Some changes after testing new HA features

This commit is contained in:
Gunnar Skjold 2023-04-01 10:43:55 +02:00
parent c456e3fdf1
commit ea43b2b632
2 changed files with 50 additions and 39 deletions

View File

@ -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

View File

@ -11,6 +11,10 @@
#include "json/hadiscover_json.h"
#include "json/realtime_json.h"
#if defined(ESP32)
#include <esp_task_wdt.h>
#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);