From 98858315dee431580493ddb7886aced7c7184519 Mon Sep 17 00:00:00 2001 From: Gunnar Skjold Date: Fri, 20 Oct 2023 14:33:56 +0200 Subject: [PATCH] Changes for Energy Speedometer connection --- .../include/AmsConfiguration.h | 6 ++++-- lib/AmsConfiguration/src/AmsConfiguration.cpp | 20 ++++++++++++++++++- lib/SvelteUi/src/AmsWebServer.cpp | 4 ++-- src/AmsToMqttBridge.cpp | 15 +++++++++++++- 4 files changed, 39 insertions(+), 6 deletions(-) diff --git a/lib/AmsConfiguration/include/AmsConfiguration.h b/lib/AmsConfiguration/include/AmsConfiguration.h index 5b10ef6d..fc8e81ac 100644 --- a/lib/AmsConfiguration/include/AmsConfiguration.h +++ b/lib/AmsConfiguration/include/AmsConfiguration.h @@ -33,7 +33,7 @@ struct SystemConfig { bool userConfigured; uint8_t dataCollectionConsent; // 0 = unknown, 1 = accepted, 2 = declined char country[3]; - bool energyspeedometer; + uint8_t energyspeedometer; }; // 8 struct WiFiConfig { @@ -232,6 +232,8 @@ public: bool getSystemConfig(SystemConfig&); bool setSystemConfig(SystemConfig&); + bool isSystemConfigChanged(); + void ackSystemConfigChanged(); bool getWiFiConfig(WiFiConfig&); bool setWiFiConfig(WiFiConfig&); @@ -319,7 +321,7 @@ protected: private: uint8_t configVersion = 0; - bool wifiChanged, mqttChanged, meterChanged = true, ntpChanged = true, entsoeChanged = false, energyAccountingChanged = true; + bool sysChanged = false, wifiChanged = false, mqttChanged = false, meterChanged = true, ntpChanged = true, entsoeChanged = false, energyAccountingChanged = true; uint8_t tempSensorCount = 0; TempSensorConfig** tempSensors = NULL; diff --git a/lib/AmsConfiguration/src/AmsConfiguration.cpp b/lib/AmsConfiguration/src/AmsConfiguration.cpp index 5fb072aa..15ab749c 100644 --- a/lib/AmsConfiguration/src/AmsConfiguration.cpp +++ b/lib/AmsConfiguration/src/AmsConfiguration.cpp @@ -13,13 +13,22 @@ bool AmsConfiguration::getSystemConfig(SystemConfig& config) { config.vendorConfigured = false; config.userConfigured = false; config.dataCollectionConsent = 0; - config.energyspeedometer = false; + config.energyspeedometer = 0; strcpy(config.country, ""); return false; } } bool AmsConfiguration::setSystemConfig(SystemConfig& config) { + SystemConfig existing; + if(getSystemConfig(existing)) { + sysChanged |= config.boardType != existing.boardType; + sysChanged |= config.vendorConfigured != existing.vendorConfigured; + sysChanged |= config.userConfigured != existing.userConfigured; + sysChanged |= config.dataCollectionConsent != existing.dataCollectionConsent; + sysChanged |= strcmp(config.country, existing.country) != 0; + sysChanged |= config.energyspeedometer != existing.energyspeedometer; + } EEPROM.begin(EEPROM_SIZE); stripNonAscii((uint8_t*) config.country, 2); EEPROM.put(CONFIG_SYSTEM_START, config); @@ -28,6 +37,14 @@ bool AmsConfiguration::setSystemConfig(SystemConfig& config) { return ret; } +bool AmsConfiguration::isSystemConfigChanged() { + return sysChanged; +} + +void AmsConfiguration::ackSystemConfigChanged() { + sysChanged = false; +} + bool AmsConfiguration::getWiFiConfig(WiFiConfig& config) { if(hasConfig()) { EEPROM.begin(EEPROM_SIZE); @@ -739,6 +756,7 @@ void AmsConfiguration::clear() { EEPROM.get(CONFIG_SYSTEM_START, sys); sys.userConfigured = false; sys.dataCollectionConsent = 0; + sys.energyspeedometer = 0; strcpy(sys.country, ""); EEPROM.put(CONFIG_SYSTEM_START, sys); diff --git a/lib/SvelteUi/src/AmsWebServer.cpp b/lib/SvelteUi/src/AmsWebServer.cpp index 1d4af5a6..8a138cc7 100644 --- a/lib/SvelteUi/src/AmsWebServer.cpp +++ b/lib/SvelteUi/src/AmsWebServer.cpp @@ -978,7 +978,7 @@ void AmsWebServer::configurationJson() { server.sendContent(buf); snprintf_P(buf, BufferSize, CONF_CLOUD_JSON, #if defined(ENERGY_SPEEDOMETER_PASS) - sysConfig.energyspeedometer ? "true" : "false" + sysConfig.energyspeedometer == 7 ? "true" : "false" #else "null" #endif @@ -1483,7 +1483,7 @@ void AmsWebServer::handleSave() { if(debugger->isActive(RemoteDebug::DEBUG)) debugger->printf_P(PSTR("Received cloud config\n")); SystemConfig sys; config->getSystemConfig(sys); - sys.energyspeedometer = server.hasArg(F("ces")) && server.arg(F("ces")) == F("true"); + sys.energyspeedometer = server.hasArg(F("ces")) && server.arg(F("ces")) == F("true") ? 7 : 0; config->setSystemConfig(sys); } diff --git a/src/AmsToMqttBridge.cpp b/src/AmsToMqttBridge.cpp index ef29dcb8..07a2dc0a 100644 --- a/src/AmsToMqttBridge.cpp +++ b/src/AmsToMqttBridge.cpp @@ -574,7 +574,7 @@ void loop() { } #if defined(ENERGY_SPEEDOMETER_PASS) - if(sysConfig.energyspeedometer) { + if(sysConfig.energyspeedometer == 7) { if(!meterState.getMeterId().isEmpty()) { if(energySpeedometer == NULL) { uint16_t chipId; @@ -597,6 +597,14 @@ void loop() { energySpeedometer->loop(); delay(10); } + } else if(energySpeedometer != NULL) { + if(energySpeedometer->connected()) { + energySpeedometer->disconnect(); + energySpeedometer->loop(); + } else { + delete energySpeedometer; + energySpeedometer = NULL; + } } #endif @@ -745,6 +753,11 @@ void handleNtpChange() { } void handleSystem(unsigned long now) { + if(config.isSystemConfigChanged()) { + config.getSystemConfig(sysConfig); + config.ackSystemConfigChanged(); + } + unsigned long start, end; if(now - lastSysupdate > 60000) { start = millis();