Home Assistant Unofficial Reference 2024.12.1
button.py
Go to the documentation of this file.
1 """Support for Elgato button."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Awaitable, Callable
6 from dataclasses import dataclass
7 from typing import Any
8 
9 from elgato import Elgato, ElgatoError
10 
12  ButtonDeviceClass,
13  ButtonEntity,
14  ButtonEntityDescription,
15 )
16 from homeassistant.const import EntityCategory
17 from homeassistant.core import HomeAssistant
18 from homeassistant.exceptions import HomeAssistantError
19 from homeassistant.helpers.entity_platform import AddEntitiesCallback
20 
21 from . import ElgatorConfigEntry
22 from .coordinator import ElgatoDataUpdateCoordinator
23 from .entity import ElgatoEntity
24 
25 
26 @dataclass(frozen=True, kw_only=True)
28  """Class describing Elgato button entities."""
29 
30  press_fn: Callable[[Elgato], Awaitable[Any]]
31 
32 
33 BUTTONS = [
35  key="identify",
36  device_class=ButtonDeviceClass.IDENTIFY,
37  entity_category=EntityCategory.CONFIG,
38  press_fn=lambda client: client.identify(),
39  ),
41  key="restart",
42  device_class=ButtonDeviceClass.RESTART,
43  entity_category=EntityCategory.CONFIG,
44  press_fn=lambda client: client.restart(),
45  ),
46 ]
47 
48 
50  hass: HomeAssistant,
51  entry: ElgatorConfigEntry,
52  async_add_entities: AddEntitiesCallback,
53 ) -> None:
54  """Set up Elgato button based on a config entry."""
55  coordinator = entry.runtime_data
58  coordinator=coordinator,
59  description=description,
60  )
61  for description in BUTTONS
62  )
63 
64 
66  """Defines an Elgato button."""
67 
68  entity_description: ElgatoButtonEntityDescription
69 
70  def __init__(
71  self,
72  coordinator: ElgatoDataUpdateCoordinator,
73  description: ElgatoButtonEntityDescription,
74  ) -> None:
75  """Initialize the button entity."""
76  super().__init__(coordinator=coordinator)
77  self.entity_descriptionentity_description = description
78  self._attr_unique_id_attr_unique_id = (
79  f"{coordinator.data.info.serial_number}_{description.key}"
80  )
81 
82  async def async_press(self) -> None:
83  """Trigger button press on the Elgato device."""
84  try:
85  await self.entity_descriptionentity_description.press_fn(self.coordinator.client)
86  except ElgatoError as error:
87  raise HomeAssistantError(
88  "An error occurred while communicating with the Elgato Light"
89  ) from error
None __init__(self, ElgatoDataUpdateCoordinator coordinator, ElgatoButtonEntityDescription description)
Definition: button.py:74
None async_setup_entry(HomeAssistant hass, ElgatorConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: button.py:53