Add energy sensors to MQTT + HA discovery for active power, reactive power, power factor (#1102)

* HASS discovery energy stats fixed except energycounter_clear_date

* HASS: add friendly entity names, remove timestamp class from energycounter_clear_date as workaround for hass-incompatible date format

* HA energycounter_clear_date fixed for correct interpreting as home assistant timestamp sensor

* refactor HA power sensors discovery info

* refactor HA power sensors discovery more

* add apparent power, reactive power, power factor to mqtt + hass discovery, refactor some vars into new energy_sensors[] struct

* amend hass sensor unique_ids due to mqtt topic/channel too long; 'Error:MQTT:Unable to queue! Topic (13), channel (66) or value (437) exceeds size limit'

* hass sensors: add 'energy 2 days ago', 'energy 3 days ago', 'uptime'
web UI: energy sensors apply their rounding setting
drv_bl_shared.c: add enum for daily_stats[], put rearrange energy_sensor[] struct to expose only names via DRV_GetEnergySensorNames()

* -HA energy sensor uniq_id values made consistent with prior builds via .hass_uniq_id_suffix
-Refactor drv_bl_shared sensor/counter vars into energy_sensors[] to simplify mqtt transmissions etc
-Add energy '2 days ago'/'3 days ago' to main web ui, data from vars already being saved to/from flash
-NTP fix html formatting in web ui

* -HA energy sensor uniq_id values made consistent with prior builds via .hass_uniq_id_suffix
-Refactor drv_bl_shared sensor/counter vars into energy_sensors[] to simplify mqtt transmissions etc
-Add energy '2 days ago'/'3 days ago' to main web ui, data from vars already being saved to/from flash
-NTP fix html formatting in web ui

* Update settings.json

ignore vscode settings...

* Update settings.json

* Update settings.json

* minor fix

* fix OBK_CONSUMPTION_LAST_HOUR missing from mqtt

---------

Co-authored-by: Stefan Smith <stefan064>
This commit is contained in:
stefan064
2024-03-02 17:55:01 +11:00
committed by GitHub
parent d4ec659cc0
commit 29cc2cc323
10 changed files with 320 additions and 464 deletions

View File

@ -193,17 +193,14 @@ static int http_tasmota_json_power(void* request, jsonCb_t printer) {
{"StatusSNS":{"Time":"2022-07-30T10:11:26","ENERGY":{"TotalStartTime":"2022-05-12T10:56:31","Total":0.003,"Yesterday":0.003,"Today":0.000,"Power": 0,"ApparentPower": 0,"ReactivePower": 0,"Factor":0.00,"Voltage":236,"Current":0.000}}}
*/
// returns NaN values as 0
static float _getReading_NanToZero(energySensor_t type) {
float retval = DRV_GetReading(type);
return OBK_IS_NAN(retval) ? 0 : retval;
}
static int http_tasmota_json_ENERGY(void* request, jsonCb_t printer) {
float power, voltage, current, batterypercentage = 0;
float energy, energy_hour, energy_yesterday;
voltage = DRV_GetReading(OBK_VOLTAGE);
current = DRV_GetReading(OBK_CURRENT);
power = DRV_GetReading(OBK_POWER);
energy = DRV_GetReading(OBK_CONSUMPTION_TOTAL);
energy_hour = DRV_GetReading(OBK_CONSUMPTION_LAST_HOUR);
energy_yesterday = DRV_GetReading(OBK_CONSUMPTION_YESTERDAY);
float voltage, batterypercentage = 0;
if (DRV_IsMeasuringBattery()) {
#ifdef ENABLE_DRIVER_BATTERY
@ -211,33 +208,22 @@ static int http_tasmota_json_ENERGY(void* request, jsonCb_t printer) {
batterypercentage = Battery_lastreading(OBK_BATT_LEVEL);
#endif
printer(request, "{");
printer(request, "\"Voltage\":%.4f,", voltage);
printer(request, "\"Voltage\":%.4f,", _getReading_NanToZero(OBK_VOLTAGE));
printer(request, "\"Batterypercentage\":%.0f", batterypercentage);
// close ENERGY block
printer(request, "}");
}
else {
// following check will clear NaN values
if (OBK_IS_NAN(energy)) {
energy = 0;
}
if (OBK_IS_NAN(energy_hour)) {
energy_hour = 0;
}
if (OBK_IS_NAN(energy_yesterday)) {
energy_yesterday = 0;
}
printer(request, "{");
printer(request, "\"Power\": %f,", power);
printer(request, "\"ApparentPower\": %f,", g_apparentPower);
printer(request, "\"ReactivePower\": %f,", g_reactivePower);
printer(request, "\"Factor\":%f,", g_powerFactor);
printer(request, "\"Voltage\":%f,", voltage);
printer(request, "\"Current\":%f,", current);
printer(request, "\"ConsumptionTotal\":%f,", energy);
printer(request, "\"Yesterday\": %f,", energy_yesterday);
printer(request, "\"ConsumptionLastHour\":%f", energy_hour);
printer(request, "\"Power\": %f,", _getReading_NanToZero(OBK_POWER));
printer(request, "\"ApparentPower\": %f,", _getReading_NanToZero(OBK_POWER_APPARENT));
printer(request, "\"ReactivePower\": %f,", _getReading_NanToZero(OBK_POWER_REACTIVE));
printer(request, "\"Factor\":%f,", _getReading_NanToZero(OBK_POWER_FACTOR));
printer(request, "\"Voltage\":%f,", _getReading_NanToZero(OBK_VOLTAGE));
printer(request, "\"Current\":%f,", _getReading_NanToZero(OBK_CURRENT));
printer(request, "\"ConsumptionTotal\":%f,", _getReading_NanToZero(OBK_CONSUMPTION_TOTAL));
printer(request, "\"Yesterday\": %f,", _getReading_NanToZero(OBK_CONSUMPTION_YESTERDAY));
printer(request, "\"ConsumptionLastHour\":%f", _getReading_NanToZero(OBK_CONSUMPTION_LAST_HOUR));
// close ENERGY block
printer(request, "}");
}