From 259cd57d31db63ddc3634c827d342f13b6fd1800 Mon Sep 17 00:00:00 2001 From: Benedek Kozma Date: Sat, 2 Nov 2024 23:36:22 +0100 Subject: [PATCH] Fix unique_id format, fix conflicting clientId between test and prod MQTT client --- Sources/Wiring/App/App+Presence.swift | 9 +++++---- .../Wiring/HomeAssistantMqtt/MqttBinarySensor.swift | 8 ++------ Sources/Wiring/HomeAssistantMqtt/MqttDevice.swift | 8 ++++++++ Sources/Wiring/ThirdPartyWrappers/MQTTClient.swift | 10 ++++++---- 4 files changed, 21 insertions(+), 14 deletions(-) create mode 100644 Sources/Wiring/HomeAssistantMqtt/MqttDevice.swift diff --git a/Sources/Wiring/App/App+Presence.swift b/Sources/Wiring/App/App+Presence.swift index 34aa8da..e4a63ac 100644 --- a/Sources/Wiring/App/App+Presence.swift +++ b/Sources/Wiring/App/App+Presence.swift @@ -10,13 +10,14 @@ extension App { let config = Mqtt.BinarySensor( availabilityTopic: mqttClient.stateTopic, device: .init( - name: name, - identifiers: stateTopic + identifiers: stateTopic, + name: name ), deviceClass: .presence, - name: name, + name: nil, + objectId: name, stateTopic: stateTopic, - uniqueId: stateTopic + uniqueId: stateTopic.replacingOccurrences(of: "/", with: "_") ) await mqttClient.setOnConnectMessage( topic: "\(mqttConfig.homeAssistantBaseTopic)/binary_sensor/\(mqttConfig.baseTopic)-presence/\(person)/config", diff --git a/Sources/Wiring/HomeAssistantMqtt/MqttBinarySensor.swift b/Sources/Wiring/HomeAssistantMqtt/MqttBinarySensor.swift index edcbfb4..e5eb1f2 100644 --- a/Sources/Wiring/HomeAssistantMqtt/MqttBinarySensor.swift +++ b/Sources/Wiring/HomeAssistantMqtt/MqttBinarySensor.swift @@ -6,7 +6,8 @@ extension Mqtt { let availabilityTopic: String let device: Device let deviceClass: DeviceClass? - let name: String + let name: String? + let objectId: String? let stateTopic: String let uniqueId: String @@ -15,11 +16,6 @@ extension Mqtt { case off = "OFF" } - struct Device: Encodable { - let name: String - let identifiers: String - } - /// https://www.home-assistant.io/integrations/binary_sensor/#device-class enum DeviceClass: String, Encodable { case battery diff --git a/Sources/Wiring/HomeAssistantMqtt/MqttDevice.swift b/Sources/Wiring/HomeAssistantMqtt/MqttDevice.swift new file mode 100644 index 0000000..b3139e7 --- /dev/null +++ b/Sources/Wiring/HomeAssistantMqtt/MqttDevice.swift @@ -0,0 +1,8 @@ +import Foundation + +extension Mqtt { + struct Device: Encodable { + let identifiers: String + let name: String? + } +} diff --git a/Sources/Wiring/ThirdPartyWrappers/MQTTClient.swift b/Sources/Wiring/ThirdPartyWrappers/MQTTClient.swift index 14124f8..651ac4f 100644 --- a/Sources/Wiring/ThirdPartyWrappers/MQTTClient.swift +++ b/Sources/Wiring/ThirdPartyWrappers/MQTTClient.swift @@ -5,7 +5,6 @@ import NIOFoundationCompat actor MQTTClient { private static let reconnectDelay: Double = 5 - private static let clientId = "Wiring" private let mqttClient: MQTTNIO.MQTTClient @@ -15,16 +14,19 @@ actor MQTTClient { private var onConnectMessages: [String: ByteBuffer] = [:] private let baseTopic: String + private let clientId: String nonisolated var stateTopic: String { "\(baseTopic)/server/state" } private let messageEncoder = Mqtt.jsonEncoder() init(config: Config.Mqtt) { baseTopic = config.baseTopic + let clientId = "Wiring - \(config.baseTopic)" + self.clientId = clientId mqttClient = MQTTNIO.MQTTClient( host: config.host, port: config.port, - identifier: Self.clientId, + identifier: clientId, eventLoopGroupProvider: .createNew, configuration: MQTTNIO.MQTTClient.Configuration( version: .v5_0, @@ -43,11 +45,11 @@ actor MQTTClient { setOnConnectMessage(topic: stateTopic, rawMessage: Mqtt.Availability.online) isStarted = true - mqttClient.addPublishListener(named: Self.clientId) { result in + mqttClient.addPublishListener(named: clientId) { result in guard case let .failure(error) = result else { return } Log.error("Publish listener error: \(error)") } - mqttClient.addCloseListener(named: Self.clientId) { [weak self] _ in + mqttClient.addCloseListener(named: clientId) { [weak self] _ in Log.error("Connection closed...") Task { [weak self] in await self?.connect(isReconnect: true)