diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e54acb5c..150c42e4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -52,7 +52,7 @@ jobs: draft: false prerelease: false - name: Upload hw1esp12e binary to release - uses: actions/upload-release-asset@v1.0.1 + uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: @@ -61,7 +61,7 @@ jobs: asset_name: ams2mqtt-hw1esp12e-${{ steps.release_tag.outputs.tag }}.bin asset_content_type: application/octet-stream - name: Upload esp12e binary to release - uses: actions/upload-release-asset@v1.0.1 + uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: @@ -70,7 +70,7 @@ jobs: asset_name: ams2mqtt-esp12e-${{ steps.release_tag.outputs.tag }}.bin asset_content_type: application/octet-stream - name: Upload d1mini binary to release - uses: actions/upload-release-asset@v1.0.1 + uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: @@ -79,7 +79,7 @@ jobs: asset_name: ams2mqtt-d1mini-${{ steps.release_tag.outputs.tag }}.bin asset_content_type: application/octet-stream - name: Upload esp32 binary to release - uses: actions/upload-release-asset@v1.0.1 + uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: @@ -88,7 +88,7 @@ jobs: asset_name: ams2mqtt-esp32-${{ steps.release_tag.outputs.tag }}.bin asset_content_type: application/octet-stream - name: Upload lolind32 binary to release - uses: actions/upload-release-asset@v1.0.1 + uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: @@ -97,7 +97,7 @@ jobs: asset_name: ams2mqtt-lolind32-${{ steps.release_tag.outputs.tag }}.bin asset_content_type: application/octet-stream - name: Upload featheresp32 binary to release - uses: actions/upload-release-asset@v1.0.1 + uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: diff --git a/src/AmsConfiguration.cpp b/src/AmsConfiguration.cpp index a066349f..65485590 100644 --- a/src/AmsConfiguration.cpp +++ b/src/AmsConfiguration.cpp @@ -45,10 +45,39 @@ void AmsConfiguration::setWifiSubnet(String wifiSubnet) { this->wifiSubnet = String(wifiSubnet); } +String AmsConfiguration::getWifiDns1() { + return wifiDns1; +} + +void AmsConfiguration::setWifiDns1(String wifiDns1) { + wifiChanged |= this->wifiDns1 != wifiDns1; + this->wifiDns1 = wifiDns1; +} + +String AmsConfiguration::getWifiDns2() { + return wifiDns2; +} + +void AmsConfiguration::setWifiDns2(String wifiDns2) { + wifiChanged |= this->wifiDns2 != wifiDns2; + this->wifiDns2 = wifiDns2; +} + +String AmsConfiguration::getWifiHostname() { + return wifiHostname; +} + +void AmsConfiguration::setWifiHostname(String wifiHostname) { + wifiChanged |= this->wifiHostname != wifiHostname; + this->wifiHostname = wifiHostname; +} + void AmsConfiguration::clearWifiIp() { setWifiIp(""); setWifiGw(""); setWifiSubnet(""); + setWifiDns1(""); + setWifiDns2(""); } bool AmsConfiguration::isWifiChanged() { @@ -214,9 +243,11 @@ void AmsConfiguration::setProductionCapacity(int productionCapacity) { bool AmsConfiguration::hasConfig() { - EEPROM.begin(EEPROM_SIZE); - int configVersion = EEPROM.read(EEPROM_CONFIG_ADDRESS); - EEPROM.end(); + if(configVersion == 0) { + EEPROM.begin(EEPROM_SIZE); + configVersion = EEPROM.read(EEPROM_CONFIG_ADDRESS); + EEPROM.end(); + } switch(configVersion) { case 71: case 72: @@ -229,6 +260,10 @@ bool AmsConfiguration::hasConfig() { } } +int AmsConfiguration::getConfigVersion() { + return configVersion; +} + bool AmsConfiguration::load() { int address = EEPROM_CONFIG_ADDRESS; bool success = false; @@ -451,13 +486,23 @@ bool AmsConfiguration::loadConfig81(int address) { setWifiSsid(temp); address += readString(address, &temp); setWifiPassword(temp); - address += readString(address, &temp); - setWifiIp(temp); - address += readString(address, &temp); - setWifiGw(temp); - address += readString(address, &temp); - setWifiSubnet(temp); + bool staticIp = false; + address += readBool(address, &staticIp); + if(staticIp) { + address += readString(address, &temp); + setWifiIp(temp); + address += readString(address, &temp); + setWifiGw(temp); + address += readString(address, &temp); + setWifiSubnet(temp); + address += readString(address, &temp); + setWifiDns1(temp); + address += readString(address, &temp); + setWifiDns2(temp); + } + address += readString(address, &temp); + setWifiHostname(temp); bool mqtt = false; address += readBool(address, &mqtt); if(mqtt) { @@ -526,17 +571,25 @@ bool AmsConfiguration::save() { address += saveString(address, wifiSsid.c_str()); address += saveString(address, wifiPassword.c_str()); - address += saveString(address, wifiIp.c_str()); - address += saveString(address, wifiGw.c_str()); - address += saveString(address, wifiSubnet.c_str()); - if(mqttHost) { + if(!wifiIp.isEmpty()) { + address += saveBool(address, true); + address += saveString(address, wifiIp.c_str()); + address += saveString(address, wifiGw.c_str()); + address += saveString(address, wifiSubnet.c_str()); + address += saveString(address, wifiDns1.c_str()); + address += saveString(address, wifiDns2.c_str()); + } else { + address += saveBool(address, false); + } + address += saveString(address, wifiHostname.c_str()); + if(!mqttHost.isEmpty()) { address += saveBool(address, true); address += saveString(address, mqttHost.c_str()); address += saveInt(address, mqttPort); address += saveString(address, mqttClientId.c_str()); address += saveString(address, mqttPublishTopic.c_str()); address += saveString(address, mqttSubscribeTopic.c_str()); - if (mqttUser) { + if (!mqttUser.isEmpty()) { address += saveBool(address, true); address += saveString(address, mqttUser.c_str()); address += saveString(address, mqttPassword.c_str()); @@ -562,6 +615,8 @@ bool AmsConfiguration::save() { bool success = EEPROM.commit(); EEPROM.end(); + configVersion = EEPROM_CHECK_SUM; + return success; } @@ -656,13 +711,15 @@ void AmsConfiguration::print(Stream* debugger) debugger->printf("WiFi SSID: %s\r\n", this->getWifiSsid().c_str()); debugger->printf("WiFi Psk: %s\r\n", this->getWifiPassword().c_str()); - if(getWifiIp()) { + if(!getWifiIp().isEmpty()) { debugger->printf("IP: %s\r\n", this->getWifiIp().c_str()); debugger->printf("Gateway: %s\r\n", this->getWifiGw().c_str()); - debugger->printf("Subnet: %s\r\n", this->getWifiSubnet().c_str()); + debugger->printf("Subnet: %s\r\n", this->getWifiSubnet().c_str()); + debugger->printf("Primary DNS: %s\r\n", this->getWifiDns1().c_str()); + debugger->printf("Secondary DNS: %s\r\n", this->getWifiDns2().c_str()); } - if(getMqttHost()) { + if(!getMqttHost().isEmpty()) { debugger->printf("mqttHost: %s\r\n", this->getMqttHost().c_str()); debugger->printf("mqttPort: %i\r\n", this->getMqttPort()); debugger->printf("mqttClientID: %s\r\n", this->getMqttClientId().c_str()); @@ -673,6 +730,7 @@ void AmsConfiguration::print(Stream* debugger) debugger->printf("mqttUser: %s\r\n", this->getMqttUser().c_str()); debugger->printf("mqttPass: %s\r\n", this->getMqttPassword().c_str()); } + debugger->printf("payload format: %i\r\n", this->getMqttPayloadFormat()); } if (this->getAuthSecurity()) { diff --git a/src/AmsConfiguration.h b/src/AmsConfiguration.h index 1fbf779b..201d6be9 100644 --- a/src/AmsConfiguration.h +++ b/src/AmsConfiguration.h @@ -6,6 +6,8 @@ class AmsConfiguration { public: bool hasConfig(); + int getConfigVersion(); + bool load(); bool save(); @@ -19,6 +21,12 @@ public: void setWifiGw(String wifiGw); String getWifiSubnet(); void setWifiSubnet(String wifiSubnet); + String getWifiDns1(); + void setWifiDns1(String wifiDns1); + String getWifiDns2(); + void setWifiDns2(String wifiDns1); + String getWifiHostname(); + void setWifiHostname(String wifiHostname); void clearWifiIp(); bool isWifiChanged(); @@ -67,11 +75,16 @@ public: protected: private: + int configVersion; + String wifiSsid; String wifiPassword; String wifiIp; String wifiGw; String wifiSubnet; + String wifiDns1; + String wifiDns2; + String wifiHostname; bool wifiChanged; String mqttHost; diff --git a/src/AmsToMqttBridge.h b/src/AmsToMqttBridge.h index cd90e083..45c13d84 100644 --- a/src/AmsToMqttBridge.h +++ b/src/AmsToMqttBridge.h @@ -8,8 +8,10 @@ #if defined(ESP8266) #include +#include #elif defined(ESP32) #include +#include #include "SPIFFS.h" #include "Update.h" #endif diff --git a/src/AmsToMqttBridge.ino b/src/AmsToMqttBridge.ino index b73cdc84..a8b5c4f8 100644 --- a/src/AmsToMqttBridge.ino +++ b/src/AmsToMqttBridge.ino @@ -166,6 +166,16 @@ void setup() { } } + if(config.getConfigVersion() < 81) { + uint16_t chipId; +#if defined(ARDUINO_ARCH_ESP32) + chipId = ESP.getEfuseMac(); +#else + chipId = ESP.getChipId(); +#endif + config.setWifiHostname(String("ams-") + String(chipId, HEX)); + } + if(config.hasConfig()) { if(debugger) config.print(debugger); WiFi_connect(); @@ -285,6 +295,10 @@ void loop() { if(debugger) { debugger->println("Successfully connected to WiFi!"); debugger->println(WiFi.localIP()); + if(!config.getWifiHostname().isEmpty()) { + MDNS.begin(config.getWifiHostname().c_str()); + MDNS.addService("http", "tcp", 80); + } } } if (!config.getMqttHost().isEmpty()) { @@ -573,17 +587,27 @@ void WiFi_connect() { } if (WiFi.status() != WL_CONNECTED) { + MDNS.end(); WiFi.disconnect(); yield(); WiFi.enableAP(false); WiFi.mode(WIFI_STA); if(!config.getWifiIp().isEmpty()) { - IPAddress ip, gw, sn(255,255,255,0); + IPAddress ip, gw, sn(255,255,255,0), dns1, dns2; ip.fromString(config.getWifiIp()); gw.fromString(config.getWifiGw()); sn.fromString(config.getWifiSubnet()); - WiFi.config(ip, gw, sn); + dns1.fromString(config.getWifiDns1()); + dns2.fromString(config.getWifiDns2()); + WiFi.config(ip, gw, sn, dns1, dns2); + } + if(!config.getWifiHostname().isEmpty()) { +#if defined(ESP8266) + WiFi.hostname(config.getWifiHostname()); +#elif defined(ESP32) + WiFi.setHostname(config.getWifiHostname().c_str()); +#endif } WiFi.begin(config.getWifiSsid().c_str(), config.getWifiPassword().c_str()); yield(); diff --git a/src/web/AmsWebServer.cpp b/src/web/AmsWebServer.cpp index de637b24..5898f695 100644 --- a/src/web/AmsWebServer.cpp +++ b/src/web/AmsWebServer.cpp @@ -7,7 +7,7 @@ #include "root/configmqtt_html.h" #include "root/configweb_html.h" #include "root/configsystem_html.h" -#include "root/firmwarewait_html.h" +#include "root/restartwait_html.h" #include "root/boot_css.h" #include "root/gaugemeter_js.h" @@ -32,7 +32,8 @@ void AmsWebServer::setup(AmsConfiguration* config, Stream* debugger, MQTTClient* server.on("/config-system", HTTP_GET, std::bind(&AmsWebServer::configSystemHtml, this)); server.on("/config-system", HTTP_POST, std::bind(&AmsWebServer::configSystemPost, this), std::bind(&AmsWebServer::configSystemUpload, this)); - server.on("/firmware-wait", HTTP_GET, std::bind(&AmsWebServer::firmwareWaitHtml, this)); + server.on("/restart-wait", HTTP_GET, std::bind(&AmsWebServer::restartWaitHtml, this)); + server.on("/is-alive", HTTP_GET, std::bind(&AmsWebServer::isAliveCheck, this)); server.begin(); // Web server start } @@ -209,6 +210,9 @@ void AmsWebServer::configWifiHtml() { html.replace("${config.wifiIp}", config->getWifiIp()); html.replace("${config.wifiGw}", config->getWifiGw()); html.replace("${config.wifiSubnet}", config->getWifiSubnet()); + html.replace("${config.wifiDns1}", config->getWifiDns1()); + html.replace("${config.wifiDns2}", config->getWifiDns2()); + html.replace("${config.wifiHostname}", config->getWifiHostname()); server.setContentLength(html.length()); server.send(200, "text/html", html); @@ -462,9 +466,12 @@ void AmsWebServer::handleSave() { config->setWifiIp(server.arg("wifiIp")); config->setWifiGw(server.arg("wifiGw")); config->setWifiSubnet(server.arg("wifiSubnet")); + config->setWifiDns1(server.arg("wifiDns1")); + config->setWifiDns2(server.arg("wifiDns2")); } else { config->clearWifiIp(); } + config->setWifiHostname(server.arg("wifiHostname")); } if(server.hasArg("mqttConfig") && server.arg("mqttConfig") == "true") { @@ -499,19 +506,12 @@ void AmsWebServer::handleSave() { if (config->save()) { println("Successfully saved."); if(config->isWifiChanged()) { - String html = "

Successfully Saved!

Go to index"; - server.send(200, "text/html", html); - yield(); - println("Wifi config changed, rebooting"); - delay(1000); -#if defined(ESP8266) - ESP.reset(); -#elif defined(ESP32) - ESP.restart(); -#endif + performRestart = true; + server.sendHeader("Location","/restart-wait"); + server.send(303); } else { server.sendHeader("Location", String("/"), true); - server.send ( 302, "text/plain", ""); + server.send (302, "text/plain", ""); } } else { println("Error saving configuration"); @@ -567,7 +567,8 @@ void AmsWebServer::configSystemUpload() { firmwareFile.close(); SPIFFS.end(); print("handleFileUpload Size: "); println(String(upload.totalSize).c_str()); - server.sendHeader("Location","/firmware-wait"); + performRestart = true; + server.sendHeader("Location","/restart-wait"); server.send(303); } else { server.send(500, "text/plain", "500: couldn't create file"); @@ -575,18 +576,24 @@ void AmsWebServer::configSystemUpload() { } } -void AmsWebServer::firmwareWaitHtml() { - println("Serving /firmware-wait.html over http..."); +void AmsWebServer::restartWaitHtml() { + println("Serving /restart-wait.html over http..."); if(!checkSecurity(1)) return; - String html = String((const __FlashStringHelper*) FIRMWAREWAIT_HTML); + String html = String((const __FlashStringHelper*) RESTARTWAIT_HTML); html.replace("${version}", VERSION); if(WiFi.getMode() != WIFI_AP) { html.replace("boot.css", BOOTSTRAP_URL); } + if(config->getWifiIp().isEmpty() && WiFi.getMode() != WIFI_AP) { + html.replace("${ip}", WiFi.localIP().toString()); + } else { + html.replace("${ip}", config->getWifiIp()); + } + html.replace("${hostname}", config->getWifiHostname()); server.sendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); server.sendHeader("Pragma", "no-cache"); @@ -595,7 +602,7 @@ void AmsWebServer::firmwareWaitHtml() { server.send(200, "text/html", html); yield(); - if(SPIFFS.begin() && SPIFFS.exists("/firmware.bin")) { + if(performRestart) { SPIFFS.end(); println("Firmware uploaded, rebooting"); delay(1000); @@ -604,9 +611,15 @@ void AmsWebServer::firmwareWaitHtml() { #elif defined(ESP32) ESP.restart(); #endif + performRestart = false; } } +void AmsWebServer::isAliveCheck() { + server.sendHeader("Access-Control-Allow-Origin", "*"); + server.send(200); +} + size_t AmsWebServer::print(const char* text) { if (debugger) debugger->print(text); diff --git a/src/web/AmsWebServer.h b/src/web/AmsWebServer.h index e024b388..f210e93f 100644 --- a/src/web/AmsWebServer.h +++ b/src/web/AmsWebServer.h @@ -43,6 +43,7 @@ private: Stream* debugger; MQTTClient* mqtt; File firmwareFile; + bool performRestart = false; #if defined(ESP8266) ESP8266WebServer server; @@ -66,7 +67,8 @@ private: void configSystemHtml(); void configSystemPost(); void configSystemUpload(); - void firmwareWaitHtml(); + void restartWaitHtml(); + void isAliveCheck(); size_t print(const char* text); size_t println(const char* text); diff --git a/web/configwifi.html b/web/configwifi.html index 00bd5434..a8fec9e7 100644 --- a/web/configwifi.html +++ b/web/configwifi.html @@ -55,6 +55,12 @@ +
+ +
+ +
+
@@ -67,23 +73,35 @@
- -
+ +
+
+ +
+ +
+
- -
- + +
+
- -
- + +
+ +
+
+
+ +
+
diff --git a/web/firmwarewait.html b/web/restartwait.html similarity index 78% rename from web/firmwarewait.html rename to web/restartwait.html index 7e87f65a..67c9b070 100644 --- a/web/firmwarewait.html +++ b/web/restartwait.html @@ -26,7 +26,7 @@ Web
@@ -39,23 +39,38 @@
- Firmware upload complete, you will be redirected to the main page when the device is finished flashing. + Device is rebooting. You will be redirected to the main page when it is available again.