From c63054276f04fdfe65be4e6a7a59013f1f56892f Mon Sep 17 00:00:00 2001 From: Gunnar Skjold Date: Thu, 2 Oct 2025 12:45:47 +0200 Subject: [PATCH] Adapted JSON payload for 15min --- lib/JsonMqttHandler/src/JsonMqttHandler.cpp | 75 +++++++++++++-------- 1 file changed, 48 insertions(+), 27 deletions(-) diff --git a/lib/JsonMqttHandler/src/JsonMqttHandler.cpp b/lib/JsonMqttHandler/src/JsonMqttHandler.cpp index 41733db6..07ff7b05 100644 --- a/lib/JsonMqttHandler/src/JsonMqttHandler.cpp +++ b/lib/JsonMqttHandler/src/JsonMqttHandler.cpp @@ -363,38 +363,59 @@ bool JsonMqttHandler::publishPrices(PriceService* ps) { sprintf_P(ts6hr, PSTR("%04d-%02d-%02dT%02d:00:00Z"), tm.Year+1970, tm.Month, tm.Day, tm.Hour); } - char pf[4]; - uint16_t pos = snprintf_P(json, BufferSize, PSTR("{\"id\":\"%s\","), WiFi.macAddress().c_str()); - if(mqttConfig.payloadFormat != 6) { - memset(pf, 0, 4); - pos += snprintf_P(json+pos, BufferSize-pos, PSTR("\"prices\":{")); - } else { - strcpy_P(pf, PSTR("pr_")); - } + if(mqttConfig.payloadFormat == 6) { + uint16_t pos = snprintf_P(json, BufferSize, PSTR("{\"id\":\"%s\","), WiFi.macAddress().c_str()); - for(uint8_t i = 0;i < 38; i++) { - if(values[i] == PRICE_NO_VALUE) { - pos += snprintf_P(json+pos, BufferSize-pos, PSTR("\"%s%d\":null,"), pf, i); + for(uint8_t i = 0;i < 38; i++) { + if(values[i] == PRICE_NO_VALUE) { + pos += snprintf_P(json+pos, BufferSize-pos, PSTR("\"pr_%d\":null,"), i); } else { - pos += snprintf_P(json+pos, BufferSize-pos, PSTR("\"%s%d\":%.4f,"), pf, i, values[i]); + pos += snprintf_P(json+pos, BufferSize-pos, PSTR("\"pr_%d\":%.4f,"), i, values[i]); + } + } + + pos += snprintf_P(json+pos, BufferSize-pos, PSTR("\"pr_min\":%.4f,\"pr_max\":%.4f,\"pr_cheapest1hr\":\"%s\",\"pr_cheapest3hr\":\"%s\",\"pr_cheapest6hr\":\"%s\"}"), + min == INT16_MAX ? 0.0 : min, + max == INT16_MIN ? 0.0 : max, + ts1hr, + ts3hr, + ts6hr + ); + } else { + uint16_t pos = snprintf_P(json, BufferSize, PSTR("{\"id\":\"%s\",\"prices\":{\"import\":["), WiFi.macAddress().c_str()); + + uint8_t currentPricePointIndex = ps->getCurrentPricePointIndex(); + uint8_t numberOfPoints = ps->getNumberOfPointsAvailable(); + for(int i = currentPricePointIndex; i < numberOfPoints; i++) { + float val = ps->getPricePoint(PRICE_DIRECTION_IMPORT, i); + if(val == PRICE_NO_VALUE) { + pos += snprintf_P(json+pos, BufferSize-pos, PSTR("null,")); + } else { + pos += snprintf_P(json+pos, BufferSize-pos, PSTR("%.4f,"), val); + } + } + if(hasExport && ps->isExportPricesDifferentFromImport()) { + pos--; + pos += snprintf_P(json+pos, BufferSize-pos, PSTR("],\"export\":[")); + for(int i = currentPricePointIndex; i < numberOfPoints; i++) { + float val = ps->getPricePoint(PRICE_DIRECTION_EXPORT, i); + if(val == PRICE_NO_VALUE) { + pos += snprintf_P(json+pos, BufferSize-pos, PSTR("null,")); + } else { + pos += snprintf_P(json+pos, BufferSize-pos, PSTR("%.4f,"), val); } } + } - pos += snprintf_P(json+pos, BufferSize-pos, PSTR("\"%smin\":%.4f,\"%smax\":%.4f,\"%scheapest1hr\":\"%s\",\"%scheapest3hr\":\"%s\",\"%scheapest6hr\":\"%s\"}"), - pf, - min == INT16_MAX ? 0.0 : min, - pf, - max == INT16_MIN ? 0.0 : max, - pf, - ts1hr, - pf, - ts3hr, - pf, - ts6hr - ); - if(mqttConfig.payloadFormat != 6) { - json[pos++] = '}'; - json[pos] = '\0'; + pos--; + pos += snprintf_P(json+pos, BufferSize-pos, PSTR("],\"min\":%.4f,\"max\":%.4f,\"cheapest1hr\":\"%s\",\"cheapest3hr\":\"%s\",\"cheapest6hr\":\"%s\"}}"), + min == INT16_MAX ? 0.0 : min, + max == INT16_MIN ? 0.0 : max, + ts1hr, + ts3hr, + ts6hr + ); + } bool ret = false; if(mqttConfig.payloadFormat == 5) {