From 6e3a6f71e2d9774ba080025be5a4771ba5c61696 Mon Sep 17 00:00:00 2001 From: Gunnar Skjold Date: Sat, 23 Dec 2023 18:32:27 +0100 Subject: [PATCH] Fixed buffer issues and ESP8266 HA reboot issue" --- lib/AmsConfiguration/src/AmsConfiguration.cpp | 3 ++ .../include/HomeAssistantMqttHandler.h | 4 +-- .../include/HomeAssistantStatic.h | 2 +- .../src/HomeAssistantMqttHandler.cpp | 34 +++++++++---------- src/AmsToMqttBridge.cpp | 20 +++++++---- 5 files changed, 37 insertions(+), 26 deletions(-) diff --git a/lib/AmsConfiguration/src/AmsConfiguration.cpp b/lib/AmsConfiguration/src/AmsConfiguration.cpp index 36637e84..481fd8eb 100644 --- a/lib/AmsConfiguration/src/AmsConfiguration.cpp +++ b/lib/AmsConfiguration/src/AmsConfiguration.cpp @@ -240,6 +240,9 @@ bool AmsConfiguration::getMeterConfig(MeterConfig& config) { } bool AmsConfiguration::setMeterConfig(MeterConfig& config) { + if(config.bufferSize < 1) config.bufferSize = 1; + if(config.bufferSize > 64) config.bufferSize = 64; + MeterConfig existing; if(getMeterConfig(existing)) { meterChanged |= config.baud != existing.baud; diff --git a/lib/HomeAssistantMqttHandler/include/HomeAssistantMqttHandler.h b/lib/HomeAssistantMqttHandler/include/HomeAssistantMqttHandler.h index 2a1751d8..f4140c47 100644 --- a/lib/HomeAssistantMqttHandler/include/HomeAssistantMqttHandler.h +++ b/lib/HomeAssistantMqttHandler/include/HomeAssistantMqttHandler.h @@ -56,7 +56,7 @@ public: statusTopic = F("homeassistant/status"); discoveryTopic = F("homeassistant/sensor/"); } - strcpy(this->mqttConfig.subscribeTopic, statusTopic.c_str()); +// strcpy(this->mqttConfig.subscribeTopic, statusTopic.c_str()); }; bool publish(AmsData* data, AmsData* previousState, EnergyAccounting* ea, EntsoeApi* eapi); @@ -94,7 +94,7 @@ private: bool publishList4(AmsData* data, EnergyAccounting* ea); String getMeterModel(AmsData* data); bool publishRealtime(AmsData* data, EnergyAccounting* ea, EntsoeApi* eapi); - void publishSensor(const HomeAssistantSensor& sensor); + void publishSensor(const HomeAssistantSensor sensor); void publishList1Sensors(); void publishList1ExportSensors(); void publishList2Sensors(); diff --git a/lib/HomeAssistantMqttHandler/include/HomeAssistantStatic.h b/lib/HomeAssistantMqttHandler/include/HomeAssistantStatic.h index 8709c546..10005a51 100644 --- a/lib/HomeAssistantMqttHandler/include/HomeAssistantStatic.h +++ b/lib/HomeAssistantMqttHandler/include/HomeAssistantStatic.h @@ -7,7 +7,7 @@ struct HomeAssistantSensor { const char* name; const char* topic; const char* path; - const uint16_t ttl; + uint16_t ttl; const char* uom; const char* devcl; const char* stacl; diff --git a/lib/HomeAssistantMqttHandler/src/HomeAssistantMqttHandler.cpp b/lib/HomeAssistantMqttHandler/src/HomeAssistantMqttHandler.cpp index ce89446b..b7a76980 100644 --- a/lib/HomeAssistantMqttHandler/src/HomeAssistantMqttHandler.cpp +++ b/lib/HomeAssistantMqttHandler/src/HomeAssistantMqttHandler.cpp @@ -23,24 +23,24 @@ bool HomeAssistantMqttHandler::publish(AmsData* data, AmsData* previousState, En if(time(nullptr) < FirmwareVersion::BuildEpoch) return false; - if(data->getListType() >= 3) { // publish energy counts - publishList3(data, ea); - loop(); - } +// if(data->getListType() >= 3) { // publish energy counts +// publishList3(data, ea); +// loop(); +// } - if(data->getListType() == 1) { // publish power counts - publishList1(data, ea); - } else if(data->getListType() <= 3) { // publish power counts and volts/amps - publishList2(data, ea); - } else if(data->getListType() == 4) { // publish power counts and volts/amps/phase power and PF - publishList4(data, ea); - } +// if(data->getListType() == 1) { // publish power counts +// publishList1(data, ea); +// } else if(data->getListType() <= 3) { // publish power counts and volts/amps +// publishList2(data, ea); +// } else if(data->getListType() == 4) { // publish power counts and volts/amps/phase power and PF +// publishList4(data, ea); +// } loop(); - if(ea->isInitialized()) { - publishRealtime(data, ea, eapi); - loop(); - } +// if(ea->isInitialized()) { +// publishRealtime(data, ea, eapi); +// loop(); +// } return true; } @@ -319,7 +319,7 @@ bool HomeAssistantMqttHandler::publishPrices(EntsoeApi* eapi) { bool HomeAssistantMqttHandler::publishSystem(HwTools* hw, EntsoeApi* eapi, EnergyAccounting* ea) { if(topic.isEmpty() || !mqtt.connected()) return false; - + publishSystemSensors(); if(hw->getTemperature() > -50) publishTemperatureSensor(0, ""); @@ -337,7 +337,7 @@ bool HomeAssistantMqttHandler::publishSystem(HwTools* hw, EntsoeApi* eapi, Energ return ret; } -void HomeAssistantMqttHandler::publishSensor(const HomeAssistantSensor& sensor) { +void HomeAssistantMqttHandler::publishSensor(const HomeAssistantSensor sensor) { String uid = String(sensor.path); uid.replace(".", ""); uid.replace("[", ""); diff --git a/src/AmsToMqttBridge.cpp b/src/AmsToMqttBridge.cpp index 449c90da..8a8d7ed1 100644 --- a/src/AmsToMqttBridge.cpp +++ b/src/AmsToMqttBridge.cpp @@ -788,8 +788,8 @@ void handleSystem(unsigned long now) { // After one hour, adjust buffer size to match the largest payload if(!maxDetectPayloadDetectDone && now > 3600000) { - if(maxDetectedPayloadSize * 1.5 > meterConfig.bufferSize * 64) { - int bufferSize = min((double) 64, ceil((maxDetectedPayloadSize * 1.5) / 64)); + if(maxDetectedPayloadSize * 1.25 > meterConfig.bufferSize * 64) { + int bufferSize = min((double) 64, ceil((maxDetectedPayloadSize * 1.25) / 64)); #if defined(ESP8266) if(gpioConfig.hanPin != 3 && gpioConfig.hanPin != 113) { bufferSize = min(bufferSize, 2); @@ -1010,6 +1010,7 @@ void setupHanPort(GpioConfig& gpioConfig, uint32_t baud, uint8_t parityOrdinal, } if(meterConfig.bufferSize < 1) meterConfig.bufferSize = 1; + if(meterConfig.bufferSize > 64) meterConfig.bufferSize = 64; if(hwSerial != NULL) { debugD_P(PSTR("Hardware serial")); @@ -1035,6 +1036,7 @@ void setupHanPort(GpioConfig& gpioConfig, uint32_t baud, uint8_t parityOrdinal, } if(meterConfig.bufferSize < 4) meterConfig.bufferSize = 4; // 64 bytes (1) is default for software serial, 256 bytes (4) for hardware + debugD_P(PSTR("Using serial buffer size %d"), 64 * meterConfig.bufferSize); hwSerial->setRxBufferSize(64 * meterConfig.bufferSize); #if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C3) hwSerial->begin(baud, serialConfig, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, invert); @@ -1107,10 +1109,12 @@ void setupHanPort(GpioConfig& gpioConfig, uint32_t baud, uint8_t parityOrdinal, break; } + uint8_t bufferSize = meterConfig.bufferSize; #if defined(ESP8266) - if(meterConfig.bufferSize > 2) meterConfig.bufferSize = 2; + if(bufferSize > 2) bufferSize = 2; #endif - swSerial->begin(baud, serialConfig, pin, -1, invert, meterConfig.bufferSize * 64); + debugD_P(PSTR("Using serial buffer size %d"), 64 * bufferSize); + swSerial->begin(baud, serialConfig, pin, -1, invert, bufferSize * 64); hanSerial = swSerial; Serial.end(); @@ -1121,7 +1125,7 @@ void setupHanPort(GpioConfig& gpioConfig, uint32_t baud, uint8_t parityOrdinal, if(hanBuffer != NULL) { free(hanBuffer); } - hanBufferSize = 64 * meterConfig.bufferSize * 2; + hanBufferSize = max(64 * meterConfig.bufferSize * 2, 1280); hanBuffer = (uint8_t*) malloc(hanBufferSize); // The library automatically sets the pullup in Serial.begin() @@ -1258,6 +1262,10 @@ bool readHanPort() { hanSerial->readBytes(hanBuffer, hanBufferSize); len = 0; debugI_P(PSTR("Buffer overflow, resetting")); + #if defined(ESP32) + meterConfig.bufferSize += 4; + config.setMeterConfig(meterConfig); + #endif return false; } hanBuffer[len++] = hanSerial->read(); @@ -1848,7 +1856,7 @@ int16_t unwrapData(uint8_t *buf, DataParserContext &context) { return DATA_PARSE_UNKNOWN_DATA; } -unsigned long lastMqttRetry = -10000; +unsigned long lastMqttRetry = -20000; void MQTT_connect() { if(millis() - lastMqttRetry < (config.isMqttChanged() ? 5000 : 30000)) { yield();