iOS/Sources/Shared/API/Models/WebhookSensor.swift

202 lines
5.3 KiB
Swift

import Foundation
import ObjectMapper
public struct WebhookSensorSetting {
public enum SettingType {
case `switch`(getter: () -> Bool, setter: (Bool) -> Void)
case stepper(
getter: () -> Double,
setter: (Double) -> Void,
minimum: Double = 0,
maximum: Double = 100,
step: Double = 1,
displayValueFor: ((Double?) -> String?)?
)
}
public let type: SettingType
public let title: String
}
public class WebhookSensor: Mappable, Equatable, Comparable {
public var Attributes: [String: Any]?
public var DeviceClass: DeviceClass?
public var Icon: String?
public var Name: String?
public var State: Any? = "Initial"
public var `Type`: String = "sensor"
public var UniqueID: String?
public var UnitOfMeasurement: String?
public var entityCategory: String?
public var Settings: [WebhookSensorSetting] = []
init() {}
public required init?(map: Map) {}
convenience init(redacting sensor: WebhookSensor) {
self.init()
self.Name = sensor.Name
self.UniqueID = sensor.UniqueID
self.State = "unavailable"
self.Icon = "mdi:dots-square"
self.Type = sensor.Type
}
convenience init(name: String, uniqueID: String) {
self.init()
self.Name = name
self.UniqueID = uniqueID
}
convenience init(name: String, uniqueID: String, state: Any, unit: String? = nil, entityCategory: String? = nil) {
self.init(name: name, uniqueID: uniqueID)
self.State = state
self.UnitOfMeasurement = unit
self.entityCategory = entityCategory
}
convenience init(
name: String,
uniqueID: String,
icon: String?,
state: Any,
unit: String? = nil,
entityCategory: String? = nil
) {
self.init(name: name, uniqueID: uniqueID, state: state, unit: unit, entityCategory: entityCategory)
self.Icon = icon
}
convenience init(
name: String,
uniqueID: String,
icon: MaterialDesignIcons,
state: Any,
unit: String? = nil,
entityCategory: String? = nil
) {
self.init(
name: name,
uniqueID: uniqueID,
icon: "mdi:\(icon.name)",
state: state,
unit: unit,
entityCategory: entityCategory
)
}
convenience init(
name: String,
uniqueID: String,
icon: String,
deviceClass: DeviceClass,
state: Any,
unit: String? = nil,
entityCategory: String? = nil
) {
self.init(name: name, uniqueID: uniqueID, icon: icon, state: state, unit: unit, entityCategory: entityCategory)
self.DeviceClass = deviceClass
}
// Mappable
public func mapping(map: Map) {
Attributes <- map["attributes"]
Icon <- map["icon"]
State <- map["state"]
`Type` <- map["type"]
UniqueID <- map["unique_id"]
let isUpdate = (map.context as? WebhookSensorContext)?.SensorUpdate ?? false
if !isUpdate {
DeviceClass <- map["device_class"]
entityCategory <- map["entity_category"]
Name <- map["name"]
UnitOfMeasurement <- map["unit_of_measurement"]
}
}
public var StateDescription: String? {
if let value = State {
return String(describing: value) + (UnitOfMeasurement.flatMap { " " + $0 } ?? "")
} else {
return nil
}
}
public static func == (lhs: WebhookSensor, rhs: WebhookSensor) -> Bool {
let mapper = Mapper<WebhookSensor>()
let lhsData = try? JSONSerialization.data(withJSONObject: mapper.toJSON(lhs), options: [.sortedKeys])
let rhsData = try? JSONSerialization.data(withJSONObject: mapper.toJSON(rhs), options: [.sortedKeys])
return lhsData == rhsData
}
public static func < (lhs: WebhookSensor, rhs: WebhookSensor) -> Bool {
(lhs.Name ?? "").localizedCompare(rhs.Name ?? "") == .orderedAscending
}
}
public enum DeviceClass: String, CaseIterable {
case battery
case cold
case connectivity
case door
case garage_door
case gas
case heat
case humidity
case illuminance
case light
case lock
case moisture
case motion
case moving
case occupancy
case opening
case plug
case power
case presence
case pressure
case problem
case safety
case smoke
case sound
case temperature
case timestamp
case vibration
case window
}
public class WebhookSensorContext: MapContext {
public var SensorUpdate: Bool = false
convenience init(update: Bool = false) {
self.init()
self.SensorUpdate = update
}
}
public class WebhookSensorResponse: Mappable {
public var Success: Bool = false
public var ErrorMessage: String?
public var ErrorCode: String?
init() {}
init(success: Bool, errorMessage: String? = nil, errorCode: String? = nil) {
self.Success = success
self.ErrorMessage = errorMessage
self.ErrorCode = errorCode
}
public required init?(map: Map) {}
// Mappable
public func mapping(map: Map) {
Success <- map["success"]
ErrorMessage <- map["error.message"]
ErrorCode <- map["error.code"]
}
}