mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-30 14:16:32 +00:00
TuyaMcu: Add TuyaSend command to communicate with Tuya MCU
This commit is contained in:
parent
b2ea36a400
commit
e6f94fe37b
@ -452,6 +452,7 @@
|
|||||||
// Commands xdrv_16_tuyadimmer.ino
|
// Commands xdrv_16_tuyadimmer.ino
|
||||||
|
|
||||||
#define D_CMND_TUYA_MCU "TuyaMCU"
|
#define D_CMND_TUYA_MCU "TuyaMCU"
|
||||||
|
#define D_CMND_TUYA_MCU_SEND_STATE "TuyaSend"
|
||||||
#define D_JSON_TUYA_MCU_RECEIVED "TuyaMcuReceived"
|
#define D_JSON_TUYA_MCU_RECEIVED "TuyaMcuReceived"
|
||||||
|
|
||||||
// Commands xdrv_23_zigbee.ino
|
// Commands xdrv_23_zigbee.ino
|
||||||
|
@ -44,6 +44,7 @@
|
|||||||
|
|
||||||
#define TUYA_TYPE_BOOL 0x01
|
#define TUYA_TYPE_BOOL 0x01
|
||||||
#define TUYA_TYPE_VALUE 0x02
|
#define TUYA_TYPE_VALUE 0x02
|
||||||
|
#define TUYA_TYPE_STRING 0x03
|
||||||
#define TUYA_TYPE_ENUM 0x04
|
#define TUYA_TYPE_ENUM 0x04
|
||||||
|
|
||||||
#define TUYA_BUFFER_SIZE 256
|
#define TUYA_BUFFER_SIZE 256
|
||||||
@ -103,12 +104,55 @@ enum TuyaSupportedFunctions {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const char kTuyaCommand[] PROGMEM = "|" // No prefix
|
const char kTuyaCommand[] PROGMEM = "|" // No prefix
|
||||||
D_CMND_TUYA_MCU;
|
D_CMND_TUYA_MCU "|" D_CMND_TUYA_MCU_SEND_STATE;
|
||||||
|
|
||||||
void (* const TuyaCommand[])(void) PROGMEM = {
|
void (* const TuyaCommand[])(void) PROGMEM = {
|
||||||
&CmndTuyaMcu
|
&CmndTuyaMcu, &CmndTuyaSend
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
TuyaSend<x> dpId,data
|
||||||
|
|
||||||
|
TuyaSend1 11,1 -> Sends boolean (Type 1) data 0/1 to dpId 11 (Max data length 1 byte)
|
||||||
|
TuyaSend2 11,100 -> Sends integer (Type 2) data 100 to dpId 11 (Max data length 4 bytes)
|
||||||
|
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 0/1/2/3/4/5 to dpId 11 (Max data length 1 bytes)
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
void CmndTuyaSend(void) {
|
||||||
|
if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= 4)) {
|
||||||
|
if (XdrvMailbox.data_len > 0) {
|
||||||
|
|
||||||
|
char *p;
|
||||||
|
char *data;
|
||||||
|
uint8_t i = 0;
|
||||||
|
uint8_t dpId = 0;
|
||||||
|
for (char *str = strtok_r(XdrvMailbox.data, ", ", &p); str && i < 2; str = strtok_r(nullptr, ", ", &p)) {
|
||||||
|
if ( i == 0) {
|
||||||
|
dpId = strtoul(str, nullptr, 0);
|
||||||
|
} else {
|
||||||
|
data = str;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (1 == XdrvMailbox.index) {
|
||||||
|
TuyaSendBool(dpId, strtoul(data, nullptr, 0));
|
||||||
|
} else if (2 == XdrvMailbox.index) {
|
||||||
|
TuyaSendValue(dpId, strtoull(data, nullptr, 0));
|
||||||
|
} else if (3 == XdrvMailbox.index) {
|
||||||
|
TuyaSendString(dpId, data);
|
||||||
|
} else if (4 == XdrvMailbox.index) {
|
||||||
|
TuyaSendEnum(dpId, strtoul(data, nullptr, 0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ResponseCmndDone();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
@ -252,6 +296,7 @@ void TuyaSendState(uint8_t id, uint8_t type, uint8_t* value)
|
|||||||
payload_buffer[1] = type;
|
payload_buffer[1] = type;
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case TUYA_TYPE_BOOL:
|
case TUYA_TYPE_BOOL:
|
||||||
|
case TUYA_TYPE_ENUM:
|
||||||
payload_len += 1;
|
payload_len += 1;
|
||||||
payload_buffer[2] = 0x00;
|
payload_buffer[2] = 0x00;
|
||||||
payload_buffer[3] = 0x01;
|
payload_buffer[3] = 0x01;
|
||||||
@ -266,6 +311,7 @@ void TuyaSendState(uint8_t id, uint8_t type, uint8_t* value)
|
|||||||
payload_buffer[6] = value[1];
|
payload_buffer[6] = value[1];
|
||||||
payload_buffer[7] = value[0];
|
payload_buffer[7] = value[0];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TuyaSendCmd(TUYA_CMD_SET_DP, payload_buffer, payload_len);
|
TuyaSendCmd(TUYA_CMD_SET_DP, payload_buffer, payload_len);
|
||||||
@ -281,6 +327,28 @@ void TuyaSendValue(uint8_t id, uint32_t value)
|
|||||||
TuyaSendState(id, TUYA_TYPE_VALUE, (uint8_t*)(&value));
|
TuyaSendState(id, TUYA_TYPE_VALUE, (uint8_t*)(&value));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TuyaSendEnum(uint8_t id, uint32_t value)
|
||||||
|
{
|
||||||
|
TuyaSendState(id, TUYA_TYPE_ENUM, (uint8_t*)(&value));
|
||||||
|
}
|
||||||
|
|
||||||
|
void TuyaSendString(uint8_t id, char data[]) {
|
||||||
|
|
||||||
|
uint16_t len = strlen(data);
|
||||||
|
uint16_t payload_len = 4 + len;
|
||||||
|
uint8_t payload_buffer[payload_len];
|
||||||
|
payload_buffer[0] = id;
|
||||||
|
payload_buffer[1] = TUYA_TYPE_STRING;
|
||||||
|
payload_buffer[2] = len >> 8;
|
||||||
|
payload_buffer[3] = len & 0xFF;
|
||||||
|
|
||||||
|
for (uint16_t i = 0; i < len; i++) {
|
||||||
|
payload_buffer[4+i] = data[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
TuyaSendCmd(TUYA_CMD_SET_DP, payload_buffer, payload_len);
|
||||||
|
}
|
||||||
|
|
||||||
bool TuyaSetPower(void)
|
bool TuyaSetPower(void)
|
||||||
{
|
{
|
||||||
bool status = false;
|
bool status = false;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user