Skip to content

Commit 5cee5f2

Browse files
author
JagCesar
committed
Add HVAC requests
1 parent c6b73ad commit 5cee5f2

File tree

3 files changed

+115
-0
lines changed

3 files changed

+115
-0
lines changed

Source/Requests/HVACRequests.swift

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import Foundation
2+
3+
public struct HVACRequest: RequestProtocol {
4+
public enum HVACState {
5+
case on
6+
case off
7+
}
8+
typealias CompletionType = Bool
9+
var path: String {
10+
switch state {
11+
case .on:
12+
return "/api/1/vehicles/\(vehicleIdentifier)/command/auto_conditioning_start"
13+
case .off:
14+
return "/api/1/vehicles/\(vehicleIdentifier)/command/auto_conditioning_stop"
15+
}
16+
}
17+
let method = WebRequest.RequestMethod.post
18+
let accessToken: String
19+
let vehicleIdentifier: String
20+
let state: HVACState
21+
22+
public init(accessToken: String, vehicleIdentifier: String, state: HVACState) {
23+
self.accessToken = accessToken
24+
self.vehicleIdentifier = vehicleIdentifier
25+
self.state = state
26+
}
27+
28+
public func execute(completion: @escaping (Result<Bool>) -> Void) {
29+
WebRequest.request(
30+
path: path,
31+
method: method,
32+
accessToken: accessToken) { response, error in
33+
if let error = error {
34+
DispatchQueue.main.async {
35+
completion(Result.failure(error))
36+
}
37+
} else if let response = response as? [String: [String: Any]],
38+
let resultBool = response["response"]?["result"] as? Bool {
39+
DispatchQueue.main.async {
40+
completion(Result.success(resultBool))
41+
}
42+
} else {
43+
DispatchQueue.main.async {
44+
completion(Result.failure(APIError()))
45+
}
46+
}
47+
}
48+
}
49+
}

Tesla-API.xcodeproj/project.pbxproj

+18
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,13 @@
9191
FCB9329520FBB50B00D19874 /* SetTemperaturesRequestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCB9329420FBB50B00D19874 /* SetTemperaturesRequestTests.swift */; };
9292
FCB9329620FBB50B00D19874 /* SetTemperaturesRequestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCB9329420FBB50B00D19874 /* SetTemperaturesRequestTests.swift */; };
9393
FCB9329720FBB50B00D19874 /* SetTemperaturesRequestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCB9329420FBB50B00D19874 /* SetTemperaturesRequestTests.swift */; };
94+
FCB9329920FBB91100D19874 /* HVACRequests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCB9329820FBB91100D19874 /* HVACRequests.swift */; };
95+
FCB9329A20FBB91100D19874 /* HVACRequests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCB9329820FBB91100D19874 /* HVACRequests.swift */; };
96+
FCB9329B20FBB91100D19874 /* HVACRequests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCB9329820FBB91100D19874 /* HVACRequests.swift */; };
97+
FCB9329C20FBB91100D19874 /* HVACRequests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCB9329820FBB91100D19874 /* HVACRequests.swift */; };
98+
FCB9329E20FBB97500D19874 /* HVACRequestsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCB9329D20FBB97500D19874 /* HVACRequestsTests.swift */; };
99+
FCB9329F20FBB97500D19874 /* HVACRequestsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCB9329D20FBB97500D19874 /* HVACRequestsTests.swift */; };
100+
FCB932A020FBB97500D19874 /* HVACRequestsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCB9329D20FBB97500D19874 /* HVACRequestsTests.swift */; };
94101
FCD161971F1E79F0003FE381 /* Tesla-API.h in Headers */ = {isa = PBXBuildFile; fileRef = FCD161901F1E793F003FE381 /* Tesla-API.h */; settings = {ATTRIBUTES = (Public, ); }; };
95102
FCE31678205E3284004EF4B0 /* TeslaAPITestsEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCE31677205E3284004EF4B0 /* TeslaAPITestsEmpty.swift */; };
96103
FCE3167A205E3284004EF4B0 /* TeslaAPI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FCD1615D1F1E7844003FE381 /* TeslaAPI.framework */; };
@@ -167,6 +174,8 @@
167174
FCB9328B20FB9B3A00D19874 /* ClimateStateRequestTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClimateStateRequestTests.swift; sourceTree = "<group>"; };
168175
FCB9328F20FBADE700D19874 /* SetTemperaturesRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SetTemperaturesRequest.swift; sourceTree = "<group>"; };
169176
FCB9329420FBB50B00D19874 /* SetTemperaturesRequestTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SetTemperaturesRequestTests.swift; sourceTree = "<group>"; };
177+
FCB9329820FBB91100D19874 /* HVACRequests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HVACRequests.swift; sourceTree = "<group>"; };
178+
FCB9329D20FBB97500D19874 /* HVACRequestsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HVACRequestsTests.swift; sourceTree = "<group>"; };
170179
FCD1615D1F1E7844003FE381 /* TeslaAPI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TeslaAPI.framework; sourceTree = BUILT_PRODUCTS_DIR; };
171180
FCD1618D1F1E793F003FE381 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
172181
FCD1618F1F1E793F003FE381 /* Vehicle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Vehicle.swift; sourceTree = "<group>"; };
@@ -254,6 +263,7 @@
254263
children = (
255264
FCE826051F8C092C00B72C08 /* ChargeStateRequestTests.swift */,
256265
FCB9328B20FB9B3A00D19874 /* ClimateStateRequestTests.swift */,
266+
FCB9329D20FBB97500D19874 /* HVACRequestsTests.swift */,
257267
FC27C97E1F4995240064E1AE /* ListVehiclesRequestTests.swift */,
258268
FC27C97F1F4995240064E1AE /* LockRequestTests.swift */,
259269
FC27C9801F4995240064E1AE /* MobileEnabledForRequestTests.swift */,
@@ -302,6 +312,7 @@
302312
FCE946461F2CF10E004913FC /* AuthenticateRequest.swift */,
303313
FCE825FB1F8C068F00B72C08 /* ChargeStateRequest.swift */,
304314
FCB9328120FB913700D19874 /* ClimateStateRequest.swift */,
315+
FCB9329820FBB91100D19874 /* HVACRequests.swift */,
305316
FC80D5011F2CE6FD0013F6DF /* ListVehiclesRequest.swift */,
306317
FC75EC521F2E4AD7007ED697 /* LockRequest.swift */,
307318
FC1B80961F49883500D24310 /* MobileEnabledForVehicleRequest.swift */,
@@ -674,6 +685,7 @@
674685
isa = PBXSourcesBuildPhase;
675686
buildActionMask = 2147483647;
676687
files = (
688+
FCB9329E20FBB97500D19874 /* HVACRequestsTests.swift in Sources */,
677689
FC27C98B1F4995240064E1AE /* OpenChargePortRequestTests.swift in Sources */,
678690
FCB9328C20FB9B3A00D19874 /* ClimateStateRequestTests.swift in Sources */,
679691
FC27C9821F4995240064E1AE /* ListVehiclesRequestTests.swift in Sources */,
@@ -693,6 +705,7 @@
693705
files = (
694706
FC48F9AE1F1E7FCE00D2400B /* Vehicle.swift in Sources */,
695707
FC48F9AA1F1E7FBA00D2400B /* WebRequest.swift in Sources */,
708+
FCB9329A20FBB91100D19874 /* HVACRequests.swift in Sources */,
696709
FC48F9A61F1E7FB600D2400B /* TeslaAPI.swift in Sources */,
697710
FCB9328820FB917F00D19874 /* ClimateState.swift in Sources */,
698711
FCE825FD1F8C068F00B72C08 /* ChargeStateRequest.swift in Sources */,
@@ -716,6 +729,7 @@
716729
files = (
717730
FC48F9AD1F1E7FCE00D2400B /* Vehicle.swift in Sources */,
718731
FC48F9A91F1E7FBA00D2400B /* WebRequest.swift in Sources */,
732+
FCB9329B20FBB91100D19874 /* HVACRequests.swift in Sources */,
719733
FC48F9A51F1E7FB500D2400B /* TeslaAPI.swift in Sources */,
720734
FCB9328920FB917F00D19874 /* ClimateState.swift in Sources */,
721735
FCE825FE1F8C068F00B72C08 /* ChargeStateRequest.swift in Sources */,
@@ -739,6 +753,7 @@
739753
files = (
740754
FC48F9AC1F1E7FCD00D2400B /* Vehicle.swift in Sources */,
741755
FC48F9A81F1E7FBA00D2400B /* WebRequest.swift in Sources */,
756+
FCB9329C20FBB91100D19874 /* HVACRequests.swift in Sources */,
742757
FC48F9A41F1E7FB400D2400B /* TeslaAPI.swift in Sources */,
743758
FCB9328A20FB917F00D19874 /* ClimateState.swift in Sources */,
744759
FCE825FF1F8C068F00B72C08 /* ChargeStateRequest.swift in Sources */,
@@ -760,6 +775,7 @@
760775
isa = PBXSourcesBuildPhase;
761776
buildActionMask = 2147483647;
762777
files = (
778+
FCB9329F20FBB97500D19874 /* HVACRequestsTests.swift in Sources */,
763779
FC27C98C1F4995240064E1AE /* OpenChargePortRequestTests.swift in Sources */,
764780
FCB9328D20FB9B3A00D19874 /* ClimateStateRequestTests.swift in Sources */,
765781
FC27C9831F4995240064E1AE /* ListVehiclesRequestTests.swift in Sources */,
@@ -777,6 +793,7 @@
777793
isa = PBXSourcesBuildPhase;
778794
buildActionMask = 2147483647;
779795
files = (
796+
FCB932A020FBB97500D19874 /* HVACRequestsTests.swift in Sources */,
780797
FC27C98D1F4995250064E1AE /* OpenChargePortRequestTests.swift in Sources */,
781798
FCB9328E20FB9B3A00D19874 /* ClimateStateRequestTests.swift in Sources */,
782799
FC27C9841F4995240064E1AE /* ListVehiclesRequestTests.swift in Sources */,
@@ -796,6 +813,7 @@
796813
files = (
797814
FC48F9AF1F1E7FCE00D2400B /* Vehicle.swift in Sources */,
798815
FC99DFD31F1FB41400013FE9 /* Token.swift in Sources */,
816+
FCB9329920FBB91100D19874 /* HVACRequests.swift in Sources */,
799817
FC48F9AB1F1E7FBB00D2400B /* WebRequest.swift in Sources */,
800818
FCB9328720FB917F00D19874 /* ClimateState.swift in Sources */,
801819
FCE825FC1F8C068F00B72C08 /* ChargeStateRequest.swift in Sources */,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import XCTest
2+
@testable import TeslaAPI
3+
4+
extension TeslaAPITests {
5+
func testEnableHvac() {
6+
let waitExpectation = expectation(description: "Enable HVAC")
7+
8+
HVACRequest(
9+
accessToken: accessToken(),
10+
vehicleIdentifier: vehicleIdentifier(),
11+
state: .on).execute { result in
12+
XCTAssert(Thread.isMainThread)
13+
switch result {
14+
case .success(let result):
15+
if result {
16+
waitExpectation.fulfill()
17+
} else {
18+
XCTFail()
19+
}
20+
case .failure(_):
21+
XCTFail()
22+
}
23+
}
24+
waitForExpectations(timeout: 30, handler: nil)
25+
}
26+
27+
func testDisableHvac() {
28+
let waitExpectation = expectation(description: "Disable HVAC")
29+
30+
HVACRequest(
31+
accessToken: accessToken(),
32+
vehicleIdentifier: vehicleIdentifier(),
33+
state: .off).execute { result in
34+
XCTAssert(Thread.isMainThread)
35+
switch result {
36+
case .success(let result):
37+
if result {
38+
waitExpectation.fulfill()
39+
} else {
40+
XCTFail()
41+
}
42+
case .failure(_):
43+
XCTFail()
44+
}
45+
}
46+
waitForExpectations(timeout: 30, handler: nil)
47+
}
48+
}

0 commit comments

Comments
 (0)