diff --git a/usermods/usermod_v2_auto_save/usermod_v2_auto_save.h b/usermods/usermod_v2_auto_save/usermod_v2_auto_save.h index 41e0a7ecf..8283aeed1 100644 --- a/usermods/usermod_v2_auto_save/usermod_v2_auto_save.h +++ b/usermods/usermod_v2_auto_save/usermod_v2_auto_save.h @@ -91,6 +91,10 @@ class AutoSaveUsermod : public Usermod { #endif } + void enable(bool enable) { + enabled = enable; + } + public: // gets called once at boot. Do all initialization that doesn't depend on @@ -155,12 +159,24 @@ class AutoSaveUsermod : public Usermod { * Creating an "u" object allows you to add custom key/value pairs to the Info section of the WLED web UI. * Below it is shown how this could be used for e.g. a light sensor */ - //void addToJsonInfo(JsonObject& root) { - //JsonObject user = root["u"]; - //if (user.isNull()) user = root.createNestedObject("u"); - //JsonArray data = user.createNestedArray(F("Autosave")); - //data.add(F("Loaded.")); - //} + void addToJsonInfo(JsonObject& root) { + JsonObject user = root["u"]; + if (user.isNull()) { + user = root.createNestedObject("u"); + } + + JsonArray infoArr = user.createNestedArray(FPSTR(_name)); // name + + String uiDomString = F(""); + infoArr.add(uiDomString); + } /* * addToJsonState() can be used to add custom entries to the /json/state part of the JSON API (state object). @@ -173,9 +189,20 @@ class AutoSaveUsermod : public Usermod { * readFromJsonState() can be used to receive data clients send to the /json/state part of the JSON API (state object). * Values in the state object may be modified by connected clients */ - //void readFromJsonState(JsonObject& root) { - // if (!initDone) return; // prevent crash on boot applyPreset() - //} + void readFromJsonState(JsonObject& root) { + if (!initDone) return; // prevent crash on boot applyPreset() + bool en = enabled; + JsonObject um = root[FPSTR(_name)]; + if (!um.isNull()) { + if (um[FPSTR(_autoSaveEnabled)].is()) { + en = um[FPSTR(_autoSaveEnabled)].as(); + } else { + String str = um[FPSTR(_autoSaveEnabled)]; // checkbox -> off or on + en = (bool)(str!="off"); // off is guaranteed to be present + } + if (en != enabled) enable(en); + } + } /* * addToConfig() can be used to add custom persistent settings to the cfg.json file in the "um" (usermod) object. diff --git a/wled00/cfg.cpp b/wled00/cfg.cpp index 481b96510..fb60298d7 100644 --- a/wled00/cfg.cpp +++ b/wled00/cfg.cpp @@ -318,7 +318,7 @@ bool deserializeConfig(JsonObject doc, bool fromFS) { JsonObject light_tr = light["tr"]; CJSON(fadeTransition, light_tr["mode"]); int tdd = light_tr["dur"] | -1; - if (tdd >= 0) transitionDelayDefault = tdd * 100; + if (tdd >= 0) transitionDelay = transitionDelayDefault = tdd * 100; CJSON(strip.paletteFade, light_tr["pal"]); JsonObject light_nl = light["nl"]; diff --git a/wled00/const.h b/wled00/const.h index 6f8f269d9..3e5c688f4 100644 --- a/wled00/const.h +++ b/wled00/const.h @@ -9,6 +9,7 @@ //Defaults #define DEFAULT_CLIENT_SSID "Your_Network" +#define DEFAULT_AP_SSID "WLED-AP" #define DEFAULT_AP_PASS "wled1234" #define DEFAULT_OTA_PASS "wledota" diff --git a/wled00/wled.cpp b/wled00/wled.cpp index c26ad85a3..0442e3c57 100644 --- a/wled00/wled.cpp +++ b/wled00/wled.cpp @@ -133,7 +133,7 @@ void WLED::loop() ntpLastSyncTime = 0; strip.restartRuntime(); } - if (millis() - lastMqttReconnectAttempt > 30000) { + if (millis() - lastMqttReconnectAttempt > 30000 || lastMqttReconnectAttempt == 0) { // lastMqttReconnectAttempt==0 forces immediate broadcast lastMqttReconnectAttempt = millis(); initMqtt(); yield(); @@ -366,7 +366,13 @@ void WLED::setup() #endif updateFSInfo(); - strcpy_P(apSSID, PSTR("WLED-AP")); // otherwise it is empty on first boot until config is saved + // generate module IDs must be done before AP setup + escapedMac = WiFi.macAddress(); + escapedMac.replace(":", ""); + escapedMac.toLowerCase(); + + WLED_SET_AP_SSID(); // otherwise it is empty on first boot until config is saved + DEBUG_PRINTLN(F("Reading config")); deserializeConfigFromFS(); @@ -400,10 +406,6 @@ void WLED::setup() } #endif - // generate module IDs - escapedMac = WiFi.macAddress(); - escapedMac.replace(":", ""); - escapedMac.toLowerCase(); // fill in unique mdns default if (strcmp(cmDNS, "x") == 0) sprintf_P(cmDNS, PSTR("wled-%*s"), 6, escapedMac.c_str() + 6); if (mqttDeviceTopic[0] == 0) sprintf_P(mqttDeviceTopic, PSTR("wled/%*s"), 6, escapedMac.c_str() + 6); @@ -480,8 +482,8 @@ void WLED::initAP(bool resetAP) return; if (resetAP) { - strcpy_P(apSSID, PSTR("WLED-AP")); - strcpy_P(apPass, PSTR(DEFAULT_AP_PASS)); + WLED_SET_AP_SSID(); + strcpy_P(apPass, PSTR(WLED_AP_PASS)); } DEBUG_PRINT(F("Opening access point ")); DEBUG_PRINTLN(apSSID); @@ -802,6 +804,7 @@ void WLED::handleConnection() initInterfaces(); userConnected(); usermods.connected(); + lastMqttReconnectAttempt = 0; // force immediate update // shut down AP if (apBehavior != AP_BEHAVIOR_ALWAYS && apActive) { diff --git a/wled00/wled.h b/wled00/wled.h index 95d3c1ac2..05b7e6165 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -8,7 +8,7 @@ */ // version code in format yymmddb (b = daily build) -#define VERSION 2211190 +#define VERSION 2211200 //uncomment this if you have a "my_config.h" file you'd like to use //#define WLED_USE_MY_CONFIG @@ -175,6 +175,19 @@ using PSRAMDynamicJsonDocument = BasicJsonDocument; #define CLIENT_PASS "" #endif +#if defined(WLED_AP_PASS) && !defined(WLED_AP_SSID) + #error WLED_AP_PASS is defined but WLED_AP_SSID is still the default. \ + Please change WLED_AP_SSID to something unique. +#endif + +#ifndef WLED_AP_SSID + #define WLED_AP_SSID DEFAULT_AP_SSID +#endif + +#ifndef WLED_AP_PASS + #define WLED_AP_PASS DEFAULT_AP_PASS +#endif + #ifndef SPIFFS_EDITOR_AIRCOOOKIE #error You are not using the Aircoookie fork of the ESPAsyncWebserver library.\ Using upstream puts your WiFi password at risk of being served by the filesystem.\ @@ -229,7 +242,7 @@ WLED_GLOBAL char versionString[] _INIT(TOSTRING(WLED_VERSION)); #define WLED_CODENAME "Hoshi" // AP and OTA default passwords (for maximum security change them!) -WLED_GLOBAL char apPass[65] _INIT(DEFAULT_AP_PASS); +WLED_GLOBAL char apPass[65] _INIT(WLED_AP_PASS); WLED_GLOBAL char otaPass[33] _INIT(DEFAULT_OTA_PASS); // Hardware and pin config @@ -729,6 +742,23 @@ WLED_GLOBAL volatile uint8_t jsonBufferLock _INIT(0); #define WLED_WIFI_CONFIGURED (strlen(clientSSID) >= 1 && strcmp(clientSSID, DEFAULT_CLIENT_SSID) != 0) #define WLED_MQTT_CONNECTED (mqtt != nullptr && mqtt->connected()) +#ifndef WLED_AP_SSID_UNIQUE + #define WLED_SET_AP_SSID() do { \ + strcpy_P(apSSID, PSTR(WLED_AP_SSID)); \ + } while(0) +#else + #define WLED_SET_AP_SSID() do { \ + strcpy_P(apSSID, PSTR(WLED_AP_SSID)); \ + snprintf_P(\ + apSSID+strlen(WLED_AP_SSID), \ + sizeof(apSSID)-strlen(WLED_AP_SSID), \ + PSTR("-%*s"), \ + 6, \ + escapedMac.c_str() + 6\ + ); \ + } while(0) +#endif + //macro to convert F to const #define SET_F(x) (const char*)F(x)