HubitatServer: finishes ability to toggle hubitat switches

This commit is contained in:
2020-04-30 19:00:08 -07:00
parent 9bff3dda48
commit a054347f32

View File

@@ -9,7 +9,12 @@
import Foundation import Foundation
import Combine import Combine
class HubitatServer : Server public enum HubitatServerError : Error
{
case apiError
}
public class HubitatServer : Server
{ {
var connected: Bool = false var connected: Bool = false
@@ -17,7 +22,8 @@ class HubitatServer : Server
private let baseURL: URL private let baseURL: URL
private let accessToken = "fa861583-71f0-466f-8add-f29b2278af6a" private let accessToken = "fa861583-71f0-466f-8add-f29b2278af6a"
private var cancellable: AnyCancellable? private var fetchCancellable: AnyCancellable?
private var switchCancellable: AnyCancellable?
required init(_ url: URL) required init(_ url: URL)
{ {
@@ -40,7 +46,7 @@ class HubitatServer : Server
{ {
let url = baseURL.appendingPathComponent("devices/all").authenticatedURLWithAccessToken(accessToken) let url = baseURL.appendingPathComponent("devices/all").authenticatedURLWithAccessToken(accessToken)
self.cancellable = URLSession.shared.dataTaskPublisher(for: url) self.fetchCancellable = URLSession.shared.dataTaskPublisher(for: url)
.mapError { $0 as Error } .mapError { $0 as Error }
.map { $0.data } .map { $0.data }
.decode(type: [HubitatDevice].self, decoder: JSONDecoder()) .decode(type: [HubitatDevice].self, decoder: JSONDecoder())
@@ -55,12 +61,29 @@ class HubitatServer : Server
} }
} }
func toggleDevice(_ device: AnyDevice, state: DeviceState, completion: @escaping (Error?) -> Void) func toggleDevice(_ device: AnyDevice, state: DeviceState, completion toggleCompletion: @escaping (Error?) -> Void)
{ {
if let hubitatDevice = (self.devices.first { $0.serial == device.serial }) { if let hubitatDevice = (self.devices.first { $0.serial == device.serial }) {
print("HUBITAT: Toggle: ", hubitatDevice.id) let command = "devices/\(hubitatDevice.id)/\(state)"
let url = baseURL.appendingPathComponent(command).authenticatedURLWithAccessToken(accessToken)
// TODO... self.switchCancellable = URLSession.shared.dataTaskPublisher(for: url)
.tryMap { data, response -> Data in
guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 else {
throw HubitatServerError.apiError
}
return data
}
.decode(type: HubitatDevice.self, decoder: JSONDecoder())
.sink(receiveCompletion: { (completion: Subscribers.Completion<Error>) in
if case let Subscribers.Completion.failure(error) = completion {
toggleCompletion(error)
}
}, receiveValue: { (device: HubitatDevice) in
// don't need to do anything with this, but the server returns it to us.
toggleCompletion(nil)
})
} }
} }