From d41a143446472207160172002878bf35f8ccd6c8 Mon Sep 17 00:00:00 2001 From: Benny Nestler Date: Wed, 30 Mar 2022 00:08:27 +0200 Subject: [PATCH 1/2] tuya send 6 command to send raw data to the tuya mcu --- tasmota/xdrv_16_tuyamcu.ino | 58 ++++++++++++++++++++++++++++++++----- 1 file changed, 50 insertions(+), 8 deletions(-) diff --git a/tasmota/xdrv_16_tuyamcu.ino b/tasmota/xdrv_16_tuyamcu.ino index 2b3fccd8a..9913b739b 100644 --- a/tasmota/xdrv_16_tuyamcu.ino +++ b/tasmota/xdrv_16_tuyamcu.ino @@ -43,6 +43,7 @@ #define TUYA_LOW_POWER_CMD_WIFI_CONFIG 0x04 #define TUYA_LOW_POWER_CMD_STATE 0x05 +#define TUYA_TYPE_RAW 0x00 #define TUYA_TYPE_BOOL 0x01 #define TUYA_TYPE_VALUE 0x02 #define TUYA_TYPE_STRING 0x03 @@ -147,6 +148,9 @@ TuyaSend2 11,100 -> Sends integer (Type 2) data 100 to dpId 11 (Max data length TuyaSend2 11,0xAABBCCDD -> Sends 4 bytes (Type 2) data to dpId 11 (Max data length 4 bytes) TuyaSend3 11,ThisIsTheData -> Sends the supplied string (Type 3) to dpId 11 ( Max data length not-known) TuyaSend4 11,1 -> Sends enum (Type 4) data 1 to dpId 11 (Max data length 1 bytes) +TuyaSend5 11,ABCD -> Sends an HEX string (Type 3) data to dpId +TuyaSend6 11,ABCD -> Sends raw (Type 0) data to dpId + */ void CmndTuyaSend(void) { @@ -186,6 +190,8 @@ void CmndTuyaSend(void) { TuyaSendHexString(dpId, data); } else if (4 == XdrvMailbox.index) { TuyaSendEnum(dpId, strtoul(data, nullptr, 0)); + } else if (6 == XdrvMailbox.index) { + TuyaSendRaw(dpId, data); } } } @@ -501,6 +507,24 @@ void TuyaSendEnum(uint8_t id, uint32_t value) TuyaSendState(id, TUYA_TYPE_ENUM, (uint8_t*)(&value)); } +static uint16_t convertHexStringtoBytes (uint8_t * dest, char src[], uint16_t src_len){ + if (NULL == dest || NULL == src || 0 == src_len){ + return 0; + } + + char hexbyte[3]; + hexbyte[2] = 0; + uint16_t i; + + for (i = 0; i < src_len; i++) { + hexbyte[0] = src[2*i]; + hexbyte[1] = src[2*i+1]; + dest[i] = strtol(hexbyte, NULL, 16); + } + + return i; +} + void TuyaSendHexString(uint8_t id, char data[]) { uint16_t len = strlen(data)/2; @@ -511,14 +535,7 @@ void TuyaSendHexString(uint8_t id, char data[]) { payload_buffer[2] = len >> 8; payload_buffer[3] = len & 0xFF; - char hexbyte[3]; - hexbyte[2] = 0; - - for (uint16_t i = 0; i < len; i++) { - hexbyte[0] = data[2*i]; - hexbyte[1] = data[2*i+1]; - payload_buffer[4+i] = strtol(hexbyte,NULL,16); - } + (void) convertHexStringtoBytes(&payload_buffer[4], data, len); TuyaSendCmd(TUYA_CMD_SET_DP, payload_buffer, payload_len); } @@ -540,6 +557,31 @@ void TuyaSendString(uint8_t id, char data[]) { TuyaSendCmd(TUYA_CMD_SET_DP, payload_buffer, payload_len); } +void TuyaSendRaw(uint8_t id, char data[]) { + AddLog(LOG_LEVEL_ERROR, PSTR("TYA: Send Raw-Data from string: %s"), data); + + char* beginPos = strchr(data, 'x'); + if(!beginPos) { + beginPos = strchr(data, 'X'); + } + if(!beginPos) { + beginPos = data; + } else { + beginPos += 1; + } + uint16_t strSize = strlen(beginPos); + uint16_t len = strSize/2; + uint16_t payload_len = 4 + len; + uint8_t payload_buffer[payload_len]; + payload_buffer[0] = id; + payload_buffer[1] = TUYA_TYPE_RAW; + payload_buffer[2] = len >> 8; + payload_buffer[3] = len & 0xFF; + + (void) convertHexStringtoBytes(&payload_buffer[4], beginPos, len); + + TuyaSendCmd(TUYA_CMD_SET_DP, payload_buffer, payload_len); +} bool TuyaSetPower(void) { bool status = false; From fa3b88b6a8d3ec9675eed040021e1f0903f40990 Mon Sep 17 00:00:00 2001 From: Benny Nestler Date: Wed, 30 Mar 2022 07:50:39 +0200 Subject: [PATCH 2/2] remove log --- tasmota/xdrv_16_tuyamcu.ino | 2 -- 1 file changed, 2 deletions(-) diff --git a/tasmota/xdrv_16_tuyamcu.ino b/tasmota/xdrv_16_tuyamcu.ino index 9913b739b..3e37d0bb8 100644 --- a/tasmota/xdrv_16_tuyamcu.ino +++ b/tasmota/xdrv_16_tuyamcu.ino @@ -558,8 +558,6 @@ void TuyaSendString(uint8_t id, char data[]) { } void TuyaSendRaw(uint8_t id, char data[]) { - AddLog(LOG_LEVEL_ERROR, PSTR("TYA: Send Raw-Data from string: %s"), data); - char* beginPos = strchr(data, 'x'); if(!beginPos) { beginPos = strchr(data, 'X');