diff --git a/tests/test_device.py b/tests/test_device.py index 7609010ef..050bce943 100644 --- a/tests/test_device.py +++ b/tests/test_device.py @@ -11,7 +11,12 @@ from zigpy.exceptions import ZigbeeException import zigpy.profiles.zha from zigpy.quirks.registry import DeviceRegistry -from zigpy.quirks.v2 import DeviceAlertLevel, DeviceAlertMetadata, QuirkBuilder +from zigpy.quirks.v2 import ( + DeviceAlertLevel, + DeviceAlertMetadata, + ExposesFeatureMetadata, + QuirkBuilder, +) from zigpy.quirks.v2.homeassistant import EntityType from zigpy.quirks.v2.homeassistant.sensor import SensorDeviceClass, SensorStateClass import zigpy.types @@ -1123,6 +1128,36 @@ async def test_quirks_v2_translation_placeholders(zha_gateway: Gateway) -> None: ) +async def test_quirks_v2_exposed_features(zha_gateway: Gateway) -> None: + """Test quirks v2 exposed features.""" + registry = DeviceRegistry() + + ( + QuirkBuilder("CentraLite", "3405-L", registry=registry) + .exposes_feature("some_feature") + .exposes_feature("another_feature", config={"option": True}) + .add_to_registry() + ) + + zigpy_dev = registry.get_device( + await zigpy_device_from_json( + zha_gateway.application_controller, + "tests/data/devices/centralite-3405-l.json", + ) + ) + + zha_device = await join_zigpy_device(zha_gateway, zigpy_dev) + + # can access the set of exposed features, similar to v1 quirks + assert zha_device.exposes_features == {"some_feature", "another_feature"} + + # can access the quirk metadata for config features + assert zha_device.quirk_metadata.exposes_features == ( + ExposesFeatureMetadata(feature="some_feature"), + ExposesFeatureMetadata(feature="another_feature", config={"option": True}), + ) + + async def test_join_binding_reporting(zha_gateway: Gateway) -> None: """Test that new joins go through binding and attribute reporting.""" diff --git a/zha/zigbee/device.py b/zha/zigbee/device.py index 642421526..f33fb1b1f 100644 --- a/zha/zigbee/device.py +++ b/zha/zigbee/device.py @@ -272,6 +272,12 @@ def __init__( qid: set[str] | str = getattr(self._zigpy_device, ATTR_QUIRK_ID, set()) self.exposes_features: set[str] = {qid} if isinstance(qid, str) else set(qid) + # add v2 quirk exposed features + if self.quirk_metadata is not None: + self.exposes_features.update( + f.feature for f in self.quirk_metadata.exposes_features + ) + self._power_config_ch: ClusterHandler | None = None self._identify_ch: ClusterHandler | None = None self._basic_ch: ClusterHandler | None = None