Prechádzať zdrojové kódy

Update Homeassistant discovery (#3580)

* use "total" for Homeassistant discovery topic "raw" if AllowNegativeRates is activ (same as for "value")

* update webUI

* .

* .

* .

* formating

* use state class "measurement" in case of a thermometer

* Update edit_config_template.html

---------

Co-authored-by: CaCO3 <caco@ruinelli.ch>
CaCO3 11 mesiacov pred
rodič
commit
94a53b38b8

+ 5 - 5
code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp

@@ -156,7 +156,7 @@ bool ClassFlowMQTT::ReadParameter(FILE* pfile, string& aktparamgraph)
                 mqttServer_setMeterType("water", "L", "h", "L/h");
             }
             else if (toUpper(splitted[1]) == "WATER_FT3") {
-                mqttServer_setMeterType("water", "ft³", "m", "ft³/m"); // m = Minutes
+                mqttServer_setMeterType("water", "ft³", "min", "ft³/min"); // min = Minutes
             }
             else if (toUpper(splitted[1]) == "WATER_GAL") {
                 mqttServer_setMeterType("water", "gal", "h", "gal/h");
@@ -165,7 +165,7 @@ bool ClassFlowMQTT::ReadParameter(FILE* pfile, string& aktparamgraph)
                 mqttServer_setMeterType("gas", "m³", "h", "m³/h");
             }
             else if (toUpper(splitted[1]) == "GAS_FT3") {
-                mqttServer_setMeterType("gas", "ft³", "m", "ft³/m"); // m = Minutes
+                mqttServer_setMeterType("gas", "ft³", "min", "ft³/min"); // min = Minutes
             }
             else if (toUpper(splitted[1]) == "ENERGY_WH") {
                 mqttServer_setMeterType("energy", "Wh", "h", "W");
@@ -180,13 +180,13 @@ bool ClassFlowMQTT::ReadParameter(FILE* pfile, string& aktparamgraph)
                 mqttServer_setMeterType("energy", "GJ", "h", "GJ/h");
             }
             else if (toUpper(splitted[1]) == "TEMPERATURE_C") {
-                mqttServer_setMeterType("temperature", "°C", "m", "°C/m"); // m = Minutes
+                mqttServer_setMeterType("temperature", "°C", "min", "°C/min"); // min = Minutes
             }
             else if (toUpper(splitted[1]) == "TEMPERATURE_F") {
-                mqttServer_setMeterType("temperature", "°F", "m", "°F/m"); // m = Minutes
+                mqttServer_setMeterType("temperature", "°F", "min", "°F/min"); // min = Minutes
             }
             else if (toUpper(splitted[1]) == "TEMPERATURE_K") {
-                mqttServer_setMeterType("temperature", "K", "m", "K/m"); // m = Minutes
+                mqttServer_setMeterType("temperature", "K", "min", "K/m"); // min = Minutes
             }
         }
 

+ 14 - 11
code/components/jomjol_mqtt/server_mqtt.cpp

@@ -195,9 +195,12 @@ bool MQTThomeassistantDiscovery(int qos) {
 
         /* If "Allow neg. rate" is true, use "measurement" instead of "total_increasing" for the State Class, see https://github.com/jomjol/AI-on-the-edge-device/issues/3331 */
         std::string value_state_class = "total_increasing";
-        if ((*NUMBERS)[i]->AllowNegativeRates) {
+        if (meterType == "temperature") {
             value_state_class = "measurement";
         }
+        else if ((*NUMBERS)[i]->AllowNegativeRates) {
+            value_state_class = "total";
+        }
 
         /* Energy meters need a different Device Class, see https://github.com/jomjol/AI-on-the-edge-device/issues/3333 */
         std::string rate_device_class = "volume_flow_rate";
@@ -205,17 +208,17 @@ bool MQTThomeassistantDiscovery(int qos) {
             rate_device_class = "power";
         }
 
-    //                                                       Group | Field                          | User Friendly Name                | Icon                   | Unit                 | Device Class | State Class       | Entity Category
-        allSendsSuccessed |= sendHomeAssistantDiscoveryTopic(group,   "value",                      "Value",                            "gauge",                 valueUnit,             meterType,      value_state_class, "", qos); // State Class = "total_increasing" if <NUMBERS>.AllowNegativeRates = false, else use "measurement"
-        allSendsSuccessed |= sendHomeAssistantDiscoveryTopic(group,   "raw",                        "Raw Value",                        "raw",                   valueUnit,             meterType,      "measurement",      "diagnostic", qos);
-        allSendsSuccessed |= sendHomeAssistantDiscoveryTopic(group,   "error",                      "Error",                            "alert-circle-outline",  "",                    "",             "",                 "diagnostic", qos);
+    //                                                       Group   | Field                       | User Friendly Name                    | Icon                       | Unit                 | Device Class     | State Class       | Entity Category | QoS
+        allSendsSuccessed |= sendHomeAssistantDiscoveryTopic(group,   "value",                      "Value",                                "gauge",                     valueUnit,             meterType,         value_state_class,  "",               qos); // State Class = "total_increasing" if <NUMBERS>.AllowNegativeRates = false, "measurement" in case of a thermometer, else use "total".
+        allSendsSuccessed |= sendHomeAssistantDiscoveryTopic(group,   "raw",                        "Raw Value",                            "raw",                       valueUnit,             meterType,         value_state_class,  "diagnostic",     qos);
+        allSendsSuccessed |= sendHomeAssistantDiscoveryTopic(group,   "error",                      "Error",                                "alert-circle-outline",      "",                    "",                "",                 "diagnostic",     qos);
         /* Not announcing "rate" as it is better to use rate_per_time_unit resp. rate_per_digitization_round */
-        // allSendsSuccessed |= sendHomeAssistantDiscoveryTopic(group,   "rate",               "Rate (Unit/Minute)",               "swap-vertical",         "",        "",            "",                 ""); // Legacy, always Unit per Minute
-        allSendsSuccessed |= sendHomeAssistantDiscoveryTopic(group,   "rate_per_time_unit",         "Rate (" + rateUnit + ")",          "swap-vertical",         rateUnit,              rate_device_class, "measurement",      "", qos);
-        allSendsSuccessed |= sendHomeAssistantDiscoveryTopic(group,   "rate_per_digitization_round",  "Change since last Digitization round",  "arrow-expand-vertical", valueUnit,  "",             "measurement",      "", qos); // correctly the Unit is Unit/Interval!
-        allSendsSuccessed |= sendHomeAssistantDiscoveryTopic(group,   "timestamp",                  "Timestamp",                     "clock-time-eight-outline", "",                    "timestamp",    "",                 "diagnostic", qos);
-        allSendsSuccessed |= sendHomeAssistantDiscoveryTopic(group,   "json",                       "JSON",                             "code-json",             "",                    "",             "",                 "diagnostic", qos);
-        allSendsSuccessed |= sendHomeAssistantDiscoveryTopic(group,   "problem",                    "Problem",                          "alert-outline",         "",                    "problem",      "",                 "", qos); // Special binary sensor which is based on error topic
+     // allSendsSuccessed |= sendHomeAssistantDiscoveryTopic(group,   "rate",                       "Rate (Unit/Minute)",                   "swap-vertical",             "",                    "",                "",                 "",               qos); // Legacy, always Unit per Minute
+        allSendsSuccessed |= sendHomeAssistantDiscoveryTopic(group,   "rate_per_time_unit",         "Rate (" + rateUnit + ")",              "swap-vertical",             rateUnit,              rate_device_class, "measurement",      "",               qos);
+        allSendsSuccessed |= sendHomeAssistantDiscoveryTopic(group,   "rate_per_digitization_round","Change since last Digitization round", "arrow-expand-vertical",     valueUnit,             "",                "measurement",      "",               qos); // correctly the Unit is Unit/Interval!
+        allSendsSuccessed |= sendHomeAssistantDiscoveryTopic(group,   "timestamp",                  "Timestamp",                            "clock-time-eight-outline",  "",                    "timestamp",       "",                 "diagnostic",     qos);
+        allSendsSuccessed |= sendHomeAssistantDiscoveryTopic(group,   "json",                       "JSON",                                 "code-json",                 "",                    "",                "",                 "diagnostic",     qos);
+        allSendsSuccessed |= sendHomeAssistantDiscoveryTopic(group,   "problem",                    "Problem",                              "alert-outline",             "",                    "problem",         "",                 "",               qos); // Special binary sensor which is based on error topic
     }
 
     LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "Successfully published all Homeassistant Discovery MQTT topics");

+ 20 - 3
param-docs/parameter-pages/MQTT/MeterType.md

@@ -3,9 +3,26 @@ Default Value: `other`
 
 Select the Meter Type so the sensors have the right units in Homeassistant.
 
-!!! Note
-    For `Watermeter` you need to have Homeassistant 2022.11 or newer!
-
 Please also make sure that the selected Meter Type matches the dimension of the value provided by the meter!
 Eg. if your meter provides `m³`, you need to also set it to `m³`.
 Alternatively you can set the parameter `DecimalShift` to `3` so the value is converted to `liters`!
+
+List of supported options:
+
+- `other`
+- `water_m3` (uses `m^3/min` as rate)
+- `water_l`  (uses `l/h` as rate, not officially supported by Homeassistant!)
+- `water_gal`  (uses `gal/h` as rate, not officially supported by Homeassistant!)
+- `water_ft3` (uses `ft^3/min` as rate)
+- `gas_m3` (uses `m^3/min` as rate)
+- `gas_ft3` (uses `ft^3/min` as rate)
+- `energy_wh` (uses `W` as rate)
+- `energy_kwh` (uses `KW` as rate)
+- `energy_mwh` (uses `MW` as rate)
+- `energy_gj`  (uses `GJ/h` as rate, not officially supported by Homeassistant!)
+- `temperature_c` (uses `+C/min` as rate)
+- `temperature_f` (uses `°F/min` as rate)
+- `temperature_k` (uses `K/min` as rate)
+
+!!! Note
+    Not all options are supported by Homeassistant, see `SensorDeviceClass.VOLUME_FLOW_RATE` in [https://developers.home-assistant.io/docs/core/entity/sensor/#available-device-classes](https://developers.home-assistant.io/docs/core/entity/sensor/#available-device-classes)!

+ 2 - 1
sd-card/html/common.js

@@ -1,6 +1,7 @@
  
-/* The UI can also be run locally, but you have to set the IP of your devide accordingly.
+/* The UI can also be run locally, but you have to set the IP of your device accordingly.
  * And you also might have to disable CORS in your webbrowser!
+ * Eg using https://chromewebstore.google.com/detail/allow-cors-access-control/lhobafahddgcelffkeicbaginigeejlf?utm_source=ext_app_menu on chrome
  * Keep empty to disable using it. Enabling it will break access through a forwared port, see 
  * https://github.com/jomjol/AI-on-the-edge-device/issues/2681 */
 var domainname_for_testing = "";

+ 3 - 3
sd-card/html/edit_config_template.html

@@ -1183,15 +1183,15 @@
                 <select class="select_large" id="MQTT_MeterType_value1"> <!-- See https://developers.home-assistant.io/docs/core/entity/sensor/#available-device-classes -->
                     <option value="other" selected>Other (no Units)</option>
                     <option value="water_m3">Watermeter (Value: m³, Rate: m³/h)</option>
-                    <option value="water_l">Watermeter (Value: l, Rate: l/h)</option>
-                    <option value="water_gal">Watermeter (Value: gal, Rate: gal/h)</option>
+                    <option value="water_l">Watermeter (Value: l, Rate: l/h) *Not officially supported by Homeassistant!*</option>
+                    <option value="water_gal">Watermeter (Value: gal, Rate: gal/h) *Not officially supported by Homeassistant!*</option>
                     <option value="water_ft3">Watermeter (Value: ft³, Rate: ft³/min)</option>
                     <option value="gas_m3">Gasmeter (Value: m³, Rate: m³/h)</option>
                     <option value="gas_ft3">Gasmeter (Value: ft³, Rate: ft³/min)</option>
                     <option value="energy_wh">Energymeter (Value: Wh, Rate: W)</option>
                     <option value="energy_kwh">Energymeter (Value: kWh, Rate: kW)</option>
                     <option value="energy_mwh">Energymeter (Value: MWh, Rate: MW)</option>
-                    <option value="energy_gj">Energymeter (Value: GJ, Rate: GJ/h)</option>
+                    <option value="energy_gj">Energymeter (Value: GJ, Rate: GJ/h) *Not officially supported by Homeassistant!*</option>
                     <option value="temperature_c">Thermometer (Value: °C, Rate: °C/min)</option>
                     <option value="temperature_c">Thermometer (Value: °F, Rate: °F/min)</option>
                     <option value="temperature_c">Thermometer (Value: K, Rate: K/min)</option>