mirror of
https://github.com/lumapu/ahoy.git
synced 2025-05-10 23:46:37 +02:00
Implement state class for mqtt discovery.
This commit is contained in:
parent
6e34b4adf9
commit
3b7eb9c58b
3 changed files with 32 additions and 14 deletions
|
@ -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(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));
|
snprintf(uniq_id, 32, "ch%d_%s", iv->assign[i].ch, iv->getFieldName(i));
|
||||||
const char* devCls = getFieldDeviceClass(iv->assign[i].fieldId);
|
const char* devCls = getFieldDeviceClass(iv->assign[i].fieldId);
|
||||||
|
const char* stateCls = getFieldStateClass(iv->assign[i].fieldId);
|
||||||
|
|
||||||
doc["name"] = name;
|
doc["name"] = name;
|
||||||
doc["stat_t"] = stateTopic;
|
doc["stat_t"] = stateTopic;
|
||||||
|
@ -941,6 +942,9 @@ void app::sendMqttDiscoveryConfig(void) {
|
||||||
if (devCls != NULL) {
|
if (devCls != NULL) {
|
||||||
doc["dev_cla"] = devCls;
|
doc["dev_cla"] = devCls;
|
||||||
}
|
}
|
||||||
|
if (stateCls != NULL) {
|
||||||
|
doc["stat_cla"] = stateCls;
|
||||||
|
}
|
||||||
|
|
||||||
serializeJson(doc, buffer);
|
serializeJson(doc, buffer);
|
||||||
mMqtt.sendMsg2(discoveryTopic, 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];
|
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];
|
||||||
|
}
|
|
@ -76,6 +76,7 @@ class app : public Main {
|
||||||
void updateCrc(void);
|
void updateCrc(void);
|
||||||
void sendMqttDiscoveryConfig(void);
|
void sendMqttDiscoveryConfig(void);
|
||||||
const char* getFieldDeviceClass(uint8_t fieldId);
|
const char* getFieldDeviceClass(uint8_t fieldId);
|
||||||
|
const char* getFieldStateClass(uint8_t fieldId);
|
||||||
|
|
||||||
uint64_t Serial2u64(const char *val) {
|
uint64_t Serial2u64(const char *val) {
|
||||||
char tmp[3] = {0};
|
char tmp[3] = {0};
|
||||||
|
|
|
@ -30,24 +30,28 @@ const char* const fields[] = {"U_DC", "I_DC", "P_DC", "YieldDay", "YieldWeek", "
|
||||||
// mqtt discovery device classes
|
// 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};
|
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"};
|
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 {
|
typedef struct {
|
||||||
uint8_t fieldId; // field id
|
uint8_t fieldId; // field id
|
||||||
uint8_t deviceClsId; // device class
|
uint8_t deviceClsId; // device class
|
||||||
|
uint8_t stateClsId; // state class
|
||||||
} byteAssign_fieldDeviceClass;
|
} byteAssign_fieldDeviceClass;
|
||||||
const byteAssign_fieldDeviceClass deviceFieldAssignment[] = {
|
const byteAssign_fieldDeviceClass deviceFieldAssignment[] = {
|
||||||
{FLD_UDC, DEVICE_CLS_VOLTAGE},
|
{FLD_UDC, DEVICE_CLS_VOLTAGE, STATE_CLS_MEASUREMENT},
|
||||||
{FLD_IDC, DEVICE_CLS_CURRENT},
|
{FLD_IDC, DEVICE_CLS_CURRENT, STATE_CLS_MEASUREMENT},
|
||||||
{FLD_PDC, DEVICE_CLS_PWR},
|
{FLD_PDC, DEVICE_CLS_PWR, STATE_CLS_MEASUREMENT},
|
||||||
{FLD_YD, DEVICE_CLS_ENERGY},
|
{FLD_YD, DEVICE_CLS_ENERGY, STATE_CLS_TOTAL_INCREASING},
|
||||||
{FLD_YW, DEVICE_CLS_ENERGY},
|
{FLD_YW, DEVICE_CLS_ENERGY, STATE_CLS_TOTAL_INCREASING},
|
||||||
{FLD_YT, DEVICE_CLS_ENERGY},
|
{FLD_YT, DEVICE_CLS_ENERGY, STATE_CLS_TOTAL_INCREASING},
|
||||||
{FLD_UAC, DEVICE_CLS_VOLTAGE},
|
{FLD_UAC, DEVICE_CLS_VOLTAGE, STATE_CLS_MEASUREMENT},
|
||||||
{FLD_IAC, DEVICE_CLS_CURRENT},
|
{FLD_IAC, DEVICE_CLS_CURRENT, STATE_CLS_MEASUREMENT},
|
||||||
{FLD_PAC, DEVICE_CLS_PWR},
|
{FLD_PAC, DEVICE_CLS_PWR, STATE_CLS_MEASUREMENT},
|
||||||
{FLD_F, DEVICE_CLS_FREQ},
|
{FLD_F, DEVICE_CLS_FREQ, STATE_CLS_NONE},
|
||||||
{FLD_T, DEVICE_CLS_TEMP},
|
{FLD_T, DEVICE_CLS_TEMP, STATE_CLS_MEASUREMENT},
|
||||||
{FLD_EFF, DEVICE_CLS_NONE},
|
{FLD_PCT, DEVICE_CLS_NONE, STATE_CLS_NONE},
|
||||||
{FLD_IRR, DEVICE_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))
|
#define DEVICE_CLS_ASSIGN_LIST_LEN (sizeof(deviceFieldAssignment) / sizeof(byteAssign_fieldDeviceClass))
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue