From 9946827431f8096c6f9180b66ae27ebd4ef4168a Mon Sep 17 00:00:00 2001 From: Gunnar Skjold Date: Wed, 17 Mar 2021 20:17:36 +0100 Subject: [PATCH] Fixed cheapest price calculation --- src/AmsToMqttBridge.ino | 2 +- src/entsoe/EntsoeApi.cpp | 6 +++++- src/mqtt/RawMqttHandler.cpp | 27 +++++++++++++++++---------- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/AmsToMqttBridge.ino b/src/AmsToMqttBridge.ino index a5c5f522..1809befd 100644 --- a/src/AmsToMqttBridge.ino +++ b/src/AmsToMqttBridge.ino @@ -410,7 +410,7 @@ void loop() { mqtt.disconnect(); } - if(eapi != NULL) { + if(eapi != NULL && ntpEnabled) { if(eapi->loop() && mqttHandler != NULL && mqtt.connected()) { mqttHandler->publishPrices(eapi); } diff --git a/src/entsoe/EntsoeApi.cpp b/src/entsoe/EntsoeApi.cpp index 36aac75f..68d98b83 100644 --- a/src/entsoe/EntsoeApi.cpp +++ b/src/entsoe/EntsoeApi.cpp @@ -78,9 +78,13 @@ bool EntsoeApi::loop() { bool ret = false; uint64_t now = millis64(); + if(now < 10000) return false; // Grace period if(midnightMillis == 0) { - time_t epoch = tz->toLocal(time(nullptr)); + time_t t = time(nullptr); + if(t <= 0) return false; // NTP not ready + + time_t epoch = tz->toLocal(t); tmElements_t tm; breakTime(epoch, tm); diff --git a/src/mqtt/RawMqttHandler.cpp b/src/mqtt/RawMqttHandler.cpp index b4a289c6..fe878164 100644 --- a/src/mqtt/RawMqttHandler.cpp +++ b/src/mqtt/RawMqttHandler.cpp @@ -85,13 +85,14 @@ bool RawMqttHandler::publishPrices(EntsoeApi* eapi) { time_t now = time(nullptr); float min1hr, min3hr, min6hr; - uint8_t min1hrIdx = -1, min3hrIdx = -1, min6hrIdx = -1; + int8_t min1hrIdx = -1, min3hrIdx = -1, min6hrIdx = -1; float min = INT16_MAX, max = INT16_MIN; - float values[24] = {0}; - for(uint8_t i = 0; i < 24; i++) { + float values[34] = {0}; + for(uint8_t i = 0; i < 34; i++) { float val = eapi->getValueForHour(now, i); values[i] = val; + if(i > 23) continue; if(val == ENTSOE_NO_VALUE) break; if(val < min) min = val; @@ -134,25 +135,31 @@ bool RawMqttHandler::publishPrices(EntsoeApi* eapi) { } char ts1hr[21]; - if(min1hrIdx != -1) { + if(min1hrIdx > -1) { + time_t ts = now + (SECS_PER_HOUR * min1hrIdx); + //Serial.printf("1hr: %d %lu\n", min1hrIdx, ts); tmElements_t tm; - breakTime(now + (SECS_PER_HOUR * min1hrIdx), tm); + breakTime(ts, tm); sprintf(ts1hr, "%04d-%02d-%02dT%02d:00:00Z", tm.Year+1970, tm.Month, tm.Day, tm.Hour); } char ts3hr[21]; - if(min3hrIdx != -1) { + if(min3hrIdx > -1) { + time_t ts = now + (SECS_PER_HOUR * min3hrIdx); + //Serial.printf("3hr: %d %lu\n", min3hrIdx, ts); tmElements_t tm; - breakTime(now + (SECS_PER_HOUR * min3hrIdx), tm); + breakTime(ts, tm); sprintf(ts3hr, "%04d-%02d-%02dT%02d:00:00Z", tm.Year+1970, tm.Month, tm.Day, tm.Hour); } char ts6hr[21]; - if(min6hrIdx != -1) { + if(min6hrIdx > -1) { + time_t ts = now + (SECS_PER_HOUR * min6hrIdx); + //Serial.printf("6hr: %d %lu\n", min6hrIdx, ts); tmElements_t tm; - breakTime(now + (SECS_PER_HOUR * min6hrIdx), tm); + breakTime(ts, tm); sprintf(ts6hr, "%04d-%02d-%02dT%02d:00:00Z", tm.Year+1970, tm.Month, tm.Day, tm.Hour); } - for(int i = 0; i < 24; i++) { + for(int i = 0; i < 34; i++) { float val = values[i]; if(val == ENTSOE_NO_VALUE) { mqtt->publish(topic + "/price/" + String(i), "", true, 0);