From 4698442101a46eb97a3bcbf8700de8329117d2ad Mon Sep 17 00:00:00 2001 From: Gunnar Skjold Date: Thu, 19 Feb 2026 12:34:13 +0100 Subject: [PATCH] Use unique SSID on first boot --- .../include/AmsConfiguration.h | 2 ++ lib/AmsConfiguration/src/AmsConfiguration.cpp | 23 +++++++++++++++---- lib/SvelteUi/json/sysinfo.json | 2 +- lib/SvelteUi/src/AmsWebServer.cpp | 20 +++++----------- src/AmsToMqttBridge.cpp | 20 +++++++++------- 5 files changed, 39 insertions(+), 28 deletions(-) diff --git a/lib/AmsConfiguration/include/AmsConfiguration.h b/lib/AmsConfiguration/include/AmsConfiguration.h index cc949e2b..e0e8bdb8 100644 --- a/lib/AmsConfiguration/include/AmsConfiguration.h +++ b/lib/AmsConfiguration/include/AmsConfiguration.h @@ -381,6 +381,8 @@ public: bool isZmartChargeConfigChanged(); void ackZmartChargeConfig(); + uint32_t getChipId(); + void getUniqueName(char* buffer, size_t length); void clear(); diff --git a/lib/AmsConfiguration/src/AmsConfiguration.cpp b/lib/AmsConfiguration/src/AmsConfiguration.cpp index 30536fb5..d1ddca76 100644 --- a/lib/AmsConfiguration/src/AmsConfiguration.cpp +++ b/lib/AmsConfiguration/src/AmsConfiguration.cpp @@ -124,16 +124,12 @@ void AmsConfiguration::clearNetworkConfig(NetworkConfig& config) { memset(config.ssid, 0, 32); memset(config.psk, 0, 64); clearNetworkConfigIp(config); - - uint16_t chipId; + getUniqueName(config.hostname, 32); #if defined(ESP32) - chipId = ( ESP.getEfuseMac() >> 32 ) % 0xFFFFFFFF; config.power = 195; #else - chipId = ESP.getChipId(); config.power = 205; #endif - strcpy(config.hostname, (String("ams-") + String(chipId, HEX)).c_str()); config.mdns = true; config.sleep = 0xFF; config.use11b = 1; @@ -983,6 +979,23 @@ void AmsConfiguration::setUiLanguageChanged() { uiLanguageChanged = true; } +uint32_t AmsConfiguration::getChipId() { + uint32_t chipId; + #if defined(ESP32) + for(int i=0; i<17; i=i+8) { + chipId |= ((ESP.getEfuseMac() >> (40 - i)) & 0xff) << i; + } + #else + chipId = ESP.getChipId(); + #endif + return chipId; +} + +void AmsConfiguration::getUniqueName(char* buffer, size_t length) { + uint32_t chipId = getChipId(); + snprintf(buffer, length, "ams-%06x", chipId); +} + void AmsConfiguration::clear() { EEPROM.begin(EEPROM_SIZE); diff --git a/lib/SvelteUi/json/sysinfo.json b/lib/SvelteUi/json/sysinfo.json index cda8a1dc..b3fa62cf 100644 --- a/lib/SvelteUi/json/sysinfo.json +++ b/lib/SvelteUi/json/sysinfo.json @@ -1,7 +1,7 @@ { "version": "%s", "chip": "%s", - "chipId": "%s", + "chipId": "%06x", "cpu": %d, "mac": "%s", "apmac": "%s", diff --git a/lib/SvelteUi/src/AmsWebServer.cpp b/lib/SvelteUi/src/AmsWebServer.cpp index d036b163..9e99ee19 100644 --- a/lib/SvelteUi/src/AmsWebServer.cpp +++ b/lib/SvelteUi/src/AmsWebServer.cpp @@ -306,22 +306,14 @@ void AmsWebServer::sysinfoJson() { SystemConfig sys; config->getSystemConfig(sys); - - uint32_t chipId; - #if defined(ESP32) - chipId = ( ESP.getEfuseMac() >> 32 ) % 0xFFFFFFFF; - #else - chipId = ESP.getChipId(); - #endif - String chipIdStr = String(chipId, HEX); - - String hostname; + + char hostname[32]; if(sys.userConfigured) { NetworkConfig networkConfig; config->getNetworkConfig(networkConfig); - hostname = String(networkConfig.hostname); + strncpy(hostname, networkConfig.hostname, 32); } else { - hostname = "ams-"+chipIdStr; + config->getUniqueName(hostname, 32); } IPAddress localIp; @@ -421,7 +413,7 @@ void AmsWebServer::sysinfoJson() { #elif defined(ESP8266) "esp8266", #endif - chipIdStr.c_str(), + config->getChipId(), cpu_freq, macStr, apMacStr, @@ -429,7 +421,7 @@ void AmsWebServer::sysinfoJson() { sys.vendorConfigured ? "true" : "false", sys.userConfigured ? "true" : "false", sys.dataCollectionConsent, - hostname.c_str(), + hostname, performRestart ? "true" : "false", updater->getProgress() > 0.0 && upinfo.errorCode == 0 ? "true" : "false", #if defined(ESP8266) diff --git a/src/AmsToMqttBridge.cpp b/src/AmsToMqttBridge.cpp index e8c34b14..37597a26 100644 --- a/src/AmsToMqttBridge.cpp +++ b/src/AmsToMqttBridge.cpp @@ -901,13 +901,7 @@ void handleEnergySpeedometer() { if(sysConfig.energyspeedometer == 7) { if(!meterState.getMeterId().isEmpty()) { if(energySpeedometer == NULL) { - uint16_t chipId; - #if defined(ESP32) - chipId = ( ESP.getEfuseMac() >> 32 ) % 0xFFFFFFFF; - #else - chipId = ESP.getChipId(); - #endif - strcpy(energySpeedometerConfig.clientId, (String("ams") + String(chipId, HEX)).c_str()); + config.getUniqueName(energySpeedometerConfig.clientId, 32); energySpeedometer = new JsonMqttHandler(energySpeedometerConfig, &Debug, (char*) commonBuffer, &hw, &ds, &updater); energySpeedometer->setCaVerification(false); } @@ -1460,7 +1454,17 @@ void toggleSetupMode() { #else WiFi.beginSmartConfig(); #endif - WiFi.softAP(PSTR("AMS2MQTT")); + + char ssid[32]; + if(sysConfig.vendorConfigured) { + // Use the standard SSID if the vendor has configured the device + strcpy_P(ssid, PSTR("AMS2MQTT")); + } else { + // If not vendor configured, use a unique SSID to avoid conflicts if multiple devices are in setup mode at the same time + config.getUniqueName(ssid, 32); + } + WiFi.softAP(ssid); + debugI_P(PSTR("SSID: %s"), ssid); if(dnsServer == NULL) { dnsServer = new DNSServer();