Zigbee Thermostat Eurotronic fixes

This commit is contained in:
Stephan Hadinger 2020-09-27 18:42:19 +02:00
parent d0b2b9f70a
commit c77f0a267b
3 changed files with 217 additions and 200 deletions

View File

@ -72,10 +72,13 @@ public:
int16_t temperature; // temperature in 1/10th of Celsius, 0x8000 if unknown
uint16_t pressure; // air pressure in hPa, 0xFFFF if unknown
uint8_t humidity; // humidity in percent, 0..100, 0xFF if unknown
// powe plug data
// power plug data
uint16_t mains_voltage; // AC voltage
int16_t mains_power; // Active power
uint32_t last_seen; // Last seen time (epoch)
// thermostat
int16_t temperature_target; // settings for the temparature
uint8_t th_setpoint; // percentage of heat/cool in percent
// Constructor with all defaults
Z_Device(uint16_t _shortaddr = BAD_SHORTADDR, uint64_t _longaddr = 0x00):
@ -105,7 +108,9 @@ public:
humidity(0xFF),
mains_voltage(0xFFFF),
mains_power(-0x8000),
last_seen(0)
last_seen(0),
temperature_target(-0x8000),
th_setpoint(0xFF)
{ };
inline bool valid(void) const { return BAD_SHORTADDR != shortaddr; } // is the device known, valid and found?
@ -132,6 +137,9 @@ public:
inline bool validHumidity(void) const { return 0xFF != humidity; }
inline bool validLastSeen(void) const { return 0x0 != last_seen; }
inline bool validTemperatureTarget(void) const { return -0x8000 != temperature_target; }
inline bool validThSetpoint(void) const { return 0xFF != th_setpoint; }
inline bool validMainsVoltage(void) const { return 0xFFFF != mains_voltage; }
inline bool validMainsPower(void) const { return -0x8000 != mains_power; }

View File

@ -268,15 +268,12 @@ const char Z_strings[] PROGMEM =
"OccupiedHeatingSetpoint" "\x00"
"UnoccupiedCoolingSetpoint" "\x00"
"UnoccupiedHeatingSetpoint" "\x00"
"MinHeatSetpointLimit" "\x00"
"MaxHeatSetpointLimit" "\x00"
"MinCoolSetpointLimit" "\x00"
"MaxCoolSetpointLimit" "\x00"
"RemoteSensing" "\x00"
"ControlSequenceOfOperation" "\x00"
"SystemMode" "\x00"
"TRVMode" "\x00"
"SetValvePosition" "\x00"
"ThErrors" "\x00"
"EurotronicErrors" "\x00"
"CurrentTemperatureSetPoint" "\x00"
"Hue" "\x00"
"Sat" "\x00"
@ -648,189 +645,186 @@ enum Z_offsets {
Zo_OccupiedHeatingSetpoint = 3337,
Zo_UnoccupiedCoolingSetpoint = 3361,
Zo_UnoccupiedHeatingSetpoint = 3387,
Zo_MinHeatSetpointLimit = 3413,
Zo_MaxHeatSetpointLimit = 3434,
Zo_MinCoolSetpointLimit = 3455,
Zo_MaxCoolSetpointLimit = 3476,
Zo_ControlSequenceOfOperation = 3497,
Zo_SystemMode = 3524,
Zo_TRVMode = 3535,
Zo_SetValvePosition = 3543,
Zo_ThErrors = 3560,
Zo_CurrentTemperatureSetPoint = 3569,
Zo_Hue = 3596,
Zo_Sat = 3600,
Zo_RemainingTime = 3604,
Zo_X = 3618,
Zo_Y = 3620,
Zo_DriftCompensation = 3622,
Zo_CompensationText = 3640,
Zo_CT = 3657,
Zo_ColorMode = 3660,
Zo_NumberOfPrimaries = 3670,
Zo_Primary1X = 3688,
Zo_Primary1Y = 3698,
Zo_Primary1Intensity = 3708,
Zo_Primary2X = 3726,
Zo_Primary2Y = 3736,
Zo_Primary2Intensity = 3746,
Zo_Primary3X = 3764,
Zo_Primary3Y = 3774,
Zo_Primary3Intensity = 3784,
Zo_WhitePointX = 3802,
Zo_WhitePointY = 3814,
Zo_ColorPointRX = 3826,
Zo_ColorPointRY = 3839,
Zo_ColorPointRIntensity = 3852,
Zo_ColorPointGX = 3873,
Zo_ColorPointGY = 3886,
Zo_ColorPointGIntensity = 3899,
Zo_ColorPointBX = 3920,
Zo_ColorPointBY = 3933,
Zo_ColorPointBIntensity = 3946,
Zo_Illuminance = 3967,
Zo_IlluminanceMinMeasuredValue = 3979,
Zo_IlluminanceMaxMeasuredValue = 4007,
Zo_IlluminanceTolerance = 4035,
Zo_IlluminanceLightSensorType = 4056,
Zo_IlluminanceLevelStatus = 4083,
Zo_IlluminanceTargetLevel = 4106,
Zo_Temperature = 4129,
Zo_TemperatureMinMeasuredValue = 4141,
Zo_TemperatureMaxMeasuredValue = 4169,
Zo_TemperatureTolerance = 4197,
Zo_Pressure = 4218,
Zo_PressureMinMeasuredValue = 4227,
Zo_PressureMaxMeasuredValue = 4252,
Zo_PressureTolerance = 4277,
Zo_PressureScaledValue = 4295,
Zo_PressureMinScaledValue = 4315,
Zo_PressureMaxScaledValue = 4338,
Zo_PressureScaledTolerance = 4361,
Zo_PressureScale = 4385,
Zo_SeaPressure = 4399,
Zo_FlowRate = 4411,
Zo_FlowMinMeasuredValue = 4420,
Zo_FlowMaxMeasuredValue = 4441,
Zo_FlowTolerance = 4462,
Zo_Humidity = 4476,
Zo_HumidityMinMeasuredValue = 4485,
Zo_HumidityMaxMeasuredValue = 4510,
Zo_HumidityTolerance = 4535,
Zo_Occupancy = 4553,
Zo_OccupancySensorType = 4563,
Zo_ZoneState = 4583,
Zo_ZoneType = 4593,
Zo_ZoneStatus = 4602,
Zo_CurrentSummDelivered = 4613,
Zo_CompanyName = 4634,
Zo_MeterTypeID = 4646,
Zo_DataQualityID = 4658,
Zo_CustomerName = 4672,
Zo_Model = 4685,
Zo_PartNumber = 4691,
Zo_ProductRevision = 4702,
Zo_SoftwareRevision = 4718,
Zo_UtilityName = 4735,
Zo_POD = 4747,
Zo_AvailablePower = 4751,
Zo_PowerThreshold = 4766,
Zo_RMSVoltage = 4781,
Zo_RMSCurrent = 4792,
Zo_ActivePower = 4803,
Zo_NumberOfResets = 4815,
Zo_PersistentMemoryWrites = 4830,
Zo_LastMessageLQI = 4853,
Zo_LastMessageRSSI = 4868,
Zo_Identify = 4884,
Zo_xxxx = 4893,
Zo_IdentifyQuery = 4898,
Zo_AddGroup = 4912,
Zo_xxxx00 = 4921,
Zo_ViewGroup = 4928,
Zo_GetGroup = 4938,
Zo_01xxxx = 4947,
Zo_GetAllGroups = 4954,
Zo_00 = 4967,
Zo_RemoveGroup = 4970,
Zo_RemoveAllGroups = 4982,
Zo_ViewScene = 4998,
Zo_xxxxyy = 5008,
Zo_RemoveScene = 5015,
Zo_RemoveAllScenes = 5027,
Zo_RecallScene = 5043,
Zo_GetSceneMembership = 5055,
Zo_PowerOffEffect = 5074,
Zo_xxyy = 5089,
Zo_PowerOnRecall = 5094,
Zo_PowerOnTimer = 5108,
Zo_xxyyyyzzzz = 5121,
Zo_xx0A00 = 5132,
Zo_DimmerUp = 5139,
Zo_00190200 = 5148,
Zo_DimmerDown = 5157,
Zo_01190200 = 5168,
Zo_DimmerStop = 5177,
Zo_ResetAlarm = 5188,
Zo_xxyyyy = 5199,
Zo_ResetAllAlarms = 5206,
Zo_xx000A00 = 5221,
Zo_HueSat = 5230,
Zo_xxyy0A00 = 5237,
Zo_Color = 5246,
Zo_xxxxyyyy0A00 = 5252,
Zo_xxxx0A00 = 5265,
Zo_ShutterOpen = 5274,
Zo_ShutterClose = 5286,
Zo_ShutterStop = 5299,
Zo_ShutterLift = 5311,
Zo_xx = 5323,
Zo_ShutterTilt = 5326,
Zo_Shutter = 5338,
Zo_DimmerMove = 5346,
Zo_xx0A = 5357,
Zo_DimmerStepUp = 5362,
Zo_00xx0A00 = 5375,
Zo_DimmerStepDown = 5384,
Zo_01xx0A00 = 5399,
Zo_DimmerStep = 5408,
Zo_xx190A00 = 5419,
Zo_01 = 5428,
Zo_HueMove = 5431,
Zo_xx19 = 5439,
Zo_HueStepUp = 5444,
Zo_HueStepDown = 5454,
Zo_03xx0A00 = 5466,
Zo_HueStep = 5475,
Zo_SatMove = 5483,
Zo_SatStep = 5491,
Zo_xx190A = 5499,
Zo_ColorMove = 5506,
Zo_xxxxyyyy = 5516,
Zo_ColorStep = 5525,
Zo_ColorTempMoveUp = 5535,
Zo_01xxxx000000000000 = 5551,
Zo_ColorTempMoveDown = 5570,
Zo_03xxxx000000000000 = 5588,
Zo_ColorTempMoveStop = 5607,
Zo_00xxxx000000000000 = 5625,
Zo_ColorTempMove = 5644,
Zo_xxyyyy000000000000 = 5658,
Zo_ColorTempStepUp = 5677,
Zo_01xxxx0A0000000000 = 5693,
Zo_ColorTempStepDown = 5712,
Zo_03xxxx0A0000000000 = 5730,
Zo_ColorTempStep = 5749,
Zo_xxyyyy0A0000000000 = 5763,
Zo_ArrowClick = 5782,
Zo_ArrowHold = 5793,
Zo_ArrowRelease = 5803,
Zo_ZoneStatusChange = 5816,
Zo_xxxxyyzz = 5833,
Zo_xxyyzzzz = 5842,
Zo_AddScene = 5851,
Zo_xxyyyyzz = 5860,
Zo_StoreScene = 5869,
Zo_RemoteSensing = 3413,
Zo_ControlSequenceOfOperation = 3427,
Zo_SystemMode = 3454,
Zo_TRVMode = 3465,
Zo_SetValvePosition = 3473,
Zo_EurotronicErrors = 3490,
Zo_CurrentTemperatureSetPoint = 3507,
Zo_Hue = 3534,
Zo_Sat = 3538,
Zo_RemainingTime = 3542,
Zo_X = 3556,
Zo_Y = 3558,
Zo_DriftCompensation = 3560,
Zo_CompensationText = 3578,
Zo_CT = 3595,
Zo_ColorMode = 3598,
Zo_NumberOfPrimaries = 3608,
Zo_Primary1X = 3626,
Zo_Primary1Y = 3636,
Zo_Primary1Intensity = 3646,
Zo_Primary2X = 3664,
Zo_Primary2Y = 3674,
Zo_Primary2Intensity = 3684,
Zo_Primary3X = 3702,
Zo_Primary3Y = 3712,
Zo_Primary3Intensity = 3722,
Zo_WhitePointX = 3740,
Zo_WhitePointY = 3752,
Zo_ColorPointRX = 3764,
Zo_ColorPointRY = 3777,
Zo_ColorPointRIntensity = 3790,
Zo_ColorPointGX = 3811,
Zo_ColorPointGY = 3824,
Zo_ColorPointGIntensity = 3837,
Zo_ColorPointBX = 3858,
Zo_ColorPointBY = 3871,
Zo_ColorPointBIntensity = 3884,
Zo_Illuminance = 3905,
Zo_IlluminanceMinMeasuredValue = 3917,
Zo_IlluminanceMaxMeasuredValue = 3945,
Zo_IlluminanceTolerance = 3973,
Zo_IlluminanceLightSensorType = 3994,
Zo_IlluminanceLevelStatus = 4021,
Zo_IlluminanceTargetLevel = 4044,
Zo_Temperature = 4067,
Zo_TemperatureMinMeasuredValue = 4079,
Zo_TemperatureMaxMeasuredValue = 4107,
Zo_TemperatureTolerance = 4135,
Zo_Pressure = 4156,
Zo_PressureMinMeasuredValue = 4165,
Zo_PressureMaxMeasuredValue = 4190,
Zo_PressureTolerance = 4215,
Zo_PressureScaledValue = 4233,
Zo_PressureMinScaledValue = 4253,
Zo_PressureMaxScaledValue = 4276,
Zo_PressureScaledTolerance = 4299,
Zo_PressureScale = 4323,
Zo_SeaPressure = 4337,
Zo_FlowRate = 4349,
Zo_FlowMinMeasuredValue = 4358,
Zo_FlowMaxMeasuredValue = 4379,
Zo_FlowTolerance = 4400,
Zo_Humidity = 4414,
Zo_HumidityMinMeasuredValue = 4423,
Zo_HumidityMaxMeasuredValue = 4448,
Zo_HumidityTolerance = 4473,
Zo_Occupancy = 4491,
Zo_OccupancySensorType = 4501,
Zo_ZoneState = 4521,
Zo_ZoneType = 4531,
Zo_ZoneStatus = 4540,
Zo_CurrentSummDelivered = 4551,
Zo_CompanyName = 4572,
Zo_MeterTypeID = 4584,
Zo_DataQualityID = 4596,
Zo_CustomerName = 4610,
Zo_Model = 4623,
Zo_PartNumber = 4629,
Zo_ProductRevision = 4640,
Zo_SoftwareRevision = 4656,
Zo_UtilityName = 4673,
Zo_POD = 4685,
Zo_AvailablePower = 4689,
Zo_PowerThreshold = 4704,
Zo_RMSVoltage = 4719,
Zo_RMSCurrent = 4730,
Zo_ActivePower = 4741,
Zo_NumberOfResets = 4753,
Zo_PersistentMemoryWrites = 4768,
Zo_LastMessageLQI = 4791,
Zo_LastMessageRSSI = 4806,
Zo_Identify = 4822,
Zo_xxxx = 4831,
Zo_IdentifyQuery = 4836,
Zo_AddGroup = 4850,
Zo_xxxx00 = 4859,
Zo_ViewGroup = 4866,
Zo_GetGroup = 4876,
Zo_01xxxx = 4885,
Zo_GetAllGroups = 4892,
Zo_00 = 4905,
Zo_RemoveGroup = 4908,
Zo_RemoveAllGroups = 4920,
Zo_ViewScene = 4936,
Zo_xxxxyy = 4946,
Zo_RemoveScene = 4953,
Zo_RemoveAllScenes = 4965,
Zo_RecallScene = 4981,
Zo_GetSceneMembership = 4993,
Zo_PowerOffEffect = 5012,
Zo_xxyy = 5027,
Zo_PowerOnRecall = 5032,
Zo_PowerOnTimer = 5046,
Zo_xxyyyyzzzz = 5059,
Zo_xx0A00 = 5070,
Zo_DimmerUp = 5077,
Zo_00190200 = 5086,
Zo_DimmerDown = 5095,
Zo_01190200 = 5106,
Zo_DimmerStop = 5115,
Zo_ResetAlarm = 5126,
Zo_xxyyyy = 5137,
Zo_ResetAllAlarms = 5144,
Zo_xx000A00 = 5159,
Zo_HueSat = 5168,
Zo_xxyy0A00 = 5175,
Zo_Color = 5184,
Zo_xxxxyyyy0A00 = 5190,
Zo_xxxx0A00 = 5203,
Zo_ShutterOpen = 5212,
Zo_ShutterClose = 5224,
Zo_ShutterStop = 5237,
Zo_ShutterLift = 5249,
Zo_xx = 5261,
Zo_ShutterTilt = 5264,
Zo_Shutter = 5276,
Zo_DimmerMove = 5284,
Zo_xx0A = 5295,
Zo_DimmerStepUp = 5300,
Zo_00xx0A00 = 5313,
Zo_DimmerStepDown = 5322,
Zo_01xx0A00 = 5337,
Zo_DimmerStep = 5346,
Zo_xx190A00 = 5357,
Zo_01 = 5366,
Zo_HueMove = 5369,
Zo_xx19 = 5377,
Zo_HueStepUp = 5382,
Zo_HueStepDown = 5392,
Zo_03xx0A00 = 5404,
Zo_HueStep = 5413,
Zo_SatMove = 5421,
Zo_SatStep = 5429,
Zo_xx190A = 5437,
Zo_ColorMove = 5444,
Zo_xxxxyyyy = 5454,
Zo_ColorStep = 5463,
Zo_ColorTempMoveUp = 5473,
Zo_01xxxx000000000000 = 5489,
Zo_ColorTempMoveDown = 5508,
Zo_03xxxx000000000000 = 5526,
Zo_ColorTempMoveStop = 5545,
Zo_00xxxx000000000000 = 5563,
Zo_ColorTempMove = 5582,
Zo_xxyyyy000000000000 = 5596,
Zo_ColorTempStepUp = 5615,
Zo_01xxxx0A0000000000 = 5631,
Zo_ColorTempStepDown = 5650,
Zo_03xxxx0A0000000000 = 5668,
Zo_ColorTempStep = 5687,
Zo_xxyyyy0A0000000000 = 5701,
Zo_ArrowClick = 5720,
Zo_ArrowHold = 5731,
Zo_ArrowRelease = 5741,
Zo_ZoneStatusChange = 5754,
Zo_xxxxyyzz = 5771,
Zo_xxyyzzzz = 5780,
Zo_AddScene = 5789,
Zo_xxyyyyzz = 5798,
Zo_StoreScene = 5807,
};

View File

@ -413,17 +413,13 @@ const Z_AttributeConverter Z_PostProcess[] PROGMEM = {
{ Zint16, Cx0201, 0x0012, Z_(OccupiedHeatingSetpoint), -100 },
{ Zint16, Cx0201, 0x0013, Z_(UnoccupiedCoolingSetpoint), -100 },
{ Zint16, Cx0201, 0x0014, Z_(UnoccupiedHeatingSetpoint), -100 },
{ Zint16, Cx0201, 0x0015, Z_(MinHeatSetpointLimit), -100 },
{ Zint16, Cx0201, 0x0016, Z_(MaxHeatSetpointLimit), -100 },
{ Zint16, Cx0201, 0x0017, Z_(MinCoolSetpointLimit), -100 },
{ Zint16, Cx0201, 0x0018, Z_(MaxCoolSetpointLimit), -100 },
{ Zmap8, Cx0201, 0x001A, Z_(MaxCoolSetpointLimit), 1 },
{ Zmap8, Cx0201, 0x001A, Z_(RemoteSensing), 1 },
{ Zenum8, Cx0201, 0x001B, Z_(ControlSequenceOfOperation), 1 },
{ Zenum8, Cx0201, 0x001C, Z_(SystemMode), 1 },
// below is Eurotronic specific
{ Zenum8, Cx0201, 0x4000, Z_(TRVMode), 1 },
{ Zuint8, Cx0201, 0x4001, Z_(SetValvePosition), 1 },
{ Zuint8, Cx0201, 0x4002, Z_(ThErrors), 1 },
{ Zuint8, Cx0201, 0x4002, Z_(EurotronicErrors), 1 },
{ Zint16, Cx0201, 0x4003, Z_(CurrentTemperatureSetPoint), -100 },
// Color Control cluster
@ -1142,11 +1138,26 @@ void ZCLFrame::computeSyntheticAttributes(Z_attribute_list& attr_list) {
attr_list.addAttribute(0x0001, 0x0021).setUInt(toPercentageCR2032(mv) * 2);
}
break;
case 0x02010008: // Pi Heating Demand - solve Eutotronic bug
{
const char * manufacturer_c = zigbee_devices.getManufacturerId(_srcaddr); // null if unknown
String manufacturerId((char*) manufacturer_c);
if (manufacturerId.equals(F("Eurotronic"))) {
// Eurotronic does not report 0..100 but 0..255, including 255 which is normally an ivalid value
uint8_t valve = attr.getUInt();
if (attr.isNone()) { valve = 255; }
uint8_t valve_100 = changeUIntScale(valve, 0, 255, 0, 100);
attr.setUInt(valve_100);
}
}
break;
case 0x04030000: // Pressure
int16_t pressure = attr.getInt();
int16_t pressure_sealevel = (pressure / FastPrecisePow(1.0 - ((float)Settings.altitude / 44330.0f), 5.255f)) - 21.6f;
attr_list.addAttribute(0x0403, 0xFF00).setInt(pressure_sealevel);
// We create a synthetic attribute 0403/FF00 to indicate sea level
{
int16_t pressure = attr.getInt();
int16_t pressure_sealevel = (pressure / FastPrecisePow(1.0 - ((float)Settings.altitude / 44330.0f), 5.255f)) - 21.6f;
attr_list.addAttribute(0x0403, 0xFF00).setInt(pressure_sealevel);
// We create a synthetic attribute 0403/FF00 to indicate sea level
}
break;
}
}
@ -1692,6 +1703,10 @@ void ZCLFrame::postProcessAttributes(uint16_t shortaddr, Z_attribute_list& attr_
case 0x00068000: device.setPower(attr.getBool()); break;
case 0x00080000: device.dimmer = uval16; break;
case 0x02010000: device.temperature = fval * 10 + 0.5f; break;
case 0x02010008: device.th_setpoint = uval16; break;
case 0x02010012: device.temperature_target = fval * 10 + 0.5f; break;
case 0x02010007: device.th_setpoint = uval16; break;
case 0x02010011: device.temperature_target = fval * 10 + 0.5f; break;
case 0x03000000: device.hue = changeUIntScale(uval16, 0, 254, 0, 360); break;
case 0x03000001: device.sat = uval16; break;
case 0x03000003: device.x = uval16; break;