Skip to content

Commit b828eaf

Browse files
authored
Update Bosch RBSH-RTH0-ZB-EU quirk
1 parent 2e2bbd9 commit b828eaf

File tree

1 file changed

+39
-27
lines changed

1 file changed

+39
-27
lines changed

zhaquirks/bosch/rbsh_rth0_zb_eu.py

Lines changed: 39 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,23 @@
22

33
from zigpy.quirks import CustomCluster
44
from zigpy.quirks.v2 import QuirkBuilder
5-
from zigpy.quirks.v2.homeassistant import EntityPlatform, EntityType
5+
from zigpy.quirks.v2.homeassistant import EntityType, PERCENTAGE
66
import zigpy.types as t
77
from zigpy.zcl.clusters.hvac import (
8-
ControlSequenceOfOperation,
98
Thermostat,
109
UserInterface,
10+
TemperatureDisplayMode,
1111
)
12+
from zigpy.quirks.v2.homeassistant.sensor import SensorStateClass
1213
from zigpy.zcl.foundation import ZCLAttributeDef
1314

1415
"""Bosch specific thermostat attribute ids."""
1516

1617
# Mode of operation with values BoschOperatingMode.
1718
OPERATING_MODE_ATTR_ID = 0x4007
1819

19-
# Valve position: 0% - 100%
20-
VALVE_POSITION_ATTR_ID = 0x4020
20+
# Valve duty cycle: 0% - 100%
21+
VALVE_DUTY_CYCLE_ATTR_ID = 0x4020
2122

2223
# Window open switch (changes to a lower target temperature when on).
2324
WINDOW_OPEN_ATTR_ID = 0x4042
@@ -33,12 +34,9 @@
3334
# Display brightness (0 - 10).
3435
SCREEN_BRIGHTNESS_ATTR_ID = 0x403B
3536

36-
# Control sequence of operation (heating/cooling)
37-
CTRL_SEQUENCE_OF_OPERATION_ID = Thermostat.AttributeDefs.ctrl_sequence_of_oper.id
38-
3937

4038
class BoschOperatingMode(t.enum8):
41-
"""Bosh operating mode attribute values."""
39+
"""Bosch operating mode attribute values."""
4240

4341
Schedule = 0x00
4442
Manual = 0x01
@@ -52,16 +50,15 @@ class State(t.enum8):
5250
On = 0x01
5351

5452

55-
class BoschControlSequenceOfOperation(t.enum8):
56-
"""Supported ControlSequenceOfOperation modes."""
57-
58-
Cooling = ControlSequenceOfOperation.Cooling_Only
59-
Heating = ControlSequenceOfOperation.Heating_Only
60-
61-
6253
class BoschThermostatCluster(CustomCluster, Thermostat):
6354
"""Bosch thermostat cluster."""
6455

56+
# Works around an issue where ZHA thinks "Heating_Only" can't be changed
57+
# 0x06 is "centralite specific", but works perfectly for this thermostat as well
58+
_CONSTANT_ATTRIBUTES = {
59+
Thermostat.AttributeDefs.ctrl_sequence_of_oper.id: 0x06
60+
}
61+
6562
class AttributeDefs(Thermostat.AttributeDefs):
6663
"""Bosch thermostat manufacturer specific attributes."""
6764

@@ -71,8 +68,8 @@ class AttributeDefs(Thermostat.AttributeDefs):
7168
is_manufacturer_specific=True,
7269
)
7370

74-
pi_heating_demand = ZCLAttributeDef(
75-
id=VALVE_POSITION_ATTR_ID,
71+
valve_duty_cycle = ZCLAttributeDef(
72+
id=VALVE_DUTY_CYCLE_ATTR_ID,
7673
# Values range from 0-100
7774
type=t.uint8_t,
7875
is_manufacturer_specific=True,
@@ -89,6 +86,12 @@ class AttributeDefs(Thermostat.AttributeDefs):
8986
type=State,
9087
is_manufacturer_specific=True,
9188
)
89+
90+
temperature_display_mode = ZCLAttributeDef(
91+
id=0x0000,
92+
type=TemperatureDisplayMode,
93+
access="rw",
94+
)
9295

9396

9497
class BoschUserInterfaceCluster(CustomCluster, UserInterface):
@@ -117,16 +120,33 @@ class AttributeDefs(UserInterface.AttributeDefs):
117120
.applies_to("Bosch", "RBSH-RTH0-BAT-ZB-EU")
118121
.replaces(BoschThermostatCluster)
119122
.replaces(BoschUserInterfaceCluster)
123+
# Valve duty cycle, PWM controlled.
124+
.sensor(
125+
BoschThermostatCluster.AttributeDefs.valve_duty_cycle.name,
126+
BoschThermostatCluster.cluster_id,
127+
state_class=SensorStateClass.MEASUREMENT,
128+
unit=PERCENTAGE,
129+
translation_key="valve_duty_cycle",
130+
fallback_name="Valve duty cycle",
131+
)
120132
# Operating mode - read-only: controlled automatically through Thermostat.system_mode (HAVC mode).
121133
.enum(
122134
BoschThermostatCluster.AttributeDefs.operating_mode.name,
123135
BoschOperatingMode,
124136
BoschThermostatCluster.cluster_id,
125-
entity_platform=EntityPlatform.SENSOR,
126-
entity_type=EntityType.DIAGNOSTIC,
137+
entity_type=EntityType.CONFIG,
127138
translation_key="operating_mode",
128139
fallback_name="Operating mode",
129140
)
141+
# Temperature display type.
142+
.enum(
143+
BoschUserInterfaceCluster.AttributeDefs.temperature_display_mode.name,
144+
TemperatureDisplayMode,
145+
BoschUserInterfaceCluster.cluster_id,
146+
entity_type=EntityType.CONFIG,
147+
translation_key="temperature_display_mode",
148+
fallback_name="Temperature display mode",
149+
)
130150
# Fast heating/boost.
131151
.switch(
132152
BoschThermostatCluster.AttributeDefs.boost_heating.name,
@@ -161,13 +181,5 @@ class AttributeDefs(UserInterface.AttributeDefs):
161181
translation_key="display_brightness",
162182
fallback_name="Display brightness",
163183
)
164-
# Heating vs Cooling.
165-
.enum(
166-
Thermostat.AttributeDefs.ctrl_sequence_of_oper.name,
167-
BoschControlSequenceOfOperation,
168-
BoschThermostatCluster.cluster_id,
169-
translation_key="ctrl_sequence_of_oper",
170-
fallback_name="Control sequence",
171-
)
172184
.add_to_registry()
173185
)

0 commit comments

Comments
 (0)