zigbee-herdsman-converters icon indicating copy to clipboard operation
zigbee-herdsman-converters copied to clipboard

fix: Bosch BTH-RM: Expose all `system_mode` for compatibility

Open burmistrzak opened this issue 5 months ago β€’ 12 comments

The recent re-implementation #10309 of Bosch thermostats has introduced compatibility issues with ecosystems that do not use or cannot make use of HA discovery payloads (e.g. homebridge-z2m), and thus entirely depend on well-known/standard attributes (e.g. system_mode) to work properly.

This PR aims to rectify this by (once again) exposing all available system_mode states to non-HA users.

The following changes from #10309 will be reverted:

  • Changed: Only expose settings for current system mode on BTH-RM / BTH-RM230Z.

A future PR (no ETA) is going to add a new Z2M-wide device option for all thermostats to filter out system modes. This approach will be compatible across ecosystems.

burmistrzak avatar Nov 09 '25 23:11 burmistrzak

@DerDreschner I've manually reverted back to a state that keeps the rest of your great improvements, while providing us a good starting point to re-implement the HA-only enhancements.

As I wrote before, the basic idea would be to essentially keep the HA-specific stuff, but implement it in such a way that standard attributes/keys (consumed by other ecosystems) remain unaffected.

I would suggest a device mode switch (somewhat similar to custom_system_mode before) that allows users to switch between heating and cooling operation. This switch would set the corresponding system_mode and update the HA discovery payload accordingly. We might be able to borrow some logic from the BMCT to do that.

What do you think?

burmistrzak avatar Nov 09 '25 23:11 burmistrzak

@Koenkk I'd like to hear your thoughts on this... πŸ˜‡

The current implementation #10309 unfortunately breaks compatibility with non-HA systems (e.g. homebridge-z2m) because it alters (among other things) the system_mode attribute. So this has to be reverted. We cannot shut the door for users in other ecosystems, just to make things look a bit more pretty in HA.

Bosch thermostats are somewhat special because they support distinct HEAT and COOL modes but cannot switch between them automatically (a.k.a. HEAT_COOL in HA) to keep temperatures within range.

Now, how should we proceed? We have a few options:

  1. Manually revert and restore the previous behavior. This would mean non-HA users will have working thermostats and HA users will once again have to "tolerate" a HEAT and COOL mode. IMHO, not a big deal because both modes work just fine. Most people will likely never switch to cooling mode, but it's available for the few heat-pump owners that actually use it.
  2. Add a device mode option (similar to BMCT-SLZ) that forces users to choose between HEAT, COOL or both during initial setup, right after pairing. This would require quite some work to implement for essentially only cosmetic changes to a single device. On the upside, at least every ecosystem could theoretically benefit from this.
  3. Add a new device-specific option so users can select which system_mode of a given thermostat should be exposed. Such an option would be available to all thermostats in Z2M that support multiple system modes. When implemented by overriding the HA discovery payload, only HA will know what to do. However, if implemented by filtering the device's MQTT state payload itself, other ecosystems would likely work as well.
  4. Do everything in No. 1 but also provide a HA template to disable unwanted thermostat system modes.

I personally favor No. 4 because of the time I currently have on hand and the need for this issue to be resolved quickly. However, I would support anyone who is willing to properly implement No. 3 afterwards as well.

burmistrzak avatar Nov 11 '25 00:11 burmistrzak

Do I understand correctly, that this will only affect the way system_mode is exposed and the Bosch-specific operating_mode on the devices (e.g. on the BTH-RA (schedule | manual | pause) will remain as it is?

dierochade avatar Nov 11 '25 18:11 dierochade

@dierochade Correct. πŸ‘Œ That device specifically was the reason we've implemented the option to override the HA discovery payload in the first place.

The problematic changes this PR seeks to remedy only affect wall thermostats.

burmistrzak avatar Nov 11 '25 19:11 burmistrzak

@Nerivec Quick question: Has there been a recent change (herdsman or otherwise) that now hides custom clusters added via deviceAddCustomCluster in the frontend? For example: operating_mode & Co. can no longer be manually configured for reporting via UI..?

burmistrzak avatar Nov 12 '25 15:11 burmistrzak

@burmistrzak I'm not aware of any. Check what you have in frontend Settings>Tools>Download state (JSON of whole state sent by Z2M). See what you have under bridgeDefinitions>0>custom_clusters and also check the device definition (under devices>0), make sure the cluster in question is present.

Nerivec avatar Nov 12 '25 16:11 Nerivec

I'm not aware of any. Check what you have in frontend Settings>Tools>Download state (JSON of whole state sent by Z2M). See what you have under bridgeDefinitions>0>custom_clusters and also check the device definition (under devices>0), make sure the cluster in question is present.

@Nerivec Hmm, custom hvacThermostat cluster extensions (e.g. operating_mode) are indeed in state.json, but somehow not visible in the attribute dropdown when I try to manually configure reporting.

image

Not sure what's going on here..?

Excerpt from state.json

[...]
                    "hvacThermostat": {
                        "ID": 513,
                        "attributes": {
                            "SinopeAuxCycleOutput": {
                                "ID": 1028,
                                "manufacturerCode": 4508,
                                "type": 33
                            },
                            "SinopeBacklight": {
                                "ID": 1026,
                                "manufacturerCode": 4508,
                                "type": 48
                            },
                            "SinopeMainCycleOutput": {
                                "ID": 1025,
                                "manufacturerCode": 4508,
                                "type": 33
                            },
                            "SinopeOccupancy": {
                                "ID": 1024,
                                "manufacturerCode": 4508,
                                "type": 48
                            },
                            "StelproOutdoorTemp": {
                                "ID": 16385,
                                "type": 41
                            },
                            "StelproSystemMode": {
                                "ID": 16412,
                                "type": 48
                            },
                            "absMaxCoolSetpointLimit": {
                                "ID": 6,
                                "type": 41
                            },
                            "absMaxHeatSetpointLimit": {
                                "ID": 4,
                                "type": 41
                            },
                            "absMinCoolSetpointLimit": {
                                "ID": 5,
                                "type": 41
                            },
                            "absMinHeatSetpointLimit": {
                                "ID": 3,
                                "type": 41
                            },
                            "acCapacity": {
                                "ID": 65,
                                "type": 33
                            },
                            "acCapacityFormat": {
                                "ID": 71,
                                "type": 48
                            },
                            "acCollTemp": {
                                "ID": 70,
                                "type": 41
                            },
                            "acConpressorType": {
                                "ID": 67,
                                "type": 48
                            },
                            "acErrorCode": {
                                "ID": 68,
                                "type": 27
                            },
                            "acLouverPosition": {
                                "ID": 69,
                                "type": 48
                            },
                            "acRefrigerantType": {
                                "ID": 66,
                                "type": 48
                            },
                            "acType": {
                                "ID": 64,
                                "type": 48
                            },
                            "alarmMask": {
                                "ID": 29,
                                "type": 24
                            },
                            "automaticValveAdapt": {
                                "ID": 20496,
                                "manufacturerCode": 4617,
                                "type": 48
                            },
                            "boostHeating": {
                                "ID": 16451,
                                "manufacturerCode": 4617,
                                "type": 48
                            },
                            "cableSensorMode": {
                                "ID": 16482,
                                "manufacturerCode": 4617,
                                "type": 48
                            },
                            "cableSensorTemperature": {
                                "ID": 16466,
                                "manufacturerCode": 4617,
                                "type": 41
                            },
                            "ctrlSeqeOfOper": {
                                "ID": 27,
                                "type": 48
                            },
                            "danfossAdaptionRunControl": {
                                "ID": 16460,
                                "manufacturerCode": 4678,
                                "type": 48
                            },
                            "danfossAdaptionRunSettings": {
                                "ID": 16462,
                                "manufacturerCode": 4678,
                                "type": 24
                            },
                            "danfossAdaptionRunStatus": {
                                "ID": 16461,
                                "manufacturerCode": 4678,
                                "type": 24
                            },
                            "danfossAlgorithmScaleFactor": {
                                "ID": 16416,
                                "manufacturerCode": 4678,
                                "type": 32
                            },
                            "danfossDayOfWeek": {
                                "ID": 16400,
                                "manufacturerCode": 4678,
                                "type": 48
                            },
                            "danfossExternalMeasuredRoomSensor": {
                                "ID": 16405,
                                "manufacturerCode": 4678,
                                "type": 41
                            },
                            "danfossFloorMaxSetpoint": {
                                "ID": 16674,
                                "manufacturerCode": 4678,
                                "type": 41
                            },
                            "danfossFloorMinSetpoint": {
                                "ID": 16673,
                                "manufacturerCode": 4678,
                                "type": 41
                            },
                            "danfossHeatAvailable": {
                                "ID": 16432,
                                "manufacturerCode": 4678,
                                "type": 16
                            },
                            "danfossHeatRequired": {
                                "ID": 16433,
                                "manufacturerCode": 4678,
                                "type": 16
                            },
                            "danfossIcon2PreHeat": {
                                "ID": 16689,
                                "manufacturerCode": 4678,
                                "type": 48
                            },
                            "danfossIcon2PreHeatStatus": {
                                "ID": 16719,
                                "manufacturerCode": 4678,
                                "type": 48
                            },
                            "danfossLoadBalancingEnable": {
                                "ID": 16434,
                                "manufacturerCode": 4678,
                                "type": 16
                            },
                            "danfossLoadEstimate": {
                                "ID": 16458,
                                "manufacturerCode": 4678,
                                "type": 41
                            },
                            "danfossLoadRoomMean": {
                                "ID": 16448,
                                "manufacturerCode": 4678,
                                "type": 41
                            },
                            "danfossMountedModeActive": {
                                "ID": 16402,
                                "manufacturerCode": 4678,
                                "type": 16
                            },
                            "danfossMountedModeControl": {
                                "ID": 16403,
                                "manufacturerCode": 4678,
                                "type": 16
                            },
                            "danfossOutputStatus": {
                                "ID": 16656,
                                "manufacturerCode": 4678,
                                "type": 48
                            },
                            "danfossPreheatStatus": {
                                "ID": 16463,
                                "manufacturerCode": 4678,
                                "type": 16
                            },
                            "danfossPreheatTime": {
                                "ID": 16464,
                                "manufacturerCode": 4678,
                                "type": 35
                            },
                            "danfossRadiatorCovered": {
                                "ID": 16406,
                                "manufacturerCode": 4678,
                                "type": 16
                            },
                            "danfossRegulationSetpointOffset": {
                                "ID": 16459,
                                "manufacturerCode": 4678,
                                "type": 40
                            },
                            "danfossRoomFloorSensorMode": {
                                "ID": 16672,
                                "manufacturerCode": 4678,
                                "type": 48
                            },
                            "danfossRoomStatusCode": {
                                "ID": 16640,
                                "manufacturerCode": 4678,
                                "type": 25
                            },
                            "danfossScheduleTypeUsed": {
                                "ID": 16688,
                                "manufacturerCode": 4678,
                                "type": 48
                            },
                            "danfossThermostatOrientation": {
                                "ID": 16404,
                                "manufacturerCode": 4678,
                                "type": 16
                            },
                            "danfossTriggerTime": {
                                "ID": 16401,
                                "manufacturerCode": 4678,
                                "type": 33
                            },
                            "danfossWindowOpenExternal": {
                                "ID": 16387,
                                "manufacturerCode": 4678,
                                "type": 16
                            },
                            "danfossWindowOpenFeatureEnable": {
                                "ID": 16465,
                                "manufacturerCode": 4678,
                                "type": 16
                            },
                            "danfossWindowOpenInternal": {
                                "ID": 16384,
                                "manufacturerCode": 4678,
                                "type": 48
                            },
                            "elkoCalibration": {
                                "ID": 1047,
                                "type": 40
                            },
                            "elkoChildLock": {
                                "ID": 1043,
                                "type": 16
                            },
                            "elkoDateTime": {
                                "ID": 1031,
                                "type": 65
                            },
                            "elkoDisplayText": {
                                "ID": 1026,
                                "type": 66
                            },
                            "elkoExternalTemp": {
                                "ID": 1033,
                                "type": 41
                            },
                            "elkoFrostGuard": {
                                "ID": 1042,
                                "type": 16
                            },
                            "elkoLastMessageId": {
                                "ID": 1048,
                                "type": 32
                            },
                            "elkoLastMessageStatus": {
                                "ID": 1049,
                                "type": 32
                            },
                            "elkoLoad": {
                                "ID": 1025,
                                "type": 33
                            },
                            "elkoMaxFloorTemp": {
                                "ID": 1044,
                                "type": 32
                            },
                            "elkoMeanPower": {
                                "ID": 1032,
                                "type": 33
                            },
                            "elkoNightSwitching": {
                                "ID": 1041,
                                "type": 16
                            },
                            "elkoPowerStatus": {
                                "ID": 1030,
                                "type": 16
                            },
                            "elkoRegulatorMode": {
                                "ID": 1029,
                                "type": 16
                            },
                            "elkoRegulatorTime": {
                                "ID": 1028,
                                "type": 32
                            },
                            "elkoRelayState": {
                                "ID": 1045,
                                "type": 16
                            },
                            "elkoSensor": {
                                "ID": 1027,
                                "type": 48
                            },
                            "elkoVersion": {
                                "ID": 1046,
                                "type": 65
                            },
                            "errorState": {
                                "ID": 20480,
                                "manufacturerCode": 4617,
                                "type": 24
                            },
                            "fourNoksHysteresisHigh": {
                                "ID": 257,
                                "manufacturerCode": 4209,
                                "type": 33
                            },
                            "fourNoksHysteresisLow": {
                                "ID": 258,
                                "manufacturerCode": 4209,
                                "type": 33
                            },
                            "heaterType": {
                                "ID": 16483,
                                "manufacturerCode": 4617,
                                "type": 48
                            },
                            "heatingDemand": {
                                "ID": 16416,
                                "manufacturerCode": 4617,
                                "type": 48
                            },
                            "localTemp": {
                                "ID": 0,
                                "type": 41
                            },
                            "localTemperatureCalibration": {
                                "ID": 16,
                                "type": 40
                            },
                            "maxCoolSetpointLimit": {
                                "ID": 24,
                                "type": 41
                            },
                            "maxHeatSetpointLimit": {
                                "ID": 22,
                                "type": 41
                            },
                            "minCoolSetpointLimit": {
                                "ID": 23,
                                "type": 41
                            },
                            "minHeatSetpointLimit": {
                                "ID": 21,
                                "type": 41
                            },
                            "minSetpointDeadBand": {
                                "ID": 25,
                                "type": 40
                            },
                            "numberOfDailyTrans": {
                                "ID": 34,
                                "type": 32
                            },
                            "numberOfWeeklyTrans": {
                                "ID": 33,
                                "type": 32
                            },
                            "occupancy": {
                                "ID": 2,
                                "type": 24
                            },
                            "occupiedCoolingSetpoint": {
                                "ID": 17,
                                "type": 41
                            },
                            "occupiedHeatingSetpoint": {
                                "ID": 18,
                                "type": 41
                            },
                            "operatingMode": {
                                "ID": 16391,
                                "manufacturerCode": 4617,
                                "type": 48
                            },
                            "outdoorTemp": {
                                "ID": 1,
                                "type": 41
                            },
                            "pICoolingDemand": {
                                "ID": 7,
                                "type": 32
                            },
                            "pIHeatingDemand": {
                                "ID": 8,
                                "type": 32
                            },
                            "programingOperMode": {
                                "ID": 37,
                                "type": 24
                            },
                            "remoteSensing": {
                                "ID": 26,
                                "type": 24
                            },
                            "remoteTemperature": {
                                "ID": 16448,
                                "manufacturerCode": 4617,
                                "type": 41
                            },
                            "runningMode": {
                                "ID": 30,
                                "type": 48
                            },
                            "runningState": {
                                "ID": 41,
                                "type": 25
                            },
                            "schneiderWiserSpecific": {
                                "ID": 57616,
                                "manufacturerCode": 4190,
                                "type": 48
                            },
                            "setpointChangeAmount": {
                                "ID": 49,
                                "type": 41
                            },
                            "setpointChangeSource": {
                                "ID": 48,
                                "type": 48
                            },
                            "setpointChangeSourceTimeStamp": {
                                "ID": 50,
                                "type": 226
                            },
                            "startOfWeek": {
                                "ID": 32,
                                "type": 48
                            },
                            "systemMode": {
                                "ID": 28,
                                "type": 48
                            },
                            "systemTypeConfig": {
                                "ID": 9,
                                "type": 24
                            },
                            "tempSetpointHold": {
                                "ID": 35,
                                "type": 48
                            },
                            "tempSetpointHoldDuration": {
                                "ID": 36,
                                "type": 33
                            },
                            "unknownAttribute0": {
                                "ID": 16421,
                                "manufacturerCode": 4617,
                                "type": 48
                            },
                            "unknownAttribute1": {
                                "ID": 16449,
                                "manufacturerCode": 4617,
                                "type": 48
                            },
                            "unknownAttribute2": {
                                "ID": 16481,
                                "manufacturerCode": 4617,
                                "type": 48
                            },
                            "unoccupiedCoolingSetpoint": {
                                "ID": 19,
                                "type": 41
                            },
                            "unoccupiedHeatingSetpoint": {
                                "ID": 20,
                                "type": 41
                            },
                            "valveAdaptStatus": {
                                "ID": 16418,
                                "manufacturerCode": 4617,
                                "type": 48
                            },
                            "valveType": {
                                "ID": 16480,
                                "manufacturerCode": 4617,
                                "type": 48
                            },
                            "viessmannAssemblyMode": {
                                "ID": 16402,
                                "manufacturerCode": 4641,
                                "type": 16
                            },
                            "viessmannWindowOpenForce": {
                                "ID": 16387,
                                "manufacturerCode": 4641,
                                "type": 16
                            },
                            "viessmannWindowOpenInternal": {
                                "ID": 16384,
                                "manufacturerCode": 4641,
                                "type": 48
                            },
                            "windowOpenMode": {
                                "ID": 16450,
                                "manufacturerCode": 4617,
                                "type": 48
                            }
                        },
[...]

burmistrzak avatar Nov 12 '25 18:11 burmistrzak

Might be ZH vs custom priority. I don't have any device that override a spec cluster. Can you give me a full set of state.json props for that device (bridgeDefinitions.0.custom_clusters.abc, devices.0.xyz, deviceStates.0.xyz should do) so I can create a mock in the frontend tests?

Nerivec avatar Nov 12 '25 19:11 Nerivec

Really want to hear @DerDreschner opinion on this. I would propose to immediately go for the proper solution (there is plenty of time left for the 1 December release).

Probably I'm missing something, but why is the real system_mode exposed? Based on https://github.com/Koenkk/zigbee2mqtt/pull/23075#issuecomment-2171771715 it only seems to support HEAT? Can't we just rename operation_mode to system_mode?

Koenkk avatar Nov 12 '25 19:11 Koenkk

@Koenkk Yeah, it's a little bit confusing because of similar names. πŸ˜… In short, my comment you linked was about the Bosch TRV (BTH-RA) which, for the purposes of this discussion, indeed only supports HEAT as system_mode. For that reason, we developed the HA discovery payload override to essentially map operating_mode to system_mode for use in HA while leaving system_mode untouched for other integrations to consume. Works great!

Now, the other two devices are wall-mounted room thermostats. The Bosch BTH-RM is battery-powered and mainly intended to control one or more TRVs in a room remotely. Lastly, there's the hard-wired version BTH-RM230Z with an actual relay to control e.g. underfloor heating. Both room thermostats mostly follow spec (with some exceptions) and support HEAT, COOL, and OFF as system_mode. Switching to AUTO requires operating_mode to be set to schedule, so utilizing another HA discovery payload override here seems appropriate.

However, another "issue" https://github.com/Koenkk/zigbee2mqtt/issues/28892 that was attempted to be solved in https://github.com/Koenkk/zigbee-herdsman-converters/pull/10309, was the sheer availability of a cooling mode in HA for those two room thermostats (i.e. BTH-RM*)... Yes, IMHO a purely cosmetic thing, that could be solved with a template device in HA to filter out unwanted system modes. Other ecosystems (e.g. homebridge-z2m) have a similar filtering mechanism as well.

Anyhow, my point is that the aforementioned HA-centric change did once again break thermostats for non-HA users. This PR (as a first step) restores compatibility. Another PR will introduce a HA discovery override for the two room thermostats so AUTO can be used with them as well.

Last but not least, there's is the idea of a Z2M-wide device option to filter out specific attribute (e.g. system_mode) values, to support customization. This would (in theory) also address https://github.com/Koenkk/zigbee2mqtt/issues/28892 in an elegant and compatible manner.

burmistrzak avatar Nov 12 '25 22:11 burmistrzak

Might be ZH vs custom priority. I don't have any device that override a spec cluster.

@Nerivec Strange. IIRC, wasn't an issue previously... πŸ€”

Can you give me a full set of state.json props for that device (bridgeDefinitions.0.custom_clusters.abc, devices.0.xyz, deviceStates.0.xyz should do) so I can create a mock in the frontend tests?

Here you go. 🀝

state.json

{
    "devices": {
        "0": [
          {
              "date_code": "20241203",
              "definition": {
                  "description": "Room thermostat II 230V",
                  "exposes": [
                      {
                          "features": [
                              {
                                  "access": 7,
                                  "description": "The state of the relay controlling the connected heating/cooling device",
                                  "label": "State",
                                  "name": "state",
                                  "property": "state",
                                  "type": "binary",
                                  "value_off": "OFF",
                                  "value_on": "ON",
                                  "value_toggle": "TOGGLE"
                              }
                          ],
                          "type": "switch"
                      },
                      {
                          "access": 7,
                          "category": "config",
                          "description": "Bosch-specific operating mode",
                          "label": "Operating mode",
                          "name": "operating_mode",
                          "property": "operating_mode",
                          "type": "enum",
                          "values": [
                              "schedule",
                              "manual",
                              "pause"
                          ]
                      },
                      {
                          "features": [
                              {
                                  "access": 5,
                                  "description": "Current temperature measured on the device",
                                  "label": "Local temperature",
                                  "name": "local_temperature",
                                  "property": "local_temperature",
                                  "type": "numeric",
                                  "unit": "Β°C"
                              },
                              {
                                  "access": 7,
                                  "description": "Offset to add/subtract to the local temperature",
                                  "label": "Local temperature calibration",
                                  "name": "local_temperature_calibration",
                                  "property": "local_temperature_calibration",
                                  "type": "numeric",
                                  "unit": "Β°C",
                                  "value_max": 5,
                                  "value_min": -5,
                                  "value_step": 0.1
                              },
                              {
                                  "access": 7,
                                  "description": "Temperature setpoint",
                                  "label": "Occupied heating setpoint",
                                  "name": "occupied_heating_setpoint",
                                  "property": "occupied_heating_setpoint",
                                  "type": "numeric",
                                  "unit": "Β°C",
                                  "value_max": 30,
                                  "value_min": 5,
                                  "value_step": 0.5
                              },
                              {
                                  "access": 7,
                                  "description": "Temperature setpoint",
                                  "label": "Occupied cooling setpoint",
                                  "name": "occupied_cooling_setpoint",
                                  "property": "occupied_cooling_setpoint",
                                  "type": "numeric",
                                  "unit": "Β°C",
                                  "value_max": 30,
                                  "value_min": 5,
                                  "value_step": 0.5
                              },
                              {
                                  "access": 7,
                                  "description": "Currently used system mode by the thermostat",
                                  "label": "Active system mode",
                                  "name": "system_mode",
                                  "property": "system_mode",
                                  "type": "enum",
                                  "values": [
                                      "off",
                                      "heat"
                                      "cool"
                                  ]
                              },
                              {
                                  "access": 5,
                                  "description": "The current running state",
                                  "label": "Running state",
                                  "name": "running_state",
                                  "property": "running_state",
                                  "type": "enum",
                                  "values": [
                                      "idle",
                                      "heat",
                                      "cool"
                                  ]
                              }
                          ],
                          "type": "climate"
                      },
                      {
                          "access": 5,
                          "category": "diagnostic",
                          "description": "Source of the current setpoint temperature",
                          "label": "Setpoint change source",
                          "name": "setpoint_change_source",
                          "property": "setpoint_change_source",
                          "type": "enum",
                          "values": [
                              "manual",
                              "schedule",
                              "externally"
                          ]
                      },
                      {
                          "access": 5,
                          "description": "Measured relative humidity",
                          "label": "Humidity",
                          "name": "humidity",
                          "property": "humidity",
                          "type": "numeric",
                          "unit": "%"
                      },
                      {
                          "access": 7,
                          "category": "config",
                          "description": "Select the connected heater type or 'manual_control' if you like to activate the relay manually when necessary",
                          "label": "Heater type",
                          "name": "heater_type",
                          "property": "heater_type",
                          "type": "enum",
                          "values": [
                              "underfloor_heating",
                              "radiator",
                              "central_heating",
                              "manual_control"
                          ]
                      },
                      {
                          "access": 7,
                          "category": "config",
                          "description": "Select the connected valve type",
                          "label": "Valve type",
                          "name": "valve_type",
                          "property": "valve_type",
                          "type": "enum",
                          "values": [
                              "normally_closed",
                              "normally_open"
                          ]
                      },
                      {
                          "access": 7,
                          "category": "config",
                          "description": "Select a configuration for the sensor connection. If you select \"with_regulation\", the measured temperature on the cable sensor is used by the heating/cooling algorithm instead of the local temperature.",
                          "label": "Cable sensor mode",
                          "name": "cable_sensor_mode",
                          "property": "cable_sensor_mode",
                          "type": "enum",
                          "values": [
                              "not_used",
                              "cable_sensor_without_regulation",
                              "cable_sensor_with_regulation"
                          ]
                      },
                      {
                          "access": 5,
                          "description": "Measured temperature value on the cable sensor (if enabled)",
                          "label": "Cable sensor temperature",
                          "name": "cable_sensor_temperature",
                          "property": "cable_sensor_temperature",
                          "type": "numeric",
                          "unit": "Β°C"
                      },
                      {
                          "access": 7,
                          "description": "Activates the window open mode, where the thermostat disables any heating/cooling to prevent unnecessary energy consumption. Please keep in mind that the device itself does not detect any open windows!",
                          "label": "Window open mode",
                          "name": "window_open_mode",
                          "property": "window_open_mode",
                          "type": "binary",
                          "value_off": "OFF",
                          "value_on": "ON"
                      },
                      {
                          "access": 7,
                          "description": "Activate boost heating (opens TRV for 5 minutes)",
                          "label": "Activate boost heating",
                          "name": "boost_heating",
                          "property": "boost_heating",
                          "type": "binary",
                          "value_off": "OFF",
                          "value_on": "ON"
                      },
                      {
                          "access": 7,
                          "description": "Enables/disables physical input on the thermostat",
                          "label": "Child lock",
                          "name": "child_lock",
                          "property": "child_lock",
                          "type": "binary",
                          "value_off": "UNLOCK",
                          "value_on": "LOCK"
                      },
                      {
                          "access": 7,
                          "category": "config",
                          "description": "Sets brightness of the display",
                          "label": "Display brightness",
                          "name": "display_brightness",
                          "property": "display_brightness",
                          "type": "numeric",
                          "unit": "%",
                          "value_max": 100,
                          "value_min": 0,
                          "value_step": 10
                      },
                      {
                          "access": 7,
                          "category": "config",
                          "description": "Sets the time before the display is automatically switched off",
                          "label": "Display switch-on duration",
                          "name": "display_switch_on_duration",
                          "property": "display_switch_on_duration",
                          "type": "numeric",
                          "unit": "s",
                          "value_max": 30,
                          "value_min": 5
                      },
                      {
                          "access": 7,
                          "category": "config",
                          "description": "Determines the state of the little dot on the display next to the heating/cooling symbol",
                          "label": "Activity LED state",
                          "name": "activity_led",
                          "property": "activity_led",
                          "type": "enum",
                          "values": [
                              "off",
                              "auto",
                              "on"
                          ]
                      },
                      {
                          "access": 5,
                          "category": "diagnostic",
                          "description": "Indicates whether the device encounters any errors or not",
                          "label": "Error state",
                          "name": "error_state",
                          "property": "error_state",
                          "type": "text"
                      },
                      {
                          "access": 1,
                          "category": "diagnostic",
                          "description": "Link quality (signal strength)",
                          "label": "Linkquality",
                          "name": "linkquality",
                          "property": "linkquality",
                          "type": "numeric",
                          "unit": "lqi",
                          "value_max": 255,
                          "value_min": 0
                      }
                  ],
                  "model": "BTH-RM230Z",
                  "options": [
                      {
                          "access": 2,
                          "description": "Calibrates the humidity value (absolute offset), takes into effect on next report of device.",
                          "label": "Humidity calibration",
                          "name": "humidity_calibration",
                          "property": "humidity_calibration",
                          "type": "numeric",
                          "value_step": 0.1
                      },
                      {
                          "access": 2,
                          "description": "Number of digits after decimal point for humidity, takes into effect on next report of device. This option can only decrease the precision, not increase it.",
                          "label": "Humidity precision",
                          "name": "humidity_precision",
                          "property": "humidity_precision",
                          "type": "numeric",
                          "value_max": 3,
                          "value_min": 0
                      },
                      {
                          "access": 2,
                          "description": "Controls the temperature unit of the thermostat (default celsius).",
                          "label": "Thermostat unit",
                          "name": "thermostat_unit",
                          "property": "thermostat_unit",
                          "type": "enum",
                          "values": [
                              "celsius",
                              "fahrenheit"
                          ]
                      },
                      {
                          "access": 2,
                          "description": "State actions will also be published as 'action' when true (default false).",
                          "label": "State action",
                          "name": "state_action",
                          "property": "state_action",
                          "type": "binary",
                          "value_off": false,
                          "value_on": true
                      }
                  ],
                  "source": "native",
                  "supports_ota": true,
                  "vendor": "Bosch"
              },
              "disabled": false,
              "endpoints": {
                  "1": {
                      "bindings": [
                          {
                              "cluster": "hvacThermostat",
                              "target": {
                                  "endpoint": 1,
                                  "ieee_address": "0xabcde00123456789",
                                  "type": "endpoint"
                              }
                          },
                          {
                              "cluster": "hvacUserInterfaceCfg",
                              "target": {
                                  "endpoint": 1,
                                  "ieee_address": "0xabcde00123456789",
                                  "type": "endpoint"
                              }
                          },
                          {
                              "cluster": "msRelativeHumidity",
                              "target": {
                                  "endpoint": 1,
                                  "ieee_address": "0xabcde00123456789",
                                  "type": "endpoint"
                              }
                          },
                          {
                              "cluster": "genOnOff",
                              "target": {
                                  "endpoint": 1,
                                  "ieee_address": "0xabcde00123456789",
                                  "type": "endpoint"
                              }
                          }
                      ],
                      "clusters": {
                          "input": [
                              "genBasic",
                              "genIdentify",
                              "genOnOff",
                              "hvacThermostat",
                              "hvacUserInterfaceCfg",
                              "msRelativeHumidity",
                              "haDiagnostic",
                              "64673"
                          ],
                          "output": [
                              "genTime",
                              "genOta"
                          ]
                      },
                      "configured_reportings": [
                          {
                              "attribute": "onOff",
                              "cluster": "genOnOff",
                              "maximum_report_interval": 65000,
                              "minimum_report_interval": 0,
                              "reportable_change": 1
                          },
                          {
                              "attribute": "cableSensorTemperature",
                              "cluster": "hvacThermostat",
                              "maximum_report_interval": 65000,
                              "minimum_report_interval": 30,
                              "reportable_change": 20
                          },
                          {
                              "attribute": "keypadLockout",
                              "cluster": "hvacUserInterfaceCfg",
                              "maximum_report_interval": 65000,
                              "minimum_report_interval": 0,
                              "reportable_change": null
                          }
                      ],
                      "scenes": []
                  }
              },
              "friendly_name": "0x00123456789abcde",
              "ieee_address": "0x00123456789abcde",
              "interview_completed": true,
              "interview_state": "SUCCESSFUL",
              "interviewing": false,
              "manufacturer": "Bosch",
              "model_id": "RBSH-RTH0-ZB-EU",
              "network_address": 22643,
              "power_source": "Mains (single phase)",
              "supported": true,
              "type": "Router"
          }
        ]
    },
    "deviceStates": {
        "0": {
          "0x00123456789abcde": {
              "0x0_1": {
                  "systemMode": 0
              },
              "1_1": {
                  "systemMode": 0
              },
              "3_1": {
                  "systemMode": 0
              },
              "activity_led": "auto",
              "boost_heating": "OFF",
              "cable_sensor_mode": "not_used",
              "cable_sensor_temperature": 0,
              "child_lock": "UNLOCK",
              "custom_system_mode": "heat",
              "display_brightness": 50,
              "display_ontime": 10,
              "display_switch_on_duration": 10,
              "error_state": "ok",
              "heater_type": "underfloor_heating",
              "humidity": 48.04,
              "keypad_lockout": "unlock",
              "last_seen": "2025-11-12T23:29:49+01:00",
              "linkquality": 178,
              "local_temperature": 22.5,
              "local_temperature_calibration": -1.1,
              "occupied_cooling_setpoint": 21.5,
              "occupied_heating_setpoint": 22.5,
              "operating_mode": "manual",
              "running_state": "idle",
              "setpoint_change_source": "externally",
              "state": "OFF",
              "system_mode": "heat",
              "update": {
                  "installed_version": 50883216,
                  "latest_version": 50883216,
                  "state": "idle"
              },
              "valve_type": "normally_closed",
              "window_detection": "OFF",
              "window_open_mode": "OFF"
          }
        }
    },
    "bridgeDefinitions": {
        "0": {
            "custom_clusters": {
              "0x00123456789abcde": {
                      "hvacThermostat": {
                          "ID": 513,
                          "attributes": {
                              "SinopeAuxCycleOutput": {
                                  "ID": 1028,
                                  "manufacturerCode": 4508,
                                  "type": 33
                              },
                              "SinopeBacklight": {
                                  "ID": 1026,
                                  "manufacturerCode": 4508,
                                  "type": 48
                              },
                              "SinopeMainCycleOutput": {
                                  "ID": 1025,
                                  "manufacturerCode": 4508,
                                  "type": 33
                              },
                              "SinopeOccupancy": {
                                  "ID": 1024,
                                  "manufacturerCode": 4508,
                                  "type": 48
                              },
                              "StelproOutdoorTemp": {
                                  "ID": 16385,
                                  "type": 41
                              },
                              "StelproSystemMode": {
                                  "ID": 16412,
                                  "type": 48
                              },
                              "absMaxCoolSetpointLimit": {
                                  "ID": 6,
                                  "type": 41
                              },
                              "absMaxHeatSetpointLimit": {
                                  "ID": 4,
                                  "type": 41
                              },
                              "absMinCoolSetpointLimit": {
                                  "ID": 5,
                                  "type": 41
                              },
                              "absMinHeatSetpointLimit": {
                                  "ID": 3,
                                  "type": 41
                              },
                              "acCapacity": {
                                  "ID": 65,
                                  "type": 33
                              },
                              "acCapacityFormat": {
                                  "ID": 71,
                                  "type": 48
                              },
                              "acCollTemp": {
                                  "ID": 70,
                                  "type": 41
                              },
                              "acConpressorType": {
                                  "ID": 67,
                                  "type": 48
                              },
                              "acErrorCode": {
                                  "ID": 68,
                                  "type": 27
                              },
                              "acLouverPosition": {
                                  "ID": 69,
                                  "type": 48
                              },
                              "acRefrigerantType": {
                                  "ID": 66,
                                  "type": 48
                              },
                              "acType": {
                                  "ID": 64,
                                  "type": 48
                              },
                              "alarmMask": {
                                  "ID": 29,
                                  "type": 24
                              },
                              "automaticValveAdapt": {
                                  "ID": 20496,
                                  "manufacturerCode": 4617,
                                  "type": 48
                              },
                              "boostHeating": {
                                  "ID": 16451,
                                  "manufacturerCode": 4617,
                                  "type": 48
                              },
                              "cableSensorMode": {
                                  "ID": 16482,
                                  "manufacturerCode": 4617,
                                  "type": 48
                              },
                              "cableSensorTemperature": {
                                  "ID": 16466,
                                  "manufacturerCode": 4617,
                                  "type": 41
                              },
                              "ctrlSeqeOfOper": {
                                  "ID": 27,
                                  "type": 48
                              },
                              "danfossAdaptionRunControl": {
                                  "ID": 16460,
                                  "manufacturerCode": 4678,
                                  "type": 48
                              },
                              "danfossAdaptionRunSettings": {
                                  "ID": 16462,
                                  "manufacturerCode": 4678,
                                  "type": 24
                              },
                              "danfossAdaptionRunStatus": {
                                  "ID": 16461,
                                  "manufacturerCode": 4678,
                                  "type": 24
                              },
                              "danfossAlgorithmScaleFactor": {
                                  "ID": 16416,
                                  "manufacturerCode": 4678,
                                  "type": 32
                              },
                              "danfossDayOfWeek": {
                                  "ID": 16400,
                                  "manufacturerCode": 4678,
                                  "type": 48
                              },
                              "danfossExternalMeasuredRoomSensor": {
                                  "ID": 16405,
                                  "manufacturerCode": 4678,
                                  "type": 41
                              },
                              "danfossFloorMaxSetpoint": {
                                  "ID": 16674,
                                  "manufacturerCode": 4678,
                                  "type": 41
                              },
                              "danfossFloorMinSetpoint": {
                                  "ID": 16673,
                                  "manufacturerCode": 4678,
                                  "type": 41
                              },
                              "danfossHeatAvailable": {
                                  "ID": 16432,
                                  "manufacturerCode": 4678,
                                  "type": 16
                              },
                              "danfossHeatRequired": {
                                  "ID": 16433,
                                  "manufacturerCode": 4678,
                                  "type": 16
                              },
                              "danfossIcon2PreHeat": {
                                  "ID": 16689,
                                  "manufacturerCode": 4678,
                                  "type": 48
                              },
                              "danfossIcon2PreHeatStatus": {
                                  "ID": 16719,
                                  "manufacturerCode": 4678,
                                  "type": 48
                              },
                              "danfossLoadBalancingEnable": {
                                  "ID": 16434,
                                  "manufacturerCode": 4678,
                                  "type": 16
                              },
                              "danfossLoadEstimate": {
                                  "ID": 16458,
                                  "manufacturerCode": 4678,
                                  "type": 41
                              },
                              "danfossLoadRoomMean": {
                                  "ID": 16448,
                                  "manufacturerCode": 4678,
                                  "type": 41
                              },
                              "danfossMountedModeActive": {
                                  "ID": 16402,
                                  "manufacturerCode": 4678,
                                  "type": 16
                              },
                              "danfossMountedModeControl": {
                                  "ID": 16403,
                                  "manufacturerCode": 4678,
                                  "type": 16
                              },
                              "danfossOutputStatus": {
                                  "ID": 16656,
                                  "manufacturerCode": 4678,
                                  "type": 48
                              },
                              "danfossPreheatStatus": {
                                  "ID": 16463,
                                  "manufacturerCode": 4678,
                                  "type": 16
                              },
                              "danfossPreheatTime": {
                                  "ID": 16464,
                                  "manufacturerCode": 4678,
                                  "type": 35
                              },
                              "danfossRadiatorCovered": {
                                  "ID": 16406,
                                  "manufacturerCode": 4678,
                                  "type": 16
                              },
                              "danfossRegulationSetpointOffset": {
                                  "ID": 16459,
                                  "manufacturerCode": 4678,
                                  "type": 40
                              },
                              "danfossRoomFloorSensorMode": {
                                  "ID": 16672,
                                  "manufacturerCode": 4678,
                                  "type": 48
                              },
                              "danfossRoomStatusCode": {
                                  "ID": 16640,
                                  "manufacturerCode": 4678,
                                  "type": 25
                              },
                              "danfossScheduleTypeUsed": {
                                  "ID": 16688,
                                  "manufacturerCode": 4678,
                                  "type": 48
                              },
                              "danfossThermostatOrientation": {
                                  "ID": 16404,
                                  "manufacturerCode": 4678,
                                  "type": 16
                              },
                              "danfossTriggerTime": {
                                  "ID": 16401,
                                  "manufacturerCode": 4678,
                                  "type": 33
                              },
                              "danfossWindowOpenExternal": {
                                  "ID": 16387,
                                  "manufacturerCode": 4678,
                                  "type": 16
                              },
                              "danfossWindowOpenFeatureEnable": {
                                  "ID": 16465,
                                  "manufacturerCode": 4678,
                                  "type": 16
                              },
                              "danfossWindowOpenInternal": {
                                  "ID": 16384,
                                  "manufacturerCode": 4678,
                                  "type": 48
                              },
                              "elkoCalibration": {
                                  "ID": 1047,
                                  "type": 40
                              },
                              "elkoChildLock": {
                                  "ID": 1043,
                                  "type": 16
                              },
                              "elkoDateTime": {
                                  "ID": 1031,
                                  "type": 65
                              },
                              "elkoDisplayText": {
                                  "ID": 1026,
                                  "type": 66
                              },
                              "elkoExternalTemp": {
                                  "ID": 1033,
                                  "type": 41
                              },
                              "elkoFrostGuard": {
                                  "ID": 1042,
                                  "type": 16
                              },
                              "elkoLastMessageId": {
                                  "ID": 1048,
                                  "type": 32
                              },
                              "elkoLastMessageStatus": {
                                  "ID": 1049,
                                  "type": 32
                              },
                              "elkoLoad": {
                                  "ID": 1025,
                                  "type": 33
                              },
                              "elkoMaxFloorTemp": {
                                  "ID": 1044,
                                  "type": 32
                              },
                              "elkoMeanPower": {
                                  "ID": 1032,
                                  "type": 33
                              },
                              "elkoNightSwitching": {
                                  "ID": 1041,
                                  "type": 16
                              },
                              "elkoPowerStatus": {
                                  "ID": 1030,
                                  "type": 16
                              },
                              "elkoRegulatorMode": {
                                  "ID": 1029,
                                  "type": 16
                              },
                              "elkoRegulatorTime": {
                                  "ID": 1028,
                                  "type": 32
                              },
                              "elkoRelayState": {
                                  "ID": 1045,
                                  "type": 16
                              },
                              "elkoSensor": {
                                  "ID": 1027,
                                  "type": 48
                              },
                              "elkoVersion": {
                                  "ID": 1046,
                                  "type": 65
                              },
                              "errorState": {
                                  "ID": 20480,
                                  "manufacturerCode": 4617,
                                  "type": 24
                              },
                              "fourNoksHysteresisHigh": {
                                  "ID": 257,
                                  "manufacturerCode": 4209,
                                  "type": 33
                              },
                              "fourNoksHysteresisLow": {
                                  "ID": 258,
                                  "manufacturerCode": 4209,
                                  "type": 33
                              },
                              "heaterType": {
                                  "ID": 16483,
                                  "manufacturerCode": 4617,
                                  "type": 48
                              },
                              "heatingDemand": {
                                  "ID": 16416,
                                  "manufacturerCode": 4617,
                                  "type": 48
                              },
                              "localTemp": {
                                  "ID": 0,
                                  "type": 41
                              },
                              "localTemperatureCalibration": {
                                  "ID": 16,
                                  "type": 40
                              },
                              "maxCoolSetpointLimit": {
                                  "ID": 24,
                                  "type": 41
                              },
                              "maxHeatSetpointLimit": {
                                  "ID": 22,
                                  "type": 41
                              },
                              "minCoolSetpointLimit": {
                                  "ID": 23,
                                  "type": 41
                              },
                              "minHeatSetpointLimit": {
                                  "ID": 21,
                                  "type": 41
                              },
                              "minSetpointDeadBand": {
                                  "ID": 25,
                                  "type": 40
                              },
                              "numberOfDailyTrans": {
                                  "ID": 34,
                                  "type": 32
                              },
                              "numberOfWeeklyTrans": {
                                  "ID": 33,
                                  "type": 32
                              },
                              "occupancy": {
                                  "ID": 2,
                                  "type": 24
                              },
                              "occupiedCoolingSetpoint": {
                                  "ID": 17,
                                  "type": 41
                              },
                              "occupiedHeatingSetpoint": {
                                  "ID": 18,
                                  "type": 41
                              },
                              "operatingMode": {
                                  "ID": 16391,
                                  "manufacturerCode": 4617,
                                  "type": 48
                              },
                              "outdoorTemp": {
                                  "ID": 1,
                                  "type": 41
                              },
                              "pICoolingDemand": {
                                  "ID": 7,
                                  "type": 32
                              },
                              "pIHeatingDemand": {
                                  "ID": 8,
                                  "type": 32
                              },
                              "programingOperMode": {
                                  "ID": 37,
                                  "type": 24
                              },
                              "remoteSensing": {
                                  "ID": 26,
                                  "type": 24
                              },
                              "remoteTemperature": {
                                  "ID": 16448,
                                  "manufacturerCode": 4617,
                                  "type": 41
                              },
                              "runningMode": {
                                  "ID": 30,
                                  "type": 48
                              },
                              "runningState": {
                                  "ID": 41,
                                  "type": 25
                              },
                              "schneiderWiserSpecific": {
                                  "ID": 57616,
                                  "manufacturerCode": 4190,
                                  "type": 48
                              },
                              "setpointChangeAmount": {
                                  "ID": 49,
                                  "type": 41
                              },
                              "setpointChangeSource": {
                                  "ID": 48,
                                  "type": 48
                              },
                              "setpointChangeSourceTimeStamp": {
                                  "ID": 50,
                                  "type": 226
                              },
                              "startOfWeek": {
                                  "ID": 32,
                                  "type": 48
                              },
                              "systemMode": {
                                  "ID": 28,
                                  "type": 48
                              },
                              "systemTypeConfig": {
                                  "ID": 9,
                                  "type": 24
                              },
                              "tempSetpointHold": {
                                  "ID": 35,
                                  "type": 48
                              },
                              "tempSetpointHoldDuration": {
                                  "ID": 36,
                                  "type": 33
                              },
                              "unknownAttribute0": {
                                  "ID": 16421,
                                  "manufacturerCode": 4617,
                                  "type": 48
                              },
                              "unknownAttribute1": {
                                  "ID": 16449,
                                  "manufacturerCode": 4617,
                                  "type": 48
                              },
                              "unknownAttribute2": {
                                  "ID": 16481,
                                  "manufacturerCode": 4617,
                                  "type": 48
                              },
                              "unoccupiedCoolingSetpoint": {
                                  "ID": 19,
                                  "type": 41
                              },
                              "unoccupiedHeatingSetpoint": {
                                  "ID": 20,
                                  "type": 41
                              },
                              "valveAdaptStatus": {
                                  "ID": 16418,
                                  "manufacturerCode": 4617,
                                  "type": 48
                              },
                              "valveType": {
                                  "ID": 16480,
                                  "manufacturerCode": 4617,
                                  "type": 48
                              },
                              "viessmannAssemblyMode": {
                                  "ID": 16402,
                                  "manufacturerCode": 4641,
                                  "type": 16
                              },
                              "viessmannWindowOpenForce": {
                                  "ID": 16387,
                                  "manufacturerCode": 4641,
                                  "type": 16
                              },
                              "viessmannWindowOpenInternal": {
                                  "ID": 16384,
                                  "manufacturerCode": 4641,
                                  "type": 48
                              },
                              "windowOpenMode": {
                                  "ID": 16450,
                                  "manufacturerCode": 4617,
                                  "type": 48
                              }
                          },
                          "commands": {
                              "calibrateValve": {
                                  "ID": 65,
                                  "parameters": []
                              },
                              "clearWeeklySchedule": {
                                  "ID": 3,
                                  "parameters": []
                              },
                              "danfossSetpointCommand": {
                                  "ID": 64,
                                  "parameters": [
                                      {
                                          "name": "setpointType",
                                          "type": 48
                                      },
                                      {
                                          "name": "setpoint",
                                          "type": 41
                                      }
                                  ]
                              },
                              "getRelayStatusLog": {
                                  "ID": 4,
                                  "parameters": [],
                                  "response": 1
                              },
                              "getWeeklySchedule": {
                                  "ID": 2,
                                  "parameters": [
                                      {
                                          "name": "daystoreturn",
                                          "type": 32
                                      },
                                      {
                                          "name": "modetoreturn",
                                          "type": 32
                                      }
                                  ],
                                  "response": 0
                              },
                              "plugwiseCalibrateValve": {
                                  "ID": 160,
                                  "parameters": []
                              },
                              "schneiderWiserThermostatBoost": {
                                  "ID": 128,
                                  "parameters": [
                                      {
                                          "name": "command",
                                          "type": 48
                                      },
                                      {
                                          "name": "enable",
                                          "type": 48
                                      },
                                      {
                                          "name": "temperature",
                                          "type": 33
                                      },
                                      {
                                          "name": "duration",
                                          "type": 33
                                      }
                                  ]
                              },
                              "setWeeklySchedule": {
                                  "ID": 1,
                                  "parameters": [
                                      {
                                          "name": "numoftrans",
                                          "type": 32
                                      },
                                      {
                                          "name": "dayofweek",
                                          "type": 32
                                      },
                                      {
                                          "name": "mode",
                                          "type": 32
                                      },
                                      {
                                          "name": "transitions",
                                          "type": 1007
                                      }
                                  ]
                              },
                              "setpointRaiseLower": {
                                  "ID": 0,
                                  "parameters": [
                                      {
                                          "name": "mode",
                                          "type": 32
                                      },
                                      {
                                          "name": "amount",
                                          "type": 40
                                      }
                                  ]
                              },
                              "wiserSmartCalibrateValve": {
                                  "ID": 226,
                                  "parameters": []
                              },
                              "wiserSmartSetFipMode": {
                                  "ID": 225,
                                  "parameters": [
                                      {
                                          "name": "zonemode",
                                          "type": 32
                                      },
                                      {
                                          "name": "fipmode",
                                          "type": 48
                                      },
                                      {
                                          "name": "reserved",
                                          "type": 32
                                      }
                                  ]
                              },
                              "wiserSmartSetSetpoint": {
                                  "ID": 224,
                                  "parameters": [
                                      {
                                          "name": "operatingmode",
                                          "type": 32
                                      },
                                      {
                                          "name": "zonemode",
                                          "type": 32
                                      },
                                      {
                                          "name": "setpoint",
                                          "type": 41
                                      },
                                      {
                                          "name": "reserved",
                                          "type": 32
                                      }
                                  ]
                              }
                          },
                          "commandsResponse": {
                              "getRelayStatusLogRsp": {
                                  "ID": 1,
                                  "parameters": [
                                      {
                                          "name": "timeofday",
                                          "type": 33
                                      },
                                      {
                                          "name": "relaystatus",
                                          "type": 33
                                      },
                                      {
                                          "name": "localtemp",
                                          "type": 33
                                      },
                                      {
                                          "name": "humidity",
                                          "type": 32
                                      },
                                      {
                                          "name": "setpoint",
                                          "type": 33
                                      },
                                      {
                                          "name": "unreadentries",
                                          "type": 33
                                      }
                                  ]
                              },
                              "getWeeklyScheduleRsp": {
                                  "ID": 0,
                                  "parameters": [
                                      {
                                          "name": "numoftrans",
                                          "type": 32
                                      },
                                      {
                                          "name": "dayofweek",
                                          "type": 32
                                      },
                                      {
                                          "name": "mode",
                                          "type": 32
                                      },
                                      {
                                          "name": "transitions",
                                          "type": 1007
                                      }
                                  ]
                              }
                          }
                      },
                      "hvacUserInterfaceCfg": {
                          "ID": 516,
                          "attributes": {
                              "activityLed": {
                                  "ID": 16435,
                                  "manufacturerCode": 4617,
                                  "type": 48
                              },
                              "danfossViewingDirection": {
                                  "ID": 16384,
                                  "manufacturerCode": 4678,
                                  "type": 48
                              },
                              "displayBrightness": {
                                  "ID": 16443,
                                  "manufacturerCode": 4617,
                                  "type": 48
                              },
                              "displayOrientation": {
                                  "ID": 16395,
                                  "manufacturerCode": 4617,
                                  "type": 32
                              },
                              "displaySwitchOnDuration": {
                                  "ID": 16442,
                                  "manufacturerCode": 4617,
                                  "type": 48
                              },
                              "displayedTemperature": {
                                  "ID": 16441,
                                  "manufacturerCode": 4617,
                                  "type": 48
                              },
                              "keypadLockout": {
                                  "ID": 1,
                                  "type": 48
                              },
                              "programmingVisibility": {
                                  "ID": 2,
                                  "type": 48
                              },
                              "tempDisplayMode": {
                                  "ID": 0,
                                  "type": 48
                              }
                          },
                          "commands": {},
                          "commandsResponse": {}
                      }
                  }
              }
        }
    }
}

burmistrzak avatar Nov 12 '25 23:11 burmistrzak

@burmistrzak I can't seem to reproduce your issue with your data? Or am I missing something? clusterattr

I did find a syntax issue in the state.json you sent, but I figure that's a manual-edit-gone-wrong (shouldn't be possible for downloaded state.json to have bad syntax).

                                  "values": [
                                      "off",
-                                     "heat"
+                                     "heat",
                                      "cool"
                                  ]

Nerivec avatar Nov 13 '25 09:11 Nerivec

I can't seem to reproduce your issue with your data? Or am I missing something?

@Nerivec Are you able to see/select operatingMode or windowOpenMode? If you can, something is definitely wrong on my side. 😬

I did find a syntax issue in the state.json you sent, but I figure that's a manual-edit-gone-wrong (shouldn't be possible for downloaded state.json to have bad syntax).

Yep, was a manual edit. Thx for catching!

burmistrzak avatar Nov 13 '25 15:11 burmistrzak

@burmistrzak was a priority issue indeed. Will fix it in next WindFront version. Looks like it was always there (even old frontend has the same priority to ZH over custom from what I can tell).

Nerivec avatar Nov 13 '25 15:11 Nerivec

@Koenkk I hope my explanation helped you to get up to speed on the issue. Let me know if you need anything else. ☺️

burmistrzak avatar Nov 14 '25 11:11 burmistrzak

Does this PR also make both target temperatures for heating and for cooling (target temp low and high) available in HA again?

I am using both values to check whether it is too cold or too hot to set our heat pump to heating or cooling, but after the latest update I only see a target temp where the cooling target temp is hidden when the thermostat is set to heating.

So at least for my use case it would be great if both target temperatures would bei available again in HA. However, if that is not related to this PR, then I can also create an issue for it.

FlorianHockmann avatar Nov 14 '25 16:11 FlorianHockmann

Does this PR also make both target temperatures for heating and for cooling (target temp low and high) available in HA again?

@FlorianHockmann Yes! I had exactly this use-case in mind when reviewing those recent PRs. 😊 Because of life stuff, I sadly wasn't able to review them in time before they got merged and released...

I am using both values to check whether it is too cold or too hot to set our heat pump to heating or cooling, but after the latest update I only see a target temp where the cooling target temp is hidden when the thermostat is set to heating.

Yeah, an unfortunate casualty of a not necessarily bad idea, however implemented in a suboptimal manner. πŸ˜…

So at least for my use case it would be great if both target temperatures would bei available again in HA. However, if that is not related to this PR, then I can also create an issue for it.

No, you're absolutely in the right place! Btw. it's not only the heat-pump folks that are affected by this issue. Other ecosystems/integrations (e.g. homebridge-z2m) rely on standard attributes and don't know how to deal with these HA-specific changes.

burmistrzak avatar Nov 14 '25 21:11 burmistrzak

thanks!

Koenkk avatar Nov 16 '25 14:11 Koenkk

@FlorianHockmann Can you do me a favor? We need to verify whether this PR works as intended. 🀞 Once #10741 is merged, switch to ghcr.io/koenkk/zigbee2mqtt:latest-dev and check if your automations work correctly again. Feel free to report anything unusual.

burmistrzak avatar Nov 16 '25 15:11 burmistrzak

I can just install the edge addon from the HA addon store for that, right?

FlorianHockmann avatar Nov 17 '25 10:11 FlorianHockmann

@FlorianHockmann yes!

Koenkk avatar Nov 17 '25 20:11 Koenkk

@FlorianHockmann Please report back your results! 🀝

burmistrzak avatar Nov 17 '25 22:11 burmistrzak

@Koenkk Side question: Why do we expose humidity as a separate sensor when MQTT climate in HA seemingly supports current humidity as well? AFAICT, current_humidity_topic & Co. is not being used as part of the climate feature exposed via MQTT.

burmistrzak avatar Nov 17 '25 22:11 burmistrzak

I just installed the edge version and now everything is working again. Thanks a lot for this fix, @burmistrzak!

FlorianHockmann avatar Nov 18 '25 15:11 FlorianHockmann

If ever there is capacity to look into the malfunction of the pairing of the Bosch trv, this would be highly appreciated!

dierochade avatar Nov 18 '25 16:11 dierochade

@dierochade Would you mind expanding on that? And which model of TRV are you using? The most recent Z2M release already includes improvements for pairing/interviewing Bosch devices.

@FlorianHockmann Glad to hear!

burmistrzak avatar Nov 18 '25 20:11 burmistrzak

@Koenkk Side question: Why do we expose humidity as a separate sensor when MQTT climate in HA seemingly supports current humidity as well? AFAICT, current_humidity_topic & Co. is not being used as part of the climate feature exposed via MQTT.

I would propose to update homeassistant.ts to also discover this as part of the climate entity when the device exposes humidity.

Koenkk avatar Nov 18 '25 20:11 Koenkk

I would propose to update homeassistant.ts to also discover this as part of the climate entity when the device exposes humidity.

@Koenkk Sounds good. AFAIK, the thermostat cluster in ZCL doesn't include a humidity attribute, so humidity wouldn't be part of the climate features exposed by Z2M. I don't think something similar has been done before? How would we check for a key outside the regular climate feature set?

burmistrzak avatar Nov 18 '25 22:11 burmistrzak

@burmistrzak all the exposes are available in the function:

https://github.com/Koenkk/zigbee2mqtt/blob/5797b56871215b8fac37cfeb4f702f73a09c4ae0/lib/extension/homeassistant.ts#L468

Koenkk avatar Nov 19 '25 19:11 Koenkk

@Koenkk I see. So something like e.g.:

const currentHumidity = allExposes
                    ?.filter(isNumericExpose)
                    .find((e) => ["humidity"].includes(e.name) && e.access === ACCESS_STATE);

should return the separate humidity sensor (if available), right?

burmistrzak avatar Nov 19 '25 20:11 burmistrzak