Skip to content

Commit ea68927

Browse files
author
JagCesar
committed
Add HVAC requests
1 parent 6471317 commit ea68927

File tree

3 files changed

+115
-0
lines changed

3 files changed

+115
-0
lines changed

Source/Requests/HVACRequests.swift

Lines changed: 49 additions & 0 deletions
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

Lines changed: 18 additions & 0 deletions
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
FCE825FC1F8C068F00B72C08 /* ChargeStateRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCE825FB1F8C068F00B72C08 /* ChargeStateRequest.swift */; };
96103
FCE825FD1F8C068F00B72C08 /* ChargeStateRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCE825FB1F8C068F00B72C08 /* ChargeStateRequest.swift */; };
@@ -158,6 +165,8 @@
158165
FCB9328B20FB9B3A00D19874 /* ClimateStateRequestTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClimateStateRequestTests.swift; sourceTree = "<group>"; };
159166
FCB9328F20FBADE700D19874 /* SetTemperaturesRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SetTemperaturesRequest.swift; sourceTree = "<group>"; };
160167
FCB9329420FBB50B00D19874 /* SetTemperaturesRequestTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SetTemperaturesRequestTests.swift; sourceTree = "<group>"; };
168+
FCB9329820FBB91100D19874 /* HVACRequests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HVACRequests.swift; sourceTree = "<group>"; };
169+
FCB9329D20FBB97500D19874 /* HVACRequestsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HVACRequestsTests.swift; sourceTree = "<group>"; };
161170
FCD1615D1F1E7844003FE381 /* TeslaAPI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TeslaAPI.framework; sourceTree = BUILT_PRODUCTS_DIR; };
162171
FCD1618D1F1E793F003FE381 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
163172
FCD1618F1F1E793F003FE381 /* Vehicle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Vehicle.swift; sourceTree = "<group>"; };
@@ -234,6 +243,7 @@
234243
children = (
235244
FCE826051F8C092C00B72C08 /* ChargeStateRequestTests.swift */,
236245
FCB9328B20FB9B3A00D19874 /* ClimateStateRequestTests.swift */,
246+
FCB9329D20FBB97500D19874 /* HVACRequestsTests.swift */,
237247
FC27C97E1F4995240064E1AE /* ListVehiclesRequestTests.swift */,
238248
FC27C97F1F4995240064E1AE /* LockRequestTests.swift */,
239249
FC27C9801F4995240064E1AE /* MobileEnabledForRequestTests.swift */,
@@ -280,6 +290,7 @@
280290
FCE946461F2CF10E004913FC /* AuthenticateRequest.swift */,
281291
FCE825FB1F8C068F00B72C08 /* ChargeStateRequest.swift */,
282292
FCB9328120FB913700D19874 /* ClimateStateRequest.swift */,
293+
FCB9329820FBB91100D19874 /* HVACRequests.swift */,
283294
FC80D5011F2CE6FD0013F6DF /* ListVehiclesRequest.swift */,
284295
FC75EC521F2E4AD7007ED697 /* LockRequest.swift */,
285296
FC1B80961F49883500D24310 /* MobileEnabledForVehicleRequest.swift */,
@@ -613,6 +624,7 @@
613624
isa = PBXSourcesBuildPhase;
614625
buildActionMask = 2147483647;
615626
files = (
627+
FCB9329E20FBB97500D19874 /* HVACRequestsTests.swift in Sources */,
616628
FC27C98B1F4995240064E1AE /* OpenChargePortRequestTests.swift in Sources */,
617629
FCB9328C20FB9B3A00D19874 /* ClimateStateRequestTests.swift in Sources */,
618630
FC27C9821F4995240064E1AE /* ListVehiclesRequestTests.swift in Sources */,
@@ -632,6 +644,7 @@
632644
files = (
633645
FC48F9AE1F1E7FCE00D2400B /* Vehicle.swift in Sources */,
634646
FC48F9AA1F1E7FBA00D2400B /* WebRequest.swift in Sources */,
647+
FCB9329A20FBB91100D19874 /* HVACRequests.swift in Sources */,
635648
FC48F9A61F1E7FB600D2400B /* TeslaAPI.swift in Sources */,
636649
FCB9328820FB917F00D19874 /* ClimateState.swift in Sources */,
637650
FCE825FD1F8C068F00B72C08 /* ChargeStateRequest.swift in Sources */,
@@ -655,6 +668,7 @@
655668
files = (
656669
FC48F9AD1F1E7FCE00D2400B /* Vehicle.swift in Sources */,
657670
FC48F9A91F1E7FBA00D2400B /* WebRequest.swift in Sources */,
671+
FCB9329B20FBB91100D19874 /* HVACRequests.swift in Sources */,
658672
FC48F9A51F1E7FB500D2400B /* TeslaAPI.swift in Sources */,
659673
FCB9328920FB917F00D19874 /* ClimateState.swift in Sources */,
660674
FCE825FE1F8C068F00B72C08 /* ChargeStateRequest.swift in Sources */,
@@ -678,6 +692,7 @@
678692
files = (
679693
FC48F9AC1F1E7FCD00D2400B /* Vehicle.swift in Sources */,
680694
FC48F9A81F1E7FBA00D2400B /* WebRequest.swift in Sources */,
695+
FCB9329C20FBB91100D19874 /* HVACRequests.swift in Sources */,
681696
FC48F9A41F1E7FB400D2400B /* TeslaAPI.swift in Sources */,
682697
FCB9328A20FB917F00D19874 /* ClimateState.swift in Sources */,
683698
FCE825FF1F8C068F00B72C08 /* ChargeStateRequest.swift in Sources */,
@@ -699,6 +714,7 @@
699714
isa = PBXSourcesBuildPhase;
700715
buildActionMask = 2147483647;
701716
files = (
717+
FCB9329F20FBB97500D19874 /* HVACRequestsTests.swift in Sources */,
702718
FC27C98C1F4995240064E1AE /* OpenChargePortRequestTests.swift in Sources */,
703719
FCB9328D20FB9B3A00D19874 /* ClimateStateRequestTests.swift in Sources */,
704720
FC27C9831F4995240064E1AE /* ListVehiclesRequestTests.swift in Sources */,
@@ -716,6 +732,7 @@
716732
isa = PBXSourcesBuildPhase;
717733
buildActionMask = 2147483647;
718734
files = (
735+
FCB932A020FBB97500D19874 /* HVACRequestsTests.swift in Sources */,
719736
FC27C98D1F4995250064E1AE /* OpenChargePortRequestTests.swift in Sources */,
720737
FCB9328E20FB9B3A00D19874 /* ClimateStateRequestTests.swift in Sources */,
721738
FC27C9841F4995240064E1AE /* ListVehiclesRequestTests.swift in Sources */,
@@ -735,6 +752,7 @@
735752
files = (
736753
FC48F9AF1F1E7FCE00D2400B /* Vehicle.swift in Sources */,
737754
FC99DFD31F1FB41400013FE9 /* Token.swift in Sources */,
755+
FCB9329920FBB91100D19874 /* HVACRequests.swift in Sources */,
738756
FC48F9AB1F1E7FBB00D2400B /* WebRequest.swift in Sources */,
739757
FCB9328720FB917F00D19874 /* ClimateState.swift in Sources */,
740758
FCE825FC1F8C068F00B72C08 /* ChargeStateRequest.swift in Sources */,
Lines changed: 48 additions & 0 deletions
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)