diff --git a/src/AmsConfiguration.cpp b/src/AmsConfiguration.cpp index 89083299..1b0e3d23 100644 --- a/src/AmsConfiguration.cpp +++ b/src/AmsConfiguration.cpp @@ -1,5 +1,13 @@ #include "AmsConfiguration.h" +uint8_t AmsConfiguration::getBoardType() { + return config.boardType; +} + +void AmsConfiguration::setBoardType(uint8_t boardType) { + config.boardType = boardType; +} + char* AmsConfiguration::getWifiSsid() { return config.wifiSsid; } diff --git a/src/AmsConfiguration.h b/src/AmsConfiguration.h index b368bd9d..3f1cce3f 100644 --- a/src/AmsConfiguration.h +++ b/src/AmsConfiguration.h @@ -4,6 +4,7 @@ #include "Arduino.h" struct ConfigObject { + uint8_t boardType; char wifiSsid[32]; char wifiPassword[64]; char wifiIp[15]; @@ -62,6 +63,9 @@ public: bool load(); bool save(); + + uint8_t getBoardType(); + void setBoardType(uint8_t boardType); char* getWifiSsid(); void setWifiSsid(const char* wifiSsid); @@ -191,6 +195,7 @@ protected: private: int configVersion = 0; ConfigObject config { + 0, // Board type "", // SSID "", // PSK "", // IP diff --git a/src/AmsToMqttBridge.ino b/src/AmsToMqttBridge.ino index 3a2ab24e..b39ed8df 100644 --- a/src/AmsToMqttBridge.ino +++ b/src/AmsToMqttBridge.ino @@ -44,6 +44,9 @@ ADC_MODE(ADC_VCC); #define WEBSOCKET_DISABLED true #include "RemoteDebug.h" +#define DEBUG_ESP_HTTP_CLIENT 1 +#define DEBUG_ESP_PORT Serial + HwTools hw; DNSServer dnsServer; @@ -125,6 +128,10 @@ void setup() { hw.setTempSensorPin(config.getTempSensorPin()); hw.setVccPin(config.getVccPin()); hw.setVccMultiplier(config.getVccMultiplier()); + hw.ledBlink(LED_INTERNAL, 1); + hw.ledBlink(LED_RED, 1); + hw.ledBlink(LED_GREEN, 1); + hw.ledBlink(LED_YELLOW, 1); if(config.getHanPin() == 3) { if(config.getMeterType() == 3) { @@ -377,6 +384,11 @@ void setupHanPort(int pin, int meterType) { } #endif + if(pin == 0) { + debugE("Invalid GPIO configured for HAN"); + return; + } + if(hwSerial != NULL) { debugD("Hardware serial"); Serial.flush(); @@ -453,7 +465,9 @@ void errorBlink() { } void swapWifiMode() { - hw.ledOn(LED_INTERNAL); + if(!hw.ledOn(LED_YELLOW)) { + hw.ledOn(LED_INTERNAL); + } WiFiMode_t mode = WiFi.getMode(); dnsServer.stop(); WiFi.disconnect(true); @@ -473,7 +487,9 @@ void swapWifiMode() { WiFi_connect(); } delay(500); - hw.ledOff(LED_INTERNAL); + if(!hw.ledOff(LED_YELLOW)) { + hw.ledOff(LED_INTERNAL); + } } void mqttMessageReceived(String &topic, String &payload) diff --git a/src/web/AmsWebServer.cpp b/src/web/AmsWebServer.cpp index 20d50b7f..5280d26b 100644 --- a/src/web/AmsWebServer.cpp +++ b/src/web/AmsWebServer.cpp @@ -50,6 +50,7 @@ void AmsWebServer::setup(AmsConfiguration* config, MQTTClient* mqtt) { server.on("/config-system", HTTP_GET, std::bind(&AmsWebServer::configSystemHtml, this)); server.on("/firmware", HTTP_GET, std::bind(&AmsWebServer::firmwareHtml, this)); server.on("/firmware", HTTP_POST, std::bind(&AmsWebServer::uploadPost, this), std::bind(&AmsWebServer::firmwareUpload, this)); + server.on("/upgrade", HTTP_GET, std::bind(&AmsWebServer::firmwareDownload, this)); server.on("/restart-wait", HTTP_GET, std::bind(&AmsWebServer::restartWaitHtml, this)); server.on("/is-alive", HTTP_GET, std::bind(&AmsWebServer::isAliveCheck, this)); @@ -128,7 +129,23 @@ void AmsWebServer::indexHtml() { server.sendHeader("Expires", "-1"); if(WiFi.getMode() == WIFI_AP) { - server.send_P(200, "text/html", SETUP_HTML); + String html = String((const __FlashStringHelper*) SETUP_HTML); + for(int i = 0; i<255; i++) { + html.replace("${config.boardType" + String(i) + "}", config->getBoardType() == i ? "selected" : ""); + } + for(int i = 0; i<4; i++) { + html.replace("${config.meterType" + String(i) + "}", config->getMeterType() == i ? "selected" : ""); + } + html.replace("${config.wifiSsid}", config->getWifiSsid()); + html.replace("${config.wifiPassword}", config->getWifiPassword()); + html.replace("${config.wifiStaticIp}", strlen(config->getWifiIp()) > 0 ? "checked" : ""); + 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.send(200, "text/html", html); } else { if(!checkSecurity(2)) return; @@ -553,9 +570,10 @@ void AmsWebServer::handleSetup() { server.sendHeader("Location", String("/"), true); server.send (302, "text/plain", ""); } else { + config->setBoardType(server.arg("board").toInt()); config->setVccMultiplier(1.0); config->setVccBootLimit(0); - switch(server.arg("board").toInt()) { + switch(config->getBoardType()) { case 0: // roarfred config->setHanPin(3); config->setApPin(0); @@ -719,7 +737,16 @@ void AmsWebServer::handleSave() { } if(server.hasArg("sysConfig") && server.arg("sysConfig") == "true") { - config->setHanPin(server.arg("hanPin").toInt()); + // Unset all pins to avoid conflicts if GPIO have been swapped between pins + config->setLedPin(0xFF); + config->setLedPinRed(0xFF); + config->setLedPinGreen(0xFF); + config->setLedPinBlue(0xFF); + config->setApPin(0xFF); + config->setTempSensorPin(0xFF); + config->setVccPin(0xFF); + + config->setHanPin(server.hasArg("hanPin") && !server.arg("hanPin").isEmpty() ? server.arg("hanPin").toInt() : 3); config->setLedPin(server.hasArg("ledPin") && !server.arg("ledPin").isEmpty() ? server.arg("ledPin").toInt() : 0xFF); config->setLedInverted(server.hasArg("ledInverted") && server.arg("ledInverted") == "true"); config->setLedPinRed(server.hasArg("ledPinRed") && !server.arg("ledPinRed").isEmpty() ? server.arg("ledPinRed").toInt() : 0xFF); @@ -747,6 +774,12 @@ void AmsWebServer::handleSave() { if(!config->isDebugTelnet()) { debugger->stop(); } + + hw->setLed(config->getLedPin(), config->isLedInverted()); + hw->setLedRgb(config->getLedPinRed(), config->getLedPinGreen(), config->getLedPinBlue(), config->isLedRgbInverted()); + hw->setTempSensorPin(config->getTempSensorPin()); + hw->setVccPin(config->getVccPin()); + hw->setVccMultiplier(config->getVccMultiplier()); } printI("Saving configuration now..."); @@ -923,6 +956,68 @@ void AmsWebServer::firmwareUpload() { } } +const uint8_t githubFingerprint[] = {0x59, 0x74, 0x61, 0x88, 0x13, 0xCA, 0x12, 0x34, 0x15, 0x4D, 0x11, 0x0A, 0xC1, 0x7F, 0xE6, 0x67, 0x07, 0x69, 0x42, 0xF5}; + +void AmsWebServer::firmwareDownload() { + printD("Firmware download URL triggered"); + if(server.hasArg("version")) { + String version = server.arg("version"); + String versionStripped = version.substring(1); + printI("Downloading firmware..."); + WiFiClientSecure client; + //client.setFingerprint(githubFingerprint); +#if defined(ESP8266) + client.setInsecure(); + client.setBufferSizes(512, 512); +#endif + HTTPClient https; + String url = "https://github.com/gskjold/AmsToMqttBridge/releases/download/" + version + "/ams2mqtt-d1mini-" + versionStripped + ".bin"; +/* The following does not work... Maybe someone will make it work in the future? + https.setFollowRedirects(true); + + if(https.begin(client, url)) { + printD("HTTP client setup successful"); + int status = https.GET(); + if(status == HTTP_CODE_OK) { + printD("Received OK from server"); + if(SPIFFS.begin()) { + printI("Downloading firmware to SPIFFS"); + file = SPIFFS.open(FILE_FIRMWARE, "w"); + https.writeToStream(&file); + file.close(); + SPIFFS.end(); + performRestart = true; + server.sendHeader("Location","/restart-wait"); + server.send(303); + } else { + printE("Unable to open SPIFFS for writing"); + server.sendHeader("Location","/"); + server.send(303); + } + } else { + printE("Communication error: "); + printE(https.errorToString(status)); + printI(url); + printD(https.getString()); + server.sendHeader("Location","/"); + server.send(303); + } + } else { + printE("Unable to configure HTTP client"); + char buf[256]; + client.getLastSSLError(buf,256); + printE(buf); + server.sendHeader("Location","/"); + server.send(303); + } + */ + } else { + printI("No firmware version specified..."); + server.sendHeader("Location","/"); + server.send(303); + } +} + void AmsWebServer::restartWaitHtml() { printD("Serving /restart-wait.html over http..."); diff --git a/src/web/AmsWebServer.h b/src/web/AmsWebServer.h index 8ce294a1..90464039 100644 --- a/src/web/AmsWebServer.h +++ b/src/web/AmsWebServer.h @@ -20,9 +20,11 @@ #if defined(ESP8266) #include #include + #include #elif defined(ESP32) // ARDUINO_ARCH_ESP32 #include #include + #include #include "SPIFFS.h" #include "Update.h" #else @@ -75,6 +77,7 @@ private: String getSerialSelectOptions(int selected); void firmwareHtml(); void firmwareUpload(); + void firmwareDownload(); void restartWaitHtml(); void isAliveCheck(); diff --git a/web/application.js b/web/application.js index b806f68f..f5197463 100644 --- a/web/application.js +++ b/web/application.js @@ -320,7 +320,7 @@ var fetch = function() { var upgrade = function() { if(nextVersion) { if(confirm("Are you sure you want to perform upgrade to " + nextVersion.tag_name + "?")) { - window.location.href="/upgrade?version=" + nextVersion.id; + window.location.href="/upgrade?version=" + nextVersion.tag_name; } } } diff --git a/web/configmqtt.html b/web/configmqtt.html index 06b7da2d..1d8eb7c1 100644 --- a/web/configmqtt.html +++ b/web/configmqtt.html @@ -30,7 +30,7 @@
- Topic + Publish topic
diff --git a/web/setup.html b/web/setup.html index 60d826f7..4f539026 100644 --- a/web/setup.html +++ b/web/setup.html @@ -25,29 +25,29 @@
Hardware
Meter
@@ -60,7 +60,7 @@
SSID
- +
@@ -68,7 +68,7 @@
PSK
- +
@@ -76,11 +76,11 @@
Hostname
- +
- +
@@ -89,7 +89,7 @@
IP
- +
@@ -97,7 +97,7 @@
Subnet
- +
@@ -105,7 +105,7 @@
Gateway
- +
@@ -113,7 +113,7 @@
DNS
- +