Merge pull request #9953 from s-hadinger/zigbee_lumi_plug

Zigbee support for lumi_plug
This commit is contained in:
s-hadinger 2020-11-22 17:57:01 +01:00 committed by GitHub
commit 9bc5a3c973
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 171 additions and 137 deletions

View File

@ -350,7 +350,7 @@ const char Z_strings[] PROGMEM =
"Movement" "\x00"
"Panic" "\x00"
"GlassBreak" "\x00"
"CurrentSummDelivered" "\x00"
"EnergyTotal" "\x00"
"CompanyName" "\x00"
"MeterTypeID" "\x00"
"DataQualityID" "\x00"
@ -366,6 +366,8 @@ const char Z_strings[] PROGMEM =
"RMSVoltage" "\x00"
"RMSCurrent" "\x00"
"ActivePower" "\x00"
"ReactivePower" "\x00"
"ApparentPower" "\x00"
"NumberOfResets" "\x00"
"PersistentMemoryWrites" "\x00"
"LastMessageLQI" "\x00"
@ -763,140 +765,142 @@ enum Z_offsets {
Zo_Movement = 4610,
Zo_Panic = 4619,
Zo_GlassBreak = 4625,
Zo_CurrentSummDelivered = 4636,
Zo_CompanyName = 4657,
Zo_MeterTypeID = 4669,
Zo_DataQualityID = 4681,
Zo_CustomerName = 4695,
Zo_Model = 4708,
Zo_PartNumber = 4714,
Zo_ProductRevision = 4725,
Zo_SoftwareRevision = 4741,
Zo_UtilityName = 4758,
Zo_POD = 4770,
Zo_AvailablePower = 4774,
Zo_PowerThreshold = 4789,
Zo_RMSVoltage = 4804,
Zo_RMSCurrent = 4815,
Zo_ActivePower = 4826,
Zo_NumberOfResets = 4838,
Zo_PersistentMemoryWrites = 4853,
Zo_LastMessageLQI = 4876,
Zo_LastMessageRSSI = 4891,
Zo_TuyaScheduleWorkdays = 4907,
Zo_TuyaScheduleHolidays = 4928,
Zo_Power2 = 4949,
Zo_Power3 = 4956,
Zo_Power4 = 4963,
Zo_TuyaChildLock = 4970,
Zo_TuyaWindowDetection = 4984,
Zo_TuyaValveDetection = 5004,
Zo_TuyaAutoLock = 5023,
Zo_TuyaTempTarget = 5036,
Zo_TuyaBattery = 5051,
Zo_TuyaMinTemp = 5063,
Zo_TuyaMaxTemp = 5075,
Zo_TuyaBoostTime = 5087,
Zo_TuyaComfortTemp = 5101,
Zo_TuyaEcoTemp = 5117,
Zo_TuyaValvePosition = 5129,
Zo_TuyaAwayTemp = 5147,
Zo_TuyaAwayDays = 5160,
Zo_TuyaPreset = 5173,
Zo_TuyaFanMode = 5184,
Zo_TuyaForceMode = 5196,
Zo_TuyaWeekSelect = 5210,
Zo_TerncyDuration = 5225,
Zo_TerncyRotate = 5240,
Zo_Identify = 5253,
Zo_xxxx = 5262,
Zo_IdentifyQuery = 5267,
Zo_AddGroup = 5281,
Zo_xxxx00 = 5290,
Zo_ViewGroup = 5297,
Zo_GetGroup = 5307,
Zo_01xxxx = 5316,
Zo_GetAllGroups = 5323,
Zo_00 = 5336,
Zo_RemoveGroup = 5339,
Zo_RemoveAllGroups = 5351,
Zo_ViewScene = 5367,
Zo_xxxxyy = 5377,
Zo_RemoveScene = 5384,
Zo_RemoveAllScenes = 5396,
Zo_RecallScene = 5412,
Zo_GetSceneMembership = 5424,
Zo_PowerOffEffect = 5443,
Zo_xxyy = 5458,
Zo_PowerOnRecall = 5463,
Zo_PowerOnTimer = 5477,
Zo_xxyyyyzzzz = 5490,
Zo_xx0A00 = 5501,
Zo_DimmerUp = 5508,
Zo_00190200 = 5517,
Zo_DimmerDown = 5526,
Zo_01190200 = 5537,
Zo_DimmerStop = 5546,
Zo_ResetAlarm = 5557,
Zo_xxyyyy = 5568,
Zo_ResetAllAlarms = 5575,
Zo_xx000A00 = 5590,
Zo_HueSat = 5599,
Zo_xxyy0A00 = 5606,
Zo_Color = 5615,
Zo_xxxxyyyy0A00 = 5621,
Zo_xxxx0A00 = 5634,
Zo_ShutterOpen = 5643,
Zo_ShutterClose = 5655,
Zo_ShutterStop = 5668,
Zo_ShutterLift = 5680,
Zo_xx = 5692,
Zo_ShutterTilt = 5695,
Zo_Shutter = 5707,
Zo_DimmerMove = 5715,
Zo_xx0A = 5726,
Zo_DimmerStepUp = 5731,
Zo_00xx0A00 = 5744,
Zo_DimmerStepDown = 5753,
Zo_01xx0A00 = 5768,
Zo_DimmerStep = 5777,
Zo_xx190A00 = 5788,
Zo_01 = 5797,
Zo_HueMove = 5800,
Zo_xx19 = 5808,
Zo_HueStepUp = 5813,
Zo_HueStepDown = 5823,
Zo_03xx0A00 = 5835,
Zo_HueStep = 5844,
Zo_SatMove = 5852,
Zo_SatStep = 5860,
Zo_xx190A = 5868,
Zo_ColorMove = 5875,
Zo_xxxxyyyy = 5885,
Zo_ColorStep = 5894,
Zo_ColorTempMoveUp = 5904,
Zo_01xxxx000000000000 = 5920,
Zo_ColorTempMoveDown = 5939,
Zo_03xxxx000000000000 = 5957,
Zo_ColorTempMoveStop = 5976,
Zo_00xxxx000000000000 = 5994,
Zo_ColorTempMove = 6013,
Zo_xxyyyy000000000000 = 6027,
Zo_ColorTempStepUp = 6046,
Zo_01xxxx0A0000000000 = 6062,
Zo_ColorTempStepDown = 6081,
Zo_03xxxx0A0000000000 = 6099,
Zo_ColorTempStep = 6118,
Zo_xxyyyy0A0000000000 = 6132,
Zo_ArrowClick = 6151,
Zo_ArrowHold = 6162,
Zo_ArrowRelease = 6172,
Zo_ZoneStatusChange = 6185,
Zo_xxxxyyzz = 6202,
Zo_xxyyzzzz = 6211,
Zo_AddScene = 6220,
Zo_xxyyyyzz = 6229,
Zo_StoreScene = 6238,
Zo_EnergyTotal = 4636,
Zo_CompanyName = 4648,
Zo_MeterTypeID = 4660,
Zo_DataQualityID = 4672,
Zo_CustomerName = 4686,
Zo_Model = 4699,
Zo_PartNumber = 4705,
Zo_ProductRevision = 4716,
Zo_SoftwareRevision = 4732,
Zo_UtilityName = 4749,
Zo_POD = 4761,
Zo_AvailablePower = 4765,
Zo_PowerThreshold = 4780,
Zo_RMSVoltage = 4795,
Zo_RMSCurrent = 4806,
Zo_ActivePower = 4817,
Zo_ReactivePower = 4829,
Zo_ApparentPower = 4843,
Zo_NumberOfResets = 4857,
Zo_PersistentMemoryWrites = 4872,
Zo_LastMessageLQI = 4895,
Zo_LastMessageRSSI = 4910,
Zo_TuyaScheduleWorkdays = 4926,
Zo_TuyaScheduleHolidays = 4947,
Zo_Power2 = 4968,
Zo_Power3 = 4975,
Zo_Power4 = 4982,
Zo_TuyaChildLock = 4989,
Zo_TuyaWindowDetection = 5003,
Zo_TuyaValveDetection = 5023,
Zo_TuyaAutoLock = 5042,
Zo_TuyaTempTarget = 5055,
Zo_TuyaBattery = 5070,
Zo_TuyaMinTemp = 5082,
Zo_TuyaMaxTemp = 5094,
Zo_TuyaBoostTime = 5106,
Zo_TuyaComfortTemp = 5120,
Zo_TuyaEcoTemp = 5136,
Zo_TuyaValvePosition = 5148,
Zo_TuyaAwayTemp = 5166,
Zo_TuyaAwayDays = 5179,
Zo_TuyaPreset = 5192,
Zo_TuyaFanMode = 5203,
Zo_TuyaForceMode = 5215,
Zo_TuyaWeekSelect = 5229,
Zo_TerncyDuration = 5244,
Zo_TerncyRotate = 5259,
Zo_Identify = 5272,
Zo_xxxx = 5281,
Zo_IdentifyQuery = 5286,
Zo_AddGroup = 5300,
Zo_xxxx00 = 5309,
Zo_ViewGroup = 5316,
Zo_GetGroup = 5326,
Zo_01xxxx = 5335,
Zo_GetAllGroups = 5342,
Zo_00 = 5355,
Zo_RemoveGroup = 5358,
Zo_RemoveAllGroups = 5370,
Zo_ViewScene = 5386,
Zo_xxxxyy = 5396,
Zo_RemoveScene = 5403,
Zo_RemoveAllScenes = 5415,
Zo_RecallScene = 5431,
Zo_GetSceneMembership = 5443,
Zo_PowerOffEffect = 5462,
Zo_xxyy = 5477,
Zo_PowerOnRecall = 5482,
Zo_PowerOnTimer = 5496,
Zo_xxyyyyzzzz = 5509,
Zo_xx0A00 = 5520,
Zo_DimmerUp = 5527,
Zo_00190200 = 5536,
Zo_DimmerDown = 5545,
Zo_01190200 = 5556,
Zo_DimmerStop = 5565,
Zo_ResetAlarm = 5576,
Zo_xxyyyy = 5587,
Zo_ResetAllAlarms = 5594,
Zo_xx000A00 = 5609,
Zo_HueSat = 5618,
Zo_xxyy0A00 = 5625,
Zo_Color = 5634,
Zo_xxxxyyyy0A00 = 5640,
Zo_xxxx0A00 = 5653,
Zo_ShutterOpen = 5662,
Zo_ShutterClose = 5674,
Zo_ShutterStop = 5687,
Zo_ShutterLift = 5699,
Zo_xx = 5711,
Zo_ShutterTilt = 5714,
Zo_Shutter = 5726,
Zo_DimmerMove = 5734,
Zo_xx0A = 5745,
Zo_DimmerStepUp = 5750,
Zo_00xx0A00 = 5763,
Zo_DimmerStepDown = 5772,
Zo_01xx0A00 = 5787,
Zo_DimmerStep = 5796,
Zo_xx190A00 = 5807,
Zo_01 = 5816,
Zo_HueMove = 5819,
Zo_xx19 = 5827,
Zo_HueStepUp = 5832,
Zo_HueStepDown = 5842,
Zo_03xx0A00 = 5854,
Zo_HueStep = 5863,
Zo_SatMove = 5871,
Zo_SatStep = 5879,
Zo_xx190A = 5887,
Zo_ColorMove = 5894,
Zo_xxxxyyyy = 5904,
Zo_ColorStep = 5913,
Zo_ColorTempMoveUp = 5923,
Zo_01xxxx000000000000 = 5939,
Zo_ColorTempMoveDown = 5958,
Zo_03xxxx000000000000 = 5976,
Zo_ColorTempMoveStop = 5995,
Zo_00xxxx000000000000 = 6013,
Zo_ColorTempMove = 6032,
Zo_xxyyyy000000000000 = 6046,
Zo_ColorTempStepUp = 6065,
Zo_01xxxx0A0000000000 = 6081,
Zo_ColorTempStepDown = 6100,
Zo_03xxxx0A0000000000 = 6118,
Zo_ColorTempStep = 6137,
Zo_xxyyyy0A0000000000 = 6151,
Zo_ArrowClick = 6170,
Zo_ArrowHold = 6181,
Zo_ArrowRelease = 6191,
Zo_ZoneStatusChange = 6204,
Zo_xxxxyyzz = 6221,
Zo_xxyyzzzz = 6230,
Zo_AddScene = 6239,
Zo_xxyyyyzz = 6248,
Zo_StoreScene = 6257,
};

View File

@ -278,7 +278,7 @@ const Z_AttributeConverter Z_PostProcess[] PROGMEM = {
{ Zsingle, Cx000C, 0x0041, Z_(AnalogInMaxValue), Cm1, 0 },
{ Zsingle, Cx000C, 0x0045, Z_(AnalogInMinValue), Cm1, 0 },
{ Zbool, Cx000C, 0x0051, Z_(AnalogInOutOfService), Cm1, 0 },
{ Zsingle, Cx000C, 0x0055, Z_(AqaraRotate), Cm1, 0 },
{ Zsingle, Cx000C, 0x0055, Z_(AnalogValue), Cm1, 0 },
// { 0xFF, Cx000C, 0x0057, (AnalogInPriorityArray),Cm1, 0 },
{ Zenum8, Cx000C, 0x0067, Z_(AnalogInReliability), Cm1, 0 },
// { 0xFF, Cx000C, 0x0068, (AnalogInRelinquishDefault),Cm1, 0 },
@ -286,6 +286,7 @@ const Z_AttributeConverter Z_PostProcess[] PROGMEM = {
{ Zmap8, Cx000C, 0x006F, Z_(AnalogInStatusFlags), Cm1, 0 },
{ Zenum16, Cx000C, 0x0075, Z_(AnalogInEngineeringUnits),Cm1, 0 },
{ Zuint32, Cx000C, 0x0100, Z_(AnalogInApplicationType),Cm1, 0 },
{ Zuint16, Cx000C, 0xFF55, Z_(AqaraRotate), Cm1, 0 },
{ Zuint16, Cx000C, 0xFF05, Z_(Aqara_FF05), Cm1, 0 },
// Analog Output cluster
@ -572,7 +573,7 @@ const Z_AttributeConverter Z_PostProcess[] PROGMEM = {
{ Zuint8, Cx0500, 0xFFF0 + ZA_GlassBreak, Z_(GlassBreak),Cm1, 0 },
// Metering (Smart Energy) cluster
{ Zuint48, Cx0702, 0x0000, Z_(CurrentSummDelivered), Cm1, 0 },
{ Zuint48, Cx0702, 0x0000, Z_(EnergyTotal), Cm1, 0 },
// Meter Identification cluster
{ Zstring, Cx0B01, 0x0000, Z_(CompanyName), Cm1, 0 },
@ -592,6 +593,8 @@ const Z_AttributeConverter Z_PostProcess[] PROGMEM = {
{ Zuint16, Cx0B04, 0x0505, Z_(RMSVoltage), Cm1 + Z_EXPORT_DATA, Z_MAPPING(Z_Data_Plug, mains_voltage) },
{ Zuint16, Cx0B04, 0x0508, Z_(RMSCurrent), Cm1, 0 },
{ Zint16, Cx0B04, 0x050B, Z_(ActivePower), Cm1 + Z_EXPORT_DATA, Z_MAPPING(Z_Data_Plug, mains_power) },
{ Zint16, Cx0B04, 0x050E, Z_(ReactivePower), Cm1, 0 },
{ Zint16, Cx0B04, 0x050F, Z_(ApparentPower), Cm1, 0 },
// Diagnostics cluster
{ Zuint16, Cx0B05, 0x0000, Z_(NumberOfResets), Cm1, 0 },
@ -769,6 +772,7 @@ public:
void syntheticAqaraSensor2(Z_attribute_list &attr_list, class Z_attribute &attr);
void syntheticAqaraCubeOrButton(Z_attribute_list &attr_list, class Z_attribute &attr);
void syntheticAqaraVibration(Z_attribute_list &attr_list, class Z_attribute &attr);
void syntheticAnalogValue(Z_attribute_list &attr_list, class Z_attribute &attr);
// handle read attributes auto-responder
void autoResponder(const uint16_t *attr_list_ids, size_t attr_len);
@ -1230,6 +1234,9 @@ void ZCLFrame::generateSyntheticAttributes(Z_attribute_list& attr_list) {
case 0x01010508:
syntheticAqaraVibration(attr_list, attr);
break;
case 0x000C0055: // Analog Value
syntheticAnalogValue(attr_list, attr);
break;
}
}
}
@ -1552,6 +1559,21 @@ void ZCLFrame::parseClusterSpecificCommand(Z_attribute_list& attr_list) {
}
}
// ======================================================================
// Convert AnalogValue according to the device type
void ZCLFrame::syntheticAnalogValue(Z_attribute_list &attr_list, class Z_attribute &attr) {
const char * modelId_c = zigbee_devices.getModelId(_srcaddr); // null if unknown
String modelId((char*) modelId_c);
if (modelId.startsWith(F("lumi.sensor_cube"))) {
attr.setKeyId(0x000C, 0xFF55); // change to AqaraRotate
}
if (modelId.startsWith(F("lumi.plug"))) {
attr.setKeyId(0x0702, 0x0000); // change to EnergyTotal
}
}
// ======================================================================
// New version of synthetic attribute generation
void ZCLFrame::syntheticAqaraSensor(Z_attribute_list &attr_list, class Z_attribute &attr) {
@ -1603,6 +1625,14 @@ void ZCLFrame::syntheticAqaraSensor(Z_attribute_list &attr_list, class Z_attribu
} else if (0x66 == attrid) {
attr_list.addAttribute(0x0403, 0x0000).setUInt((ival32 + 50) / 100); // Pressure
}
} else if (modelId.startsWith(F("lumi.plug"))) {
if (0x64 == attrid) {
attr_list.addAttribute(0x0600, 0x0000).setInt(uval32); // Power (on/off)
} else if (0x98 == attrid) {
attr_list.addAttribute(0x0B04, 0x050B).setInt(ival32); // Active Power
} else if (0x95 == attrid) {
attr_list.addAttribute(0x0702, 0x0000).setUInt(uval32); // EnergyDelivered
}
} else {
translated = false; // we didn't find a match
}