Ver código fonte

Add `default_entity_id` to MQTT HA autodiscovery payload (#3970)

* HA MQTT autodiscovery topic update

Add `default_entity_id` to the HA autodiscovery payload to address a deprecation (warning starting with HA 2025.11 and causing an error starting with HA 2026.4).

If desired, the `object_id` (line 107) can be removed after April 2026.

* Fix whitespace

* Whitespace again

* Whitespace final
Rick Auch 1 mês atrás
pai
commit
de4ae71864
1 arquivos alterados com 16 adições e 12 exclusões
  1. 16 12
      code/components/jomjol_mqtt/server_mqtt.cpp

+ 16 - 12
code/components/jomjol_mqtt/server_mqtt.cpp

@@ -72,36 +72,40 @@ bool sendHomeAssistantDiscoveryTopic(std::string group, std::string field,
     std::string topicFull;
     std::string configTopic;
     std::string payload;
+    std::string component;
 
     configTopic = field;
 
     if (group != "" && (*NUMBERS).size() > 1) { // There is more than one meter, prepend the group so we can differentiate them
         configTopic = group + "_" + field;
         name = group + " " + name;
-    }    
+    }
 
-    /** 
-     * homeassistant needs the MQTT discovery topic according to the following structure:
-     *      <discovery_prefix>/<component>/[<node_id>/]<object_id>/config
-     * if the main topic is embedded in a nested structure, we just use the last part as node_id 
-     * This means a maintopic "home/test/watermeter" is transformed to the discovery topic "homeassistant/sensor/watermeter/..."
-    */
-    std::string node_id = createNodeId(maintopic);
     if (field == "problem") { // Special case: Binary sensor which is based on error topic
-        topicFull = "homeassistant/binary_sensor/" + node_id + "/" + configTopic + "/config";
+        component = "binary_sensor";
     }
     else if (field == "flowstart") { // Special case: Button
-        topicFull = "homeassistant/button/" + node_id + "/" + configTopic + "/config";
+        component = "button";
     }
     else {
-        topicFull = "homeassistant/sensor/" + node_id + "/" + configTopic + "/config";
+        component = "sensor";
     }
 
+    /** 
+     * homeassistant needs the MQTT discovery topic according to the following structure:
+     *      <discovery_prefix>/<component>/[<node_id>/]<object_id>/config
+     * if the main topic is embedded in a nested structure, we just use the last part as node_id 
+     * This means a maintopic "home/test/watermeter" is transformed to the discovery topic "homeassistant/sensor/watermeter/..."
+    */
+    std::string node_id = createNodeId(maintopic);
+    topicFull = "homeassistant/" + component + "/" + node_id + "/" + configTopic + "/config";
+    
     /* See https://www.home-assistant.io/docs/mqtt/discovery/ */
     payload = string("{")  +
         "\"~\": \"" + maintopic + "\","  +
         "\"unique_id\": \"" + maintopic + "-" + configTopic + "\","  +
-        "\"object_id\": \"" + maintopic + "_" + configTopic + "\","  + // This used to generate the Entity ID
+        "\"object_id\": \"" + maintopic + "_" + configTopic + "\","  + // Default entity ID; required for HA <= 2025.10
+        "\"default_entity_id\": \"" + component + "." + maintopic + "_" + configTopic + "\"," + // Default entity ID; required in HA >=2026.4
         "\"name\": \"" + name + "\","  +
         "\"icon\": \"mdi:" + icon + "\",";