From d3903d860207eed860145ddda6e63071fb46a9cd Mon Sep 17 00:00:00 2001 From: Thomas Basler Date: Tue, 24 Sep 2024 23:23:08 +0200 Subject: [PATCH] MQTT Hass: Implement method to add common metadata to json output --- include/MqttHandleHass.h | 2 ++ src/MqttHandleHass.cpp | 75 ++++++++++++++-------------------------- 2 files changed, 28 insertions(+), 49 deletions(-) diff --git a/include/MqttHandleHass.h b/include/MqttHandleHass.h index 201992c..1a3acf5 100644 --- a/include/MqttHandleHass.h +++ b/include/MqttHandleHass.h @@ -75,6 +75,8 @@ private: static void publish(const String& subtopic, const String& payload); static void publish(const String& subtopic, const JsonDocument& doc); + static void addCommonMetadata(JsonDocument& doc, const String& unit_of_measure, const String& icon, const DeviceClassType device_class, const CategoryType category); + // Binary Sensor static void publishBinarySensor(JsonDocument& doc, const String& root_device, const String& unique_id_prefix, const String& name, const String& state_topic, const String& payload_on, const String& payload_off, const DeviceClassType device_class, const CategoryType category); static void publishDtuBinarySensor(const String& name, const String& state_topic, const String& payload_on, const String& payload_off, const DeviceClassType device_class, const CategoryType category); diff --git a/src/MqttHandleHass.cpp b/src/MqttHandleHass.cpp index 3f9e070..ab4a2ad 100644 --- a/src/MqttHandleHass.cpp +++ b/src/MqttHandleHass.cpp @@ -142,7 +142,6 @@ void MqttHandleHassClass::publishInverterField(std::shared_ptr if (!clear) { const String stateTopic = MqttSettings.getPrefix() + MqttHandleInverter.getTopic(inv, type, channel, fieldType.fieldId); - const char* devCls = deviceClass_name[fieldType.deviceClsId]; const char* stateCls = stateClass_name[fieldType.stateClsId]; String name; @@ -152,25 +151,19 @@ void MqttHandleHassClass::publishInverterField(std::shared_ptr name = "CH" + chanNum + " " + fieldName; } + String unit_of_measure = inv->Statistics()->getChannelFieldUnit(type, channel, fieldType.fieldId); + JsonDocument root; + createInverterInfo(root, inv); + addCommonMetadata(root, unit_of_measure, "", fieldType.deviceClsId, CATEGORY_NONE); root["name"] = name; root["stat_t"] = stateTopic; root["uniq_id"] = serial + "_ch" + chanNum + "_" + fieldName; - String unit_of_measure = inv->Statistics()->getChannelFieldUnit(type, channel, fieldType.fieldId); - if (unit_of_measure != "") { - root["unit_of_meas"] = unit_of_measure; - } - - createInverterInfo(root, inv); - if (Configuration.get().Mqtt.Hass.Expire) { root["exp_aft"] = Hoymiles.getNumInverters() * max(Hoymiles.PollInterval(), Configuration.get().Mqtt.PublishInterval) * inv->getReachableThreshold(); } - if (devCls != 0) { - root["dev_cla"] = devCls; - } if (stateCls != 0) { root["stat_cla"] = stateCls; } @@ -196,23 +189,14 @@ void MqttHandleHassClass::publishInverterButton(std::shared_ptr