diff --git a/src/driver/drv_bl_shared.c b/src/driver/drv_bl_shared.c index effae6af3..fa017a014 100644 --- a/src/driver/drv_bl_shared.c +++ b/src/driver/drv_bl_shared.c @@ -759,8 +759,16 @@ void BL_ProcessUpdate(float voltage, float current, float power, BL_ChangeEnergyUnitIfNeeded(dailyStats[0]), roundingPrecision[PRECISION_ENERGY],0); stat_updatesSent++; ltm = gmtime(&ConsumptionResetTime); - snprintf(datetime,sizeof(datetime), "%04i-%02i-%02i %02i:%02i:%02i", - ltm->tm_year+1900, ltm->tm_mon+1, ltm->tm_mday, ltm->tm_hour, ltm->tm_min, ltm->tm_sec); + if (NTP_GetTimesZoneOfsSeconds()>0) + { + snprintf(datetime,sizeof(datetime), "%04i-%02i-%02iT%02i:%02i+%02i:%02i", + ltm->tm_year+1900, ltm->tm_mon+1, ltm->tm_mday, ltm->tm_hour, ltm->tm_min, + NTP_GetTimesZoneOfsSeconds()/3600, (NTP_GetTimesZoneOfsSeconds()/60) % 60); + } else { + snprintf(datetime, sizeof(datetime), "%04i-%02i-%02iT%02i:%02i-%02i:%02i", + ltm->tm_year+1900, ltm->tm_mon+1, ltm->tm_mday, ltm->tm_hour, ltm->tm_min, + abs(NTP_GetTimesZoneOfsSeconds()/3600), (abs(NTP_GetTimesZoneOfsSeconds())/60) % 60); + } MQTT_PublishMain_StringString(counter_mqttNames[5], datetime, 0); stat_updatesSent++; } diff --git a/src/driver/drv_main.c b/src/driver/drv_main.c index 06f4550d5..b5242175d 100644 --- a/src/driver/drv_main.c +++ b/src/driver/drv_main.c @@ -50,6 +50,18 @@ const char* counter_devClasses[OBK_NUM_COUNTERS] = { "timestamp" }; +const char* sensor_hassNames[OBK_NUM_EMUNS_MAX] = { + "Voltage", + "Current", + "Power", + "Energy Total", + "Energy Last Hour", + "Consumption Stats", + "Energy Yesterday", + "Energy Today", + "Energy Clear Date", +}; + typedef struct driver_s { const char* name; void (*initFunc)(); diff --git a/src/driver/drv_public.h b/src/driver/drv_public.h index 582cfd23b..947f464b0 100644 --- a/src/driver/drv_public.h +++ b/src/driver/drv_public.h @@ -29,6 +29,7 @@ extern const char* sensor_mqtt_device_classes[]; extern const char* sensor_mqtt_device_units[]; extern const char* counter_mqttNames[]; extern const char* counter_devClasses[]; +extern const char* sensor_hassNames[]; extern int g_dhtsCount; void DRV_Generic_Init(); diff --git a/src/httpserver/hass.c b/src/httpserver/hass.c index 4a88ef651..d19d29090 100644 --- a/src/httpserver/hass.c +++ b/src/httpserver/hass.c @@ -52,6 +52,8 @@ void hass_populate_unique_id(ENTITY_TYPE type, int index, char* uniq_id) { case VCP_SENSOR: case POWER_SENSOR: + case ENERGY_SENSOR: + case TIMESTAMP_SENSOR: sprintf(uniq_id, "%s_%s_%d", longDeviceName, "sensor", index); break; @@ -140,6 +142,8 @@ void hass_populate_device_config_channel(ENTITY_TYPE type, char* uniq_id, HassDe case TVOC_SENSOR: case POWER_SENSOR: case VCP_SENSOR: + case ENERGY_SENSOR: + case TIMESTAMP_SENSOR: case BATTERY_SENSOR: case BATTERY_VOLTAGE_SENSOR: case TEMPERATURE_SENSOR: @@ -218,12 +222,9 @@ HassDeviceInfo* hass_init_device_info(ENTITY_TYPE type, int index, const char* p isSensor = true; #ifndef OBK_DISABLE_ALL_DRIVERS if ((index >= OBK_VOLTAGE) && (index <= OBK_POWER)) - sprintf(g_hassBuffer, "%s", sensor_mqttNames[index]); - else if ((index >= OBK_CONSUMPTION_TOTAL) && (index <= OBK_CONSUMPTION_STATS)) - sprintf(g_hassBuffer, "%s", counter_mqttNames[index - OBK_CONSUMPTION_TOTAL]); + sprintf(g_hassBuffer, "%s", sensor_hassNames[index]); else - sprintf(g_hassBuffer, "Power"); - + sprintf(g_hassBuffer, "Voltage or Current or Power"); #endif break; case POWER_SENSOR: @@ -270,6 +271,23 @@ HassDeviceInfo* hass_init_device_info(ENTITY_TYPE type, int index, const char* p case HASS_RSSI: sprintf(g_hassBuffer, "RSSI"); break; + case ENERGY_SENSOR: + isSensor = true; +#ifndef OBK_DISABLE_ALL_DRIVERS + if ((index >= OBK_CONSUMPTION_TOTAL) && (index <= OBK_CONSUMPTION_TODAY)) + sprintf(g_hassBuffer, "%s", sensor_hassNames[index]); + else + sprintf(g_hassBuffer, "Energy"); +#endif + break; + case TIMESTAMP_SENSOR: +#ifndef OBK_DISABLE_ALL_DRIVERS + if (index == OBK_CONSUMPTION_CLEAR_DATE) + sprintf(g_hassBuffer, "%s", sensor_hassNames[index]); + else + sprintf(g_hassBuffer, "Timestamp"); +#endif + break; default: sprintf(g_hassBuffer, "%s", CHANNEL_GetLabel(index)); break; @@ -430,21 +448,24 @@ HassDeviceInfo* hass_init_power_sensor_device_info(int index) { cJSON_AddStringToObject(info->root, "stat_cla", "measurement"); } - else if ((index >= OBK_CONSUMPTION_TOTAL) && (index <= OBK_CONSUMPTION_STATS)) + else if ((index >= OBK_CONSUMPTION_TOTAL) && (index <= OBK_NUM_EMUNS_MAX)) { - info = hass_init_device_info(VCP_SENSOR, index, NULL, NULL); + if (index >= OBK_CONSUMPTION_YESTERDAY && !DRV_IsRunning("NTP")) return info; //include daily stats only when time is valid + + info = hass_init_device_info(index == OBK_CONSUMPTION_CLEAR_DATE ? TIMESTAMP_SENSOR : ENERGY_SENSOR, index, NULL, NULL); const char* device_class_value = counter_devClasses[index - OBK_CONSUMPTION_TOTAL]; if (strlen(device_class_value) > 0) { - cJSON_AddStringToObject(info->root, "dev_cla", device_class_value); //device_class=energy - if (CFG_HasFlag(OBK_FLAG_MQTT_ENERGY_IN_KWH)) { - cJSON_AddStringToObject(info->root, "unit_of_meas", "kWh"); //unit_of_measurement + cJSON_AddStringToObject(info->root, "dev_cla", device_class_value); //device_class=energy,timestamp + if (!strcmp(device_class_value, "energy")) { + if (CFG_HasFlag(OBK_FLAG_MQTT_ENERGY_IN_KWH)) { + cJSON_AddStringToObject(info->root, "unit_of_meas", "kWh"); //unit_of_measurement + } + else { + cJSON_AddStringToObject(info->root, "unit_of_meas", "Wh"); //unit_of_measurement + } + //state_class can be measurement, total or total_increasing. Energy values should be total_increasing. + cJSON_AddStringToObject(info->root, "stat_cla", "total_increasing"); } - else { - cJSON_AddStringToObject(info->root, "unit_of_meas", "Wh"); //unit_of_measurement - } - - //state_class can be measurement, total or total_increasing. Energy values should be total_increasing. - cJSON_AddStringToObject(info->root, "stat_cla", "total_increasing"); } sprintf(g_hassBuffer, "~/%s/get", counter_mqttNames[index - OBK_CONSUMPTION_TOTAL]); diff --git a/src/httpserver/hass.h b/src/httpserver/hass.h index 6bddb6c12..fecc62065 100644 --- a/src/httpserver/hass.h +++ b/src/httpserver/hass.h @@ -67,9 +67,12 @@ typedef enum { ILLUMINANCE_SENSOR, // dBm unit HASS_RSSI, + /// @brief Wh, kWh ENERGY_SENSOR, // hPa PRESSURE_SENSOR, + /// @Brief Timestamp Sensor + TIMESTAMP_SENSOR, } ENTITY_TYPE;