diff --git a/tasmota/tasmota_xdrv_driver/xdrv_16_tuyamcu_v1.ino b/tasmota/tasmota_xdrv_driver/xdrv_16_tuyamcu_v1.ino index d4ab71400..ad360f2e9 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_16_tuyamcu_v1.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_16_tuyamcu_v1.ino @@ -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"));