diff --git a/homeassistant/components/zwave_js/discovery.py b/homeassistant/components/zwave_js/discovery.py index 858e4c300b8..877841ef2ff 100644 --- a/homeassistant/components/zwave_js/discovery.py +++ b/homeassistant/components/zwave_js/discovery.py @@ -66,6 +66,7 @@ from .discovery_data_template import ( NumericSensorDataTemplate, ) from .entity import NewZwaveDiscoveryInfo +from .event import DISCOVERY_SCHEMAS as EVENT_SCHEMAS from .models import ( FirmwareVersionRange, NewZWaveDiscoverySchema, @@ -77,6 +78,7 @@ from .models import ( NEW_DISCOVERY_SCHEMAS: dict[Platform, list[NewZWaveDiscoverySchema]] = { Platform.BINARY_SENSOR: BINARY_SENSOR_SCHEMAS, + Platform.EVENT: EVENT_SCHEMAS, } SUPPORTED_PLATFORMS = tuple(NEW_DISCOVERY_SCHEMAS) @@ -1164,15 +1166,6 @@ DISCOVERY_SCHEMAS = [ allow_multi=True, entity_registry_enabled_default=False, ), - # event - # stateful = False - ZWaveDiscoverySchema( - platform=Platform.EVENT, - hint="stateless", - primary_value=ZWaveValueDiscoverySchema( - stateful=False, - ), - ), # button # Meter CC idle ZWaveDiscoverySchema( diff --git a/homeassistant/components/zwave_js/event.py b/homeassistant/components/zwave_js/event.py index 60f0e110108..4919d5bb036 100644 --- a/homeassistant/components/zwave_js/event.py +++ b/homeassistant/components/zwave_js/event.py @@ -2,22 +2,37 @@ from __future__ import annotations +from dataclasses import dataclass + from zwave_js_server.model.driver import Driver from zwave_js_server.model.value import Value, ValueNotification -from homeassistant.components.event import DOMAIN as EVENT_DOMAIN, EventEntity +from homeassistant.components.event import ( + DOMAIN as EVENT_DOMAIN, + EventEntity, + EventEntityDescription, +) +from homeassistant.const import Platform from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from .const import ATTR_VALUE, DOMAIN -from .discovery import ZwaveDiscoveryInfo -from .entity import ZWaveBaseEntity -from .models import ZwaveJSConfigEntry +from .entity import NewZwaveDiscoveryInfo, ZWaveBaseEntity +from .models import ( + NewZWaveDiscoverySchema, + ZwaveJSConfigEntry, + ZWaveValueDiscoverySchema, +) PARALLEL_UPDATES = 0 +@dataclass(frozen=True, kw_only=True) +class ValueNotificationZWaveJSEntityDescription(EventEntityDescription): + """Represent a Z-Wave JS event entity description.""" + + async def async_setup_entry( hass: HomeAssistant, config_entry: ZwaveJSConfigEntry, @@ -27,11 +42,13 @@ async def async_setup_entry( client = config_entry.runtime_data.client @callback - def async_add_event(info: ZwaveDiscoveryInfo) -> None: + def async_add_event(info: NewZwaveDiscoveryInfo) -> None: """Add Z-Wave event entity.""" driver = client.driver assert driver is not None # Driver is ready before platforms are loaded. - entities: list[ZWaveBaseEntity] = [ZwaveEventEntity(config_entry, driver, info)] + entities: list[ZWaveBaseEntity] = [ + info.entity_class(config_entry, driver, info) + ] async_add_entities(entities) config_entry.async_on_unload( @@ -55,7 +72,10 @@ class ZwaveEventEntity(ZWaveBaseEntity, EventEntity): """Representation of a Z-Wave event entity.""" def __init__( - self, config_entry: ZwaveJSConfigEntry, driver: Driver, info: ZwaveDiscoveryInfo + self, + config_entry: ZwaveJSConfigEntry, + driver: Driver, + info: NewZwaveDiscoveryInfo, ) -> None: """Initialize a ZwaveEventEntity entity.""" super().__init__(config_entry, driver, info) @@ -96,3 +116,17 @@ class ZwaveEventEntity(ZWaveBaseEntity, EventEntity): lambda event: self._async_handle_event(event["value_notification"]), ) ) + + +DISCOVERY_SCHEMAS: list[NewZWaveDiscoverySchema] = [ + NewZWaveDiscoverySchema( + platform=Platform.EVENT, + primary_value=ZWaveValueDiscoverySchema( + stateful=False, + ), + entity_description=ValueNotificationZWaveJSEntityDescription( + key="value_notification", + ), + entity_class=ZwaveEventEntity, + ), +] diff --git a/tests/components/zwave_js/test_event.py b/tests/components/zwave_js/test_event.py index 84b1ade2632..b174bd1648a 100644 --- a/tests/components/zwave_js/test_event.py +++ b/tests/components/zwave_js/test_event.py @@ -6,8 +6,6 @@ from freezegun import freeze_time import pytest from zwave_js_server.event import Event -from homeassistant.components.event import ATTR_EVENT_TYPE -from homeassistant.components.zwave_js.const import ATTR_VALUE from homeassistant.const import STATE_UNKNOWN, Platform from homeassistant.core import HomeAssistant from homeassistant.util import dt as dt_util @@ -66,9 +64,12 @@ async def test_basic( assert state assert state.state == dt_util.as_utc(fut).isoformat(timespec="milliseconds") - attributes = state.attributes - assert attributes[ATTR_EVENT_TYPE] == "Basic event value" - assert attributes[ATTR_VALUE] == 255 + assert state.attributes == { + "friendly_name": "honeywell_in_wall_smart_fan_control Event value", + "event_type": "Basic event value", + "event_types": ["Basic event value"], + "value": 255, + } async def test_central_scene( @@ -128,9 +129,20 @@ async def test_central_scene( assert state assert state.state == dt_util.as_utc(fut).isoformat(timespec="milliseconds") - attributes = state.attributes - assert attributes[ATTR_EVENT_TYPE] == "KeyReleased" - assert attributes[ATTR_VALUE] == 1 + assert state.attributes == { + "friendly_name": "Node 51 Scene 002", + "event_type": "KeyReleased", + "event_types": [ + "KeyHeldDown", + "KeyPressed", + "KeyPressed2x", + "KeyPressed3x", + "KeyPressed4x", + "KeyPressed5x", + "KeyReleased", + ], + "value": 1, + } # Try invalid value event = Event( @@ -178,6 +190,17 @@ async def test_central_scene( assert state assert state.state == dt_util.as_utc(fut).isoformat(timespec="milliseconds") - attributes = state.attributes - assert attributes[ATTR_EVENT_TYPE] == "KeyReleased" - assert attributes[ATTR_VALUE] == 1 + assert state.attributes == { + "friendly_name": "Node 51 Scene 002", + "event_type": "KeyReleased", + "event_types": [ + "KeyHeldDown", + "KeyPressed", + "KeyPressed2x", + "KeyPressed3x", + "KeyPressed4x", + "KeyPressed5x", + "KeyReleased", + ], + "value": 1, + }