diff --git a/sonoff/my_user_config.h b/sonoff/my_user_config.h index 5b721af2a..3c946f7ad 100644 --- a/sonoff/my_user_config.h +++ b/sonoff/my_user_config.h @@ -354,7 +354,7 @@ //#define USE_MP3_PLAYER // Use of the DFPlayer Mini MP3 Player RB-DFR-562 commands: play, volume and stop #define MP3_VOLUME 10 // Set the startup volume on init, the range can be 0..30(max) #define USE_TUYA_DIMMER // Add support for Tuya Serial Dimmer - #define TUYA_DIMMER_ID 3 // Default dimmer Id + #define TUYA_DIMMER_ID 0 // Default dimmer Id // Power monitoring sensors ----------------------- #define USE_PZEM004T // Add support for PZEM004T Energy monitor (+2k code) diff --git a/sonoff/sonoff_post.h b/sonoff/sonoff_post.h old mode 100755 new mode 100644 index b6fea83a2..7498d40e9 --- a/sonoff/sonoff_post.h +++ b/sonoff/sonoff_post.h @@ -104,7 +104,7 @@ void KNX_CB_Action(message_t const &msg, void *arg); #define USE_MP3_PLAYER // Use of the DFPlayer Mini MP3 Player RB-DFR-562 commands: play, volume and stop #define MP3_VOLUME 10 // Set the startup volume on init, the range can be 0..30(max) #define USE_TUYA_DIMMER // Add support for Tuya Serial Dimmer - #define TUYA_DIMMER_ID 3 // Default dimmer Id + #define TUYA_DIMMER_ID 0 // Default dimmer Id #define USE_PZEM004T // Add support for PZEM004T Energy monitor (+2k code) #define USE_PZEM_AC // Add support for PZEM014,016 Energy monitor (+1k1 code) #define USE_PZEM_DC // Add support for PZEM003,017 Energy monitor (+1k1 code) diff --git a/sonoff/sonoff_template.h b/sonoff/sonoff_template.h index f3712672f..036e2400d 100644 --- a/sonoff/sonoff_template.h +++ b/sonoff/sonoff_template.h @@ -1154,7 +1154,7 @@ const mytmplt kModules[MAXMODULE] PROGMEM = { }, { "Tuya Dimmer", // Tuya Dimmer (ESP8266 w/ separate MCU dimmer) // https://www.amazon.com/gp/product/B07CTNSZZ8/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1 - GPIO_KEY1, // Virtual Button (controlled by MCU) + GPIO_USER, // Virtual Button (controlled by MCU) GPIO_USER, // GPIO01 MCU serial control GPIO_USER, GPIO_USER, // GPIO03 MCU serial control @@ -1163,7 +1163,7 @@ const mytmplt kModules[MAXMODULE] PROGMEM = { 0, 0, 0, 0, 0, 0, // Flash connection GPIO_USER, GPIO_USER, - GPIO_LED1, // GPIO14 Green Led + GPIO_USER, // GPIO14 Green Led GPIO_USER, GPIO_USER, 0 diff --git a/sonoff/xdrv_16_tuyadimmer.ino b/sonoff/xdrv_16_tuyadimmer.ino index 91fe17581..813879b97 100644 --- a/sonoff/xdrv_16_tuyadimmer.ino +++ b/sonoff/xdrv_16_tuyadimmer.ino @@ -20,7 +20,7 @@ #ifdef USE_TUYA_DIMMER #ifndef TUYA_DIMMER_ID -#define TUYA_DIMMER_ID 3 +#define TUYA_DIMMER_ID 0 #endif #define TUYA_BUFFER_SIZE 256 @@ -33,7 +33,7 @@ boolean tuya_ignore_dim = false; // Flag to skip serial send to preve uint8_t tuya_cmd_status = 0; // Current status of serial-read uint8_t tuya_cmd_checksum = 0; // Checksum of tuya command uint8_t tuya_data_len = 0; // Data lenght of command -int8_t tuya_wifi_state = -2; +int8_t tuya_wifi_state = -2; // Keep MCU wifi-status in sync with WifiState() char tuya_buffer[TUYA_BUFFER_SIZE]; // Serial receive buffer int tuya_byte_counter = 0; // Index in serial receive buffer @@ -113,6 +113,10 @@ void TuyaPacketProcess() if (tuya_byte_counter == 7 && tuya_buffer[3] == 14 ) { // heartbeat packet AddLog_P(LOG_LEVEL_DEBUG, PSTR("TYA: Heartbeat")); + if(tuya_buffer[6] == 0){ + AddLog_P(LOG_LEVEL_DEBUG, PSTR("TYA: Detected MCU restart")); + tuya_wifi_state = -2; + } } else if (tuya_byte_counter == 12 && tuya_buffer[3] == 7 && tuya_buffer[5] == 5) { // on/off packet @@ -128,6 +132,12 @@ void TuyaPacketProcess() snprintf_P(log_data, sizeof(log_data), PSTR("TYA: Rcvd Dim State=%d"), tuya_buffer[13]); AddLog(LOG_LEVEL_DEBUG); + if (!Settings.param[P_TUYA_DIMMER_ID]) { + snprintf_P(log_data, sizeof(log_data), PSTR("TYA: Autoconfiguring Dimmer ID %d"), tuya_buffer[6]); + AddLog(LOG_LEVEL_DEBUG); + Settings.param[P_TUYA_DIMMER_ID] = tuya_buffer[6]; + } + tuya_new_dim = round(tuya_buffer[13] * (100. / 255.)); if((power) && (tuya_new_dim > 0) && (abs(tuya_new_dim - Settings.light_dimmer) > 2)) { @@ -143,16 +153,40 @@ void TuyaPacketProcess() ExecuteCommand(scmnd, SRC_SWITCH); } } - else if (tuya_byte_counter == 8 && tuya_buffer[3] == 5 && tuya_buffer[5] == 1 && tuya_buffer[7] == 5 ) { // reset WiFi settings packet + else if (tuya_byte_counter == 8 && tuya_buffer[3] == 5 && tuya_buffer[5] == 1) { // reset WiFi settings packet AddLog_P(LOG_LEVEL_DEBUG, PSTR("TYA: WiFi Reset Rcvd")); TuyaResetWifi(); } else if (tuya_byte_counter == 7 && tuya_buffer[3] == 3 && tuya_buffer[6] == 2) { // WiFi LED has been sucessfully set. - AddLog_P(LOG_LEVEL_DEBUG, PSTR("TYA: WiFi LED set ACK")); + AddLog_P(LOG_LEVEL_DEBUG, PSTR("TYA: WiFi LED set ACK Rcvd")); tuya_wifi_state = WifiState(); } + else if (tuya_buffer[3] == 2) { // MCU configuration packet + + AddLog_P(LOG_LEVEL_DEBUG, PSTR("TYA: MCU configuration Rcvd")); + + if (tuya_buffer[5] == 2) { + uint8_t led1_gpio = tuya_buffer[6]; + uint8_t key1_gpio = tuya_buffer[7]; + boolean key1_set = false; + boolean led1_set = false; + for (byte i = 0; i < MAX_GPIO_PIN; i++) { + if (Settings.my_gp.io[i] == GPIO_LED1) led1_set = true; + else if (Settings.my_gp.io[i] == GPIO_KEY1) key1_set = true; + } + if(!Settings.my_gp.io[led1_gpio] && !led1_set){ + Settings.my_gp.io[led1_gpio] = GPIO_LED1; + restart_flag = 2; + } + if(!Settings.my_gp.io[key1_gpio] && !key1_set){ + Settings.my_gp.io[key1_gpio] = GPIO_KEY1; + restart_flag = 2; + } + } + TuyaRequestState(); + } } void TuyaSerialInput() @@ -218,8 +252,11 @@ void TuyaSerialInput() boolean TuyaModuleSelected() { if (!(pin[GPIO_TUYA_RX] < 99) || !(pin[GPIO_TUYA_TX] < 99)) { // fallback to hardware-serial if not explicitly selected - pin[GPIO_TUYA_RX] = 1; - pin[GPIO_TUYA_TX] = 3; + pin[GPIO_TUYA_TX] = 1; + pin[GPIO_TUYA_RX] = 3; + Settings.my_gp.io[1] = GPIO_TUYA_TX; + Settings.my_gp.io[3] = GPIO_TUYA_RX; + restart_flag = 2; } light_type = LT_SERIAL; return true; @@ -254,15 +291,8 @@ void TuyaSetWifiLed(){ TuyaSerial->flush(); } -void TuyaInit() -{ - if (!Settings.param[P_TUYA_DIMMER_ID]) { - Settings.param[P_TUYA_DIMMER_ID] = TUYA_DIMMER_ID; - } - TuyaSerial = new TasmotaSerial(pin[GPIO_TUYA_RX], pin[GPIO_TUYA_TX], 1); - if (TuyaSerial->begin(9600)) { - if (TuyaSerial->hardwareSerial()) { ClaimSerial(); } - +void TuyaRequestState(){ + if(TuyaSerial) { // Get current status of MCU snprintf_P(log_data, sizeof(log_data), "TYA: Request MCU state"); AddLog(LOG_LEVEL_DEBUG); @@ -278,6 +308,29 @@ void TuyaInit() } } +void TuyaInit() +{ + if (!Settings.param[P_TUYA_DIMMER_ID]) { + Settings.param[P_TUYA_DIMMER_ID] = TUYA_DIMMER_ID; + } + TuyaSerial = new TasmotaSerial(pin[GPIO_TUYA_RX], pin[GPIO_TUYA_TX], 1); + if (TuyaSerial->begin(9600)) { + if (TuyaSerial->hardwareSerial()) { ClaimSerial(); } + // Get MCU Configuration + snprintf_P(log_data, sizeof(log_data), "TYA: Request MCU configuration"); + AddLog(LOG_LEVEL_DEBUG); + + TuyaSerial->write((uint8_t)0x55); // header 55AA + TuyaSerial->write((uint8_t)0xAA); + TuyaSerial->write((uint8_t)0x00); // version 00 + TuyaSerial->write((uint8_t)0x02); // command 02 - get configuration + TuyaSerial->write((uint8_t)0x00); + TuyaSerial->write((uint8_t)0x00); // following data length 0x00 + TuyaSerial->write((uint8_t)0x01); // checksum:sum of all bytes in packet mod 256 + TuyaSerial->flush(); + } +} + void TuyaResetWifi() { if (!Settings.flag.button_restrict) {