Home Assistant Unofficial Reference 2024.12.1
button.py
Go to the documentation of this file.
1 """Buttons for Hunter Douglas Powerview advanced features."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable
6 from dataclasses import dataclass
7 from typing import Any, Final
8 
9 from aiopvapi.helpers.constants import (
10  ATTR_NAME,
11  MOTION_CALIBRATE,
12  MOTION_FAVORITE,
13  MOTION_JOG,
14 )
15 from aiopvapi.hub import Hub
16 from aiopvapi.resources.shade import BaseShade
17 
19  ButtonDeviceClass,
20  ButtonEntity,
21  ButtonEntityDescription,
22 )
23 from homeassistant.const import EntityCategory
24 from homeassistant.core import HomeAssistant
25 from homeassistant.helpers.entity_platform import AddEntitiesCallback
26 
27 from .coordinator import PowerviewShadeUpdateCoordinator
28 from .entity import ShadeEntity
29 from .model import PowerviewConfigEntry, PowerviewDeviceInfo
30 
31 
32 @dataclass(frozen=True)
34  """Mixin to describe a Button entity."""
35 
36  press_action: Callable[[BaseShade | Hub], Any]
37  create_entity_fn: Callable[[BaseShade | Hub], bool]
38 
39 
40 @dataclass(frozen=True)
42  ButtonEntityDescription, PowerviewButtonDescriptionMixin
43 ):
44  """Class to describe a Button entity."""
45 
46 
47 BUTTONS_SHADE: Final = [
49  key="calibrate",
50  translation_key="calibrate",
51  icon="mdi:swap-vertical-circle-outline",
52  entity_category=EntityCategory.DIAGNOSTIC,
53  create_entity_fn=lambda shade: shade.is_supported(MOTION_CALIBRATE),
54  press_action=lambda shade: shade.calibrate(),
55  ),
57  key="identify",
58  device_class=ButtonDeviceClass.IDENTIFY,
59  entity_category=EntityCategory.DIAGNOSTIC,
60  create_entity_fn=lambda shade: shade.is_supported(MOTION_JOG),
61  press_action=lambda shade: shade.jog(),
62  ),
64  key="favorite",
65  translation_key="favorite",
66  icon="mdi:heart",
67  entity_category=EntityCategory.DIAGNOSTIC,
68  create_entity_fn=lambda shade: shade.is_supported(MOTION_FAVORITE),
69  press_action=lambda shade: shade.favorite(),
70  ),
71 ]
72 
73 
75  hass: HomeAssistant,
76  entry: PowerviewConfigEntry,
77  async_add_entities: AddEntitiesCallback,
78 ) -> None:
79  """Set up the hunter douglas advanced feature buttons."""
80  pv_entry = entry.runtime_data
81  entities: list[ButtonEntity] = []
82  for shade in pv_entry.shade_data.values():
83  room_name = getattr(pv_entry.room_data.get(shade.room_id), ATTR_NAME, "")
84  entities.extend(
86  pv_entry.coordinator,
87  pv_entry.device_info,
88  room_name,
89  shade,
90  shade.name,
91  description,
92  )
93  for description in BUTTONS_SHADE
94  if description.create_entity_fn(shade)
95  )
96  async_add_entities(entities)
97 
98 
100  """Representation of an advanced feature button."""
101 
102  def __init__(
103  self,
104  coordinator: PowerviewShadeUpdateCoordinator,
105  device_info: PowerviewDeviceInfo,
106  room_name: str,
107  shade: BaseShade,
108  name: str,
109  description: PowerviewButtonDescription,
110  ) -> None:
111  """Initialize the button entity."""
112  super().__init__(coordinator, device_info, room_name, shade, name)
113  self.entity_description: PowerviewButtonDescription = description
114  self._attr_unique_id_attr_unique_id_attr_unique_id = f"{self._attr_unique_id}_{description.key}"
115 
116  async def async_press(self) -> None:
117  """Handle the button press."""
118  async with self.coordinator.radio_operation_lock:
119  await self.entity_description.press_action(self._shade_shade)
None __init__(self, PowerviewShadeUpdateCoordinator coordinator, PowerviewDeviceInfo device_info, str room_name, BaseShade shade, str name, PowerviewButtonDescription description)
Definition: button.py:110
None async_setup_entry(HomeAssistant hass, PowerviewConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: button.py:78