mirror of
https://github.com/home-assistant/core.git
synced 2026-05-08 17:49:37 +01:00
Migrate Z-Wave event entity to new discovery schema (#156320)
This commit is contained in:
@@ -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(
|
||||
|
||||
@@ -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,
|
||||
),
|
||||
]
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user