diff --git a/src/AmsToMqttBridge.cpp b/src/AmsToMqttBridge.cpp index 7f83ca38..fc8fa134 100644 --- a/src/AmsToMqttBridge.cpp +++ b/src/AmsToMqttBridge.cpp @@ -160,6 +160,7 @@ void handleButton(unsigned long now); void handlePriceApi(unsigned long now); void handleClear(unsigned long now); void handleEnergyAccountingChanged(); +bool handleVoltageCheck(); bool readHanPort(); void setupHanPort(GpioConfig& gpioConfig, uint32_t baud, uint8_t parityOrdinal, bool invert); void rxerr(int err); @@ -191,18 +192,21 @@ void WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info) { } case ARDUINO_EVENT_WIFI_STA_DISCONNECTED: wifi_err_reason_t reason = (wifi_err_reason_t) info.wifi_sta_disconnected.reason; - debugI_P(PSTR("WiFi disconnected, reason %s"), WiFi.disconnectReasonName(reason)); + const char* descr = WiFi.disconnectReasonName(reason); + debugI_P(PSTR("WiFi disconnected, reason %s"), descr); switch(reason) { case WIFI_REASON_AUTH_FAIL: case WIFI_REASON_NO_AP_FOUND: if(sysConfig.dataCollectionConsent == 0) { swapWifiMode(); - } else { - WiFi_disconnect(WIFI_CONNECTION_TIMEOUT); + } else if(strlen(descr) > 0) { + WiFi_disconnect(5000); } break; default: - WiFi_disconnect(WIFI_CONNECTION_TIMEOUT); + if(strlen(descr) > 0) { + WiFi_disconnect(5000); + } } break; } @@ -462,6 +466,7 @@ bool wifiConnected = false; unsigned long lastTemperatureRead = 0; unsigned long lastSysupdate = 0; unsigned long lastErrorBlink = 0; +unsigned long lastVoltageCheck = 0; int lastError = 0; bool meterAutodetect = false; @@ -558,6 +563,11 @@ void loop() { debugW_P(PSTR("Used %dms to handle mqtt"), millis()-start); } } + + if(now - lastVoltageCheck > 1000) { + handleVoltageCheck(); + lastVoltageCheck = now; + } } else { if(dnsServer != NULL) { dnsServer->processNextRequest(); @@ -708,22 +718,6 @@ void handleSystem(unsigned long now) { } maxDetectPayloadDetectDone = true; } - - if(sysConfig.boardType == 7 && maxVcc > 2.8) { // Pow-U - float vcc = hw.getVcc(); - if(vcc > 3.4 || vcc < 2.8) { - maxVcc = 0; - } else if(vcc > maxVcc) { - debugD_P(PSTR("Setting new max Vcc to %.2f"), vcc); - maxVcc = vcc; - } else { - float diff = maxVcc-vcc; - if(diff > 0.3) { - debugW_P(PSTR("Vcc dropped to %.2f, disconnecting WiFi for %d seconds to preserve power"), vcc, (uint8_t) (WIFI_CONNECTION_TIMEOUT/1000)); - WiFi_disconnect(WIFI_CONNECTION_TIMEOUT); - } - } - } } void handleTemperature(unsigned long now) { @@ -835,6 +829,26 @@ void handleButton(unsigned long now) { } } +bool handleVoltageCheck() { + if(sysConfig.boardType == 7 && maxVcc > 2.8) { // Pow-U + float vcc = hw.getVcc(); + if(vcc > 3.4 || vcc < 2.8) { + maxVcc = 0; + } else if(vcc > maxVcc) { + debugD_P(PSTR("Setting new max Vcc to %.2f"), vcc); + maxVcc = vcc; + } else if(WiFi.getMode() != WIFI_OFF) { + float diff = maxVcc-vcc; + if(diff > 0.3) { + debugW_P(PSTR("Vcc dropped to %.2f, disconnecting WiFi for 5 seconds to preserve power"), vcc); + WiFi_disconnect(5000); + return false; + } + } + } + return true; +} + void rxerr(int err) { if(err == 0) return; switch(err) { @@ -1429,6 +1443,11 @@ void WiFi_connect() { } lastWifiRetry = millis(); + if(!handleVoltageCheck()) { + debugW_P(PSTR("Voltage is not high enough to reconnect")); + return; + } + if (WiFi.status() != WL_CONNECTED) { WiFiConfig wifi; if(!config.getWiFiConfig(wifi) || strlen(wifi.ssid) == 0) {