Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for WLED sensors."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable
6 from dataclasses import dataclass
7 from datetime import datetime
8 
9 from wled import Device as WLEDDevice
10 
12  SensorDeviceClass,
13  SensorEntity,
14  SensorEntityDescription,
15  SensorStateClass,
16 )
17 from homeassistant.const import (
18  PERCENTAGE,
19  SIGNAL_STRENGTH_DECIBELS_MILLIWATT,
20  EntityCategory,
21  UnitOfElectricCurrent,
22  UnitOfInformation,
23 )
24 from homeassistant.core import HomeAssistant
25 from homeassistant.helpers.entity_platform import AddEntitiesCallback
26 from homeassistant.helpers.typing import StateType
27 from homeassistant.util.dt import utcnow
28 
29 from . import WLEDConfigEntry
30 from .coordinator import WLEDDataUpdateCoordinator
31 from .entity import WLEDEntity
32 
33 
34 @dataclass(frozen=True, kw_only=True)
36  """Describes WLED sensor entity."""
37 
38  exists_fn: Callable[[WLEDDevice], bool] = lambda _: True
39  value_fn: Callable[[WLEDDevice], datetime | StateType]
40 
41 
42 SENSORS: tuple[WLEDSensorEntityDescription, ...] = (
44  key="estimated_current",
45  translation_key="estimated_current",
46  native_unit_of_measurement=UnitOfElectricCurrent.MILLIAMPERE,
47  device_class=SensorDeviceClass.CURRENT,
48  state_class=SensorStateClass.MEASUREMENT,
49  entity_category=EntityCategory.DIAGNOSTIC,
50  value_fn=lambda device: device.info.leds.power,
51  exists_fn=lambda device: bool(device.info.leds.max_power),
52  ),
54  key="info_leds_count",
55  translation_key="info_leds_count",
56  entity_category=EntityCategory.DIAGNOSTIC,
57  value_fn=lambda device: device.info.leds.count,
58  ),
60  key="info_leds_max_power",
61  translation_key="info_leds_max_power",
62  native_unit_of_measurement=UnitOfElectricCurrent.MILLIAMPERE,
63  entity_category=EntityCategory.DIAGNOSTIC,
64  device_class=SensorDeviceClass.CURRENT,
65  value_fn=lambda device: device.info.leds.max_power,
66  exists_fn=lambda device: bool(device.info.leds.max_power),
67  ),
69  key="uptime",
70  translation_key="uptime",
71  device_class=SensorDeviceClass.TIMESTAMP,
72  entity_category=EntityCategory.DIAGNOSTIC,
73  entity_registry_enabled_default=False,
74  value_fn=lambda device: (utcnow() - device.info.uptime),
75  ),
77  key="free_heap",
78  translation_key="free_heap",
79  native_unit_of_measurement=UnitOfInformation.BYTES,
80  state_class=SensorStateClass.MEASUREMENT,
81  device_class=SensorDeviceClass.DATA_SIZE,
82  entity_category=EntityCategory.DIAGNOSTIC,
83  entity_registry_enabled_default=False,
84  value_fn=lambda device: device.info.free_heap,
85  ),
87  key="wifi_signal",
88  translation_key="wifi_signal",
89  native_unit_of_measurement=PERCENTAGE,
90  state_class=SensorStateClass.MEASUREMENT,
91  entity_category=EntityCategory.DIAGNOSTIC,
92  entity_registry_enabled_default=False,
93  value_fn=lambda device: device.info.wifi.signal if device.info.wifi else None,
94  ),
96  key="wifi_rssi",
97  translation_key="wifi_rssi",
98  native_unit_of_measurement=SIGNAL_STRENGTH_DECIBELS_MILLIWATT,
99  device_class=SensorDeviceClass.SIGNAL_STRENGTH,
100  state_class=SensorStateClass.MEASUREMENT,
101  entity_category=EntityCategory.DIAGNOSTIC,
102  entity_registry_enabled_default=False,
103  value_fn=lambda device: device.info.wifi.rssi if device.info.wifi else None,
104  ),
106  key="wifi_channel",
107  translation_key="wifi_channel",
108  entity_category=EntityCategory.DIAGNOSTIC,
109  entity_registry_enabled_default=False,
110  value_fn=lambda device: device.info.wifi.channel if device.info.wifi else None,
111  ),
113  key="wifi_bssid",
114  translation_key="wifi_bssid",
115  entity_category=EntityCategory.DIAGNOSTIC,
116  entity_registry_enabled_default=False,
117  value_fn=lambda device: device.info.wifi.bssid if device.info.wifi else None,
118  ),
120  key="ip",
121  translation_key="ip",
122  entity_category=EntityCategory.DIAGNOSTIC,
123  value_fn=lambda device: device.info.ip,
124  ),
125 )
126 
127 
129  hass: HomeAssistant,
130  entry: WLEDConfigEntry,
131  async_add_entities: AddEntitiesCallback,
132 ) -> None:
133  """Set up WLED sensor based on a config entry."""
134  coordinator = entry.runtime_data
136  WLEDSensorEntity(coordinator, description)
137  for description in SENSORS
138  if description.exists_fn(coordinator.data)
139  )
140 
141 
143  """Defines a WLED sensor entity."""
144 
145  entity_description: WLEDSensorEntityDescription
146 
147  def __init__(
148  self,
149  coordinator: WLEDDataUpdateCoordinator,
150  description: WLEDSensorEntityDescription,
151  ) -> None:
152  """Initialize a WLED sensor entity."""
153  super().__init__(coordinator=coordinator)
154  self.entity_descriptionentity_description = description
155  self._attr_unique_id_attr_unique_id = f"{coordinator.data.info.mac_address}_{description.key}"
156 
157  @property
158  def native_value(self) -> datetime | StateType:
159  """Return the state of the sensor."""
160  return self.entity_descriptionentity_description.value_fn(self.coordinator.data)
None __init__(self, WLEDDataUpdateCoordinator coordinator, WLEDSensorEntityDescription description)
Definition: sensor.py:151
None async_setup_entry(HomeAssistant hass, WLEDConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:132