From 50c06e2cfe19b03b537725ab0f1790bd347ff667 Mon Sep 17 00:00:00 2001 From: Gunnar Skjold Date: Sun, 16 Jan 2022 19:38:35 +0100 Subject: [PATCH 1/4] Removed ap pin from generic ESP32 --- src/web/AmsWebServer.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/web/AmsWebServer.cpp b/src/web/AmsWebServer.cpp index b854bbfd..8e107771 100644 --- a/src/web/AmsWebServer.cpp +++ b/src/web/AmsWebServer.cpp @@ -1040,7 +1040,6 @@ void AmsWebServer::handleSetup() { break; case 200: // ESP32 gpioConfig->hanPin = 16; - gpioConfig->apPin = 0; gpioConfig->ledPin = 2; gpioConfig->ledInverted = false; break; From 7b203b196f79856c212c1551b847405e6d8e2806 Mon Sep 17 00:00:00 2001 From: Gunnar Skjold Date: Fri, 21 Jan 2022 17:50:02 +0100 Subject: [PATCH 2/4] Fixed voltage and current labels for esp8266 --- src/web/AmsWebServer.cpp | 6 +++--- web/data.json | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/web/AmsWebServer.cpp b/src/web/AmsWebServer.cpp index b854bbfd..582dfb88 100644 --- a/src/web/AmsWebServer.cpp +++ b/src/web/AmsWebServer.cpp @@ -757,7 +757,7 @@ void AmsWebServer::dataJson() { if(eapi != NULL && strlen(eapi->getToken()) > 0) price = eapi->getValueForHour(0); - char json[384]; + char json[512]; snprintf_P(json, sizeof(json), DATA_JSON, maxPwr == 0 ? meterState->isThreePhase() ? 20000 : 10000 : maxPwr, meterConfig->productionCapacity, @@ -791,9 +791,9 @@ void AmsWebServer::dataJson() { mqttStatus, mqtt == NULL ? 0 : (int) mqtt->lastError(), price == ENTSOE_NO_VALUE ? "null" : String(price, 2).c_str(), - time(nullptr), meterState->getMeterType(), - meterConfig->distributionSystem + meterConfig->distributionSystem, + (uint32_t) time(nullptr) ); server.sendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); diff --git a/web/data.json b/web/data.json index d48cc336..d7dcea9b 100644 --- a/web/data.json +++ b/web/data.json @@ -31,7 +31,7 @@ "mm" : %d, "me" : %d, "p" : %s, - "c" : %lu, "mt" : %d, - "ds" : %d + "ds" : %d, + "c" : %lu } \ No newline at end of file From c0a9a01b41f91bc7317098fab89a10d40116a1cf Mon Sep 17 00:00:00 2001 From: Gunnar Skjold Date: Fri, 21 Jan 2022 17:57:01 +0100 Subject: [PATCH 3/4] Fixed uint problem with current --- src/IEC6205675.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/IEC6205675.cpp b/src/IEC6205675.cpp index 3f7d5935..4cdee6ac 100644 --- a/src/IEC6205675.cpp +++ b/src/IEC6205675.cpp @@ -471,9 +471,8 @@ double IEC6205675::getNumber(CosemData* item) { break; } case CosemTypeLongSigned: { - uint16_t u16 = ntohs(item->lu.data); // ntohs only works for uint16 ? - int16_t i16 = u16; // Cast to int16 before use? - ret = i16; // Who knows, got to try it all... + int16_t i16 = ntohs(item->ls.data); + ret = i16; pos += 3; break; } From 6aa02d54c825dcafc79d98002b4b657befcea8df Mon Sep 17 00:00:00 2001 From: Gunnar Skjold Date: Sun, 23 Jan 2022 17:52:10 +0100 Subject: [PATCH 4/4] Improvements for ENTSO-E --- src/AmsConfiguration.cpp | 3 +++ src/AmsToMqttBridge.ino | 8 ++++++-- src/entsoe/DnbCurrParser.cpp | 1 + src/entsoe/EntsoeA44Parser.cpp | 2 ++ src/entsoe/EntsoeApi.cpp | 15 ++++++++++++--- src/web/AmsWebServer.cpp | 1 - 6 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/AmsConfiguration.cpp b/src/AmsConfiguration.cpp index 919dd102..62819081 100644 --- a/src/AmsConfiguration.cpp +++ b/src/AmsConfiguration.cpp @@ -451,6 +451,9 @@ bool AmsConfiguration::getEntsoeConfig(EntsoeConfig& config) { EEPROM.begin(EEPROM_SIZE); EEPROM.get(CONFIG_ENTSOE_START, config); EEPROM.end(); + if(strlen(config.token) != 0 && strlen(config.token) != 36) { + clearEntsoe(config); + } return true; } else { return false; diff --git a/src/AmsToMqttBridge.ino b/src/AmsToMqttBridge.ino index 3bc5f680..f057bbdd 100644 --- a/src/AmsToMqttBridge.ino +++ b/src/AmsToMqttBridge.ino @@ -18,7 +18,7 @@ ADC_MODE(ADC_VCC); #if defined(ESP32) #include #endif -#define WDT_TIMEOUT 10 +#define WDT_TIMEOUT 30 #include "AmsToMqttBridge.h" #include "AmsStorage.h" @@ -137,12 +137,14 @@ void setup() { hw.ledBlink(LED_GREEN, 1); hw.ledBlink(LED_BLUE, 1); + #if defined(ESP32) EntsoeConfig entsoe; if(config.getEntsoeConfig(entsoe) && strlen(entsoe.token) > 0) { eapi = new EntsoeApi(&Debug); eapi->setup(entsoe); ws.setEntsoeApi(eapi); } + #endif bool shared = false; config.getMeterConfig(meterConfig); @@ -436,6 +438,7 @@ void loop() { mqtt->disconnect(); } + #if defined(ESP32) if(eapi != NULL && ntpEnabled) { if(eapi->loop() && mqtt != NULL && mqttHandler != NULL && mqtt->connected()) { mqttHandler->publishPrices(eapi); @@ -453,10 +456,11 @@ void loop() { } else if(eapi != NULL) { delete eapi; eapi = NULL; - ws.setEntsoeApi(eapi); + ws.setEntsoeApi(NULL); } config.ackEntsoeChange(); } + #endif ws.loop(); } if(mqtt != NULL) { // Run loop regardless, to let MQTT do its work. diff --git a/src/entsoe/DnbCurrParser.cpp b/src/entsoe/DnbCurrParser.cpp index 00b6dc53..82fcf278 100644 --- a/src/entsoe/DnbCurrParser.cpp +++ b/src/entsoe/DnbCurrParser.cpp @@ -30,6 +30,7 @@ size_t DnbCurrParser::write(const uint8_t *buffer, size_t size) { } size_t DnbCurrParser::write(uint8_t byte) { + if(pos >= 64) pos = 0; if(pos == 0) { if(byte == '<') { buf[pos++] = byte; diff --git a/src/entsoe/EntsoeA44Parser.cpp b/src/entsoe/EntsoeA44Parser.cpp index c01504df..1d7fa9b2 100644 --- a/src/entsoe/EntsoeA44Parser.cpp +++ b/src/entsoe/EntsoeA44Parser.cpp @@ -14,6 +14,7 @@ char* EntsoeA44Parser::getMeasurementUnit() { } float EntsoeA44Parser::getPoint(uint8_t position) { + if(position >= 24) return ENTSOE_NO_VALUE; return points[position]; } @@ -41,6 +42,7 @@ size_t EntsoeA44Parser::write(const uint8_t *buffer, size_t size) { } size_t EntsoeA44Parser::write(uint8_t byte) { + if(pos >= 64) pos = 0; if(docPos == DOCPOS_CURRENCY) { buf[pos++] = byte; if(pos == 3) { diff --git a/src/entsoe/EntsoeApi.cpp b/src/entsoe/EntsoeApi.cpp index 1eeec954..c0ccf25a 100644 --- a/src/entsoe/EntsoeApi.cpp +++ b/src/entsoe/EntsoeApi.cpp @@ -13,6 +13,7 @@ EntsoeApi::EntsoeApi(RemoteDebug* Debug) { client.setInsecure(); https.setFollowRedirects(HTTPC_STRICT_FOLLOW_REDIRECTS); + https.setTimeout(5000); // Entso-E uses CET/CEST TimeChangeRule CEST = {"CEST", Last, Sun, Mar, 2, 120}; @@ -63,8 +64,10 @@ float EntsoeApi::getValueForHour(time_t cur, uint8_t hour) { } else { return ENTSOE_NO_VALUE; } - multiplier *= getCurrencyMultiplier(tomorrow->getCurrency(), config->currency); - } else if(pos > 0) { + float mult = getCurrencyMultiplier(tomorrow->getCurrency(), config->currency); + if(mult == 0) return ENTSOE_NO_VALUE; + multiplier *= mult; + } else if(pos >= 0) { if(today == NULL) return ENTSOE_NO_VALUE; value = today->getPoint(pos); @@ -73,7 +76,9 @@ float EntsoeApi::getValueForHour(time_t cur, uint8_t hour) { } else { return ENTSOE_NO_VALUE; } - multiplier *= getCurrencyMultiplier(today->getCurrency(), config->currency); + float mult = getCurrencyMultiplier(today->getCurrency(), config->currency); + if(mult == 0) return ENTSOE_NO_VALUE; + multiplier *= mult; } return value * multiplier; } @@ -288,8 +293,12 @@ float EntsoeApi::getCurrencyMultiplier(const char* from, const char* to) { if(retrieve(url, &p)) { if(debugger->isActive(RemoteDebug::DEBUG)) debugger->printf("(EntsoeApi) got exchange rate %.4f\n", p.getValue()); currencyMultiplier /= p.getValue(); + } else { + return 0; } } + } else { + return 0; } if(debugger->isActive(RemoteDebug::DEBUG)) debugger->printf("(EntsoeApi) Resulting currency multiplier: %.4f\n", currencyMultiplier); lastCurrencyFetch = midnightMillis; diff --git a/src/web/AmsWebServer.cpp b/src/web/AmsWebServer.cpp index c0e5d94f..968a520d 100644 --- a/src/web/AmsWebServer.cpp +++ b/src/web/AmsWebServer.cpp @@ -1278,7 +1278,6 @@ void AmsWebServer::handleSave() { strcpy(entsoe.currency, server.arg("ecu").c_str()); entsoe.multiplier = server.arg("em").toFloat() * 1000; config->setEntsoeConfig(entsoe); - eapi->setup(entsoe); } printI("Saving configuration now...");