Skip to content

Commit 2dcbe38

Browse files
mrrstuxjclsn
authored andcommitted
Use zcl_type to avoid custom write_attribute code for display orientation.
1 parent e1cd677 commit 2dcbe38

File tree

2 files changed

+6
-125
lines changed

2 files changed

+6
-125
lines changed

tests/test_bosch.py

Lines changed: 3 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,14 @@
22

33
from unittest import mock
44

5-
from zigpy.zcl import foundation
6-
from zigpy.zcl.clusters.hvac import ControlSequenceOfOperation, Thermostat
7-
from zigpy.zcl.foundation import WriteAttributesStatusRecord
8-
95
import zhaquirks
106
from zhaquirks.bosch.rbsh_trv0_zb_eu import (
11-
BoschDisplayOrientation,
127
BoschOperatingMode,
138
BoschThermostatCluster as BoschTrvThermostatCluster,
14-
BoschUserInterfaceCluster as BoschTrvUserInterfaceCluster,
159
)
10+
from zigpy.zcl import foundation
11+
from zigpy.zcl.clusters.hvac import ControlSequenceOfOperation, Thermostat
12+
from zigpy.zcl.foundation import WriteAttributesStatusRecord
1613

1714
zhaquirks.setup()
1815

@@ -544,88 +541,3 @@ def mock_write(attributes, manufacturer=None):
544541
]
545542
== ControlSequenceOfOperation.Cooling_Only
546543
)
547-
548-
549-
async def test_bosch_radiator_thermostat_II_user_interface_write_attributes(
550-
zigpy_device_from_v2_quirk,
551-
):
552-
"""Test the Radiator Thermostat II user-interface writes behaving correctly."""
553-
554-
device = zigpy_device_from_v2_quirk(manufacturer="BOSCH", model="RBSH-TRV0-ZB-EU")
555-
556-
bosch_thermostat_ui_cluster = device.endpoints[1].thermostat_ui
557-
558-
def mock_write(attributes, manufacturer=None):
559-
records = [
560-
WriteAttributesStatusRecord(foundation.Status.SUCCESS) for _ in attributes
561-
]
562-
return [records, []]
563-
564-
# data is written to trv ui
565-
patch_bosch_trv_ui_write = mock.patch.object(
566-
bosch_thermostat_ui_cluster,
567-
"_write_attributes",
568-
mock.AsyncMock(side_effect=mock_write),
569-
)
570-
571-
# check that display_orientation gets converted to supported value type:
572-
with patch_bosch_trv_ui_write:
573-
# - orientation (by-id) normal
574-
success, fail = await bosch_thermostat_ui_cluster.write_attributes(
575-
{
576-
BoschTrvUserInterfaceCluster.AttributeDefs.display_orientation.id: BoschDisplayOrientation.Normal
577-
}
578-
)
579-
assert success
580-
assert not fail
581-
assert (
582-
bosch_thermostat_ui_cluster._attr_cache[
583-
BoschTrvUserInterfaceCluster.AttributeDefs.display_orientation.id
584-
]
585-
== 0
586-
)
587-
588-
# - orientation (by-id) flipped
589-
success, fail = await bosch_thermostat_ui_cluster.write_attributes(
590-
{
591-
BoschTrvUserInterfaceCluster.AttributeDefs.display_orientation.id: BoschDisplayOrientation.Flipped
592-
}
593-
)
594-
assert success
595-
assert not fail
596-
assert (
597-
bosch_thermostat_ui_cluster._attr_cache[
598-
BoschTrvUserInterfaceCluster.AttributeDefs.display_orientation.id
599-
]
600-
== 1
601-
)
602-
603-
# - orientation (by-name) normal
604-
success, fail = await bosch_thermostat_ui_cluster.write_attributes(
605-
{
606-
BoschTrvUserInterfaceCluster.AttributeDefs.display_orientation.name: BoschDisplayOrientation.Normal
607-
}
608-
)
609-
assert success
610-
assert not fail
611-
assert (
612-
bosch_thermostat_ui_cluster._attr_cache[
613-
BoschTrvUserInterfaceCluster.AttributeDefs.display_orientation.id
614-
]
615-
== 0
616-
)
617-
618-
# - orientation (by-name) flipped
619-
success, fail = await bosch_thermostat_ui_cluster.write_attributes(
620-
{
621-
BoschTrvUserInterfaceCluster.AttributeDefs.display_orientation.name: BoschDisplayOrientation.Flipped
622-
}
623-
)
624-
assert success
625-
assert not fail
626-
assert (
627-
bosch_thermostat_ui_cluster._attr_cache[
628-
BoschTrvUserInterfaceCluster.AttributeDefs.display_orientation.id
629-
]
630-
== 1
631-
)

zhaquirks/bosch/rbsh_trv0_zb_eu.py

Lines changed: 3 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
Thermostat,
1414
UserInterface,
1515
)
16-
from zigpy.zcl.foundation import Direction, ZCLAttributeDef, ZCLCommandDef
16+
from zigpy.zcl.foundation import DataTypeId, Direction, ZCLAttributeDef, ZCLCommandDef
1717

1818
"""Bosch specific thermostat attribute ids."""
1919

@@ -423,8 +423,8 @@ class AttributeDefs(UserInterface.AttributeDefs):
423423

424424
display_orientation: Final = ZCLAttributeDef(
425425
id=SCREEN_ORIENTATION_ATTR_ID,
426-
# To be matched to BoschDisplayOrientation enum.
427-
type=t.uint8_t,
426+
type=BoschDisplayOrientation,
427+
zcl_type=DataTypeId.uint8,
428428
is_manufacturer_specific=True,
429429
)
430430

@@ -448,37 +448,6 @@ class AttributeDefs(UserInterface.AttributeDefs):
448448
is_manufacturer_specific=True,
449449
)
450450

451-
async def write_attributes(
452-
self, attributes: dict[str | int, Any], manufacturer: int | None = None
453-
) -> list:
454-
"""display_orientation special handling.
455-
456-
- convert from enum to uint8_t
457-
"""
458-
display_orientation_attr = self.AttributeDefs.display_orientation
459-
460-
remaining_attributes = attributes.copy()
461-
display_orientation_attribute_id = None
462-
463-
"""Check if display_orientation is being written (can be numeric or string)."""
464-
if display_orientation_attr.id in attributes:
465-
display_orientation_attribute_id = display_orientation_attr.id
466-
elif display_orientation_attr.name in attributes:
467-
display_orientation_attribute_id = display_orientation_attr.name
468-
469-
if display_orientation_attribute_id is not None:
470-
display_orientation_value = remaining_attributes.pop(
471-
display_orientation_attribute_id
472-
)
473-
new_display_orientation_value = DISPLAY_ORIENTATION_ENUM_TO_INT_MAP[
474-
display_orientation_value
475-
]
476-
remaining_attributes[display_orientation_attribute_id] = (
477-
new_display_orientation_value
478-
)
479-
480-
return await super().write_attributes(remaining_attributes, manufacturer)
481-
482451

483452
(
484453
QuirkBuilder("BOSCH", "RBSH-TRV0-ZB-EU")

0 commit comments

Comments
 (0)