mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-25 11:46:31 +00:00
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)
This commit is contained in:
parent
36b8f5d293
commit
d47ab92862
@ -2,6 +2,9 @@
|
|||||||
* Add TasmotaModbus library for very basic modbus wrapper for TasmotaSerial
|
* Add TasmotaModbus library for very basic modbus wrapper for TasmotaSerial
|
||||||
* Change xsns_17_senseair.ino to use TasmotaModbus library
|
* Change xsns_17_senseair.ino to use TasmotaModbus library
|
||||||
* Fix xnrg_05_pzem2.ino for PZEM-014/016 support using TasmotaModbus library (#3694)
|
* 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
|
* 6.2.1.15 20181012
|
||||||
* Fix Color Temperature slider functionality regression from 6.2.1.5 (#4037)
|
* Fix Color Temperature slider functionality regression from 6.2.1.5 (#4037)
|
||||||
|
@ -201,7 +201,7 @@ char log_data[LOGSZ]; // Logging
|
|||||||
char web_log[WEB_LOG_SIZE] = {'\0'}; // Web log buffer
|
char web_log[WEB_LOG_SIZE] = {'\0'}; // Web log buffer
|
||||||
String backlog[MAX_BACKLOG]; // Command backlog
|
String backlog[MAX_BACKLOG]; // Command backlog
|
||||||
uint8_t tuya_new_dim = 0; // Tuya dimmer value temp
|
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(0x55); // Tuya header 55AA
|
||||||
Serial.write(0xAA);
|
Serial.write(0xAA);
|
||||||
Serial.write(0x00); // version 00
|
Serial.write(0x00); // version 00
|
||||||
Serial.write(0x06); // Tuya command 06
|
Serial.write(0x06); // Tuya command 06
|
||||||
Serial.write(0x00);
|
Serial.write(0x00);
|
||||||
Serial.write(0x05); // following data length 0x05
|
Serial.write(0x05); // following data length 0x05
|
||||||
Serial.write(0x01); // relay number 1,2,3
|
Serial.write(0x01); // relay number 1,2,3
|
||||||
Serial.write(0x01);
|
Serial.write(0x01);
|
||||||
Serial.write(0x00);
|
Serial.write(0x00);
|
||||||
Serial.write(0x01);
|
Serial.write(0x01);
|
||||||
Serial.write(rpower); // status
|
Serial.write(rpower); // status
|
||||||
Serial.write(0x0D + rpower); // checksum sum of all bytes in packet mod 256
|
Serial.write(0x0D + rpower); // checksum sum of all bytes in packet mod 256
|
||||||
Serial.flush();
|
Serial.flush();
|
||||||
}
|
}
|
||||||
else if (EXS_RELAY == Settings.module) {
|
else if (EXS_RELAY == Settings.module) {
|
||||||
SetLatchingRelay(rpower, 1);
|
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"
|
Serial.printf("%s", Unescape(dataBuf, &dat_len)); // "Hello\f"
|
||||||
}
|
}
|
||||||
else if (5 == index) {
|
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);
|
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));
|
ota_result = (HTTP_UPDATE_FAILED != ESPhttpUpdate.update(mqtt_data));
|
||||||
#else
|
#else
|
||||||
// If using core stage or 2.5.0+ the syntax has changed
|
// 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));
|
ota_result = (HTTP_UPDATE_FAILED != ESPhttpUpdate.update(OTAclient, mqtt_data));
|
||||||
#endif
|
#endif
|
||||||
if (!ota_result) {
|
if (!ota_result) {
|
||||||
@ -2241,7 +2241,7 @@ void TuyaPacketProcess()
|
|||||||
AddLog(LOG_LEVEL_DEBUG);
|
AddLog(LOG_LEVEL_DEBUG);
|
||||||
if (serial_in_byte_counter == 7 && serial_in_buffer[3] == 14 ) { // heartbeat packet
|
if (serial_in_byte_counter == 7 && serial_in_buffer[3] == 14 ) { // heartbeat packet
|
||||||
AddLog_P(LOG_LEVEL_DEBUG, PSTR("TYA: Heartbeat"));
|
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_byte_counter == 12 && serial_in_buffer[3] == 7 && serial_in_buffer[5] == 5) { // on/off packet
|
||||||
if (serial_in_buffer[10] == 0) {
|
if (serial_in_buffer[10] == 0) {
|
||||||
AddLog_P(LOG_LEVEL_DEBUG, PSTR("TYA: Rcvd - Off State"));
|
AddLog_P(LOG_LEVEL_DEBUG, PSTR("TYA: Rcvd - Off State"));
|
||||||
@ -2267,14 +2267,14 @@ void TuyaPacketProcess()
|
|||||||
ExecuteCommand(scmnd, SRC_SWITCH);
|
ExecuteCommand(scmnd, SRC_SWITCH);
|
||||||
serial_in_byte_counter = 0;
|
serial_in_byte_counter = 0;
|
||||||
serial_in_buffer[serial_in_byte_counter] = 0; // serial data completed
|
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
|
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"));
|
AddLog_P(LOG_LEVEL_DEBUG, PSTR("TYA: WiFi Reset Rcvd"));
|
||||||
serial_in_byte_counter = 0;
|
serial_in_byte_counter = 0;
|
||||||
serial_in_buffer[serial_in_byte_counter] = 0; // serial data completed
|
serial_in_buffer[serial_in_byte_counter] = 0; // serial data completed
|
||||||
snprintf_P(scmnd, sizeof(scmnd), D_CMND_WIFICONFIG " 2");
|
snprintf_P(scmnd, sizeof(scmnd), D_CMND_WIFICONFIG " 2");
|
||||||
ExecuteCommand(scmnd, SRC_BUTTON);
|
ExecuteCommand(scmnd, SRC_BUTTON);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void SerialInput()
|
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 (TUYA_DIMMER == Settings.module) {
|
||||||
if (serial_in_byte == '\x55') { // Start TUYA Packet
|
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: \""));
|
snprintf_P(log_data, sizeof(log_data), PSTR("TYA: 0x55 Packet End: \""));
|
||||||
for (int i = 0; i < serial_in_byte_counter; i++) {
|
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]);
|
snprintf_P(log_data, sizeof(log_data), PSTR("%s%02x"), log_data, serial_in_buffer[i]);
|
||||||
|
@ -241,7 +241,7 @@ enum SupportedModules {
|
|||||||
OBI,
|
OBI,
|
||||||
TECKIN,
|
TECKIN,
|
||||||
APLIC_WDP303075,
|
APLIC_WDP303075,
|
||||||
TUYA_DIMMER,
|
TUYA_DIMMER,
|
||||||
MAXMODULE };
|
MAXMODULE };
|
||||||
|
|
||||||
/********************************************************************************************/
|
/********************************************************************************************/
|
||||||
@ -408,6 +408,7 @@ const uint8_t kModuleNiceList[MAXMODULE] PROGMEM = {
|
|||||||
NEO_COOLCAM, // Socket Relay Devices
|
NEO_COOLCAM, // Socket Relay Devices
|
||||||
OBI,
|
OBI,
|
||||||
ESP_SWITCH, // Switch Devices
|
ESP_SWITCH, // Switch Devices
|
||||||
|
TUYA_DIMMER, // Dimmer Devices
|
||||||
H801, // Light Devices
|
H801, // Light Devices
|
||||||
MAGICHOME,
|
MAGICHOME,
|
||||||
ARILUX_LC01,
|
ARILUX_LC01,
|
||||||
@ -419,8 +420,7 @@ const uint8_t kModuleNiceList[MAXMODULE] PROGMEM = {
|
|||||||
AILIGHT, // Light Bulbs
|
AILIGHT, // Light Bulbs
|
||||||
PHILIPS,
|
PHILIPS,
|
||||||
WITTY, // Development Devices
|
WITTY, // Development Devices
|
||||||
WEMOS,
|
WEMOS
|
||||||
TUYA_DIMMER
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Default module settings
|
// Default module settings
|
||||||
@ -1137,13 +1137,14 @@ const mytmplt kModules[MAXMODULE] PROGMEM = {
|
|||||||
0, 0, 0
|
0, 0, 0
|
||||||
},
|
},
|
||||||
{ "Tuya Dimmer", // Tuya Dimmer (ESP8266 w/ separate MCU dimmer)
|
{ "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,
|
0,
|
||||||
GPIO_TXD, // TX to dimmer MCU
|
GPIO_TXD, // TX to dimmer MCU
|
||||||
0,
|
0,
|
||||||
GPIO_RXD, // RX from dimmer MCU
|
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, // Flash connection
|
||||||
0, 0
|
0, 0, 0, 0, 0, 0
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -750,13 +750,13 @@ void ClaimSerial()
|
|||||||
Settings.baudrate = baudrate / 1200;
|
Settings.baudrate = baudrate / 1200;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SerialSendRaw(char *codes, int size)
|
void SerialSendRaw(char *codes)
|
||||||
{
|
{
|
||||||
char *p;
|
char *p;
|
||||||
char stemp[3];
|
char stemp[3];
|
||||||
uint8_t code;
|
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) {
|
while (size > 0) {
|
||||||
snprintf(stemp, sizeof(stemp), codes);
|
snprintf(stemp, sizeof(stemp), codes);
|
||||||
|
@ -310,8 +310,8 @@ boolean SonoffBridgeSerialInput()
|
|||||||
}
|
}
|
||||||
serial_in_buffer[serial_in_byte_counter++] = serial_in_byte;
|
serial_in_buffer[serial_in_byte_counter++] = serial_in_byte;
|
||||||
if (serial_in_byte_counter == 3) {
|
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
|
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[serial_in_byte_counter - 1]; // Get at least receive_len bytes
|
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
|
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_counter = 0;
|
||||||
serial_in_byte = 0;
|
serial_in_byte = 0;
|
||||||
sonoff_bridge_receive_flag = 1;
|
sonoff_bridge_receive_flag = 1;
|
||||||
receive_len = 0;
|
receive_len = 0;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -537,12 +537,12 @@ boolean SonoffBridgeCommand()
|
|||||||
sonoff_bridge_receive_raw_flag = 1;
|
sonoff_bridge_receive_raw_flag = 1;
|
||||||
break;
|
break;
|
||||||
case 192: // 0xC0 - Beep
|
case 192: // 0xC0 - Beep
|
||||||
char beep[] = "AAC000C055";
|
char beep[] = "AAC000C055\0";
|
||||||
SerialSendRaw(beep, sizeof(beep));
|
SerialSendRaw(beep);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
SerialSendRaw(RemoveSpace(XdrvMailbox.data), strlen(XdrvMailbox.data));
|
SerialSendRaw(RemoveSpace(XdrvMailbox.data));
|
||||||
sonoff_bridge_receive_raw_flag = 1;
|
sonoff_bridge_receive_raw_flag = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user