From a2af12c969bccd42e61090251491342194a541fe Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 14 Feb 2025 12:55:58 +0100 Subject: [PATCH] Add support for WiZMote with WiFi disabled --- .../QuickESPNow/src/QuickEspNow_esp32.cpp | 11 +++- .../QuickESPNow/src/QuickEspNow_esp8266.cpp | 1 + .../tasmota_xdrv_driver/xdrv_77_wizmote.ino | 50 +++++++++++-------- 3 files changed, 40 insertions(+), 22 deletions(-) diff --git a/lib/lib_div/QuickESPNow/src/QuickEspNow_esp32.cpp b/lib/lib_div/QuickESPNow/src/QuickEspNow_esp32.cpp index 8de5f6c74..1c0b19408 100644 --- a/lib/lib_div/QuickESPNow/src/QuickEspNow_esp32.cpp +++ b/lib/lib_div/QuickESPNow/src/QuickEspNow_esp32.cpp @@ -52,11 +52,18 @@ bool QuickEspNow::begin (uint8_t channel, uint32_t wifi_interface, bool synchron void QuickEspNow::stop () { DEBUG_INFO (QESPNOW_TAG, "-------------> ESP-NOW STOP"); - vTaskDelete (espnowTxTask); - vTaskDelete (espnowRxTask); + if (espnowTxTask) { + vTaskDelete (espnowTxTask); + espnowTxTask = nullptr; + } + if (espnowRxTask) { + vTaskDelete (espnowRxTask); + espnowRxTask = nullptr; + } esp_now_unregister_recv_cb (); esp_now_unregister_send_cb (); esp_now_deinit (); + followWiFiChannel = false; } bool QuickEspNow::readyToSendData () { diff --git a/lib/lib_div/QuickESPNow/src/QuickEspNow_esp8266.cpp b/lib/lib_div/QuickESPNow/src/QuickEspNow_esp8266.cpp index e33f78dbf..c6ba485d2 100644 --- a/lib/lib_div/QuickESPNow/src/QuickEspNow_esp8266.cpp +++ b/lib/lib_div/QuickESPNow/src/QuickEspNow_esp8266.cpp @@ -85,6 +85,7 @@ void QuickEspNow::stop () { esp_now_unregister_recv_cb (); esp_now_unregister_send_cb (); esp_now_deinit (); + followWiFiChannel = false; } bool QuickEspNow::readyToSendData () { diff --git a/tasmota/tasmota_xdrv_driver/xdrv_77_wizmote.ino b/tasmota/tasmota_xdrv_driver/xdrv_77_wizmote.ino index 1d696985b..29b8fdd7f 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_77_wizmote.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_77_wizmote.ino @@ -30,7 +30,7 @@ struct WizMote { int rssi; uint8_t index; uint8_t battery_level; - bool active; + uint8_t active; } WizMote; /*********************************************************************************************\ @@ -146,19 +146,36 @@ void EspNowDataReceived(uint8_t* mac, uint8_t* data, uint8_t len, signed int rss } } -/*********************************************************************************************\ - * -\*********************************************************************************************/ - void EspNowInit(void) { - if (!WizMote.active) { - quickEspNow.onDataRcvd(EspNowDataReceived); -#ifdef ESP32 -// quickEspNow.setWiFiBandwidth (WIFI_IF_STA, WIFI_BW_HT20); // Only needed for ESP32 in case you need coexistence with ESP8266 in the same network + if (0 == Settings->flag4.network_wifi) { // WiFi Off + if (WizMote.active != 2) { + uint32_t channel = 1; + + quickEspNow.stop(); + delay(500); // Allow time to finish stopped WiFi by WifiDisable() + WiFi.mode(WIFI_STA); +#if defined ESP32 + WiFi.disconnect(false, true); +#elif defined ESP8266 + WiFi.disconnect(false); #endif //ESP32 - if (quickEspNow.begin()) { - AddLog(LOG_LEVEL_INFO, PSTR("NOW: ESP-NOW started")); - WizMote.active = true; + quickEspNow.onDataRcvd(EspNowDataReceived); + if (quickEspNow.begin(channel)) { // Specify channel if no connected WiFi + AddLog(LOG_LEVEL_INFO, PSTR("NOW: ESP-NOW started on channel %d"), channel); + WizMote.active = 2; + } + } + } else { // WiFi On + if (TasmotaGlobal.global_state.wifi_down) { + WizMote.active = 0; + } + else if (WizMote.active != 1) { + quickEspNow.stop(); + quickEspNow.onDataRcvd(EspNowDataReceived); + if (quickEspNow.begin()) { + AddLog(LOG_LEVEL_INFO, PSTR("NOW: ESP-NOW started")); + WizMote.active = 1; + } } } } @@ -172,16 +189,9 @@ bool Xdrv77(uint32_t function) { bool result = false; -/* - if (FUNC_INIT == function) { + if (FUNC_EVERY_SECOND == function) { EspNowInit(); } -*/ - if (FUNC_NETWORK_UP == function) { - if (!TasmotaGlobal.global_state.wifi_down) { - EspNowInit(); - } - } else if (WizMote.active) { switch (function) { case FUNC_LOOP: