From 30cf1435daf2fb0697d9421d96da8fac9925f24c Mon Sep 17 00:00:00 2001 From: Gunnar Skjold Date: Sun, 12 Jun 2022 10:34:01 +0200 Subject: [PATCH 01/10] Fixed firmware upgrade for ESP32S2 --- src/web/AmsWebServer.cpp | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/web/AmsWebServer.cpp b/src/web/AmsWebServer.cpp index 397ab63c..8ee713ef 100644 --- a/src/web/AmsWebServer.cpp +++ b/src/web/AmsWebServer.cpp @@ -1675,11 +1675,12 @@ void AmsWebServer::firmwareDownload() { printI("Downloading firmware..."); HTTPClient httpClient; httpClient.setFollowRedirects(HTTPC_STRICT_FOLLOW_REDIRECTS); - httpClient.setTimeout(20000); - httpClient.addHeader("User-Agent", "ams2mqtt/" + String(VERSION)); + httpClient.setReuse(false); + httpClient.setTimeout(60000); + httpClient.setUserAgent("ams2mqtt/" + String(VERSION)); #if defined(ESP8266) - WiFiClient client; + //WiFiClient client; String url = "http://ams2mqtt.no23.cc/releases/download/" + version + "/ams2mqtt-esp8266-" + versionStripped + ".bin"; /* t_httpUpdate_return ret = ESPhttpUpdate.update(client, url, VERSION); @@ -1705,13 +1706,11 @@ void AmsWebServer::firmwareDownload() { return; */ #elif defined(CONFIG_IDF_TARGET_ESP32S2) - WiFiClientSecure client; - client.setInsecure(); + httpClient.setConnectTimeout(60000); String url = "https://github.com/gskjold/AmsToMqttBridge/releases/download/" + version + "/ams2mqtt-esp32s2-" + versionStripped + ".bin"; httpClient.addHeader("Referer", "https://github.com/gskjold/AmsToMqttBridge/releases"); #elif defined(ESP32) - WiFiClientSecure client; - client.setInsecure(); + httpClient.setConnectTimeout(60000); #if defined(CONFIG_FREERTOS_UNICORE) String url = "https://github.com/gskjold/AmsToMqttBridge/releases/download/" + version + "/ams2mqtt-esp32solo-" + versionStripped + ".bin"; #else @@ -1721,7 +1720,10 @@ void AmsWebServer::firmwareDownload() { httpClient.addHeader("Referer", "https://github.com/gskjold/AmsToMqttBridge/releases"); #endif - if(httpClient.begin(client, url)) { + printD("Downloading from URL:"); + printD(url); + + if(httpClient.begin(url)) { printD("HTTP client setup successful"); int status = httpClient.GET(); if(status == HTTP_CODE_OK) { @@ -1749,8 +1751,8 @@ void AmsWebServer::firmwareDownload() { } } else { printE("Communication error: "); + debugger->printf("%d\n", status); printE(httpClient.errorToString(status)); - printI(url); printD(httpClient.getString()); server.sendHeader("Location","/"); server.send(303); @@ -1761,7 +1763,6 @@ void AmsWebServer::firmwareDownload() { server.send(303); } httpClient.end(); - client.stop(); } else { printI("No firmware version specified..."); server.sendHeader("Location","/"); From c5aa65a780a3caaf81f53e023bde1947b375fa76 Mon Sep 17 00:00:00 2001 From: Gunnar Skjold Date: Sun, 12 Jun 2022 10:55:28 +0200 Subject: [PATCH 02/10] Fixed previous commit --- src/web/AmsWebServer.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/web/AmsWebServer.cpp b/src/web/AmsWebServer.cpp index 8ee713ef..775a6fc6 100644 --- a/src/web/AmsWebServer.cpp +++ b/src/web/AmsWebServer.cpp @@ -1680,7 +1680,7 @@ void AmsWebServer::firmwareDownload() { httpClient.setUserAgent("ams2mqtt/" + String(VERSION)); #if defined(ESP8266) - //WiFiClient client; + WiFiClient client; String url = "http://ams2mqtt.no23.cc/releases/download/" + version + "/ams2mqtt-esp8266-" + versionStripped + ".bin"; /* t_httpUpdate_return ret = ESPhttpUpdate.update(client, url, VERSION); @@ -1723,7 +1723,11 @@ void AmsWebServer::firmwareDownload() { printD("Downloading from URL:"); printD(url); + #if defined(ESP8266) + if(httpClient.begin(client, url)) { + #elif defined(ESP32) if(httpClient.begin(url)) { + #endif printD("HTTP client setup successful"); int status = httpClient.GET(); if(status == HTTP_CODE_OK) { From e5556fe80b833988d67a403a63e43651c0d53661 Mon Sep 17 00:00:00 2001 From: Gunnar Skjold Date: Sun, 19 Jun 2022 08:31:13 +0200 Subject: [PATCH 03/10] Fixed minimum value for lowest threshold --- web/thresholds.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/thresholds.html b/web/thresholds.html index 3c0a2321..8c66b13c 100644 --- a/web/thresholds.html +++ b/web/thresholds.html @@ -8,7 +8,7 @@
1
- +
kWh
From 4e039c2cc946d33e44fa5c0413b1f2da95be4379 Mon Sep 17 00:00:00 2001 From: Gunnar Skjold Date: Thu, 23 Jun 2022 08:10:57 +0200 Subject: [PATCH 04/10] Escape backslash in JSON --- src/mqtt/HomeAssistantMqttHandler.cpp | 4 +++- src/mqtt/JsonMqttHandler.cpp | 8 +++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/mqtt/HomeAssistantMqttHandler.cpp b/src/mqtt/HomeAssistantMqttHandler.cpp index 485e0905..798dc8f9 100644 --- a/src/mqtt/HomeAssistantMqttHandler.cpp +++ b/src/mqtt/HomeAssistantMqttHandler.cpp @@ -25,6 +25,8 @@ bool HomeAssistantMqttHandler::publish(AmsData* data, AmsData* previousState, En ); mqtt->publish(topic + "/energy", json); } + String meterModel = data->getMeterModel(); + meterModel.replace("\\", "\\\\"); if(data->getListType() == 1) { // publish power counts snprintf_P(json, BufferSize, HA1_JSON, data->getActiveImportPower() @@ -34,7 +36,7 @@ bool HomeAssistantMqttHandler::publish(AmsData* data, AmsData* previousState, En snprintf_P(json, BufferSize, HA3_JSON, data->getListId().c_str(), data->getMeterId().c_str(), - data->getMeterModel().c_str(), + meterModel.c_str(), data->getActiveImportPower(), data->getReactiveImportPower(), data->getActiveExportPower(), diff --git a/src/mqtt/JsonMqttHandler.cpp b/src/mqtt/JsonMqttHandler.cpp index aa7c5dd9..b5d6103a 100644 --- a/src/mqtt/JsonMqttHandler.cpp +++ b/src/mqtt/JsonMqttHandler.cpp @@ -12,6 +12,8 @@ bool JsonMqttHandler::publish(AmsData* data, AmsData* previousState, EnergyAccou if(topic.isEmpty() || !mqtt->connected()) return false; + String meterModel = data->getMeterModel(); + meterModel.replace("\\", "\\\\"); if(data->getListType() == 1) { snprintf_P(json, BufferSize, JSON1_JSON, WiFi.macAddress().c_str(), @@ -39,7 +41,7 @@ bool JsonMqttHandler::publish(AmsData* data, AmsData* previousState, EnergyAccou hw->getTemperature(), data->getListId().c_str(), data->getMeterId().c_str(), - data->getMeterModel().c_str(), + meterModel.c_str(), data->getActiveImportPower(), data->getReactiveImportPower(), data->getActiveExportPower(), @@ -67,7 +69,7 @@ bool JsonMqttHandler::publish(AmsData* data, AmsData* previousState, EnergyAccou hw->getTemperature(), data->getListId().c_str(), data->getMeterId().c_str(), - data->getMeterModel().c_str(), + meterModel.c_str(), data->getActiveImportPower(), data->getReactiveImportPower(), data->getActiveExportPower(), @@ -100,7 +102,7 @@ bool JsonMqttHandler::publish(AmsData* data, AmsData* previousState, EnergyAccou hw->getTemperature(), data->getListId().c_str(), data->getMeterId().c_str(), - data->getMeterModel().c_str(), + meterModel.c_str(), data->getActiveImportPower(), data->getReactiveImportPower(), data->getActiveExportPower(), From 846b166ae99ec7839adc8b7947334e95451d34ed Mon Sep 17 00:00:00 2001 From: Gunnar Skjold Date: Thu, 23 Jun 2022 08:12:25 +0200 Subject: [PATCH 05/10] MQTT/SSL config re-enabled for ESP8266 in case it actually is in use --- src/web/AmsWebServer.cpp | 40 ++++++++++++++++++---------------------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/src/web/AmsWebServer.cpp b/src/web/AmsWebServer.cpp index 775a6fc6..6c763027 100644 --- a/src/web/AmsWebServer.cpp +++ b/src/web/AmsWebServer.cpp @@ -497,29 +497,25 @@ void AmsWebServer::configMqttHtml() { } html.replace("{f255}", mqtt.payloadFormat == 255 ? "selected" : ""); - #if defined(ESP8266) - html.replace("{sd}", "d-none"); - #else - html.replace("{sd}", ""); - html.replace("{s}", mqtt.ssl ? "checked" : ""); + html.replace("{sd}", ""); // Could be used to hide SSL config with "d-none" + html.replace("{s}", mqtt.ssl ? "checked" : ""); - if(LittleFS.begin()) { - html.replace("{dcu}", LittleFS.exists(FILE_MQTT_CA) ? "none" : ""); - html.replace("{dcf}", LittleFS.exists(FILE_MQTT_CA) ? "" : "none"); - html.replace("{deu}", LittleFS.exists(FILE_MQTT_CERT) ? "none" : ""); - html.replace("{def}", LittleFS.exists(FILE_MQTT_CERT) ? "" : "none"); - html.replace("{dku}", LittleFS.exists(FILE_MQTT_KEY) ? "none" : ""); - html.replace("{dkf}", LittleFS.exists(FILE_MQTT_KEY) ? "" : "none"); - LittleFS.end(); - } else { - html.replace("{dcu}", ""); - html.replace("{dcf}", "none"); - html.replace("{deu}", ""); - html.replace("{def}", "none"); - html.replace("{dku}", ""); - html.replace("{dkf}", "none"); - } - #endif + if(LittleFS.begin()) { + html.replace("{dcu}", LittleFS.exists(FILE_MQTT_CA) ? "none" : ""); + html.replace("{dcf}", LittleFS.exists(FILE_MQTT_CA) ? "" : "none"); + html.replace("{deu}", LittleFS.exists(FILE_MQTT_CERT) ? "none" : ""); + html.replace("{def}", LittleFS.exists(FILE_MQTT_CERT) ? "" : "none"); + html.replace("{dku}", LittleFS.exists(FILE_MQTT_KEY) ? "none" : ""); + html.replace("{dkf}", LittleFS.exists(FILE_MQTT_KEY) ? "" : "none"); + LittleFS.end(); + } else { + html.replace("{dcu}", ""); + html.replace("{dcf}", "none"); + html.replace("{deu}", ""); + html.replace("{def}", "none"); + html.replace("{dku}", ""); + html.replace("{dkf}", "none"); + } server.setContentLength(html.length() + HEAD_HTML_LEN + FOOT_HTML_LEN); server.send_P(200, MIME_HTML, HEAD_HTML); From b805363c6052d27e981eb5fb857c39fe5a23177f Mon Sep 17 00:00:00 2001 From: Gunnar Skjold Date: Thu, 23 Jun 2022 08:13:13 +0200 Subject: [PATCH 06/10] MQTT/SSL config re-enabled for ESP8266 in case it actually is in use --- src/AmsToMqttBridge.ino | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/src/AmsToMqttBridge.ino b/src/AmsToMqttBridge.ino index b68e9d21..d312dd45 100644 --- a/src/AmsToMqttBridge.ino +++ b/src/AmsToMqttBridge.ino @@ -87,7 +87,7 @@ Timezone* tz; AmsWebServer ws(commonBuffer, &Debug, &hw); MQTTClient *mqtt = NULL; -WiFiClient *mqttClient = new WiFiClient(); +WiFiClient *mqttClient = NULL; WiFiClientSecure *mqttSecureClient = NULL; AmsMqttHandler* mqttHandler = NULL; @@ -1306,24 +1306,21 @@ void MQTT_connect() { } if(mqttConfig.ssl) { - debugI("MQTT SSL is configured"); + debugI("MQTT SSL is configured (%dkb free heap)", ESP.getFreeHeap()); if(mqttSecureClient == NULL) { mqttSecureClient = new WiFiClientSecure(); } #if defined(ESP8266) mqttSecureClient->setBufferSizes(512, 512); - debugE("ESP8266 does not have enough RAM to SSL"); - return; + //debugE("ESP8266 does not have enough RAM to SSL"); + //return; #endif - + if(LittleFS.begin()) { - char *ca = NULL; - char *cert = NULL; - char *key = NULL; File file; if(LittleFS.exists(FILE_MQTT_CA)) { - debugI("Found MQTT CA file"); + debugI("Found MQTT CA file (%dkb free heap)", ESP.getFreeHeap()); file = LittleFS.open(FILE_MQTT_CA, "r"); #if defined(ESP8266) BearSSL::X509List *serverTrustedCA = new BearSSL::X509List(file); @@ -1331,32 +1328,37 @@ void MQTT_connect() { #elif defined(ESP32) mqttSecureClient->loadCACert(file, file.size()); #endif + file.close(); } if(LittleFS.exists(FILE_MQTT_CERT) && LittleFS.exists(FILE_MQTT_KEY)) { #if defined(ESP8266) - debugI("Found MQTT certificate file"); + debugI("Found MQTT certificate file (%dkb free heap)", ESP.getFreeHeap()); file = LittleFS.open(FILE_MQTT_CERT, "r"); BearSSL::X509List *serverCertList = new BearSSL::X509List(file); + file.close(); - debugI("Found MQTT key file"); + debugI("Found MQTT key file (%dkb free heap)", ESP.getFreeHeap()); file = LittleFS.open(FILE_MQTT_KEY, "r"); BearSSL::PrivateKey *serverPrivKey = new BearSSL::PrivateKey(file); + file.close(); - debugD("Setting client certificates"); + debugD("Setting client certificates (%dkb free heap)", ESP.getFreeHeap()); mqttSecureClient->setClientRSACert(serverCertList, serverPrivKey); #elif defined(ESP32) - debugI("Found MQTT certificate file"); + debugI("Found MQTT certificate file (%dkb free heap)", ESP.getFreeHeap()); file = LittleFS.open(FILE_MQTT_CERT, "r"); mqttSecureClient->loadCertificate(file, file.size()); + file.close(); - debugI("Found MQTT key file"); + debugI("Found MQTT key file (%dkb free heap)", ESP.getFreeHeap()); file = LittleFS.open(FILE_MQTT_KEY, "r"); mqttSecureClient->loadPrivateKey(file, file.size()); + file.close(); #endif } LittleFS.end(); - debugD("MQTT SSL setup complete"); + debugD("MQTT SSL setup complete (%dkb free heap)", ESP.getFreeHeap()); } mqttClient = mqttSecureClient; } else if(mqttClient == NULL) { From 55f1b4b1293a6b23afad559feb3644f0171b9c08 Mon Sep 17 00:00:00 2001 From: Gunnar Skjold Date: Thu, 23 Jun 2022 19:25:41 +0200 Subject: [PATCH 07/10] Fixed ESP32-S2 ADC --- src/HwTools.cpp | 38 +++++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/src/HwTools.cpp b/src/HwTools.cpp index 220eb476..c727ecc3 100644 --- a/src/HwTools.cpp +++ b/src/HwTools.cpp @@ -14,12 +14,30 @@ void HwTools::setup(GpioConfig* config, AmsConfiguration* amsConf) { config->tempSensorPin = 0xFF; } - #if defined(ESP32) + #if defined(CONFIG_IDF_TARGET_ESP32S2) + analogReadResolution(13); + analogRange = 8192; + //analogSetAttenuation(ADC_11db); + #elif defined(ESP32) analogReadResolution(12); analogRange = 4096; + //analogSetAttenuation(ADC_11db); #endif if(config->vccPin > 0 && config->vccPin < 40) { - #if defined(CONFIG_IDF_TARGET_ESP32) + #if defined(CONFIG_IDF_TARGET_ESP32S2) + getAdcChannel(config->vccPin, voltAdc); + if(voltAdc.unit != 0xFF) { + if(voltAdc.unit == ADC_UNIT_1) { + voltAdcChar = (esp_adc_cal_characteristics_t*) calloc(1, sizeof(esp_adc_cal_characteristics_t)); + esp_adc_cal_value_t adcVal = esp_adc_cal_characterize((adc_unit_t) voltAdc.unit, ADC_ATTEN_DB_11, ADC_WIDTH_BIT_13, 1100, voltAdcChar); + adc1_config_channel_atten((adc1_channel_t) voltAdc.channel, ADC_ATTEN_DB_11); + } else if(voltAdc.unit == ADC_UNIT_2) { + voltAdcChar = (esp_adc_cal_characteristics_t*) calloc(1, sizeof(esp_adc_cal_characteristics_t)); + esp_adc_cal_value_t adcVal = esp_adc_cal_characterize((adc_unit_t) voltAdc.unit, ADC_ATTEN_DB_11, ADC_WIDTH_BIT_13, 1100, voltAdcChar); + adc2_config_channel_atten((adc2_channel_t) voltAdc.channel, ADC_ATTEN_DB_11); + } + } + #elif defined(ESP32) getAdcChannel(config->vccPin, voltAdc); if(voltAdc.unit != 0xFF) { if(voltAdc.unit == ADC_UNIT_1) { @@ -113,6 +131,16 @@ void HwTools::getAdcChannel(uint8_t pin, AdcConfig& config) { config.unit = ADC_UNIT_1; config.channel = ADC1_CHANNEL_7; break; + #if defined(CONFIG_IDF_TARGET_ESP32S2) + case ADC1_CHANNEL_8_GPIO_NUM: + config.unit = ADC_UNIT_1; + config.channel = ADC1_CHANNEL_8; + break; + case ADC1_CHANNEL_9_GPIO_NUM: + config.unit = ADC_UNIT_1; + config.channel = ADC1_CHANNEL_9; + break; + #endif case ADC2_CHANNEL_0_GPIO_NUM: config.unit = ADC_UNIT_2; config.channel = ADC2_CHANNEL_0; @@ -160,7 +188,7 @@ void HwTools::getAdcChannel(uint8_t pin, AdcConfig& config) { double HwTools::getVcc() { double volts = 0.0; if(config->vccPin != 0xFF) { - #if defined(CONFIG_IDF_TARGET_ESP32) + #if defined(ESP32) if(voltAdc.unit != 0xFF) { uint32_t x = 0; for (int i = 0; i < 10; i++) { @@ -168,7 +196,11 @@ double HwTools::getVcc() { x += adc1_get_raw((adc1_channel_t) voltAdc.channel); } else if(voltAdc.unit == ADC_UNIT_2) { int v = 0; + #if defined(CONFIG_IDF_TARGET_ESP32S2) + adc2_get_raw((adc2_channel_t) voltAdc.channel, ADC_WIDTH_BIT_13, &v); + #elif defined(CONFIG_IDF_TARGET_ESP32) adc2_get_raw((adc2_channel_t) voltAdc.channel, ADC_WIDTH_BIT_12, &v); + #endif x += v; } } From a5d1a2c0eecfe8050ed8e9c2690fc4b074952539 Mon Sep 17 00:00:00 2001 From: Gunnar Skjold Date: Thu, 23 Jun 2022 20:03:29 +0200 Subject: [PATCH 08/10] Some adjustments --- src/HwTools.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/HwTools.cpp b/src/HwTools.cpp index c727ecc3..007c06a4 100644 --- a/src/HwTools.cpp +++ b/src/HwTools.cpp @@ -17,11 +17,11 @@ void HwTools::setup(GpioConfig* config, AmsConfiguration* amsConf) { #if defined(CONFIG_IDF_TARGET_ESP32S2) analogReadResolution(13); analogRange = 8192; - //analogSetAttenuation(ADC_11db); + analogSetAttenuation(ADC_11db); #elif defined(ESP32) analogReadResolution(12); analogRange = 4096; - //analogSetAttenuation(ADC_11db); + analogSetAttenuation(ADC_6db); #endif if(config->vccPin > 0 && config->vccPin < 40) { #if defined(CONFIG_IDF_TARGET_ESP32S2) From 648cac0b068b7e8a49d95e5fdedca3cc67ee308e Mon Sep 17 00:00:00 2001 From: Gunnar Skjold Date: Thu, 23 Jun 2022 20:22:15 +0200 Subject: [PATCH 09/10] Some adjustmenst --- src/AmsToMqttBridge.ino | 2 -- src/web/AmsWebServer.cpp | 1 - web/mqtt.html | 2 +- 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/AmsToMqttBridge.ino b/src/AmsToMqttBridge.ino index d312dd45..3994f5b8 100644 --- a/src/AmsToMqttBridge.ino +++ b/src/AmsToMqttBridge.ino @@ -1312,8 +1312,6 @@ void MQTT_connect() { } #if defined(ESP8266) mqttSecureClient->setBufferSizes(512, 512); - //debugE("ESP8266 does not have enough RAM to SSL"); - //return; #endif if(LittleFS.begin()) { diff --git a/src/web/AmsWebServer.cpp b/src/web/AmsWebServer.cpp index 6c763027..b1afdaa1 100644 --- a/src/web/AmsWebServer.cpp +++ b/src/web/AmsWebServer.cpp @@ -497,7 +497,6 @@ void AmsWebServer::configMqttHtml() { } html.replace("{f255}", mqtt.payloadFormat == 255 ? "selected" : ""); - html.replace("{sd}", ""); // Could be used to hide SSL config with "d-none" html.replace("{s}", mqtt.ssl ? "checked" : ""); if(LittleFS.begin()) { diff --git a/web/mqtt.html b/web/mqtt.html index ba4c73f3..8871b3d9 100644 --- a/web/mqtt.html +++ b/web/mqtt.html @@ -74,7 +74,7 @@ -
+
From aaa318e5114e11ad8070609acbc8300d7fa7ce4c Mon Sep 17 00:00:00 2001 From: Gunnar Skjold Date: Tue, 28 Jun 2022 14:02:00 +0200 Subject: [PATCH 10/10] Updated issue templates --- .github/ISSUE_TEMPLATE/bug_report.md | 5 ++++- .github/ISSUE_TEMPLATE/support.md | 6 +++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 6d75b183..2a3a752f 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -24,16 +24,19 @@ A clear description of what you expected to happen. If applicable, add screenshots to help explain your problem. **Hardware information:** + - Country: [e.g. Norway] - Meter: [e.g. Aidon] + - Encryption enabled [yes/no] - AMS reader: [e.g. Pow-U, ESP32 etc] - M-bus adapter (if applicable): **Relevant firmware information:** - - Version: [e.g. 1.5.0] + - Version: [e.g. 2.1.0] - MQTT: [yes/no] - HAN GPIO: [e.g. GPIO5] - HAN baud and parity: [e.g. 2400 8E1] - Temperature sensors [e.g. 3xDS18B20] + - ENTSO-E API enabled: [yes/no] **Additional context** Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/support.md b/.github/ISSUE_TEMPLATE/support.md index 981cfa37..13121413 100644 --- a/.github/ISSUE_TEMPLATE/support.md +++ b/.github/ISSUE_TEMPLATE/support.md @@ -11,12 +11,16 @@ assignees: '' A clear and concise description of what the problem is. **Hardware information:** + - Country: [e.g. Norway] - Meter: [e.g. Aidon] + - Encryption enabled [yes/no] - AMS reader: [e.g. Pow-U, ESP32 etc] - M-bus adapter (if applicable): **Relevant firmware information:** - - Version: [e.g. 1.5.0] + - Version: [e.g. 2.1.0] - MQTT: [yes/no] - HAN GPIO: [e.g. GPIO5] + - HAN baud and parity: [e.g. 2400 8E1] - Temperature sensors [e.g. 3xDS18B20] + - ENTSO-E API enabled: [yes/no]