Home Assistant Unofficial Reference 2024.12.1
event.py
Go to the documentation of this file.
1 """Support for Z-Wave controls using the event platform."""
2 
3 from __future__ import annotations
4 
5 from zwave_js_server.client import Client as ZwaveClient
6 from zwave_js_server.model.driver import Driver
7 from zwave_js_server.model.value import Value, ValueNotification
8 
9 from homeassistant.components.event import DOMAIN as EVENT_DOMAIN, EventEntity
10 from homeassistant.config_entries import ConfigEntry
11 from homeassistant.core import HomeAssistant, callback
12 from homeassistant.helpers.dispatcher import async_dispatcher_connect
13 from homeassistant.helpers.entity_platform import AddEntitiesCallback
14 
15 from .const import ATTR_VALUE, DATA_CLIENT, DOMAIN
16 from .discovery import ZwaveDiscoveryInfo
17 from .entity import ZWaveBaseEntity
18 
19 PARALLEL_UPDATES = 0
20 
21 
23  hass: HomeAssistant,
24  config_entry: ConfigEntry,
25  async_add_entities: AddEntitiesCallback,
26 ) -> None:
27  """Set up Z-Wave Event entity from Config Entry."""
28  client: ZwaveClient = config_entry.runtime_data[DATA_CLIENT]
29 
30  @callback
31  def async_add_event(info: ZwaveDiscoveryInfo) -> None:
32  """Add Z-Wave event entity."""
33  driver = client.driver
34  assert driver is not None # Driver is ready before platforms are loaded.
35  entities: list[ZWaveBaseEntity] = [ZwaveEventEntity(config_entry, driver, info)]
36  async_add_entities(entities)
37 
38  config_entry.async_on_unload(
40  hass,
41  f"{DOMAIN}_{config_entry.entry_id}_add_{EVENT_DOMAIN}",
42  async_add_event,
43  )
44  )
45 
46 
47 def _cc_and_label(value: Value) -> str:
48  """Return a string with the command class and label."""
49  label = value.metadata.label
50  if label:
51  label = label.lower()
52  return f"{value.command_class_name.capitalize()} {label}".strip()
53 
54 
55 class ZwaveEventEntity(ZWaveBaseEntity, EventEntity):
56  """Representation of a Z-Wave event entity."""
57 
58  def __init__(
59  self, config_entry: ConfigEntry, driver: Driver, info: ZwaveDiscoveryInfo
60  ) -> None:
61  """Initialize a ZwaveEventEntity entity."""
62  super().__init__(config_entry, driver, info)
63  value = self.valuevalue = info.primary_value
64  self.statesstates: dict[int, str] = {}
65 
66  if states := value.metadata.states:
67  self._attr_event_types_attr_event_types = sorted(states.values())
68  self.statesstates = {int(k): v for k, v in states.items()}
69  else:
70  self._attr_event_types_attr_event_types = [_cc_and_label(value)]
71  # Entity class attributes
72  self._attr_name_attr_name_attr_name = self.generate_namegenerate_name(include_value_name=True)
73 
74  @callback
75  def _async_handle_event(self, value_notification: ValueNotification) -> None:
76  """Handle a value notification event."""
77  # If the notification doesn't match the value we are tracking, we can return
78  value = self.valuevalue
79  if (
80  value_notification.command_class != value.command_class
81  or value_notification.endpoint != value.endpoint
82  or value_notification.property_ != value.property_
83  or value_notification.property_key != value.property_key
84  or (notification_value := value_notification.value) is None
85  ):
86  return
87  event_name = self.statesstates.get(notification_value, _cc_and_label(value))
88  self._trigger_event(event_name, {ATTR_VALUE: notification_value})
89  self.async_write_ha_stateasync_write_ha_state()
90 
91  async def async_added_to_hass(self) -> None:
92  """Call when entity is added."""
93  await super().async_added_to_hass()
94  self.async_on_removeasync_on_remove(
95  self.infoinfo.node.on(
96  "value notification",
97  lambda event: self._async_handle_event_async_handle_event(event["value_notification"]),
98  )
99  )
str generate_name(self, bool include_value_name=False, str|None alternate_value_name=None, Sequence[str|None]|None additional_info=None, str|None name_prefix=None)
Definition: entity.py:163
None __init__(self, ConfigEntry config_entry, Driver driver, ZwaveDiscoveryInfo info)
Definition: event.py:60
None _async_handle_event(self, ValueNotification value_notification)
Definition: event.py:75
None async_on_remove(self, CALLBACK_TYPE func)
Definition: entity.py:1331
web.Response get(self, web.Request request, str config_key)
Definition: view.py:88
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: event.py:26
Callable[[], None] async_dispatcher_connect(HomeAssistant hass, str signal, Callable[..., Any] target)
Definition: dispatcher.py:103