diff --git a/src/ESP32React/APSettingsService.cpp b/src/ESP32React/APSettingsService.cpp index 47d90a8b1..a68037738 100644 --- a/src/ESP32React/APSettingsService.cpp +++ b/src/ESP32React/APSettingsService.cpp @@ -10,7 +10,6 @@ APSettingsService::APSettingsService(AsyncWebServer * server, FS * fs, SecurityM , _reconfigureAp(false) , _connected(0) { addUpdateHandler([this] { reconfigureAP(); }, false); - WiFi.onEvent([this](WiFiEvent_t event, WiFiEventInfo_t info) { WiFiEvent(event); }); } void APSettingsService::begin() { @@ -19,39 +18,27 @@ void APSettingsService::begin() { // reconfigureAP(); } -// wait 10 sec on STA disconnect before starting AP -void APSettingsService::WiFiEvent(WiFiEvent_t event) { - const uint8_t was_connected = _connected; - switch (event) { - case ARDUINO_EVENT_WIFI_STA_DISCONNECTED: - _connected &= ~1U; - break; - case ARDUINO_EVENT_ETH_DISCONNECTED: - _connected &= ~2U; - break; - case ARDUINO_EVENT_WIFI_STA_GOT_IP: - case ARDUINO_EVENT_WIFI_STA_GOT_IP6: - _connected |= 1U; - break; - case ARDUINO_EVENT_ETH_GOT_IP: - case ARDUINO_EVENT_ETH_GOT_IP6: - _connected |= 2U; - break; - default: - return; - } - // wait 10 sec before starting AP - if (was_connected && !_connected) { - _lastManaged = uuid::get_uptime(); - } -} - void APSettingsService::reconfigureAP() { _lastManaged = uuid::get_uptime() - MANAGE_NETWORK_DELAY; _reconfigureAp = true; } void APSettingsService::loop() { + const uint8_t was_connected = _connected; + if (WiFi.isConnected()) { + _connected |= 1U; + } else { + _connected &= ~1U; + } + if (ETH.connected()) { + _connected |= 2U; + } else { + _connected &= ~2U; + } + // wait 10 sec before starting AP + if (was_connected && !_connected) { + _lastManaged = uuid::get_uptime(); + } const unsigned long currentMillis = uuid::get_uptime(); if ((currentMillis - _lastManaged) >= MANAGE_NETWORK_DELAY) { _lastManaged = currentMillis; diff --git a/src/ESP32React/APSettingsService.h b/src/ESP32React/APSettingsService.h index 9b52f84d0..21eb24075 100644 --- a/src/ESP32React/APSettingsService.h +++ b/src/ESP32React/APSettingsService.h @@ -104,7 +104,6 @@ class APSettingsService : public StatefulService { void startAP(); void stopAP(); void handleDNS(); - void WiFiEvent(WiFiEvent_t event); }; #endif diff --git a/src/ESP32React/ESP32React.cpp b/src/ESP32React/ESP32React.cpp index 41536153f..9b533dfba 100644 --- a/src/ESP32React/ESP32React.cpp +++ b/src/ESP32React/ESP32React.cpp @@ -84,4 +84,5 @@ void ESP32React::loop() { _networkSettingsService.loop(); _apSettingsService.loop(); _mqttSettingsService.loop(); + _ntpSettingsService.loop(); } \ No newline at end of file diff --git a/src/ESP32React/MqttSettingsService.cpp b/src/ESP32React/MqttSettingsService.cpp index 63879e6a8..7049c5713 100644 --- a/src/ESP32React/MqttSettingsService.cpp +++ b/src/ESP32React/MqttSettingsService.cpp @@ -9,7 +9,6 @@ MqttSettingsService::MqttSettingsService(AsyncWebServer * server, FS * fs, Secur , _disconnectedAt(0) , _disconnectReason(espMqttClientTypes::DisconnectReason::TCP_DISCONNECTED) , _mqttClient(nullptr) { - WiFi.onEvent([this](WiFiEvent_t event, WiFiEventInfo_t info) { WiFiEvent(event); }); addUpdateHandler([this] { onConfigUpdated(); }, false); } @@ -29,6 +28,7 @@ MqttSettingsService::~MqttSettingsService() { void MqttSettingsService::begin() { _fsPersistence.readFromFS(); startClient(); + _reconfigureMqtt = true; } void MqttSettingsService::startClient() { @@ -79,6 +79,10 @@ void MqttSettingsService::startClient() { } void MqttSettingsService::loop() { + if (_state.enabled && _mqttClient && _mqttClient->connected() && !emsesp::EMSESP::system_.network_connected()) { + // emsesp::EMSESP::logger().info("Network connection dropped, stopping MQTT client"); + _mqttClient->disconnect(true); + } if (_reconfigureMqtt || (_disconnectedAt && static_cast(uuid::get_uptime() - _disconnectedAt) >= MQTT_RECONNECTION_DELAY)) { // reconfigure MQTT client _disconnectedAt = configureMqtt() ? 0 : uuid::get_uptime(); @@ -142,28 +146,6 @@ void MqttSettingsService::onConfigUpdated() { emsesp::EMSESP::mqtt_.start(); // reload EMS-ESP MQTT settings } -void MqttSettingsService::WiFiEvent(WiFiEvent_t event) { - switch (event) { - case ARDUINO_EVENT_WIFI_STA_GOT_IP: - case ARDUINO_EVENT_ETH_GOT_IP: - case ARDUINO_EVENT_ETH_GOT_IP6: - case ARDUINO_EVENT_WIFI_STA_GOT_IP6: - if (_state.enabled && !_mqttClient->connected()) { - onConfigUpdated(); - } - break; - case ARDUINO_EVENT_WIFI_STA_DISCONNECTED: - case ARDUINO_EVENT_ETH_DISCONNECTED: - if (_state.enabled) { - _mqttClient->disconnect(true); - } - break; - - default: - break; - } -} - bool MqttSettingsService::configureMqtt() { // disconnect if already connected if (_mqttClient->connected()) { @@ -256,7 +238,7 @@ void MqttSettings::read(MqttSettings & settings, JsonObject root) { StateUpdateResult MqttSettings::update(JsonObject root, MqttSettings & settings) { MqttSettings newSettings; - bool changed = false; + bool changed = false; #ifndef NO_TLS_SUPPORT newSettings.enableTLS = root["enableTLS"]; @@ -316,6 +298,10 @@ StateUpdateResult MqttSettings::update(JsonObject root, MqttSettings & settings) changed = true; } + if (newSettings.ha_number_mode != settings.ha_number_mode) { + changed = true; + } + if (newSettings.entity_format != settings.entity_format) { changed = true; } diff --git a/src/ESP32React/MqttSettingsService.h b/src/ESP32React/MqttSettingsService.h index 36b52fa74..c286c3544 100644 --- a/src/ESP32React/MqttSettingsService.h +++ b/src/ESP32React/MqttSettingsService.h @@ -134,7 +134,6 @@ class MqttSettingsService : public StatefulService { // the MQTT client instance MqttClient * _mqttClient; - void WiFiEvent(WiFiEvent_t event); void onMqttConnect(bool sessionPresent); void onMqttDisconnect(espMqttClientTypes::DisconnectReason reason); void diff --git a/src/ESP32React/NTPSettingsService.cpp b/src/ESP32React/NTPSettingsService.cpp index 81e5cdf82..b12d69bbf 100644 --- a/src/ESP32React/NTPSettingsService.cpp +++ b/src/ESP32React/NTPSettingsService.cpp @@ -11,7 +11,6 @@ NTPSettingsService::NTPSettingsService(AsyncWebServer * server, FS * fs, Securit configureTime(request, json); }); - WiFi.onEvent([this](WiFiEvent_t event, WiFiEventInfo_t info) { WiFiEvent(event); }); addUpdateHandler([this] { configureNTP(); }, false); } @@ -20,27 +19,10 @@ void NTPSettingsService::begin() { configureNTP(); } -// handles both WiFI and Ethernet -void NTPSettingsService::WiFiEvent(WiFiEvent_t event) { - switch (event) { - case ARDUINO_EVENT_WIFI_STA_DISCONNECTED: - case ARDUINO_EVENT_ETH_DISCONNECTED: - if (_connected && emsesp::EMSESP::system_.ntp_connected()) { - emsesp::EMSESP::logger().info("WiFi connection dropped, stopping NTP"); - _connected = false; - configureNTP(); - } - break; - - case ARDUINO_EVENT_WIFI_STA_GOT_IP: - case ARDUINO_EVENT_ETH_GOT_IP: - // emsesp::EMSESP::logger().info("Got IP address, starting NTP synchronization"); - _connected = true; +void NTPSettingsService::loop() { + if (_connected != emsesp::EMSESP::system_.network_connected()) { + _connected = emsesp::EMSESP::system_.network_connected(); configureNTP(); - break; - - default: - break; } } @@ -55,7 +37,9 @@ void NTPSettingsService::configureNTP() { } else { setenv("TZ", _state.tzFormat.c_str(), 1); tzset(); - esp_sntp_stop(); + if (esp_sntp_enabled()) { + esp_sntp_stop(); + } } } diff --git a/src/ESP32React/NTPSettingsService.h b/src/ESP32React/NTPSettingsService.h index 635b68f1c..ca75c5dd9 100644 --- a/src/ESP32React/NTPSettingsService.h +++ b/src/ESP32React/NTPSettingsService.h @@ -44,6 +44,7 @@ class NTPSettingsService : public StatefulService { NTPSettingsService(AsyncWebServer * server, FS * fs, SecurityManager * securityManager); void begin(); + void loop(); static void ntp_received(struct timeval * tv); private: @@ -51,7 +52,6 @@ class NTPSettingsService : public StatefulService { FSPersistence _fsPersistence; volatile bool _connected; - void WiFiEvent(WiFiEvent_t event); void configureNTP(); void configureTime(AsyncWebServerRequest * request, JsonVariant json); };