Skip to content

Commit 3cb4145

Browse files
authored
Migrate Z-Wave event entity to new discovery schema (home-assistant#156320)
1 parent f55c36d commit 3cb4145

File tree

3 files changed

+77
-27
lines changed

3 files changed

+77
-27
lines changed

homeassistant/components/zwave_js/discovery.py

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
NumericSensorDataTemplate,
6767
)
6868
from .entity import NewZwaveDiscoveryInfo
69+
from .event import DISCOVERY_SCHEMAS as EVENT_SCHEMAS
6970
from .models import (
7071
FirmwareVersionRange,
7172
NewZWaveDiscoverySchema,
@@ -77,6 +78,7 @@
7778

7879
NEW_DISCOVERY_SCHEMAS: dict[Platform, list[NewZWaveDiscoverySchema]] = {
7980
Platform.BINARY_SENSOR: BINARY_SENSOR_SCHEMAS,
81+
Platform.EVENT: EVENT_SCHEMAS,
8082
}
8183
SUPPORTED_PLATFORMS = tuple(NEW_DISCOVERY_SCHEMAS)
8284

@@ -1164,15 +1166,6 @@ class ZWaveDiscoverySchema:
11641166
allow_multi=True,
11651167
entity_registry_enabled_default=False,
11661168
),
1167-
# event
1168-
# stateful = False
1169-
ZWaveDiscoverySchema(
1170-
platform=Platform.EVENT,
1171-
hint="stateless",
1172-
primary_value=ZWaveValueDiscoverySchema(
1173-
stateful=False,
1174-
),
1175-
),
11761169
# button
11771170
# Meter CC idle
11781171
ZWaveDiscoverySchema(

homeassistant/components/zwave_js/event.py

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,37 @@
22

33
from __future__ import annotations
44

5+
from dataclasses import dataclass
6+
57
from zwave_js_server.model.driver import Driver
68
from zwave_js_server.model.value import Value, ValueNotification
79

8-
from homeassistant.components.event import DOMAIN as EVENT_DOMAIN, EventEntity
10+
from homeassistant.components.event import (
11+
DOMAIN as EVENT_DOMAIN,
12+
EventEntity,
13+
EventEntityDescription,
14+
)
15+
from homeassistant.const import Platform
916
from homeassistant.core import HomeAssistant, callback
1017
from homeassistant.helpers.dispatcher import async_dispatcher_connect
1118
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
1219

1320
from .const import ATTR_VALUE, DOMAIN
14-
from .discovery import ZwaveDiscoveryInfo
15-
from .entity import ZWaveBaseEntity
16-
from .models import ZwaveJSConfigEntry
21+
from .entity import NewZwaveDiscoveryInfo, ZWaveBaseEntity
22+
from .models import (
23+
NewZWaveDiscoverySchema,
24+
ZwaveJSConfigEntry,
25+
ZWaveValueDiscoverySchema,
26+
)
1727

1828
PARALLEL_UPDATES = 0
1929

2030

31+
@dataclass(frozen=True, kw_only=True)
32+
class ValueNotificationZWaveJSEntityDescription(EventEntityDescription):
33+
"""Represent a Z-Wave JS event entity description."""
34+
35+
2136
async def async_setup_entry(
2237
hass: HomeAssistant,
2338
config_entry: ZwaveJSConfigEntry,
@@ -27,11 +42,13 @@ async def async_setup_entry(
2742
client = config_entry.runtime_data.client
2843

2944
@callback
30-
def async_add_event(info: ZwaveDiscoveryInfo) -> None:
45+
def async_add_event(info: NewZwaveDiscoveryInfo) -> None:
3146
"""Add Z-Wave event entity."""
3247
driver = client.driver
3348
assert driver is not None # Driver is ready before platforms are loaded.
34-
entities: list[ZWaveBaseEntity] = [ZwaveEventEntity(config_entry, driver, info)]
49+
entities: list[ZWaveBaseEntity] = [
50+
info.entity_class(config_entry, driver, info)
51+
]
3552
async_add_entities(entities)
3653

3754
config_entry.async_on_unload(
@@ -55,7 +72,10 @@ class ZwaveEventEntity(ZWaveBaseEntity, EventEntity):
5572
"""Representation of a Z-Wave event entity."""
5673

5774
def __init__(
58-
self, config_entry: ZwaveJSConfigEntry, driver: Driver, info: ZwaveDiscoveryInfo
75+
self,
76+
config_entry: ZwaveJSConfigEntry,
77+
driver: Driver,
78+
info: NewZwaveDiscoveryInfo,
5979
) -> None:
6080
"""Initialize a ZwaveEventEntity entity."""
6181
super().__init__(config_entry, driver, info)
@@ -96,3 +116,17 @@ async def async_added_to_hass(self) -> None:
96116
lambda event: self._async_handle_event(event["value_notification"]),
97117
)
98118
)
119+
120+
121+
DISCOVERY_SCHEMAS: list[NewZWaveDiscoverySchema] = [
122+
NewZWaveDiscoverySchema(
123+
platform=Platform.EVENT,
124+
primary_value=ZWaveValueDiscoverySchema(
125+
stateful=False,
126+
),
127+
entity_description=ValueNotificationZWaveJSEntityDescription(
128+
key="value_notification",
129+
),
130+
entity_class=ZwaveEventEntity,
131+
),
132+
]

tests/components/zwave_js/test_event.py

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
import pytest
77
from zwave_js_server.event import Event
88

9-
from homeassistant.components.event import ATTR_EVENT_TYPE
10-
from homeassistant.components.zwave_js.const import ATTR_VALUE
119
from homeassistant.const import STATE_UNKNOWN, Platform
1210
from homeassistant.core import HomeAssistant
1311
from homeassistant.util import dt as dt_util
@@ -66,9 +64,12 @@ async def test_basic(
6664

6765
assert state
6866
assert state.state == dt_util.as_utc(fut).isoformat(timespec="milliseconds")
69-
attributes = state.attributes
70-
assert attributes[ATTR_EVENT_TYPE] == "Basic event value"
71-
assert attributes[ATTR_VALUE] == 255
67+
assert state.attributes == {
68+
"friendly_name": "honeywell_in_wall_smart_fan_control Event value",
69+
"event_type": "Basic event value",
70+
"event_types": ["Basic event value"],
71+
"value": 255,
72+
}
7273

7374

7475
async def test_central_scene(
@@ -128,9 +129,20 @@ async def test_central_scene(
128129

129130
assert state
130131
assert state.state == dt_util.as_utc(fut).isoformat(timespec="milliseconds")
131-
attributes = state.attributes
132-
assert attributes[ATTR_EVENT_TYPE] == "KeyReleased"
133-
assert attributes[ATTR_VALUE] == 1
132+
assert state.attributes == {
133+
"friendly_name": "Node 51 Scene 002",
134+
"event_type": "KeyReleased",
135+
"event_types": [
136+
"KeyHeldDown",
137+
"KeyPressed",
138+
"KeyPressed2x",
139+
"KeyPressed3x",
140+
"KeyPressed4x",
141+
"KeyPressed5x",
142+
"KeyReleased",
143+
],
144+
"value": 1,
145+
}
134146

135147
# Try invalid value
136148
event = Event(
@@ -178,6 +190,17 @@ async def test_central_scene(
178190

179191
assert state
180192
assert state.state == dt_util.as_utc(fut).isoformat(timespec="milliseconds")
181-
attributes = state.attributes
182-
assert attributes[ATTR_EVENT_TYPE] == "KeyReleased"
183-
assert attributes[ATTR_VALUE] == 1
193+
assert state.attributes == {
194+
"friendly_name": "Node 51 Scene 002",
195+
"event_type": "KeyReleased",
196+
"event_types": [
197+
"KeyHeldDown",
198+
"KeyPressed",
199+
"KeyPressed2x",
200+
"KeyPressed3x",
201+
"KeyPressed4x",
202+
"KeyPressed5x",
203+
"KeyReleased",
204+
],
205+
"value": 1,
206+
}

0 commit comments

Comments
 (0)