diff --git a/tasmota/tasmota_support/support.ino b/tasmota/tasmota_support/support.ino index d978316d6..33b69b51b 100755 --- a/tasmota/tasmota_support/support.ino +++ b/tasmota/tasmota_support/support.ino @@ -1658,7 +1658,7 @@ uint32_t ValidPin(uint32_t pin, uint32_t gpio) { #elif defined(CONFIG_IDF_TARGET_ESP32) // ignore #else // not ESP32C3 and not ESP32S2 - if ((WEMOS == Settings->module) && !Settings->flag3.user_esp8285_enable) { // SetOption51 - Enable ESP8285 user GPIO's + if (((WEMOS == Settings->module) || (TUYA_DIMMER == Settings->module) || (USER_MODULE == Settings->module)) && !Settings->flag3.user_esp8285_enable) { // SetOption51 - Enable ESP8285 user GPIO's if ((9 == pin) || (10 == pin)) { return GPIO_NONE; // Disable possible flash GPIO9 and GPIO10 } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_16_tuyamcu_v1.ino b/tasmota/tasmota_xdrv_driver/xdrv_16_tuyamcu_v1.ino index e4bb6b01a..2803bd1a5 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_16_tuyamcu_v1.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_16_tuyamcu_v1.ino @@ -42,6 +42,7 @@ #define TUYA_CMD_INITIATING_UPGRADE 0x0A #define TUYA_CMD_UPGRADE_PACKAGE 0x0B #define TUYA_CMD_SET_TIME 0x1C +#define TUYA_CMD_GET_WIFI_STRENGTH 0x24 #define TUYA_LOW_POWER_CMD_WIFI_STATE 0x02 #define TUYA_LOW_POWER_CMD_WIFI_RESET 0x03 @@ -116,7 +117,7 @@ void (* const TuyaCommand[])(void) PROGMEM = { }; const uint8_t TuyaExcludeCMDsFromMQTT[] PROGMEM = { // don't publish this received commands via MQTT if SetOption66 and SetOption137 is active (can be expanded in the future) - TUYA_CMD_HEARTBEAT, TUYA_CMD_WIFI_STATE, TUYA_CMD_SET_TIME, TUYA_CMD_UPGRADE_PACKAGE + TUYA_CMD_HEARTBEAT, TUYA_CMD_WIFI_STATE, TUYA_CMD_SET_TIME, TUYA_CMD_UPGRADE_PACKAGE, TUYA_CMD_GET_WIFI_STRENGTH }; /*********************************************************************************************\ @@ -1097,23 +1098,42 @@ void TuyaNormalPowerModePacketProcess(void) if (Tuya.buffer[5] == 2) { // Processing by ESP module mode uint8_t led1_gpio = Tuya.buffer[6]; uint8_t key1_gpio = Tuya.buffer[7]; + AddLog(LOG_LEVEL_DEBUG, PSTR("TYA: Mode=2 led:%d, key:%d"), led1_gpio, key1_gpio); bool key1_set = false; bool led1_set = false; + // Check if LED_1 and KEY_1 are not already configured for (uint32_t i = 0; i < nitems(Settings->my_gp.io); i++) { if (Settings->my_gp.io[i] == AGPIO(GPIO_LED1)) led1_set = true; else if (Settings->my_gp.io[i] == AGPIO(GPIO_KEY1)) key1_set = true; } - if (!Settings->my_gp.io[led1_gpio] && !led1_set) { - Settings->my_gp.io[led1_gpio] = AGPIO(GPIO_LED1); - TasmotaGlobal.restart_flag = 2; + // If LED_1 not yet configured + if (!led1_set) { + // Check is the GPIO is not already in use and if it is valid + if (!Settings->my_gp.io[led1_gpio] && ValidPin(led1_gpio,GPIO_LED1)) { + Settings->my_gp.io[led1_gpio] = AGPIO(GPIO_LED1); + TasmotaGlobal.restart_flag = 2; + AddLog(LOG_LEVEL_DEBUG, PSTR("TYA: Set LED1 on gpio%d, will restart"), led1_gpio); + } else { + AddLog(LOG_LEVEL_ERROR, PSTR("TYA: In use or illegal gpio%d for LED1, ignored"), led1_gpio); + } } - if (!Settings->my_gp.io[key1_gpio] && !key1_set) { - Settings->my_gp.io[key1_gpio] = AGPIO(GPIO_KEY1); - TasmotaGlobal.restart_flag = 2; + // If KEY_1 not yet configured + if (!key1_set) { + // Check is the GPIO is not already in use and if it is valid + if (!Settings->my_gp.io[key1_gpio] && ValidPin(key1_gpio,GPIO_KEY1)) { + Settings->my_gp.io[key1_gpio] = AGPIO(GPIO_KEY1); + TasmotaGlobal.restart_flag = 2; + AddLog(LOG_LEVEL_DEBUG, PSTR("TYA: Set KEY1 on gpio%d, will restart"), key1_gpio); + } else { + AddLog(LOG_LEVEL_ERROR, PSTR("TYA: In use or illegal gpio%d for KEY1, ignored"), key1_gpio); + } } } TuyaRequestState(0); break; + case TUYA_CMD_GET_WIFI_STRENGTH: + TuyaSetWifiStrength(); + break; #ifdef USE_TUYA_TIME case TUYA_CMD_SET_TIME: TuyaSetTime(); @@ -1395,6 +1415,18 @@ void TuyaSetWifiLed(void) } } +void TuyaSetWifiStrength(void) { + uint16_t payload_len = 1; + uint8_t payload_buffer[1]; + int32_t rssi = WiFi.RSSI(); + int signal_strength = WifiGetRssiAsQuality(rssi); + + AddLog(LOG_LEVEL_DEBUG, PSTR("TYA: RX MCU Get Wifi Strength -> sending %d"), signal_strength); + payload_buffer[0] = (uint8_t)signal_strength; + + TuyaSendCmd(TUYA_CMD_GET_WIFI_STRENGTH, payload_buffer, payload_len); +} + #ifdef USE_TUYA_TIME void TuyaSetTime(void) { if (!RtcTime.valid) { return; }