Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Representation of Idasen Desk sensors."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable
6 from dataclasses import dataclass
7 from typing import Any
8 
9 from homeassistant import config_entries
11  SensorDeviceClass,
12  SensorEntity,
13  SensorEntityDescription,
14  SensorStateClass,
15 )
16 from homeassistant.const import UnitOfLength
17 from homeassistant.core import HomeAssistant, callback
18 from homeassistant.helpers.device_registry import DeviceInfo
19 from homeassistant.helpers.entity_platform import AddEntitiesCallback
20 from homeassistant.helpers.update_coordinator import CoordinatorEntity
21 
22 from . import DeskData, IdasenDeskCoordinator
23 from .const import DOMAIN
24 
25 
26 @dataclass(frozen=True, kw_only=True)
28  """Class describing IdasenDesk sensor entities."""
29 
30  value_fn: Callable[[IdasenDeskCoordinator], float | None]
31 
32 
33 SENSORS = (
35  key="height",
36  translation_key="height",
37  native_unit_of_measurement=UnitOfLength.METERS,
38  device_class=SensorDeviceClass.DISTANCE,
39  state_class=SensorStateClass.MEASUREMENT,
40  entity_registry_enabled_default=False,
41  suggested_display_precision=3,
42  value_fn=lambda coordinator: coordinator.desk.height,
43  ),
44 )
45 
46 
48  hass: HomeAssistant,
50  async_add_entities: AddEntitiesCallback,
51 ) -> None:
52  """Set up Idasen Desk sensors."""
53  data: DeskData = hass.data[DOMAIN][entry.entry_id]
56  data.address, data.device_info, data.coordinator, sensor_description
57  )
58  for sensor_description in SENSORS
59  )
60 
61 
62 class IdasenDeskSensor(CoordinatorEntity[IdasenDeskCoordinator], SensorEntity):
63  """IdasenDesk sensor."""
64 
65  entity_description: IdasenDeskSensorDescription
66  _attr_has_entity_name = True
67 
68  def __init__(
69  self,
70  address: str,
71  device_info: DeviceInfo,
72  coordinator: IdasenDeskCoordinator,
73  description: IdasenDeskSensorDescription,
74  ) -> None:
75  """Initialize the IdasenDesk sensor entity."""
76  super().__init__(coordinator)
77  self.entity_descriptionentity_description = description
78 
79  self._attr_unique_id_attr_unique_id = f"{description.key}-{address}"
80  self._attr_device_info_attr_device_info = device_info
81  self._address_address = address
82  self._desk_desk = coordinator.desk
83 
84  async def async_added_to_hass(self) -> None:
85  """When entity is added to hass."""
86  await super().async_added_to_hass()
87  self._update_native_value_update_native_value()
88 
89  @property
90  def available(self) -> bool:
91  """Return True if entity is available."""
92  return super().available and self._desk_desk.is_connected is True
93 
94  @callback
95  def _handle_coordinator_update(self, *args: Any) -> None:
96  """Handle data update."""
97  self._update_native_value_update_native_value()
99 
100  def _update_native_value(self) -> None:
101  """Update the native value attribute."""
102  self._attr_native_value_attr_native_value = self.entity_descriptionentity_description.value_fn(self.coordinator)
None __init__(self, str address, DeviceInfo device_info, IdasenDeskCoordinator coordinator, IdasenDeskSensorDescription description)
Definition: sensor.py:74
None async_setup_entry(HomeAssistant hass, config_entries.ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:51