From ea43b2b632484b1d3d97a08813a9d56b9251c3a5 Mon Sep 17 00:00:00 2001 From: Gunnar Skjold Date: Sat, 1 Apr 2023 10:43:55 +0200 Subject: [PATCH] Some changes after testing new HA features --- .../include/HomeAssistantMqttHandler.h | 60 +++++++++---------- .../src/HomeAssistantMqttHandler.cpp | 29 ++++++--- 2 files changed, 50 insertions(+), 39 deletions(-) diff --git a/lib/HomeAssistantMqttHandler/include/HomeAssistantMqttHandler.h b/lib/HomeAssistantMqttHandler/include/HomeAssistantMqttHandler.h index 6bb7f367..676cf371 100644 --- a/lib/HomeAssistantMqttHandler/include/HomeAssistantMqttHandler.h +++ b/lib/HomeAssistantMqttHandler/include/HomeAssistantMqttHandler.h @@ -10,7 +10,6 @@ public: HomeAssistantMqttHandler(MQTTClient* mqtt, char* buf, const char* clientId, const char* topic, uint8_t boardType, HomeAssistantConfig config, HwTools* hw) : AmsMqttHandler(mqtt, buf) { this->clientId = clientId; this->topic = String(topic); - this->config = config; this->hw = hw; l1Init = l2Init = l2eInit = l3Init = l3eInit = l4Init = l4eInit = rtInit = rteInit = pInit = sInit = false; @@ -20,7 +19,7 @@ public: snprintf_P(buf, 128, PSTR("[%s] "), config.discoveryNameTag); sensorNamePrefix = String(buf); } else { - deviceName = "AMS reader"; + deviceName = F("AMS reader"); sensorNamePrefix = ""; } deviceModel = boardTypeToString(boardType); @@ -50,7 +49,7 @@ public: snprintf_P(buf, 128, PSTR("%s/sensor/"), config.discoveryPrefix); discoveryTopic = String(buf); } else { - discoveryTopic = "homeassistant/sensor/"; + discoveryTopic = F("homeassistant/sensor/"); } }; bool publish(AmsData* data, AmsData* previousState, EnergyAccounting* ea, EntsoeApi* eapi); @@ -74,7 +73,6 @@ public: void publishSystemSensors(); private: - HomeAssistantConfig config; String deviceName; String deviceModel; String deviceUid; @@ -96,70 +94,70 @@ private: switch(b) { case 5: #if defined(ESP8266) - return "Pow-K"; + return F("Pow-K"); #elif defined(ESP32) - return "Pow-K+"; + return F("Pow-K+"); #endif case 7: #if defined(ESP8266) - return "Pow-U"; + return F("Pow-U"); #elif defined(ESP32) - return "Pow-U+"; + return F("Pow-U+"); #endif case 6: - return "Pow-P1"; + return F("Pow-P1"); case 51: - return "S2 mini"; + return F("S2 mini"); case 50: - return "ESP32-S2"; + return F("ESP32-S2"); case 201: - return "LOLIN D32"; + return F("LOLIN D32"); case 202: - return "HUZZAH32"; + return F("HUZZAH32"); case 203: - return "DevKitC"; + return F("DevKitC"); case 200: - return "ESP32"; + return F("ESP32"); case 2: - return "HAN Reader 2.0 by Max Spencer"; + return F("HAN Reader 2.0 by Max Spencer"); case 0: - return "Custom hardware by Roar Fredriksen"; + return F("Custom hardware by Roar Fredriksen"); case 1: - return "Kamstrup module by Egil Opsahl"; + return F("Kamstrup module by Egil Opsahl"); case 3: - return "Pow-K"; + return F("Pow-K"); case 4: - return "Pow-U"; + return F("Pow-U"); case 101: - return "D1 mini"; + return F("D1 mini"); case 100: - return "ESP8266"; + return F("ESP8266"); case 70: - return "ESP32-C3"; + return F("ESP32-C3"); case 71: - return "ESP32-C3-DevKitM-1"; + return F("ESP32-C3-DevKitM-1"); } #if defined(ESP8266) - return "ESP8266"; + return F("ESP8266"); #elif defined(ESP32) - return "ESP32"; + return F("ESP32"); #endif }; String boardManufacturerToString(uint8_t b) { if(b >= 3 && b <= 7) - return "amsleser.no"; + return F("amsleser.no"); if(b < 50) - return "Custom"; + return F("Custom"); switch(b) { case 51: case 101: case 201: - return "Wemos"; + return F("Wemos"); case 202: - return "Adafruit"; + return F("Adafruit"); } - return "Espressif"; + return F("Espressif"); }; }; #endif diff --git a/lib/HomeAssistantMqttHandler/src/HomeAssistantMqttHandler.cpp b/lib/HomeAssistantMqttHandler/src/HomeAssistantMqttHandler.cpp index 0aa3e2ee..0a6a3054 100644 --- a/lib/HomeAssistantMqttHandler/src/HomeAssistantMqttHandler.cpp +++ b/lib/HomeAssistantMqttHandler/src/HomeAssistantMqttHandler.cpp @@ -11,6 +11,10 @@ #include "json/hadiscover_json.h" #include "json/realtime_json.h" +#if defined(ESP32) +#include +#endif + bool HomeAssistantMqttHandler::publish(AmsData* data, AmsData* previousState, EnergyAccounting* ea, EntsoeApi* eapi) { if(topic.isEmpty() || !mqtt->connected()) return false; @@ -27,6 +31,7 @@ bool HomeAssistantMqttHandler::publish(AmsData* data, AmsData* previousState, En ); mqtt->publish(topic + "/energy", json); mqtt->loop(); + delay(10); } String meterModel = data->getMeterModel(); meterModel.replace("\\", "\\\\"); @@ -126,7 +131,7 @@ bool HomeAssistantMqttHandler::publishTemperatures(AmsConfiguration* config, HwT int size = 32 + (count * 26); char buf[size]; - snprintf(buf, 24, "{\"temperatures\":{"); + snprintf_P(buf, 24, PSTR("{\"temperatures\":{")); for(int i = 0; i < count; i++) { TempSensorData* data = hw->getTempSensorData(i); @@ -143,7 +148,7 @@ bool HomeAssistantMqttHandler::publishTemperatures(AmsConfiguration* config, HwT } } char* pos = buf+strlen(buf); - snprintf(count == 0 ? pos : pos-1, 8, "}}"); + snprintf_P(count == 0 ? pos : pos-1, 8, PSTR("}}")); return mqtt->publish(topic + "/temperatures", buf); } @@ -214,7 +219,7 @@ bool HomeAssistantMqttHandler::publishPrices(EntsoeApi* eapi) { //Serial.printf("1hr: %d %lu\n", min1hrIdx, ts); tmElements_t tm; breakTime(ts, tm); - sprintf(ts1hr, "%04d-%02d-%02dT%02d:00:00Z", tm.Year+1970, tm.Month, tm.Day, tm.Hour); + sprintf_P(ts1hr, PSTR("%04d-%02d-%02dT%02d:00:00Z"), tm.Year+1970, tm.Month, tm.Day, tm.Hour); } char ts3hr[24]; memset(ts3hr, 0, 24); @@ -223,7 +228,7 @@ bool HomeAssistantMqttHandler::publishPrices(EntsoeApi* eapi) { //Serial.printf("3hr: %d %lu\n", min3hrIdx, ts); tmElements_t tm; breakTime(ts, tm); - sprintf(ts3hr, "%04d-%02d-%02dT%02d:00:00Z", tm.Year+1970, tm.Month, tm.Day, tm.Hour); + sprintf_P(ts3hr, PSTR("%04d-%02d-%02dT%02d:00:00Z"), tm.Year+1970, tm.Month, tm.Day, tm.Hour); } char ts6hr[24]; memset(ts6hr, 0, 24); @@ -232,7 +237,7 @@ bool HomeAssistantMqttHandler::publishPrices(EntsoeApi* eapi) { //Serial.printf("6hr: %d %lu\n", min6hrIdx, ts); tmElements_t tm; breakTime(ts, tm); - sprintf(ts6hr, "%04d-%02d-%02dT%02d:00:00Z", tm.Year+1970, tm.Month, tm.Day, tm.Hour); + sprintf_P(ts6hr, PSTR("%04d-%02d-%02dT%02d:00:00Z"), tm.Year+1970, tm.Month, tm.Day, tm.Hour); } snprintf_P(json, BufferSize, JSONPRICES_JSON, @@ -328,6 +333,14 @@ void HomeAssistantMqttHandler::publishSensor(const HomeAssistantSensor& sensor) strlen_P(sensor.stacl) > 0 ? (char *) FPSTR(sensor.stacl) : "" ); mqtt->publish(discoveryTopic + deviceUid + "_" + uid.c_str() + "/config", json, true, 0); + mqtt->loop(); + delay(10); + + #if defined(ESP32) + esp_task_wdt_reset(); + #elif defined(ESP8266) + ESP.wdtFeed(); + #endif } void HomeAssistantMqttHandler::publishList1Sensors() { @@ -390,7 +403,7 @@ void HomeAssistantMqttHandler::publishRealtimeSensors(EnergyAccounting* ea, Ents if(rtInit) return; for(uint8_t i = 0; i < RealtimeSensorCount; i++) { HomeAssistantSensor sensor = RealtimeSensors[i]; - if(strncmp(sensor.devcl, "monetary", 8) == 0) { + if(strncmp_P(sensor.devcl, PSTR("monetary"), 8) == 0) { if(eapi == NULL) continue; sensor.uom = eapi->getCurrency(); } @@ -420,7 +433,7 @@ void HomeAssistantMqttHandler::publishRealtimeExportSensors(EnergyAccounting* ea if(rteInit) return; for(uint8_t i = 0; i < RealtimeExportSensorCount; i++) { HomeAssistantSensor sensor = RealtimeExportSensors[i]; - if(strncmp(sensor.devcl, "monetary", 8) == 0) { + if(strncmp_P(sensor.devcl, PSTR("monetary"), 8) == 0) { if(eapi == NULL) continue; sensor.uom = eapi->getCurrency(); } @@ -460,7 +473,7 @@ void HomeAssistantMqttHandler::publishPriceSensors(EntsoeApi* eapi) { if(!pInit) { for(uint8_t i = 0; i < PriceSensorCount; i++) { HomeAssistantSensor sensor = PriceSensors[i]; - if(strncmp(sensor.devcl, "monetary", 8) == 0) { + if(strncmp_P(sensor.devcl, PSTR("monetary"), 8) == 0) { sensor.uom = uom.c_str(); } publishSensor(sensor);