diff --git a/lib/AmsConfiguration/src/AmsConfiguration.cpp b/lib/AmsConfiguration/src/AmsConfiguration.cpp index 5ceb4127..1ae657a1 100644 --- a/lib/AmsConfiguration/src/AmsConfiguration.cpp +++ b/lib/AmsConfiguration/src/AmsConfiguration.cpp @@ -67,6 +67,7 @@ bool AmsConfiguration::getNetworkConfig(NetworkConfig& config) { bool AmsConfiguration::setNetworkConfig(NetworkConfig& config) { NetworkConfig existing; if(config.sleep > 2) config.sleep = 1; + if(config.mode < 1 || config.mode > 4) config.mode = 1; if(getNetworkConfig(existing)) { networkChanged |= strcmp(config.ssid, existing.ssid) != 0; networkChanged |= strcmp(config.psk, existing.psk) != 0; diff --git a/lib/SvelteUi/src/AmsWebServer.cpp b/lib/SvelteUi/src/AmsWebServer.cpp index 5fbbef44..32bda918 100644 --- a/lib/SvelteUi/src/AmsWebServer.cpp +++ b/lib/SvelteUi/src/AmsWebServer.cpp @@ -1220,38 +1220,40 @@ void AmsWebServer::handleSave() { } if(server.hasArg(F("w")) && server.arg(F("w")) == F("true")) { - NetworkConfig network; - config->getNetworkConfig(network); - strcpy(network.ssid, server.arg(F("ws")).c_str()); - String psk = server.arg(F("wp")); - if(!psk.equals("***")) { - strcpy(network.psk, psk.c_str()); - } - network.power = server.arg(F("ww")).toFloat() * 10; - network.sleep = server.arg(F("wz")).toInt(); - network.use11b = server.hasArg(F("wb")) && server.arg(F("wb")) == F("true"); - network.mode = server.arg(F("nc")).toInt(); - if(network.mode > 3) network.mode = 1; // WiFi Client - config->setNetworkConfig(network); - - if(server.hasArg(F("nm"))) { - if(server.arg(F("nm")) == "static") { - strcpy(network.ip, server.arg(F("ni")).c_str()); - strcpy(network.gateway, server.arg(F("ng")).c_str()); - strcpy(network.subnet, server.arg(F("ns")).c_str()); - strcpy(network.dns1, server.arg(F("nd1")).c_str()); - strcpy(network.dns2, server.arg(F("nd2")).c_str()); - } else if(server.arg(F("nm")) == "dhcp") { - strcpy(network.ip, ""); - strcpy(network.gateway, ""); - strcpy(network.subnet, ""); - strcpy(network.dns1, ""); - strcpy(network.dns2, ""); + long mode = server.arg(F("nc")).toInt(); + if(mode > 0 && mode < 3) { + NetworkConfig network; + config->getNetworkConfig(network); + network.mode = mode; + strcpy(network.ssid, server.arg(F("ws")).c_str()); + String psk = server.arg(F("wp")); + if(!psk.equals("***")) { + strcpy(network.psk, psk.c_str()); } - } - network.ipv6 = server.hasArg(F("nx")) && server.arg(F("nx")) == F("true"); - network.mdns = server.hasArg(F("nd")) && server.arg(F("nd")) == F("true"); - config->setNetworkConfig(network); + network.power = server.arg(F("ww")).toFloat() * 10; + network.sleep = server.arg(F("wz")).toInt(); + network.use11b = server.hasArg(F("wb")) && server.arg(F("wb")) == F("true"); + + if(server.hasArg(F("nm"))) { + if(server.arg(F("nm")) == "static") { + strcpy(network.ip, server.arg(F("ni")).c_str()); + strcpy(network.gateway, server.arg(F("ng")).c_str()); + strcpy(network.subnet, server.arg(F("ns")).c_str()); + strcpy(network.dns1, server.arg(F("nd1")).c_str()); + strcpy(network.dns2, server.arg(F("nd2")).c_str()); + } else if(server.arg(F("nm")) == "dhcp") { + strcpy(network.ip, ""); + strcpy(network.gateway, ""); + strcpy(network.subnet, ""); + strcpy(network.dns1, ""); + strcpy(network.dns2, ""); + } + } + network.ipv6 = server.hasArg(F("nx")) && server.arg(F("nx")) == F("true"); + network.mdns = server.hasArg(F("nd")) && server.arg(F("nd")) == F("true"); + config->setNetworkConfig(network); + } + } if(server.hasArg(F("ntp")) && server.arg(F("ntp")) == F("true")) { @@ -2188,6 +2190,7 @@ void AmsWebServer::configFileDownload() { if(includePrice) { PriceServiceConfig price; config->getPriceServiceConfig(price); + server.sendContent(buf, snprintf_P(buf, BufferSize, PSTR("priceEnabled %s\n"), price.enabled ? 1 : 0)); if(strlen(price.entsoeToken) == 36 && includeSecrets) server.sendContent(buf, snprintf_P(buf, BufferSize, PSTR("priceEntsoeToken %s\n"), price.entsoeToken)); server.sendContent(buf, snprintf_P(buf, BufferSize, PSTR("priceArea %s\n"), price.area)); server.sendContent(buf, snprintf_P(buf, BufferSize, PSTR("priceCurrency %s\n"), price.currency)); @@ -2215,10 +2218,10 @@ void AmsWebServer::configFileDownload() { if(ds != NULL) { DayDataPoints day = ds->getDayData(); - server.sendContent(buf, snprintf_P(buf, BufferSize, PSTR("dayplot %d %lu %lu %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d"), + server.sendContent(buf, snprintf_P(buf, BufferSize, PSTR("dayplot %d %lu %.3f %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d"), day.version, (int32_t) day.lastMeterReadTime, - day.activeImport, + day.activeImport / 1000.0, day.accuracy, ds->getHourImport(0), ds->getHourImport(1), @@ -2246,8 +2249,8 @@ void AmsWebServer::configFileDownload() { ds->getHourImport(23) )); if(day.activeExport > 0) { - server.sendContent(buf, snprintf_P(buf, BufferSize, PSTR(" %u %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n"), - day.activeExport, + server.sendContent(buf, snprintf_P(buf, BufferSize, PSTR(" %.3f %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n"), + day.activeExport / 1000.0, ds->getHourExport(0), ds->getHourExport(1), ds->getHourExport(2), @@ -2278,10 +2281,10 @@ void AmsWebServer::configFileDownload() { } MonthDataPoints month = ds->getMonthData(); - server.sendContent(buf, snprintf_P(buf, BufferSize, PSTR("monthplot %d %lu %lu %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d"), + server.sendContent(buf, snprintf_P(buf, BufferSize, PSTR("monthplot %d %lu %.3f %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d"), month.version, (int32_t) month.lastMeterReadTime, - month.activeImport, + month.activeImport / 1000.0, month.accuracy, ds->getDayImport(1), ds->getDayImport(2), @@ -2316,8 +2319,8 @@ void AmsWebServer::configFileDownload() { ds->getDayImport(31) )); if(month.activeExport > 0) { - server.sendContent(buf, snprintf_P(buf, BufferSize, PSTR(" %u %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n"), - month.activeExport, + server.sendContent(buf, snprintf_P(buf, BufferSize, PSTR(" %.3f %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n"), + month.activeExport / 1000.0, ds->getDayExport(1), ds->getDayExport(2), ds->getDayExport(3), diff --git a/src/AmsToMqttBridge.cpp b/src/AmsToMqttBridge.cpp index 5316c0ba..665c1763 100644 --- a/src/AmsToMqttBridge.cpp +++ b/src/AmsToMqttBridge.cpp @@ -282,6 +282,8 @@ void setup() { if(sysConfig.boardType < 20) { config.clearGpio(gpioConfig); hw.applyBoardConfig(sysConfig.boardType, gpioConfig, meterConfig, 0); + config.setMeterConfig(meterConfig); + config.setGpioConfig(gpioConfig); } } else { config.clearMeter(meterConfig); @@ -1511,7 +1513,7 @@ void configFileParse() { sys.boardType = String(buf+10).toInt(); } else if(strncmp_P(buf, PSTR("netmode "), 8) == 0) { if(!lNetwork) { config.getNetworkConfig(network); lNetwork = true; }; - network.mode = String(buf+5).toInt(); + network.mode = String(buf+8).toInt(); } else if(strncmp_P(buf, PSTR("ssid "), 5) == 0) { if(!lNetwork) { config.getNetworkConfig(network); lNetwork = true; }; strcpy(network.ssid, buf+5); @@ -1705,21 +1707,24 @@ void configFileParse() { } else if(strncmp_P(buf, PSTR("entsoeFixedPrice "), 17) == 0) { if(!lPrice) { config.getPriceServiceConfig(price); lPrice = true; }; price.unused2 = String(buf+17).toFloat() * 1000; + } else if(strncmp_P(buf, PSTR("priceEnabled "), 13) == 0) { + if(!lPrice) { config.getPriceServiceConfig(price); lPrice = true; }; + price.enabled = String(buf+13).toInt() == 1; } else if(strncmp_P(buf, PSTR("priceEntsoeToken "), 17) == 0) { if(!lPrice) { config.getPriceServiceConfig(price); lPrice = true; }; - strcpy(price.entsoeToken, buf+12); + strcpy(price.entsoeToken, buf+17); } else if(strncmp_P(buf, PSTR("priceArea "), 10) == 0) { if(!lPrice) { config.getPriceServiceConfig(price); lPrice = true; }; - strcpy(price.area, buf+11); + strcpy(price.area, buf+10); } else if(strncmp_P(buf, PSTR("priceCurrency "), 14) == 0) { if(!lPrice) { config.getPriceServiceConfig(price); lPrice = true; }; - strcpy(price.currency, buf+15); + strcpy(price.currency, buf+14); } else if(strncmp_P(buf, PSTR("priceMultiplier "), 16) == 0) { if(!lPrice) { config.getPriceServiceConfig(price); lPrice = true; }; - price.unused1 = String(buf+17).toFloat() * 1000; + price.unused1 = String(buf+16).toFloat() * 1000; } else if(strncmp_P(buf, PSTR("priceFixedPrice "), 16) == 0) { if(!lPrice) { config.getPriceServiceConfig(price); lPrice = true; }; - price.unused2 = String(buf+17).toFloat() * 1000; + price.unused2 = String(buf+16).toFloat() * 1000; } else if(strncmp_P(buf, PSTR("thresholds "), 11) == 0) { if(!lEac) { config.getEnergyAccountingConfig(eac); lEac = true; }; int i = 0; @@ -1734,7 +1739,7 @@ void configFileParse() { DayDataPoints day = { 0 }; char * pch = strtok (buf+8," "); while (pch != NULL) { - int64_t val = String(pch).toInt(); + double val = String(pch).toDouble(); if(day.version < 5) { if(i == 0) { day.version = val; @@ -1753,13 +1758,13 @@ void configFileParse() { if(i == 1) { day.lastMeterReadTime = val; } else if(i == 2) { - day.activeImport = val; + day.activeImport = day.version > 5 ? val * 1000 : val; } else if(i == 3) { day.accuracy = val; } else if(i > 3 && i < 28) { day.hImport[i-4] = val / pow(10, day.accuracy); } else if(i == 28) { - day.activeExport = val; + day.activeExport = day.version > 5 ? val * 1000 : val; } else if(i > 28 && i < 53) { day.hExport[i-29] = val / pow(10, day.accuracy); } @@ -1775,7 +1780,7 @@ void configFileParse() { MonthDataPoints month = { 0 }; char * pch = strtok (buf+10," "); while (pch != NULL) { - int64_t val = String(pch).toInt(); + double val = String(pch).toDouble(); if(month.version < 6) { if(i == 0) { month.version = val; @@ -1794,13 +1799,13 @@ void configFileParse() { if(i == 1) { month.lastMeterReadTime = val; } else if(i == 2) { - month.activeImport = val; + month.activeImport = month.version > 6 ? val * 1000 : val; } else if(i == 3) { month.accuracy = val; } else if(i > 3 && i < 35) { month.dImport[i-4] = val / pow(10, month.accuracy); } else if(i == 35) { - month.activeExport = val; + month.activeExport = month.version > 6 ? val * 1000 : val; } else if(i > 35 && i < 67) { month.dExport[i-36] = val / pow(10, month.accuracy); }