From d47ab92862a2220ed25ecd90d67818b7a690abe9 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Tue, 16 Oct 2018 11:21:44 +0200 Subject: [PATCH] Fixxes and Add Tuya Dimmer * Fix RfRaw and SerialSend5 regression from 6.2.1.15 (#4072) * Fix Sonoff Bridge RfRaw receive (#4080) * Add support for Tuya Dimmer (#469, #4075) --- sonoff/_changelog.ino | 3 +++ sonoff/sonoff.ino | 26 +++++++++++++------------- sonoff/sonoff_template.h | 13 +++++++------ sonoff/support.ino | 6 +++--- sonoff/xdrv_06_snfbridge.ino | 12 ++++++------ 5 files changed, 32 insertions(+), 28 deletions(-) diff --git a/sonoff/_changelog.ino b/sonoff/_changelog.ino index d924329f9..93fdce4da 100644 --- a/sonoff/_changelog.ino +++ b/sonoff/_changelog.ino @@ -2,6 +2,9 @@ * Add TasmotaModbus library for very basic modbus wrapper for TasmotaSerial * Change xsns_17_senseair.ino to use TasmotaModbus library * Fix xnrg_05_pzem2.ino for PZEM-014/016 support using TasmotaModbus library (#3694) + * Fix RfRaw and SerialSend5 regression from 6.2.1.15 (#4072) + * Fix Sonoff Bridge RfRaw receive (#4080) + * Add support for Tuya Dimmer (#469, #4075) * * 6.2.1.15 20181012 * Fix Color Temperature slider functionality regression from 6.2.1.5 (#4037) diff --git a/sonoff/sonoff.ino b/sonoff/sonoff.ino index cfc91eab7..a5dbcef4e 100755 --- a/sonoff/sonoff.ino +++ b/sonoff/sonoff.ino @@ -201,7 +201,7 @@ char log_data[LOGSZ]; // Logging char web_log[WEB_LOG_SIZE] = {'\0'}; // Web log buffer String backlog[MAX_BACKLOG]; // Command backlog uint8_t tuya_new_dim = 0; // Tuya dimmer value temp -boolean tuya_ignore_dim = false; // Flag to skip serial send to prevent looping when processing inbound states from the faceplate interaction +boolean tuya_ignore_dim = false; // Flag to skip serial send to prevent looping when processing inbound states from the faceplate interaction /********************************************************************************************/ @@ -358,16 +358,16 @@ void SetDevicePower(power_t rpower, int source) Serial.write(0x55); // Tuya header 55AA Serial.write(0xAA); Serial.write(0x00); // version 00 - Serial.write(0x06); // Tuya command 06 + Serial.write(0x06); // Tuya command 06 Serial.write(0x00); Serial.write(0x05); // following data length 0x05 Serial.write(0x01); // relay number 1,2,3 - Serial.write(0x01); - Serial.write(0x00); - Serial.write(0x01); + Serial.write(0x01); + Serial.write(0x00); + Serial.write(0x01); Serial.write(rpower); // status Serial.write(0x0D + rpower); // checksum sum of all bytes in packet mod 256 - Serial.flush(); + Serial.flush(); } else if (EXS_RELAY == Settings.module) { SetLatchingRelay(rpower, 1); @@ -1021,7 +1021,7 @@ void MqttDataHandler(char* topic, byte* data, unsigned int data_len) Serial.printf("%s", Unescape(dataBuf, &dat_len)); // "Hello\f" } else if (5 == index) { - SerialSendRaw(RemoveSpace(dataBuf), strlen(dataBuf)); // "AA004566" + SerialSendRaw(RemoveSpace(dataBuf)); // "AA004566" } snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_SVALUE, command, D_JSON_DONE); } @@ -2062,7 +2062,7 @@ void Every250mSeconds() ota_result = (HTTP_UPDATE_FAILED != ESPhttpUpdate.update(mqtt_data)); #else // If using core stage or 2.5.0+ the syntax has changed - WiFiClient OTAclient; + WiFiClient OTAclient; ota_result = (HTTP_UPDATE_FAILED != ESPhttpUpdate.update(OTAclient, mqtt_data)); #endif if (!ota_result) { @@ -2241,7 +2241,7 @@ void TuyaPacketProcess() AddLog(LOG_LEVEL_DEBUG); if (serial_in_byte_counter == 7 && serial_in_buffer[3] == 14 ) { // heartbeat packet AddLog_P(LOG_LEVEL_DEBUG, PSTR("TYA: Heartbeat")); - } + } if (serial_in_byte_counter == 12 && serial_in_buffer[3] == 7 && serial_in_buffer[5] == 5) { // on/off packet if (serial_in_buffer[10] == 0) { AddLog_P(LOG_LEVEL_DEBUG, PSTR("TYA: Rcvd - Off State")); @@ -2267,14 +2267,14 @@ void TuyaPacketProcess() ExecuteCommand(scmnd, SRC_SWITCH); serial_in_byte_counter = 0; serial_in_buffer[serial_in_byte_counter] = 0; // serial data completed - } + } if (serial_in_byte_counter == 8 && serial_in_buffer[3] == 5 && serial_in_buffer[5] == 1 && serial_in_buffer[7] == 5 ) { // reset WiFi settings packet - to do: reset red MCU LED after WiFi is up AddLog_P(LOG_LEVEL_DEBUG, PSTR("TYA: WiFi Reset Rcvd")); serial_in_byte_counter = 0; serial_in_buffer[serial_in_byte_counter] = 0; // serial data completed snprintf_P(scmnd, sizeof(scmnd), D_CMND_WIFICONFIG " 2"); ExecuteCommand(scmnd, SRC_BUTTON); - } + } } void SerialInput() { @@ -2305,7 +2305,7 @@ void SerialInput() } /*-------------------------------------------------------------------------------------------*\ - * Tuya based Dimmer with Serial Communications to MCU dimmer + * Tuya based Dimmer with Serial Communications to MCU dimmer at 9600 baud \*-------------------------------------------------------------------------------------------*/ if (TUYA_DIMMER == Settings.module) { if (serial_in_byte == '\x55') { // Start TUYA Packet @@ -2391,7 +2391,7 @@ void SerialInput() } } - if (TUYA_DIMMER == Settings.module && serial_in_byte_counter > 6 && (millis() > (serial_polling_window + SERIAL_POLLING))) { + if (TUYA_DIMMER == Settings.module && serial_in_byte_counter > 6 && (millis() > (serial_polling_window + SERIAL_POLLING))) { snprintf_P(log_data, sizeof(log_data), PSTR("TYA: 0x55 Packet End: \"")); for (int i = 0; i < serial_in_byte_counter; i++) { snprintf_P(log_data, sizeof(log_data), PSTR("%s%02x"), log_data, serial_in_buffer[i]); diff --git a/sonoff/sonoff_template.h b/sonoff/sonoff_template.h index 134778d2c..359466884 100644 --- a/sonoff/sonoff_template.h +++ b/sonoff/sonoff_template.h @@ -241,7 +241,7 @@ enum SupportedModules { OBI, TECKIN, APLIC_WDP303075, - TUYA_DIMMER, + TUYA_DIMMER, MAXMODULE }; /********************************************************************************************/ @@ -408,6 +408,7 @@ const uint8_t kModuleNiceList[MAXMODULE] PROGMEM = { NEO_COOLCAM, // Socket Relay Devices OBI, ESP_SWITCH, // Switch Devices + TUYA_DIMMER, // Dimmer Devices H801, // Light Devices MAGICHOME, ARILUX_LC01, @@ -419,8 +420,7 @@ const uint8_t kModuleNiceList[MAXMODULE] PROGMEM = { AILIGHT, // Light Bulbs PHILIPS, WITTY, // Development Devices - WEMOS, - TUYA_DIMMER + WEMOS }; // Default module settings @@ -1137,13 +1137,14 @@ const mytmplt kModules[MAXMODULE] PROGMEM = { 0, 0, 0 }, { "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 0, GPIO_TXD, // TX to dimmer MCU 0, GPIO_RXD, // RX from dimmer MCU - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0 + 0, 0, + 0, 0, 0, 0, 0, 0, // Flash connection + 0, 0, 0, 0, 0, 0 } }; diff --git a/sonoff/support.ino b/sonoff/support.ino index 6dd6776f0..1f8f4b912 100644 --- a/sonoff/support.ino +++ b/sonoff/support.ino @@ -750,13 +750,13 @@ void ClaimSerial() Settings.baudrate = baudrate / 1200; } -void SerialSendRaw(char *codes, int size) +void SerialSendRaw(char *codes) { char *p; char stemp[3]; uint8_t code; - - size = strlen(codes); // Force size to be strlen of codes, if whitespace was removed it will overrun into unwanted buffer space + + int size = strlen(codes); while (size > 0) { snprintf(stemp, sizeof(stemp), codes); diff --git a/sonoff/xdrv_06_snfbridge.ino b/sonoff/xdrv_06_snfbridge.ino index cacf9a1a0..7f983fee1 100644 --- a/sonoff/xdrv_06_snfbridge.ino +++ b/sonoff/xdrv_06_snfbridge.ino @@ -310,8 +310,8 @@ boolean SonoffBridgeSerialInput() } serial_in_buffer[serial_in_byte_counter++] = serial_in_byte; if (serial_in_byte_counter == 3) { - if ((0xA6 == serial_in_buffer[serial_in_byte_counter - 2]) || (0xAB == serial_in_buffer[serial_in_byte_counter - 2])) { // AA A6 06 023908010155 55 - 06 is receive_len - receive_len = serial_in_buffer[serial_in_byte_counter - 1]; // Get at least receive_len bytes + if ((0xA6 == serial_in_buffer[1]) || (0xAB == serial_in_buffer[1])) { // AA A6 06 023908010155 55 - 06 is receive_len + receive_len = serial_in_buffer[2]; // Get at least receive_len bytes } } if (((0 == receive_len) && (0x55 == serial_in_byte)) || (serial_in_byte_counter == receive_len + 4)) { // 0x55 - End of text @@ -345,7 +345,7 @@ boolean SonoffBridgeSerialInput() serial_in_byte_counter = 0; serial_in_byte = 0; sonoff_bridge_receive_flag = 1; - receive_len = 0; + receive_len = 0; } return 0; } @@ -537,12 +537,12 @@ boolean SonoffBridgeCommand() sonoff_bridge_receive_raw_flag = 1; break; case 192: // 0xC0 - Beep - char beep[] = "AAC000C055"; - SerialSendRaw(beep, sizeof(beep)); + char beep[] = "AAC000C055\0"; + SerialSendRaw(beep); break; } } else { - SerialSendRaw(RemoveSpace(XdrvMailbox.data), strlen(XdrvMailbox.data)); + SerialSendRaw(RemoveSpace(XdrvMailbox.data)); sonoff_bridge_receive_raw_flag = 1; } }