diff --git a/lib/AmsConfiguration/include/AmsConfiguration.h b/lib/AmsConfiguration/include/AmsConfiguration.h index 98ac4d5f..0b2db91c 100644 --- a/lib/AmsConfiguration/include/AmsConfiguration.h +++ b/lib/AmsConfiguration/include/AmsConfiguration.h @@ -206,7 +206,7 @@ struct PriceServiceConfig { char entsoeToken[37]; char area[17]; char currency[4]; - uint8_t resolutionInMinues; + uint8_t resolutionInMinutes; uint8_t unused2; uint16_t unused3; bool enabled; diff --git a/lib/AmsConfiguration/src/AmsConfiguration.cpp b/lib/AmsConfiguration/src/AmsConfiguration.cpp index 13a9c20f..1171fd63 100644 --- a/lib/AmsConfiguration/src/AmsConfiguration.cpp +++ b/lib/AmsConfiguration/src/AmsConfiguration.cpp @@ -655,7 +655,7 @@ bool AmsConfiguration::setPriceServiceConfig(PriceServiceConfig& config) { priceChanged |= strcmp(config.area, existing.area) != 0; priceChanged |= strcmp(config.currency, existing.currency) != 0; priceChanged |= config.enabled != existing.enabled; - priceChanged |= config.resolutionInMinues != existing.resolutionInMinues; + priceChanged |= config.resolutionInMinutes != existing.resolutionInMinutes; } else { priceChanged = true; } @@ -676,7 +676,7 @@ void AmsConfiguration::clearPriceServiceConfig(PriceServiceConfig& config) { memset(config.area, 0, 17); memset(config.currency, 0, 4); config.enabled = false; - config.resolutionInMinues = 60; + config.resolutionInMinutes = 60; } bool AmsConfiguration::isPriceServiceChanged() { diff --git a/lib/PriceService/src/PriceService.cpp b/lib/PriceService/src/PriceService.cpp index 8f73a9f8..1777fa46 100644 --- a/lib/PriceService/src/PriceService.cpp +++ b/lib/PriceService/src/PriceService.cpp @@ -43,8 +43,8 @@ void PriceService::setup(PriceServiceConfig& config) { this->config = new PriceServiceConfig(); } memcpy(this->config, &config, sizeof(config)); - if(this->config->resolutionInMinues != 15 && this->config->resolutionInMinues != 60) { - this->config->resolutionInMinues = 60; + if(this->config->resolutionInMinutes != 15 && this->config->resolutionInMinutes != 60) { + this->config->resolutionInMinutes = 60; } lastTodayFetch = lastTomorrowFetch = lastCurrencyFetch = 0; @@ -155,11 +155,15 @@ float PriceService::getEnergyPricePoint(uint8_t direction, int8_t point) { float value = PRICE_NO_VALUE; uint8_t pos = point; float multiplier = 1.0; - if(pos >= today->getNumberOfPoints()) { - pos = pos - today->getNumberOfPoints(); - if(pos >= tomorrow->getNumberOfPoints()) return PRICE_NO_VALUE; + uint8_t numberOfPointsToday = 24; + if(today != NULL) { + numberOfPointsToday = today->getNumberOfPoints(); + } + if(pos >= numberOfPointsToday) { + pos = pos - numberOfPointsToday; if(tomorrow == NULL) return PRICE_NO_VALUE; + if(pos >= tomorrow->getNumberOfPoints()) return PRICE_NO_VALUE; if(!tomorrow->hasPrice(pos, direction)) return PRICE_NO_VALUE; value = tomorrow->getPrice(pos, direction); @@ -231,27 +235,47 @@ bool PriceService::loop() { if(now < 10000) return false; // Grace period time_t t = time(nullptr); - if(t < FirmwareVersion::BuildEpoch) return false; + if(t < FirmwareVersion::BuildEpoch) { + return false; + } #ifndef AMS2MQTT_PRICE_KEY if(strlen(getToken()) == 0) { return false; } #endif - if(strlen(config->area) == 0) + if(strlen(config->area) == 0){ + #if defined(AMS_REMOTE_DEBUG) + if (debugger->isActive(RemoteDebug::WARNING)) + #endif + debugger->printf_P(PSTR("(PriceService) Area is missing\n")); return false; - if(strlen(config->currency) == 0) + } + if(strlen(config->currency) == 0) { + #if defined(AMS_REMOTE_DEBUG) + if (debugger->isActive(RemoteDebug::WARNING)) + #endif + debugger->printf_P(PSTR("(PriceService) Currency is missing\n")); return false; + } tmElements_t tm; breakTime(entsoeTz->toLocal(t), tm); if(currentDay == 0) { + #if defined(AMS_REMOTE_DEBUG) + if (debugger->isActive(RemoteDebug::INFO)) + #endif + debugger->printf_P(PSTR("(PriceService) Day init\n")); currentDay = tm.Day; currentHour = tm.Hour; } if(currentDay != tm.Day) { + #if defined(AMS_REMOTE_DEBUG) + if (debugger->isActive(RemoteDebug::INFO)) + #endif + debugger->printf_P(PSTR("(PriceService) Day reset\n")); if(today != NULL) delete today; if(tomorrow != NULL) { today = tomorrow; @@ -261,6 +285,10 @@ bool PriceService::loop() { currentHour = tm.Hour; return today != NULL || (!config->enabled && priceConfig.capacity() != 0); // Only trigger MQTT publish if we have todays prices. } else if(currentHour != tm.Hour) { + #if defined(AMS_REMOTE_DEBUG) + if (debugger->isActive(RemoteDebug::INFO)) + #endif + debugger->printf_P(PSTR("(PriceService) Hour reset\n")); currentHour = tm.Hour; return today != NULL || (!config->enabled && priceConfig.capacity() != 0); // Only trigger MQTT publish if we have todays prices. } @@ -451,17 +479,22 @@ PricesContainer* PriceService::fetchPrices(time_t t) { return NULL; } } else if(hub) { + #if defined(AMS_REMOTE_DEBUG) + if (debugger->isActive(RemoteDebug::DEBUG)) + #endif + debugger->printf_P(PSTR("(PriceService) Going to fetch prices from hub\n")); + tmElements_t tm; breakTime(entsoeTz->toLocal(t), tm); String data; - snprintf_P(buf, BufferSize, PSTR("http://hub.amsleser.no/hub/price-v2/%s/%d/%d/%d/pt%dm?currency=%s"), + snprintf_P(buf, BufferSize, PSTR("http://hub.amsleser.no/hub/price/%s/%d/%d/%d/pt%dm?currency=%s"), config->area, tm.Year+1970, tm.Month, tm.Day, - config->currency, - config->resolutionInMinues + config->resolutionInMinutes, + config->currency ); #if defined(AMS_REMOTE_DEBUG) if (debugger->isActive(RemoteDebug::INFO)) diff --git a/lib/SvelteUi/src/AmsWebServer.cpp b/lib/SvelteUi/src/AmsWebServer.cpp index a9f52a03..08c55af1 100644 --- a/lib/SvelteUi/src/AmsWebServer.cpp +++ b/lib/SvelteUi/src/AmsWebServer.cpp @@ -1048,7 +1048,7 @@ void AmsWebServer::configurationJson() { price.entsoeToken, price.area, price.currency, - price.resolutionInMinues + price.resolutionInMinutes ); server.sendContent(buf); snprintf_P(buf, BufferSize, CONF_DEBUG_JSON, @@ -1613,7 +1613,7 @@ void AmsWebServer::handleSave() { strcpy(price.entsoeToken, server.arg(F("pt")).c_str()); strcpy(price.area, priceRegion.c_str()); strcpy(price.currency, server.arg(F("pc")).c_str()); - price.resolutionInMinues = server.arg(F("pm")).toInt(); + price.resolutionInMinutes = server.arg(F("pm")).toInt(); config->setPriceServiceConfig(price); }