Home Assistant Unofficial Reference 2024.12.1
number.py
Go to the documentation of this file.
1 """Support for configuring different deCONZ numbers."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable, Coroutine
6 from dataclasses import dataclass
7 from typing import Any
8 
9 from pydeconz.gateway import DeconzSession
10 from pydeconz.interfaces.sensors import SensorResources
11 from pydeconz.models.event import EventType
12 from pydeconz.models.sensor import SensorBase as PydeconzSensorBase
13 from pydeconz.models.sensor.presence import Presence
14 
16  DOMAIN as NUMBER_DOMAIN,
17  NumberEntity,
18  NumberEntityDescription,
19 )
20 from homeassistant.config_entries import ConfigEntry
21 from homeassistant.const import EntityCategory
22 from homeassistant.core import HomeAssistant, callback
23 from homeassistant.helpers.entity_platform import AddEntitiesCallback
24 
25 from .entity import DeconzDevice
26 from .hub import DeconzHub
27 
28 
29 @dataclass(frozen=True, kw_only=True)
30 class DeconzNumberDescription[_T: (Presence, PydeconzSensorBase)](
31  NumberEntityDescription
32 ):
33  """Class describing deCONZ number entities."""
34 
35  instance_check: type[_T]
36  name_suffix: str
37  set_fn: Callable[[DeconzSession, str, int], Coroutine[Any, Any, dict[str, Any]]]
38  update_key: str
39  value_fn: Callable[[_T], float | None]
40 
41 
42 ENTITY_DESCRIPTIONS: tuple[DeconzNumberDescription, ...] = (
43  DeconzNumberDescription[Presence](
44  key="delay",
45  instance_check=Presence,
46  name_suffix="Delay",
47  set_fn=lambda api, id, v: api.sensors.presence.set_config(id=id, delay=v),
48  update_key="delay",
49  value_fn=lambda device: device.delay,
50  native_max_value=65535,
51  native_min_value=0,
52  native_step=1,
53  entity_category=EntityCategory.CONFIG,
54  ),
55  DeconzNumberDescription[Presence](
56  key="duration",
57  instance_check=Presence,
58  name_suffix="Duration",
59  set_fn=lambda api, id, v: api.sensors.presence.set_config(id=id, duration=v),
60  update_key="duration",
61  value_fn=lambda device: device.duration,
62  native_max_value=65535,
63  native_min_value=0,
64  native_step=1,
65  entity_category=EntityCategory.CONFIG,
66  ),
67 )
68 
69 
71  hass: HomeAssistant,
72  config_entry: ConfigEntry,
73  async_add_entities: AddEntitiesCallback,
74 ) -> None:
75  """Set up the deCONZ number entity."""
76  hub = DeconzHub.get_hub(hass, config_entry)
77  hub.entities[NUMBER_DOMAIN] = set()
78 
79  @callback
80  def async_add_sensor(_: EventType, sensor_id: str) -> None:
81  """Add sensor from deCONZ."""
82  sensor = hub.api.sensors.presence[sensor_id]
83 
84  for description in ENTITY_DESCRIPTIONS:
85  if (
86  not isinstance(sensor, description.instance_check)
87  or description.value_fn(sensor) is None
88  ):
89  continue
90  async_add_entities([DeconzNumber(sensor, hub, description)])
91 
92  hub.register_platform_add_device_callback(
93  async_add_sensor,
94  hub.api.sensors.presence,
95  always_ignore_clip_sensors=True,
96  )
97 
98 
99 class DeconzNumber(DeconzDevice[SensorResources], NumberEntity):
100  """Representation of a deCONZ number entity."""
101 
102  TYPE = NUMBER_DOMAIN
103  entity_description: DeconzNumberDescription
104 
105  def __init__(
106  self,
107  device: SensorResources,
108  hub: DeconzHub,
109  description: DeconzNumberDescription,
110  ) -> None:
111  """Initialize deCONZ number entity."""
112  self.entity_descriptionentity_description = description
113  self.unique_id_suffixunique_id_suffix = description.key
114  self._name_suffix_name_suffix = description.name_suffix
115  self._update_key_update_key = description.update_key
116  super().__init__(device, hub)
117 
118  @property
119  def native_value(self) -> float | None:
120  """Return the value of the sensor property."""
121  return self.entity_descriptionentity_description.value_fn(self._device)
122 
123  async def async_set_native_value(self, value: float) -> None:
124  """Set sensor config."""
125  await self.entity_descriptionentity_description.set_fn(
126  self.hub.api,
127  self._device.resource_id,
128  int(value),
129  )
None async_set_native_value(self, float value)
Definition: number.py:123
None __init__(self, SensorResources device, DeconzHub hub, DeconzNumberDescription description)
Definition: number.py:110
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: number.py:74