Home Assistant Unofficial Reference 2024.12.1
number.py
Go to the documentation of this file.
1 """Support for AirGradient number entities."""
2 
3 from collections.abc import Awaitable, Callable
4 from dataclasses import dataclass
5 
6 from airgradient import AirGradientClient, Config
7 from airgradient.models import ConfigurationControl
8 
10  DOMAIN as NUMBER_DOMAIN,
11  NumberEntity,
12  NumberEntityDescription,
13 )
14 from homeassistant.const import PERCENTAGE, EntityCategory
15 from homeassistant.core import HomeAssistant, callback
16 from homeassistant.helpers import entity_registry as er
17 from homeassistant.helpers.entity_platform import AddEntitiesCallback
18 
19 from . import AirGradientConfigEntry
20 from .const import DOMAIN
21 from .coordinator import AirGradientCoordinator
22 from .entity import AirGradientEntity
23 
24 
25 @dataclass(frozen=True, kw_only=True)
27  """Describes AirGradient number entity."""
28 
29  value_fn: Callable[[Config], int]
30  set_value_fn: Callable[[AirGradientClient, int], Awaitable[None]]
31 
32 
34  key="display_brightness",
35  translation_key="display_brightness",
36  entity_category=EntityCategory.CONFIG,
37  native_min_value=0,
38  native_max_value=100,
39  native_step=1,
40  native_unit_of_measurement=PERCENTAGE,
41  value_fn=lambda config: config.display_brightness,
42  set_value_fn=lambda client, value: client.set_display_brightness(value),
43 )
44 
46  key="led_bar_brightness",
47  translation_key="led_bar_brightness",
48  entity_category=EntityCategory.CONFIG,
49  native_min_value=0,
50  native_max_value=100,
51  native_step=1,
52  native_unit_of_measurement=PERCENTAGE,
53  value_fn=lambda config: config.led_bar_brightness,
54  set_value_fn=lambda client, value: client.set_led_bar_brightness(value),
55 )
56 
57 
59  hass: HomeAssistant,
60  entry: AirGradientConfigEntry,
61  async_add_entities: AddEntitiesCallback,
62 ) -> None:
63  """Set up AirGradient number entities based on a config entry."""
64 
65  coordinator = entry.runtime_data
66  model = coordinator.data.measures.model
67 
68  added_entities = False
69 
70  @callback
71  def _async_check_entities() -> None:
72  nonlocal added_entities
73 
74  if (
75  coordinator.data.config.configuration_control is ConfigurationControl.LOCAL
76  and not added_entities
77  ):
78  entities = []
79  if "I" in model:
80  entities.append(AirGradientNumber(coordinator, DISPLAY_BRIGHTNESS))
81  if "L" in model:
82  entities.append(AirGradientNumber(coordinator, LED_BAR_BRIGHTNESS))
83 
84  async_add_entities(entities)
85  added_entities = True
86  elif (
87  coordinator.data.config.configuration_control
88  is not ConfigurationControl.LOCAL
89  and added_entities
90  ):
91  entity_registry = er.async_get(hass)
92  for entity_description in (DISPLAY_BRIGHTNESS, LED_BAR_BRIGHTNESS):
93  unique_id = f"{coordinator.serial_number}-{entity_description.key}"
94  if entity_id := entity_registry.async_get_entity_id(
95  NUMBER_DOMAIN, DOMAIN, unique_id
96  ):
97  entity_registry.async_remove(entity_id)
98  added_entities = False
99 
100  coordinator.async_add_listener(_async_check_entities)
101  _async_check_entities()
102 
103 
105  """Defines an AirGradient number entity."""
106 
107  entity_description: AirGradientNumberEntityDescription
108 
109  def __init__(
110  self,
111  coordinator: AirGradientCoordinator,
112  description: AirGradientNumberEntityDescription,
113  ) -> None:
114  """Initialize AirGradient number."""
115  super().__init__(coordinator)
116  self.entity_descriptionentity_description = description
117  self._attr_unique_id_attr_unique_id = f"{coordinator.serial_number}-{description.key}"
118 
119  @property
120  def native_value(self) -> int | None:
121  """Return the state of the number."""
122  return self.entity_descriptionentity_description.value_fn(self.coordinator.data.config)
123 
124  async def async_set_native_value(self, value: float) -> None:
125  """Set the selected value."""
126  await self.entity_descriptionentity_description.set_value_fn(self.coordinator.client, int(value))
127  await self.coordinator.async_request_refresh()
None __init__(self, AirGradientCoordinator coordinator, AirGradientNumberEntityDescription description)
Definition: number.py:113
None async_setup_entry(HomeAssistant hass, AirGradientConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: number.py:62