Home Assistant Unofficial Reference 2024.12.1
button.py
Go to the documentation of this file.
1 """Support for AirGradient buttons."""
2 
3 from collections.abc import Awaitable, Callable
4 from dataclasses import dataclass
5 
6 from airgradient import AirGradientClient, ConfigurationControl
7 
9  DOMAIN as BUTTON_DOMAIN,
10  ButtonEntity,
11  ButtonEntityDescription,
12 )
13 from homeassistant.const import EntityCategory
14 from homeassistant.core import HomeAssistant, callback
15 from homeassistant.helpers import entity_registry as er
16 from homeassistant.helpers.entity_platform import AddEntitiesCallback
17 
18 from . import AirGradientConfigEntry
19 from .const import DOMAIN
20 from .coordinator import AirGradientCoordinator
21 from .entity import AirGradientEntity
22 
23 
24 @dataclass(frozen=True, kw_only=True)
26  """Describes AirGradient button entity."""
27 
28  press_fn: Callable[[AirGradientClient], Awaitable[None]]
29 
30 
32  key="co2_calibration",
33  translation_key="co2_calibration",
34  entity_category=EntityCategory.CONFIG,
35  press_fn=lambda client: client.request_co2_calibration(),
36 )
38  key="led_bar_test",
39  translation_key="led_bar_test",
40  entity_category=EntityCategory.CONFIG,
41  press_fn=lambda client: client.request_led_bar_test(),
42 )
43 
44 
46  hass: HomeAssistant,
47  entry: AirGradientConfigEntry,
48  async_add_entities: AddEntitiesCallback,
49 ) -> None:
50  """Set up AirGradient button entities based on a config entry."""
51  coordinator = entry.runtime_data
52  model = coordinator.data.measures.model
53 
54  added_entities = False
55 
56  @callback
57  def _check_entities() -> None:
58  nonlocal added_entities
59 
60  if (
61  coordinator.data.config.configuration_control is ConfigurationControl.LOCAL
62  and not added_entities
63  ):
64  entities = [AirGradientButton(coordinator, CO2_CALIBRATION)]
65  if "L" in model:
66  entities.append(AirGradientButton(coordinator, LED_BAR_TEST))
67 
68  async_add_entities(entities)
69  added_entities = True
70  elif (
71  coordinator.data.config.configuration_control
72  is not ConfigurationControl.LOCAL
73  and added_entities
74  ):
75  entity_registry = er.async_get(hass)
76  for entity_description in (CO2_CALIBRATION, LED_BAR_TEST):
77  unique_id = f"{coordinator.serial_number}-{entity_description.key}"
78  if entity_id := entity_registry.async_get_entity_id(
79  BUTTON_DOMAIN, DOMAIN, unique_id
80  ):
81  entity_registry.async_remove(entity_id)
82  added_entities = False
83 
84  coordinator.async_add_listener(_check_entities)
85  _check_entities()
86 
87 
89  """Defines an AirGradient button."""
90 
91  entity_description: AirGradientButtonEntityDescription
92 
93  def __init__(
94  self,
95  coordinator: AirGradientCoordinator,
96  description: AirGradientButtonEntityDescription,
97  ) -> None:
98  """Initialize airgradient button."""
99  super().__init__(coordinator)
100  self.entity_descriptionentity_description = description
101  self._attr_unique_id_attr_unique_id = f"{coordinator.serial_number}-{description.key}"
102 
103  async def async_press(self) -> None:
104  """Press the button."""
105  await self.entity_descriptionentity_description.press_fn(self.coordinator.client)
None __init__(self, AirGradientCoordinator coordinator, AirGradientButtonEntityDescription description)
Definition: button.py:97
None async_setup_entry(HomeAssistant hass, AirGradientConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: button.py:49