TuyaMCU: handle WIFI_SELECT / WIFI_RESET without soft-locking MCU (#24063)

* TuyaMCU: send WIFI_STATE ramp after WIFI_SELECT/WIFI_RESET to satisfy MCU pairing logic

When WIFI_SELECT or WIFI_RESET is received, this sends a WIFI_STATE ramp 0x00/0x01 up to 0x05 to simulate successful WiFi connection up to 'cloud connected' to exit pairing mode and reallow Tasmota control of the MCU

* Update tasmota/tasmota_xdrv_driver/xdrv_16_tuyamcu_v1.ino

Co-authored-by: Erik Kunze <eku@users.noreply.github.com>

---------

Co-authored-by: Erik Kunze <eku@users.noreply.github.com>
This commit is contained in:
Sam 2025-10-27 14:15:14 +00:00 committed by GitHub
parent 09cc100e8a
commit 890b3b645c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -1097,12 +1097,32 @@ void TuyaNormalPowerModePacketProcess(void)
case TUYA_CMD_STATE:
TuyaProcessStatePacket();
break;
case TUYA_CMD_WIFI_RESET:
case TUYA_CMD_WIFI_SELECT:
AddLog(LOG_LEVEL_DEBUG, PSTR("TYA: RX WiFi Reset"));
case TUYA_CMD_WIFI_RESET: {
const bool is_select = (Tuya.buffer[3] == TUYA_CMD_WIFI_SELECT);
const uint16_t payload_len = ((uint16_t)Tuya.buffer[4] << 8) | Tuya.buffer[5];
// Establish pairing mode - WIFI_RESET is assumed to be AP mode
uint8_t first = 0x01;
if (is_select && !(payload_len >= 1 && Tuya.buffer[6] == 0x01))
first = 0x00;
}
// Send ACK, then WIFI_STATE ramp up to cloud connected to re-enable MCU control
TuyaSendCmd(is_select ? TUYA_CMD_WIFI_SELECT : TUYA_CMD_WIFI_RESET);
uint8_t st = first; TuyaSendCmd(TUYA_CMD_WIFI_STATE, &st, 1);
st = 0x02; TuyaSendCmd(TUYA_CMD_WIFI_STATE, &st, 1);
st = 0x03; TuyaSendCmd(TUYA_CMD_WIFI_STATE, &st, 1);
st = 0x04; TuyaSendCmd(TUYA_CMD_WIFI_STATE, &st, 1);
AddLog(LOG_LEVEL_INFO, PSTR("TYA: %s received (%s), sent WIFI_STATE ramp"),
is_select ? PSTR("WIFI_SELECT") : PSTR("WIFI_RESET"),
(first == 0x01) ? "AP" : "EZ");
// Now actually reset Tasmota WiFi
TuyaResetWifi();
break;
}
case TUYA_CMD_WIFI_STATE:
AddLog(LOG_LEVEL_DEBUG, PSTR("TYA: RX WiFi LED set ACK"));