From 3b7eb9c58b8514a236b5f1c28fa345420316337e Mon Sep 17 00:00:00 2001 From: Kai Gerken Date: Wed, 6 Jul 2022 20:55:17 +0200 Subject: [PATCH] Implement state class for mqtt discovery. --- tools/esp8266/app.cpp | 13 +++++++++++++ tools/esp8266/app.h | 1 + tools/esp8266/hmDefines.h | 32 ++++++++++++++++++-------------- 3 files changed, 32 insertions(+), 14 deletions(-) diff --git a/tools/esp8266/app.cpp b/tools/esp8266/app.cpp index c739958b..50120e5f 100644 --- a/tools/esp8266/app.cpp +++ b/tools/esp8266/app.cpp @@ -931,6 +931,7 @@ void app::sendMqttDiscoveryConfig(void) { snprintf(discoveryTopic, 64, "%s/sensor/%s/ch%d_%s/config", MQTT_DISCOVERY_PREFIX, iv->name, iv->assign[i].ch, iv->getFieldName(i)); snprintf(uniq_id, 32, "ch%d_%s", iv->assign[i].ch, iv->getFieldName(i)); const char* devCls = getFieldDeviceClass(iv->assign[i].fieldId); + const char* stateCls = getFieldStateClass(iv->assign[i].fieldId); doc["name"] = name; doc["stat_t"] = stateTopic; @@ -941,6 +942,9 @@ void app::sendMqttDiscoveryConfig(void) { if (devCls != NULL) { doc["dev_cla"] = devCls; } + if (stateCls != NULL) { + doc["stat_cla"] = stateCls; + } serializeJson(doc, buffer); mMqtt.sendMsg2(discoveryTopic, buffer); @@ -963,3 +967,12 @@ const char* app::getFieldDeviceClass(uint8_t fieldId) { } return (pos >= DEVICE_CLS_ASSIGN_LIST_LEN) ? NULL : deviceClasses[deviceFieldAssignment[pos].deviceClsId]; } + +const char* app::getFieldStateClass(uint8_t fieldId) { + uint8_t pos = 0; + for(; pos < DEVICE_CLS_ASSIGN_LIST_LEN; pos++) { + if(deviceFieldAssignment[pos].fieldId == fieldId) + break; + } + return (pos >= DEVICE_CLS_ASSIGN_LIST_LEN) ? NULL : stateClasses[deviceFieldAssignment[pos].stateClsId]; +} \ No newline at end of file diff --git a/tools/esp8266/app.h b/tools/esp8266/app.h index ef14b9b2..46c6ba67 100644 --- a/tools/esp8266/app.h +++ b/tools/esp8266/app.h @@ -76,6 +76,7 @@ class app : public Main { void updateCrc(void); void sendMqttDiscoveryConfig(void); const char* getFieldDeviceClass(uint8_t fieldId); + const char* getFieldStateClass(uint8_t fieldId); uint64_t Serial2u64(const char *val) { char tmp[3] = {0}; diff --git a/tools/esp8266/hmDefines.h b/tools/esp8266/hmDefines.h index 8269f270..4411a589 100644 --- a/tools/esp8266/hmDefines.h +++ b/tools/esp8266/hmDefines.h @@ -30,24 +30,28 @@ const char* const fields[] = {"U_DC", "I_DC", "P_DC", "YieldDay", "YieldWeek", " // mqtt discovery device classes enum {DEVICE_CLS_NONE = 0, DEVICE_CLS_CURRENT, DEVICE_CLS_ENERGY, DEVICE_CLS_PWR, DEVICE_CLS_VOLTAGE, DEVICE_CLS_FREQ, DEVICE_CLS_TEMP}; const char* const deviceClasses[] = {0, "current", "energy", "power", "voltage", "frequency", "temperature"}; +enum {STATE_CLS_NONE = 0, STATE_CLS_MEASUREMENT, STATE_CLS_TOTAL_INCREASING}; +const char* const stateClasses[] = {0, "measurement", "total_increasing"}; typedef struct { - uint8_t fieldId; // field id + uint8_t fieldId; // field id uint8_t deviceClsId; // device class + uint8_t stateClsId; // state class } byteAssign_fieldDeviceClass; const byteAssign_fieldDeviceClass deviceFieldAssignment[] = { - {FLD_UDC, DEVICE_CLS_VOLTAGE}, - {FLD_IDC, DEVICE_CLS_CURRENT}, - {FLD_PDC, DEVICE_CLS_PWR}, - {FLD_YD, DEVICE_CLS_ENERGY}, - {FLD_YW, DEVICE_CLS_ENERGY}, - {FLD_YT, DEVICE_CLS_ENERGY}, - {FLD_UAC, DEVICE_CLS_VOLTAGE}, - {FLD_IAC, DEVICE_CLS_CURRENT}, - {FLD_PAC, DEVICE_CLS_PWR}, - {FLD_F, DEVICE_CLS_FREQ}, - {FLD_T, DEVICE_CLS_TEMP}, - {FLD_EFF, DEVICE_CLS_NONE}, - {FLD_IRR, DEVICE_CLS_NONE} + {FLD_UDC, DEVICE_CLS_VOLTAGE, STATE_CLS_MEASUREMENT}, + {FLD_IDC, DEVICE_CLS_CURRENT, STATE_CLS_MEASUREMENT}, + {FLD_PDC, DEVICE_CLS_PWR, STATE_CLS_MEASUREMENT}, + {FLD_YD, DEVICE_CLS_ENERGY, STATE_CLS_TOTAL_INCREASING}, + {FLD_YW, DEVICE_CLS_ENERGY, STATE_CLS_TOTAL_INCREASING}, + {FLD_YT, DEVICE_CLS_ENERGY, STATE_CLS_TOTAL_INCREASING}, + {FLD_UAC, DEVICE_CLS_VOLTAGE, STATE_CLS_MEASUREMENT}, + {FLD_IAC, DEVICE_CLS_CURRENT, STATE_CLS_MEASUREMENT}, + {FLD_PAC, DEVICE_CLS_PWR, STATE_CLS_MEASUREMENT}, + {FLD_F, DEVICE_CLS_FREQ, STATE_CLS_NONE}, + {FLD_T, DEVICE_CLS_TEMP, STATE_CLS_MEASUREMENT}, + {FLD_PCT, DEVICE_CLS_NONE, STATE_CLS_NONE}, + {FLD_EFF, DEVICE_CLS_NONE, STATE_CLS_NONE}, + {FLD_IRR, DEVICE_CLS_NONE, STATE_CLS_NONE} }; #define DEVICE_CLS_ASSIGN_LIST_LEN (sizeof(deviceFieldAssignment) / sizeof(byteAssign_fieldDeviceClass))