Home Assistant Unofficial Reference 2024.12.1
button.py
Go to the documentation of this file.
1 """Support for Overkiz (virtual) buttons."""
2 
3 from __future__ import annotations
4 
5 from dataclasses import dataclass
6 
7 from pyoverkiz.enums import OverkizCommand
8 from pyoverkiz.types import StateType as OverkizStateType
9 
10 from homeassistant.components.button import ButtonEntity, ButtonEntityDescription
11 from homeassistant.config_entries import ConfigEntry
12 from homeassistant.const import EntityCategory
13 from homeassistant.core import HomeAssistant
14 from homeassistant.helpers.entity_platform import AddEntitiesCallback
15 
16 from . import HomeAssistantOverkizData
17 from .const import DOMAIN, IGNORED_OVERKIZ_DEVICES
18 from .entity import OverkizDescriptiveEntity
19 
20 
21 @dataclass(frozen=True)
23  """Class to describe an Overkiz button."""
24 
25  press_args: OverkizStateType | None = None
26 
27 
28 BUTTON_DESCRIPTIONS: list[OverkizButtonDescription] = [
29  # My Position (cover, light)
31  key="my",
32  name="My position",
33  icon="mdi:star",
34  ),
35  # Identify
37  key="identify", # startIdentify and identify are reversed... Swap this when fixed in API.
38  name="Start identify",
39  icon="mdi:human-greeting-variant",
40  entity_category=EntityCategory.DIAGNOSTIC,
41  entity_registry_enabled_default=False,
42  ),
44  key="stopIdentify",
45  name="Stop identify",
46  icon="mdi:human-greeting-variant",
47  entity_category=EntityCategory.DIAGNOSTIC,
48  entity_registry_enabled_default=False,
49  ),
51  key="startIdentify", # startIdentify and identify are reversed... Swap this when fixed in API.
52  name="Identify",
53  icon="mdi:human-greeting-variant",
54  entity_category=EntityCategory.DIAGNOSTIC,
55  ),
56  # RTDIndoorSiren / RTDOutdoorSiren
57  OverkizButtonDescription(key="dingDong", name="Ding dong", icon="mdi:bell-ring"),
58  OverkizButtonDescription(key="bip", name="Bip", icon="mdi:bell-ring"),
60  key="fastBipSequence", name="Fast bip sequence", icon="mdi:bell-ring"
61  ),
62  OverkizButtonDescription(key="ring", name="Ring", icon="mdi:bell-ring"),
63  # DynamicScreen (ogp:blind) uses goToAlias (id 1: favorite1) instead of 'my'
65  key="goToAlias",
66  press_args="1",
67  name="My position",
68  icon="mdi:star",
69  ),
71  key=OverkizCommand.CYCLE,
72  name="Toggle",
73  icon="mdi:sync",
74  ),
75 ]
76 
77 SUPPORTED_COMMANDS = {
78  description.key: description for description in BUTTON_DESCRIPTIONS
79 }
80 
81 
83  hass: HomeAssistant,
84  entry: ConfigEntry,
85  async_add_entities: AddEntitiesCallback,
86 ) -> None:
87  """Set up the Overkiz button from a config entry."""
88  data: HomeAssistantOverkizData = hass.data[DOMAIN][entry.entry_id]
89  entities: list[ButtonEntity] = []
90 
91  for device in data.coordinator.data.values():
92  if (
93  device.widget in IGNORED_OVERKIZ_DEVICES
94  or device.ui_class in IGNORED_OVERKIZ_DEVICES
95  ):
96  continue
97 
98  entities.extend(
100  device.device_url,
101  data.coordinator,
102  description,
103  )
104  for command in device.definition.commands
105  if (description := SUPPORTED_COMMANDS.get(command.command_name))
106  )
107 
108  async_add_entities(entities)
109 
110 
112  """Representation of an Overkiz Button."""
113 
114  entity_description: OverkizButtonDescription
115 
116  async def async_press(self) -> None:
117  """Handle the button press."""
118  if self.entity_descriptionentity_description.press_args:
119  await self.executorexecutor.async_execute_command(
120  self.entity_descriptionentity_description.key, self.entity_descriptionentity_description.press_args
121  )
122  return
123 
124  await self.executorexecutor.async_execute_command(self.entity_descriptionentity_description.key)
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: button.py:86