From 95684092b47ecf686dd6bb07e16ff01fbd5e30e1 Mon Sep 17 00:00:00 2001 From: iranl Date: Sat, 10 Feb 2024 19:16:20 +0100 Subject: [PATCH 1/2] add-ring-as-event --- Network.cpp | 36 +++++++++++++++++++++++++++++++----- Network.h | 4 ++-- 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/Network.cpp b/Network.cpp index 23a17309..5cbba52d 100644 --- a/Network.cpp +++ b/Network.cpp @@ -1104,6 +1104,33 @@ void Network::publishHASSConfigRingDetect(char *deviceType, const char *baseTopi "", {{"pl_on", "ring"}, {"pl_off", "locked"}}); + + DynamicJsonDocument ringjson(_bufferSize); + ringjson.clear(); + auto ringdev = ringjson.createNestedObject("dev"); + auto ringids = ringdev.createNestedArray("ids"); + ringids.add(String("nuki_") + uidString); + ringjson["dev"]["mf"] = "Nuki"; + ringjson["dev"]["mdl"] = deviceType; + ringjson["dev"]["name"] = name; + ringjson["~"] = baseTopic; + ringjson["name"] = "Ring"; + ringjson["unique_id"] = String(uidString) + "_ring_event"; + ringjson["dev_cla"] = "doorbell"; + ringjson["stat_t"] = String("~") + mqtt_topic_lock_state; + ringjson["avty"]["t"] = _lockPath + mqtt_topic_mqtt_connection_state; + ringjson["event_types"][0] = "ring"; + ringjson["value_template"] = "{ \"event_type\": \"{{ value }}\" }"; + + serializeJson(ringjson, _buffer, _bufferSize); + + String ringpath = discoveryTopic; + ringpath.concat("/event/"); + ringpath.concat(uidString); + ringpath.concat("/ring/config"); + + _device->mqttPublish(ringpath.c_str(), MQTT_QOS_LEVEL, true, _buffer); + } } @@ -1241,7 +1268,7 @@ void Network::publishHASSBleRssiConfig(char *deviceType, const char *baseTopic, } void Network::publishHassTopic(const String& mqttDeviceType, - const String& mattDeviceName, + const String& mqttDeviceName, const String& uidString, const String& uidStringPostfix, const String& displayName, @@ -1262,7 +1289,6 @@ void Network::publishHassTopic(const String& mqttDeviceType, { DynamicJsonDocument json(_bufferSize); - // Battery level json.clear(); auto dev = json.createNestedObject("dev"); auto ids = dev.createNestedArray("ids"); @@ -1322,7 +1348,7 @@ void Network::publishHassTopic(const String& mqttDeviceType, path.concat("/"); path.concat(uidString); path.concat("/"); - path.concat(mattDeviceName); + path.concat(mqttDeviceName); path.concat("/config"); _device->mqttPublish(path.c_str(), MQTT_QOS_LEVEL, true, _buffer); @@ -1330,7 +1356,7 @@ void Network::publishHassTopic(const String& mqttDeviceType, } -void Network::removeHassTopic(const String& mqttDeviceType, const String& mattDeviceName, const String& uidString) +void Network::removeHassTopic(const String& mqttDeviceType, const String& mqttDeviceName, const String& uidString) { String discoveryTopic = _preferences->getString(preference_mqtt_hass_discovery); @@ -1342,7 +1368,7 @@ void Network::removeHassTopic(const String& mqttDeviceType, const String& mattDe path.concat("/"); path.concat(uidString); path.concat("/"); - path.concat(mattDeviceName); + path.concat(mqttDeviceName); path.concat("/config"); _device->mqttPublish(path.c_str(), MQTT_QOS_LEVEL, true, ""); diff --git a/Network.h b/Network.h index c9aa133b..30e7f626 100644 --- a/Network.h +++ b/Network.h @@ -83,7 +83,7 @@ class Network bool reconnect(); void publishHassTopic(const String& mqttDeviceType, - const String& mattDeviceName, + const String& mqttDeviceName, const String& uidString, const String& uidStringPostfix, const String& displayName, @@ -98,7 +98,7 @@ class Network std::vector> additionalEntries = {} ); - void removeHassTopic(const String& mqttDeviceType, const String& mattDeviceName, const String& uidString); + void removeHassTopic(const String& mqttDeviceType, const String& mqttDeviceName, const String& uidString); void onMqttConnect(const bool& sessionPresent); void onMqttDisconnect(const espMqttClientTypes::DisconnectReason& reason); From e17fa504f0e32f5f16ddaea8f7ca9f07ca60f2c1 Mon Sep 17 00:00:00 2001 From: iranl Date: Tue, 13 Feb 2024 19:37:14 +0100 Subject: [PATCH 2/2] Fixes --- Network.cpp | 193 ++++++++++++++++++++++++++-------------------------- Network.h | 19 +++++- 2 files changed, 113 insertions(+), 99 deletions(-) diff --git a/Network.cpp b/Network.cpp index 2f8f64a5..8e0f39ad 100644 --- a/Network.cpp +++ b/Network.cpp @@ -1105,32 +1105,12 @@ void Network::publishHASSConfigRingDetect(char *deviceType, const char *baseTopi {{"pl_on", "ring"}, {"pl_off", "locked"}}); - DynamicJsonDocument ringjson(_bufferSize); - ringjson.clear(); - auto ringdev = ringjson.createNestedObject("dev"); - auto ringids = ringdev.createNestedArray("ids"); - ringids.add(String("nuki_") + uidString); - ringjson["dev"]["mf"] = "Nuki"; - ringjson["dev"]["mdl"] = deviceType; - ringjson["dev"]["name"] = name; - ringjson["~"] = baseTopic; - ringjson["name"] = "Ring"; - ringjson["unique_id"] = String(uidString) + "_ring_event"; - ringjson["dev_cla"] = "doorbell"; - ringjson["stat_t"] = String("~") + mqtt_topic_lock_state; - ringjson["avty"]["t"] = _lockPath + mqtt_topic_mqtt_connection_state; - ringjson["event_types"][0] = "ring"; - ringjson["value_template"] = "{ \"event_type\": \"{{ value }}\" }"; - - serializeJson(ringjson, _buffer, _bufferSize); - - String ringpath = discoveryTopic; - ringpath.concat("/event/"); - ringpath.concat(uidString); - ringpath.concat("/ring/config"); - - _device->mqttPublish(ringpath.c_str(), MQTT_QOS_LEVEL, true, _buffer); - + DynamicJsonDocument json(_bufferSize); + json = createHassJson(uidString, "_ring_event", "Ring", name, baseTopic, String("~") + mqtt_topic_lock_state, deviceType, "doorbell", "", "", "", {{"value_template", "{ \"event_type\": \"{{ value }}\" }"}}); + json["event_types"][0] = "ring"; + serializeJson(json, _buffer, _bufferSize); + String path = createHassTopicPath("event", "ring", uidString); + _device->mqttPublish(path.c_str(), MQTT_QOS_LEVEL, true, _buffer); } } @@ -1288,73 +1268,27 @@ void Network::publishHassTopic(const String& mqttDeviceType, if (discoveryTopic != "") { DynamicJsonDocument json(_bufferSize); - - json.clear(); - auto dev = json.createNestedObject("dev"); - auto ids = dev.createNestedArray("ids"); - ids.add(String("nuki_") + uidString); - json["dev"]["mf"] = "Nuki"; - json["dev"]["mdl"] = deviceType; - json["dev"]["name"] = name; - json["~"] = baseTopic; - json["name"] = displayName; - json["unique_id"] = String(uidString) + uidStringPostfix; - if(deviceClass != "") - { - json["dev_cla"] = deviceClass; - } - - if(stateTopic != "") - { - json["stat_t"] = stateTopic; - } - - if(stateClass != "") - { - json["stat_cla"] = stateClass; - } - if(entityCat != "") - { - json["ent_cat"] = entityCat; - } - if(commandTopic != "") - { - json["cmd_t"] = commandTopic; - } - - json["avty"]["t"] = _lockPath + mqtt_topic_mqtt_connection_state; - - for(const auto& entry : additionalEntries) - { - if(strcmp(entry.second, "true") == 0) - { - json[entry.first] = true; - } - else if(strcmp(entry.second, "false") == 0) - { - json[entry.first] = false; - } - else - { - json[entry.first] = entry.second; - } - } - + json = createHassJson(uidString, uidStringPostfix, displayName, name, baseTopic, stateTopic, deviceType, deviceClass, stateClass, entityCat, commandTopic, additionalEntries); serializeJson(json, _buffer, _bufferSize); - - String path = discoveryTopic; - path.concat("/"); - path.concat(mqttDeviceType); - path.concat("/"); - path.concat(uidString); - path.concat("/"); - path.concat(mqttDeviceName); - path.concat("/config"); - + String path = createHassTopicPath(mqttDeviceType, mqttDeviceName, uidString); _device->mqttPublish(path.c_str(), MQTT_QOS_LEVEL, true, _buffer); } } +String Network::createHassTopicPath(const String& mqttDeviceType, const String& mqttDeviceName, const String& uidString) +{ + String discoveryTopic = _preferences->getString(preference_mqtt_hass_discovery); + String path = discoveryTopic; + path.concat("/"); + path.concat(mqttDeviceType); + path.concat("/"); + path.concat(uidString); + path.concat("/"); + path.concat(mqttDeviceName); + path.concat("/config"); + + return path; +} void Network::removeHassTopic(const String& mqttDeviceType, const String& mqttDeviceName, const String& uidString) { @@ -1362,15 +1296,7 @@ void Network::removeHassTopic(const String& mqttDeviceType, const String& mqttDe if (discoveryTopic != "") { - String path = discoveryTopic; - path.concat("/"); - path.concat(mqttDeviceType); - path.concat("/"); - path.concat(uidString); - path.concat("/"); - path.concat(mqttDeviceName); - path.concat("/config"); - + String path = createHassTopicPath(mqttDeviceType, mqttDeviceName, uidString); _device->mqttPublish(path.c_str(), MQTT_QOS_LEVEL, true, ""); } } @@ -1479,6 +1405,79 @@ void Network::removeHASSConfigTopic(char *deviceType, char *name, char *uidStrin removeHassTopic(deviceType, name, uidString); } +DynamicJsonDocument Network::createHassJson(const String& uidString, + const String& uidStringPostfix, + const String& displayName, + const String& name, + const String& baseTopic, + const String& stateTopic, + const String& deviceType, + const String& deviceClass, + const String& stateClass, + const String& entityCat, + const String& commandTopic, + std::vector> additionalEntries +) +{ + DynamicJsonDocument json(_bufferSize); + + json.clear(); + auto dev = json.createNestedObject("dev"); + auto ids = dev.createNestedArray("ids"); + ids.add(String("nuki_") + uidString); + json["dev"]["mf"] = "Nuki"; + json["dev"]["mdl"] = deviceType; + json["dev"]["name"] = name; + json["~"] = baseTopic; + json["name"] = displayName; + json["unique_id"] = String(uidString) + uidStringPostfix; + + if(deviceClass != "") + { + json["dev_cla"] = deviceClass; + } + + if(stateTopic != "") + { + json["stat_t"] = stateTopic; + } + + if(stateClass != "") + { + json["stat_cla"] = stateClass; + } + + if(entityCat != "") + { + json["ent_cat"] = entityCat; + } + + if(commandTopic != "") + { + json["cmd_t"] = commandTopic; + } + + json["avty"]["t"] = _lockPath + mqtt_topic_mqtt_connection_state; + + for(const auto& entry : additionalEntries) + { + if(strcmp(entry.second, "true") == 0) + { + json[entry.first] = true; + } + else if(strcmp(entry.second, "false") == 0) + { + json[entry.first] = false; + } + else + { + json[entry.first] = entry.second; + } + } + + return json; +} + void Network::publishPresenceDetection(char *csv) { _presenceCsv = csv; diff --git a/Network.h b/Network.h index 30e7f626..cac479e5 100644 --- a/Network.h +++ b/Network.h @@ -8,6 +8,7 @@ #include "networkDevices/IPConfiguration.h" #include "MqttTopics.h" #include "Gpio.h" +#include enum class NetworkDeviceType { @@ -97,9 +98,23 @@ class Network const String& commandTopic = "", std::vector> additionalEntries = {} ); - + + String createHassTopicPath(const String& mqttDeviceType, const String& mqttDeviceName, const String& uidString); void removeHassTopic(const String& mqttDeviceType, const String& mqttDeviceName, const String& uidString); - + DynamicJsonDocument createHassJson(const String& uidString, + const String& uidStringPostfix, + const String& displayName, + const String& name, + const String& baseTopic, + const String& stateTopic, + const String& deviceType, + const String& deviceClass, + const String& stateClass = "", + const String& entityCat = "", + const String& commandTopic = "", + std::vector> additionalEntries = {} + ); + void onMqttConnect(const bool& sessionPresent); void onMqttDisconnect(const espMqttClientTypes::DisconnectReason& reason);