Home Assistant Unofficial Reference 2024.12.1
event.py
Go to the documentation of this file.
1 """Support for Lutron events."""
2 
3 from enum import StrEnum
4 
5 from pylutron import Button, Keypad, Lutron, LutronEvent
6 
7 from homeassistant.components.event import EventEntity
8 from homeassistant.config_entries import ConfigEntry
9 from homeassistant.const import ATTR_ID
10 from homeassistant.core import HomeAssistant, callback
11 from homeassistant.helpers.entity_platform import AddEntitiesCallback
12 from homeassistant.util import slugify
13 
14 from . import ATTR_ACTION, ATTR_FULL_ID, ATTR_UUID, DOMAIN, LutronData
15 from .entity import LutronKeypad
16 
17 
18 class LutronEventType(StrEnum):
19  """Lutron event types."""
20 
21  SINGLE_PRESS = "single_press"
22  PRESS = "press"
23  RELEASE = "release"
24 
25 
26 LEGACY_EVENT_TYPES: dict[LutronEventType, str] = {
27  LutronEventType.SINGLE_PRESS: "single",
28  LutronEventType.PRESS: "pressed",
29  LutronEventType.RELEASE: "released",
30 }
31 
32 
34  hass: HomeAssistant,
35  config_entry: ConfigEntry,
36  async_add_entities: AddEntitiesCallback,
37 ) -> None:
38  """Set up the Lutron event platform."""
39  entry_data: LutronData = hass.data[DOMAIN][config_entry.entry_id]
40 
42  LutronEventEntity(area_name, keypad, button, entry_data.client)
43  for area_name, keypad, button in entry_data.buttons
44  )
45 
46 
48  """Representation of a Lutron keypad button."""
49 
50  _attr_translation_key = "button"
51 
52  def __init__(
53  self,
54  area_name: str,
55  keypad: Keypad,
56  button: Button,
57  controller: Lutron,
58  ) -> None:
59  """Initialize the button."""
60  super().__init__(area_name, button, controller, keypad)
61  if (name := button.name) == "Unknown Button":
62  name += f" {button.number}"
63  self._attr_name_attr_name = name
64  self._has_release_event_has_release_event = (
65  button.button_type is not None and "RaiseLower" in button.button_type
66  )
67  if self._has_release_event_has_release_event:
68  self._attr_event_types_attr_event_types = [LutronEventType.PRESS, LutronEventType.RELEASE]
69  else:
70  self._attr_event_types_attr_event_types = [LutronEventType.SINGLE_PRESS]
71 
72  self._full_id_full_id = slugify(f"{area_name} {name}")
73  self._id_id = slugify(name)
74 
75  async def async_added_to_hass(self) -> None:
76  """Register callbacks."""
77  await super().async_added_to_hass()
78  self.async_on_removeasync_on_remove(self._lutron_device_lutron_device.subscribe(self.handle_eventhandle_event, None))
79 
80  @callback
82  self, button: Button, _context: None, event: LutronEvent, _params: dict
83  ) -> None:
84  """Handle received event."""
85  action: LutronEventType | None = None
86  if self._has_release_event_has_release_event:
87  if event == Button.Event.PRESSED:
88  action = LutronEventType.PRESS
89  else:
90  action = LutronEventType.RELEASE
91  elif event == Button.Event.PRESSED:
92  action = LutronEventType.SINGLE_PRESS
93 
94  if action:
95  data = {
96  ATTR_ID: self._id_id,
97  ATTR_ACTION: LEGACY_EVENT_TYPES[action],
98  ATTR_FULL_ID: self._full_id_full_id,
99  ATTR_UUID: button.uuid,
100  }
101  self.hasshass.bus.fire("lutron_event", data)
102  self._trigger_event_trigger_event(action)
103  self.schedule_update_ha_stateschedule_update_ha_state()
None _trigger_event(self, str event_type, dict[str, Any]|None event_attributes=None)
Definition: __init__.py:148
None handle_event(self, Button button, None _context, LutronEvent event, dict _params)
Definition: event.py:83
None __init__(self, str area_name, Keypad keypad, Button button, Lutron controller)
Definition: event.py:58
None async_on_remove(self, CALLBACK_TYPE func)
Definition: entity.py:1331
None schedule_update_ha_state(self, bool force_refresh=False)
Definition: entity.py:1244
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: event.py:37
Callable[[], None] subscribe(HomeAssistant hass, str topic, MessageCallbackType msg_callback, int qos=DEFAULT_QOS, str encoding="utf-8")
Definition: client.py:247