Merge pull request #9516 from s-hadinger/zigbee_tuya_moes

Zigbee support for Tuya Moes devices
This commit is contained in:
s-hadinger 2020-10-11 19:52:38 +02:00 committed by GitHub
commit 9e520a7b90
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 314 additions and 181 deletions

View File

@ -148,6 +148,12 @@ public:
}
return 0;
}
uint16_t get16BigEndian(const size_t offset) const {
if (offset < len() - 1) {
return _buf->buf[offset+1] | (_buf->buf[offset] << 8);
}
return 0;
}
uint32_t get32(const size_t offset) const {
if (offset < len() - 3) {
return _buf->buf[offset] | (_buf->buf[offset+1] << 8) |
@ -155,6 +161,13 @@ public:
}
return 0;
}
int32_t get32IBigEndian(const size_t offset) const {
if (offset < len() - 3) {
return _buf->buf[offset+3] | (_buf->buf[offset+2] << 8) |
(_buf->buf[offset+1] << 16) | (_buf->buf[offset] << 24);
}
return 0;
}
uint64_t get64(const size_t offset) const {
if (offset < len() - 7) {
return (uint64_t)_buf->buf[offset] | ((uint64_t)_buf->buf[offset+1] << 8) |

View File

@ -272,7 +272,7 @@ const char Z_strings[] PROGMEM =
"ControlSequenceOfOperation" "\x00"
"SystemMode" "\x00"
"TRVMode" "\x00"
"SetValvePosition" "\x00"
"ValvePosition" "\x00"
"EurotronicErrors" "\x00"
"CurrentTemperatureSetPoint" "\x00"
"ThSetpoint" "\x00"
@ -361,6 +361,26 @@ const char Z_strings[] PROGMEM =
"PersistentMemoryWrites" "\x00"
"LastMessageLQI" "\x00"
"LastMessageRSSI" "\x00"
"TuyaScheduleWorkdays" "\x00"
"TuyaScheduleHolidays" "\x00"
"TuyaChildLock" "\x00"
"TuyaWindowDetection" "\x00"
"TuyaValveDetection" "\x00"
"TuyaAutoLock" "\x00"
"TuyaTempTarget" "\x00"
"TuyaBattery" "\x00"
"TuyaMinTemp" "\x00"
"TuyaMaxTemp" "\x00"
"TuyaBoostTime" "\x00"
"TuyaComfortTemp" "\x00"
"TuyaEcoTemp" "\x00"
"TuyaValvePosition" "\x00"
"TuyaAwayTemp" "\x00"
"TuyaAwayDays" "\x00"
"TuyaPreset" "\x00"
"TuyaFanMode" "\x00"
"TuyaForceMode" "\x00"
"TuyaWeekSelect" "\x00"
"Identify" "\x00"
"xxxx" "\x00"
"IdentifyQuery" "\x00"
@ -651,184 +671,204 @@ enum Z_offsets {
Zo_ControlSequenceOfOperation = 3427,
Zo_SystemMode = 3454,
Zo_TRVMode = 3465,
Zo_SetValvePosition = 3473,
Zo_EurotronicErrors = 3490,
Zo_CurrentTemperatureSetPoint = 3507,
Zo_ThSetpoint = 3534,
Zo_TempTarget = 3545,
Zo_Hue = 3556,
Zo_Sat = 3560,
Zo_RemainingTime = 3564,
Zo_X = 3578,
Zo_Y = 3580,
Zo_DriftCompensation = 3582,
Zo_CompensationText = 3600,
Zo_CT = 3617,
Zo_ColorMode = 3620,
Zo_NumberOfPrimaries = 3630,
Zo_Primary1X = 3648,
Zo_Primary1Y = 3658,
Zo_Primary1Intensity = 3668,
Zo_Primary2X = 3686,
Zo_Primary2Y = 3696,
Zo_Primary2Intensity = 3706,
Zo_Primary3X = 3724,
Zo_Primary3Y = 3734,
Zo_Primary3Intensity = 3744,
Zo_WhitePointX = 3762,
Zo_WhitePointY = 3774,
Zo_ColorPointRX = 3786,
Zo_ColorPointRY = 3799,
Zo_ColorPointRIntensity = 3812,
Zo_ColorPointGX = 3833,
Zo_ColorPointGY = 3846,
Zo_ColorPointGIntensity = 3859,
Zo_ColorPointBX = 3880,
Zo_ColorPointBY = 3893,
Zo_ColorPointBIntensity = 3906,
Zo_Illuminance = 3927,
Zo_IlluminanceMinMeasuredValue = 3939,
Zo_IlluminanceMaxMeasuredValue = 3967,
Zo_IlluminanceTolerance = 3995,
Zo_IlluminanceLightSensorType = 4016,
Zo_IlluminanceLevelStatus = 4043,
Zo_IlluminanceTargetLevel = 4066,
Zo_Temperature = 4089,
Zo_TemperatureMinMeasuredValue = 4101,
Zo_TemperatureMaxMeasuredValue = 4129,
Zo_TemperatureTolerance = 4157,
Zo_Pressure = 4178,
Zo_PressureMinMeasuredValue = 4187,
Zo_PressureMaxMeasuredValue = 4212,
Zo_PressureTolerance = 4237,
Zo_PressureScaledValue = 4255,
Zo_PressureMinScaledValue = 4275,
Zo_PressureMaxScaledValue = 4298,
Zo_PressureScaledTolerance = 4321,
Zo_PressureScale = 4345,
Zo_SeaPressure = 4359,
Zo_FlowRate = 4371,
Zo_FlowMinMeasuredValue = 4380,
Zo_FlowMaxMeasuredValue = 4401,
Zo_FlowTolerance = 4422,
Zo_Humidity = 4436,
Zo_HumidityMinMeasuredValue = 4445,
Zo_HumidityMaxMeasuredValue = 4470,
Zo_HumidityTolerance = 4495,
Zo_Occupancy = 4513,
Zo_OccupancySensorType = 4523,
Zo_ZoneState = 4543,
Zo_ZoneType = 4553,
Zo_ZoneStatus = 4562,
Zo_CurrentSummDelivered = 4573,
Zo_CompanyName = 4594,
Zo_MeterTypeID = 4606,
Zo_DataQualityID = 4618,
Zo_CustomerName = 4632,
Zo_Model = 4645,
Zo_PartNumber = 4651,
Zo_ProductRevision = 4662,
Zo_SoftwareRevision = 4678,
Zo_UtilityName = 4695,
Zo_POD = 4707,
Zo_AvailablePower = 4711,
Zo_PowerThreshold = 4726,
Zo_RMSVoltage = 4741,
Zo_RMSCurrent = 4752,
Zo_ActivePower = 4763,
Zo_NumberOfResets = 4775,
Zo_PersistentMemoryWrites = 4790,
Zo_LastMessageLQI = 4813,
Zo_LastMessageRSSI = 4828,
Zo_Identify = 4844,
Zo_xxxx = 4853,
Zo_IdentifyQuery = 4858,
Zo_AddGroup = 4872,
Zo_xxxx00 = 4881,
Zo_ViewGroup = 4888,
Zo_GetGroup = 4898,
Zo_01xxxx = 4907,
Zo_GetAllGroups = 4914,
Zo_00 = 4927,
Zo_RemoveGroup = 4930,
Zo_RemoveAllGroups = 4942,
Zo_ViewScene = 4958,
Zo_xxxxyy = 4968,
Zo_RemoveScene = 4975,
Zo_RemoveAllScenes = 4987,
Zo_RecallScene = 5003,
Zo_GetSceneMembership = 5015,
Zo_PowerOffEffect = 5034,
Zo_xxyy = 5049,
Zo_PowerOnRecall = 5054,
Zo_PowerOnTimer = 5068,
Zo_xxyyyyzzzz = 5081,
Zo_xx0A00 = 5092,
Zo_DimmerUp = 5099,
Zo_00190200 = 5108,
Zo_DimmerDown = 5117,
Zo_01190200 = 5128,
Zo_DimmerStop = 5137,
Zo_ResetAlarm = 5148,
Zo_xxyyyy = 5159,
Zo_ResetAllAlarms = 5166,
Zo_xx000A00 = 5181,
Zo_HueSat = 5190,
Zo_xxyy0A00 = 5197,
Zo_Color = 5206,
Zo_xxxxyyyy0A00 = 5212,
Zo_xxxx0A00 = 5225,
Zo_ShutterOpen = 5234,
Zo_ShutterClose = 5246,
Zo_ShutterStop = 5259,
Zo_ShutterLift = 5271,
Zo_xx = 5283,
Zo_ShutterTilt = 5286,
Zo_Shutter = 5298,
Zo_DimmerMove = 5306,
Zo_xx0A = 5317,
Zo_DimmerStepUp = 5322,
Zo_00xx0A00 = 5335,
Zo_DimmerStepDown = 5344,
Zo_01xx0A00 = 5359,
Zo_DimmerStep = 5368,
Zo_xx190A00 = 5379,
Zo_01 = 5388,
Zo_HueMove = 5391,
Zo_xx19 = 5399,
Zo_HueStepUp = 5404,
Zo_HueStepDown = 5414,
Zo_03xx0A00 = 5426,
Zo_HueStep = 5435,
Zo_SatMove = 5443,
Zo_SatStep = 5451,
Zo_xx190A = 5459,
Zo_ColorMove = 5466,
Zo_xxxxyyyy = 5476,
Zo_ColorStep = 5485,
Zo_ColorTempMoveUp = 5495,
Zo_01xxxx000000000000 = 5511,
Zo_ColorTempMoveDown = 5530,
Zo_03xxxx000000000000 = 5548,
Zo_ColorTempMoveStop = 5567,
Zo_00xxxx000000000000 = 5585,
Zo_ColorTempMove = 5604,
Zo_xxyyyy000000000000 = 5618,
Zo_ColorTempStepUp = 5637,
Zo_01xxxx0A0000000000 = 5653,
Zo_ColorTempStepDown = 5672,
Zo_03xxxx0A0000000000 = 5690,
Zo_ColorTempStep = 5709,
Zo_xxyyyy0A0000000000 = 5723,
Zo_ArrowClick = 5742,
Zo_ArrowHold = 5753,
Zo_ArrowRelease = 5763,
Zo_ZoneStatusChange = 5776,
Zo_xxxxyyzz = 5793,
Zo_xxyyzzzz = 5802,
Zo_AddScene = 5811,
Zo_xxyyyyzz = 5820,
Zo_StoreScene = 5829,
Zo_ValvePosition = 3473,
Zo_EurotronicErrors = 3487,
Zo_CurrentTemperatureSetPoint = 3504,
Zo_ThSetpoint = 3531,
Zo_TempTarget = 3542,
Zo_Hue = 3553,
Zo_Sat = 3557,
Zo_RemainingTime = 3561,
Zo_X = 3575,
Zo_Y = 3577,
Zo_DriftCompensation = 3579,
Zo_CompensationText = 3597,
Zo_CT = 3614,
Zo_ColorMode = 3617,
Zo_NumberOfPrimaries = 3627,
Zo_Primary1X = 3645,
Zo_Primary1Y = 3655,
Zo_Primary1Intensity = 3665,
Zo_Primary2X = 3683,
Zo_Primary2Y = 3693,
Zo_Primary2Intensity = 3703,
Zo_Primary3X = 3721,
Zo_Primary3Y = 3731,
Zo_Primary3Intensity = 3741,
Zo_WhitePointX = 3759,
Zo_WhitePointY = 3771,
Zo_ColorPointRX = 3783,
Zo_ColorPointRY = 3796,
Zo_ColorPointRIntensity = 3809,
Zo_ColorPointGX = 3830,
Zo_ColorPointGY = 3843,
Zo_ColorPointGIntensity = 3856,
Zo_ColorPointBX = 3877,
Zo_ColorPointBY = 3890,
Zo_ColorPointBIntensity = 3903,
Zo_Illuminance = 3924,
Zo_IlluminanceMinMeasuredValue = 3936,
Zo_IlluminanceMaxMeasuredValue = 3964,
Zo_IlluminanceTolerance = 3992,
Zo_IlluminanceLightSensorType = 4013,
Zo_IlluminanceLevelStatus = 4040,
Zo_IlluminanceTargetLevel = 4063,
Zo_Temperature = 4086,
Zo_TemperatureMinMeasuredValue = 4098,
Zo_TemperatureMaxMeasuredValue = 4126,
Zo_TemperatureTolerance = 4154,
Zo_Pressure = 4175,
Zo_PressureMinMeasuredValue = 4184,
Zo_PressureMaxMeasuredValue = 4209,
Zo_PressureTolerance = 4234,
Zo_PressureScaledValue = 4252,
Zo_PressureMinScaledValue = 4272,
Zo_PressureMaxScaledValue = 4295,
Zo_PressureScaledTolerance = 4318,
Zo_PressureScale = 4342,
Zo_SeaPressure = 4356,
Zo_FlowRate = 4368,
Zo_FlowMinMeasuredValue = 4377,
Zo_FlowMaxMeasuredValue = 4398,
Zo_FlowTolerance = 4419,
Zo_Humidity = 4433,
Zo_HumidityMinMeasuredValue = 4442,
Zo_HumidityMaxMeasuredValue = 4467,
Zo_HumidityTolerance = 4492,
Zo_Occupancy = 4510,
Zo_OccupancySensorType = 4520,
Zo_ZoneState = 4540,
Zo_ZoneType = 4550,
Zo_ZoneStatus = 4559,
Zo_CurrentSummDelivered = 4570,
Zo_CompanyName = 4591,
Zo_MeterTypeID = 4603,
Zo_DataQualityID = 4615,
Zo_CustomerName = 4629,
Zo_Model = 4642,
Zo_PartNumber = 4648,
Zo_ProductRevision = 4659,
Zo_SoftwareRevision = 4675,
Zo_UtilityName = 4692,
Zo_POD = 4704,
Zo_AvailablePower = 4708,
Zo_PowerThreshold = 4723,
Zo_RMSVoltage = 4738,
Zo_RMSCurrent = 4749,
Zo_ActivePower = 4760,
Zo_NumberOfResets = 4772,
Zo_PersistentMemoryWrites = 4787,
Zo_LastMessageLQI = 4810,
Zo_LastMessageRSSI = 4825,
Zo_TuyaScheduleWorkdays = 4841,
Zo_TuyaScheduleHolidays = 4862,
Zo_TuyaChildLock = 4883,
Zo_TuyaWindowDetection = 4897,
Zo_TuyaValveDetection = 4917,
Zo_TuyaAutoLock = 4936,
Zo_TuyaTempTarget = 4949,
Zo_TuyaBattery = 4964,
Zo_TuyaMinTemp = 4976,
Zo_TuyaMaxTemp = 4988,
Zo_TuyaBoostTime = 5000,
Zo_TuyaComfortTemp = 5014,
Zo_TuyaEcoTemp = 5030,
Zo_TuyaValvePosition = 5042,
Zo_TuyaAwayTemp = 5060,
Zo_TuyaAwayDays = 5073,
Zo_TuyaPreset = 5086,
Zo_TuyaFanMode = 5097,
Zo_TuyaForceMode = 5109,
Zo_TuyaWeekSelect = 5123,
Zo_Identify = 5138,
Zo_xxxx = 5147,
Zo_IdentifyQuery = 5152,
Zo_AddGroup = 5166,
Zo_xxxx00 = 5175,
Zo_ViewGroup = 5182,
Zo_GetGroup = 5192,
Zo_01xxxx = 5201,
Zo_GetAllGroups = 5208,
Zo_00 = 5221,
Zo_RemoveGroup = 5224,
Zo_RemoveAllGroups = 5236,
Zo_ViewScene = 5252,
Zo_xxxxyy = 5262,
Zo_RemoveScene = 5269,
Zo_RemoveAllScenes = 5281,
Zo_RecallScene = 5297,
Zo_GetSceneMembership = 5309,
Zo_PowerOffEffect = 5328,
Zo_xxyy = 5343,
Zo_PowerOnRecall = 5348,
Zo_PowerOnTimer = 5362,
Zo_xxyyyyzzzz = 5375,
Zo_xx0A00 = 5386,
Zo_DimmerUp = 5393,
Zo_00190200 = 5402,
Zo_DimmerDown = 5411,
Zo_01190200 = 5422,
Zo_DimmerStop = 5431,
Zo_ResetAlarm = 5442,
Zo_xxyyyy = 5453,
Zo_ResetAllAlarms = 5460,
Zo_xx000A00 = 5475,
Zo_HueSat = 5484,
Zo_xxyy0A00 = 5491,
Zo_Color = 5500,
Zo_xxxxyyyy0A00 = 5506,
Zo_xxxx0A00 = 5519,
Zo_ShutterOpen = 5528,
Zo_ShutterClose = 5540,
Zo_ShutterStop = 5553,
Zo_ShutterLift = 5565,
Zo_xx = 5577,
Zo_ShutterTilt = 5580,
Zo_Shutter = 5592,
Zo_DimmerMove = 5600,
Zo_xx0A = 5611,
Zo_DimmerStepUp = 5616,
Zo_00xx0A00 = 5629,
Zo_DimmerStepDown = 5638,
Zo_01xx0A00 = 5653,
Zo_DimmerStep = 5662,
Zo_xx190A00 = 5673,
Zo_01 = 5682,
Zo_HueMove = 5685,
Zo_xx19 = 5693,
Zo_HueStepUp = 5698,
Zo_HueStepDown = 5708,
Zo_03xx0A00 = 5720,
Zo_HueStep = 5729,
Zo_SatMove = 5737,
Zo_SatStep = 5745,
Zo_xx190A = 5753,
Zo_ColorMove = 5760,
Zo_xxxxyyyy = 5770,
Zo_ColorStep = 5779,
Zo_ColorTempMoveUp = 5789,
Zo_01xxxx000000000000 = 5805,
Zo_ColorTempMoveDown = 5824,
Zo_03xxxx000000000000 = 5842,
Zo_ColorTempMoveStop = 5861,
Zo_00xxxx000000000000 = 5879,
Zo_ColorTempMove = 5898,
Zo_xxyyyy000000000000 = 5912,
Zo_ColorTempStepUp = 5931,
Zo_01xxxx0A0000000000 = 5947,
Zo_ColorTempStepDown = 5966,
Zo_03xxxx0A0000000000 = 5984,
Zo_ColorTempStep = 6003,
Zo_xxyyyy0A0000000000 = 6017,
Zo_ArrowClick = 6036,
Zo_ArrowHold = 6047,
Zo_ArrowRelease = 6057,
Zo_ZoneStatusChange = 6070,
Zo_xxxxyyzz = 6087,
Zo_xxyyzzzz = 6096,
Zo_AddScene = 6105,
Zo_xxyyyyzz = 6114,
Zo_StoreScene = 6123,
};

View File

@ -120,6 +120,7 @@ enum Cx_cluster_short {
Cx0010, Cx0011, Cx0012, Cx0013, Cx0014, Cx001A, Cx0020, Cx0100,
Cx0101, Cx0102, Cx0201, Cx0300, Cx0400, Cx0401, Cx0402, Cx0403,
Cx0404, Cx0405, Cx0406, Cx0500, Cx0702, Cx0B01, Cx0B04, Cx0B05,
CxEF00,
};
const uint16_t Cx_cluster[] PROGMEM = {
@ -128,6 +129,7 @@ const uint16_t Cx_cluster[] PROGMEM = {
0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x001A, 0x0020, 0x0100,
0x0101, 0x0102, 0x0201, 0x0300, 0x0400, 0x0401, 0x0402, 0x0403,
0x0404, 0x0405, 0x0406, 0x0500, 0x0702, 0x0B01, 0x0B04, 0x0B05,
0xEF00,
};
uint16_t CxToCluster(uint8_t cx) {
@ -453,7 +455,7 @@ const Z_AttributeConverter Z_PostProcess[] PROGMEM = {
{ Zenum8, Cx0201, 0x001C, Z_(SystemMode), Cm1, 0 },
// below is Eurotronic specific
{ Zenum8, Cx0201, 0x4000, Z_(TRVMode), Cm1, 0 },
{ Zuint8, Cx0201, 0x4001, Z_(SetValvePosition), Cm1, 0 },
{ Zuint8, Cx0201, 0x4001, Z_(ValvePosition), Cm1, 0 },
{ Zuint8, Cx0201, 0x4002, Z_(EurotronicErrors), Cm1, 0 },
{ Zint16, Cx0201, 0x4003, Z_(CurrentTemperatureSetPoint), Cm_100, 0 },
// below are virtual attributes to simplify ZbData import/export
@ -578,6 +580,28 @@ const Z_AttributeConverter Z_PostProcess[] PROGMEM = {
{ Zuint8, Cx0B05, 0x011C, Z_(LastMessageLQI), Cm1, 0 },
{ Zuint8, Cx0B05, 0x011D, Z_(LastMessageRSSI), Cm1, 0 },
// Tuya Moes specific - 0xEF00
{ Zoctstr, CxEF00, 0x0070, Z_(TuyaScheduleWorkdays), Cm1, 0 },
{ Zoctstr, CxEF00, 0x0071, Z_(TuyaScheduleHolidays), Cm1, 0 },
{ Zuint8, CxEF00, 0x0107, Z_(TuyaChildLock), Cm1, 0 },
{ Zuint8, CxEF00, 0x0112, Z_(TuyaWindowDetection), Cm1, 0 },
{ Zuint8, CxEF00, 0x0114, Z_(TuyaValveDetection), Cm1, 0 },
{ Zuint8, CxEF00, 0x0174, Z_(TuyaAutoLock), Cm1, 0 },
{ Zint16, CxEF00, 0x0202, Z_(TuyaTempTarget), Cm_10, 0 },
{ Zint16, CxEF00, 0x0203, Z_(LocalTemperature), Cm_10, 0 }, // will be overwritten by actual LocalTemperature
{ Zuint8, CxEF00, 0x0215, Z_(TuyaBattery), Cm1, 0 }, // TODO check equivalent?
{ Zint32, CxEF00, 0x0266, Z_(TuyaMinTemp), Cm1, 0 },
{ Zint32, CxEF00, 0x0267, Z_(TuyaMaxTemp), Cm1, 0 },
{ Zint32, CxEF00, 0x0269, Z_(TuyaBoostTime), Cm1, 0 },
{ Zint32, CxEF00, 0x026B, Z_(TuyaComfortTemp), Cm1, 0 },
{ Zint32, CxEF00, 0x026C, Z_(TuyaEcoTemp), Cm1, 0 },
{ Zuint8, CxEF00, 0x026D, Z_(TuyaValvePosition), Cm1, 0 },
{ Zint32, CxEF00, 0x0272, Z_(TuyaAwayTemp), Cm1, 0 },
{ Zint32, CxEF00, 0x0275, Z_(TuyaAwayDays), Cm1, 0 },
{ Zuint8, CxEF00, 0x0404, Z_(TuyaPreset), Cm1, 0 },
{ Zuint8, CxEF00, 0x0405, Z_(TuyaFanMode), Cm1, 0 },
{ Zuint8, CxEF00, 0x046A, Z_(TuyaForceMode), Cm1, 0 },
{ Zuint8, CxEF00, 0x046F, Z_(TuyaWeekSelect), Cm1, 0 },
};
#pragma GCC diagnostic pop

View File

@ -134,6 +134,8 @@ const Z_CommandConverter Z_Commands[] PROGMEM = {
{ Z_(RemoveAllScenes),0x0005, 0x03, 0x82, Z_(xxyyyy) }, // xx = status, yyyy = group id
{ Z_(StoreScene), 0x0005, 0x04, 0x82, Z_(xxyyyyzz) }, // xx = status, yyyy = group id, zz = scene id
{ Z_(GetSceneMembership),0x0005, 0x06, 0x82,Z_(xxyyzzzz) }, // specific
// Tuya - Moes specific
{ Z_(), 0xEF00, 0xFF, 0x83, Z_() }, // capture any command in 0xEF00 cluster
};
/*********************************************************************************************\
@ -330,7 +332,8 @@ void convertClusterSpecific(class Z_attribute_list &attr_list, uint16_t cluster,
// Format: "0004<00": "00" = "<cluster><<cmd>": "<payload>" for commands to devices
char attrid_str[12];
snprintf_P(attrid_str, sizeof(attrid_str), PSTR("%04X%c%02X"), cluster, direction ? '<' : '!', cmd);
attr_list.addAttribute(attrid_str).setBuf(payload, 0, payload.len());
Z_attribute & attr_raw = attr_list.addAttribute(attrid_str);
attr_raw.setBuf(payload, 0, payload.len());
if (command_name) {
// Now try to transform into a human readable format
@ -410,6 +413,11 @@ void convertClusterSpecific(class Z_attribute_list &attr_list, uint16_t cluster,
attr_list.addAttribute(PSTR("PowerOnTime"), true).setFloat(xyz.y / 10.0f);
attr_list.addAttribute(PSTR("PowerOffWait"), true).setFloat(xyz.z / 10.0f);
break;
case 0xEF000000 ... 0xEF0000FF: // any Tuya - Moes command
if (convertTuyaSpecificCluster(attr_list, cluster, cmd, direction, shortaddr, srcendpoint, payload)) {
attr_list.removeAttribute(&attr_raw); // remove raw command
}
break;
}
} else { // general case
// do we send command with endpoint suffix
@ -438,6 +446,54 @@ void convertClusterSpecific(class Z_attribute_list &attr_list, uint16_t cluster,
}
}
//
// Tuya - MOES specifc cluster 0xEF00
// See https://medium.com/@dzegarra/zigbee2mqtt-how-to-add-support-for-a-new-tuya-based-device-part-2-5492707e882d
// and https://github.com/Koenkk/zigbee-herdsman-converters/blob/9f503d47d3df6a99d133b78d2b52aa5c701ddddf/converters/fromZigbee.js#L339
//
bool convertTuyaSpecificCluster(class Z_attribute_list &attr_list, uint16_t cluster, uint8_t cmd, bool direction, uint16_t shortaddr, uint8_t srcendpoint, const SBuffer &buf) {
// uint8_t status = buf.get8(0);
// uint8_t transid = buf.get8(1);
uint16_t dp = buf.get16(2); // decode dp as 16 bits little endian - which is not big endian as mentioned in documentation
// uint8_t fn = buf.get8(4);
uint8_t len = buf.get8(5); // len of payload
if ((1 == cmd) || (2 == cmd)) { // attribute report or attribute response
// create a synthetic attribute with id 'dp'
Z_attribute & attr = attr_list.addAttribute(cluster, dp);
int32_t ival32 = -0x80000000;
if (1 == len) {
// 1 byte, convert as uint8_t
ival32 = buf.get8(6);
} else if (2 == len) {
ival32 = buf.get16BigEndian(6);
} else if (4 == len) {
// 4 bytes, convert as int32_t
ival32 = buf.get32IBigEndian(6);
}
if (ival32 != -0x80000000) {
// fix temperature coefficient
switch (dp) {
case 0x0202:
attr_list.addAttribute(0x0201, 0x0012).setInt(ival32 * 10); // OccupiedHeatingSetpoint
break;
case 0x0203:
attr_list.addAttribute(0x0201, 0x0000).setInt(ival32 * 10); // LocalTemperature
break;
case 0x026D:
attr_list.addAttribute(0x0201, 0x0008).setUInt(ival32); // PIHeatingDemand
break;
}
attr.setInt(ival32);
} else {
// add as raw buffer
attr.setBuf(buf, 6, len);
}
return true; // true = remove the original Tuya attribute
}
return false;
}
// Find the command details by command name
// Only take commands outgoing, i.e. direction == 0
// If not found: