diff --git a/Sources/Wiring/App/App+BridgeStatus.swift b/Sources/Wiring/App/App+BridgeStatus.swift new file mode 100644 index 0000000..ef7a35d --- /dev/null +++ b/Sources/Wiring/App/App+BridgeStatus.swift @@ -0,0 +1,30 @@ +extension App { + func setupServerState() async { + guard generalConfig.publishServerState else { return } + let mqttConfig = generalConfig.mqtt + let name = if mqttConfig.baseTopic == "wiring" { + "Wiring server" + } else { + "Wiring server (\(mqttConfig.baseTopic))" + } + let stateTopic = mqttClient.stateTopic + let config = Mqtt.BinarySensor( + availabilityTopic: nil, + device: .init( + identifiers: stateTopic, + name: name + ), + deviceClass: .connectivity, + name: nil, + objectId: nil, + payloadOff: Mqtt.Availability.offline.rawValue, + payloadOn: Mqtt.Availability.online.rawValue, + stateTopic: stateTopic, + uniqueId: stateTopic.replacingOccurrences(of: "/", with: "_") + ) + await mqttClient.setOnConnectMessage( + topic: "\(mqttConfig.homeAssistantBaseTopic)/binary_sensor/\(mqttConfig.baseTopic)-server/state/config", + message: config + ) + } +} diff --git a/Sources/Wiring/App/App+Presence.swift b/Sources/Wiring/App/App+Presence.swift index fc2cbad..43bcbc5 100644 --- a/Sources/Wiring/App/App+Presence.swift +++ b/Sources/Wiring/App/App+Presence.swift @@ -39,6 +39,8 @@ extension App { deviceClass: .presence, name: name, objectId: name, + payloadOff: nil, + payloadOn: nil, stateTopic: stateTopic, uniqueId: stateTopic.replacingOccurrences(of: "/", with: "_") ) diff --git a/Sources/Wiring/App/App.swift b/Sources/Wiring/App/App.swift index f16c5e2..a0ef53a 100644 --- a/Sources/Wiring/App/App.swift +++ b/Sources/Wiring/App/App.swift @@ -34,6 +34,7 @@ import Foundation } func run() async { + await setupServerState() await setupPresenceDetectors() await mqttClient.start() diff --git a/Sources/Wiring/Config/GeneralConfig.swift b/Sources/Wiring/Config/GeneralConfig.swift index 8fbbba3..4fa216e 100644 --- a/Sources/Wiring/Config/GeneralConfig.swift +++ b/Sources/Wiring/Config/GeneralConfig.swift @@ -3,11 +3,14 @@ import Foundation extension Config { struct General: Decodable { let mqtt: Mqtt + private let _publishServerState: Bool? + var publishServerState: Bool { _publishServerState ?? true } private let _enableDebugLogging: Bool? var enableDebugLogging: Bool { _enableDebugLogging ?? false } private enum CodingKeys: String, CodingKey { case mqtt + case _publishServerState = "publishServerState" case _enableDebugLogging = "enableDebugLogging" } } diff --git a/Sources/Wiring/HomeAssistantMqtt/MqttBinarySensor.swift b/Sources/Wiring/HomeAssistantMqtt/MqttBinarySensor.swift index 77cf282..839d1de 100644 --- a/Sources/Wiring/HomeAssistantMqtt/MqttBinarySensor.swift +++ b/Sources/Wiring/HomeAssistantMqtt/MqttBinarySensor.swift @@ -3,11 +3,13 @@ import Foundation extension Mqtt { /// https://www.home-assistant.io/integrations/binary_sensor.mqtt/ struct BinarySensor: Encodable { - let availabilityTopic: String + let availabilityTopic: String? let device: Device - let deviceClass: DeviceClass? + let deviceClass: DeviceClass let name: String? let objectId: String? + let payloadOff: String? + let payloadOn: String? let stateTopic: String let uniqueId: String diff --git a/sample_config/config/config.general.json b/sample_config/config/config.general.json index a556b8b..1f14125 100644 --- a/sample_config/config/config.general.json +++ b/sample_config/config/config.general.json @@ -7,5 +7,6 @@ "base_topic": "wiring", // optional "home_assistant_base_topic": "homeassistant" // optional }, + "publish_server_state": true, // optional "enable_debug_logging": false // optional } \ No newline at end of file