1
0
mirror of https://github.com/home-assistant/core.git synced 2026-08-06 21:35:13 +01:00
Files
core/homeassistant/components/wled/sensor.py
T
2026-06-22 20:51:13 +02:00

163 lines
5.6 KiB
Python

"""Support for WLED sensors."""
from collections.abc import Callable
from dataclasses import dataclass
from datetime import datetime
from typing import override
from wled import Device as WLEDDevice
from homeassistant.components.sensor import (
SensorDeviceClass,
SensorEntity,
SensorEntityDescription,
SensorStateClass,
)
from homeassistant.const import (
PERCENTAGE,
SIGNAL_STRENGTH_DECIBELS_MILLIWATT,
EntityCategory,
UnitOfElectricCurrent,
UnitOfInformation,
)
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from homeassistant.helpers.typing import StateType
from homeassistant.util.dt import utcnow
from .coordinator import WLEDConfigEntry, WLEDDataUpdateCoordinator
from .entity import WLEDEntity
# Coordinator is used to centralize the data updates
PARALLEL_UPDATES = 0
@dataclass(frozen=True, kw_only=True)
class WLEDSensorEntityDescription(SensorEntityDescription):
"""Describes WLED sensor entity."""
exists_fn: Callable[[WLEDDevice], bool] = lambda _: True
value_fn: Callable[[WLEDDevice], datetime | StateType]
SENSORS: tuple[WLEDSensorEntityDescription, ...] = (
WLEDSensorEntityDescription(
key="estimated_current",
translation_key="estimated_current",
native_unit_of_measurement=UnitOfElectricCurrent.MILLIAMPERE,
device_class=SensorDeviceClass.CURRENT,
state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.DIAGNOSTIC,
value_fn=lambda device: device.info.leds.power,
exists_fn=lambda device: bool(device.info.leds.max_power),
),
WLEDSensorEntityDescription(
key="info_leds_count",
translation_key="info_leds_count",
entity_category=EntityCategory.DIAGNOSTIC,
value_fn=lambda device: device.info.leds.count,
),
WLEDSensorEntityDescription(
key="info_leds_max_power",
translation_key="info_leds_max_power",
native_unit_of_measurement=UnitOfElectricCurrent.MILLIAMPERE,
entity_category=EntityCategory.DIAGNOSTIC,
device_class=SensorDeviceClass.CURRENT,
value_fn=lambda device: device.info.leds.max_power,
exists_fn=lambda device: bool(device.info.leds.max_power),
),
WLEDSensorEntityDescription(
key="uptime",
translation_key="uptime",
device_class=SensorDeviceClass.UPTIME,
entity_category=EntityCategory.DIAGNOSTIC,
entity_registry_enabled_default=False,
value_fn=lambda device: utcnow() - device.info.uptime,
),
WLEDSensorEntityDescription(
key="free_heap",
translation_key="free_heap",
native_unit_of_measurement=UnitOfInformation.BYTES,
state_class=SensorStateClass.MEASUREMENT,
device_class=SensorDeviceClass.DATA_SIZE,
entity_category=EntityCategory.DIAGNOSTIC,
entity_registry_enabled_default=False,
value_fn=lambda device: device.info.free_heap,
),
WLEDSensorEntityDescription(
key="wifi_signal",
translation_key="wifi_signal",
native_unit_of_measurement=PERCENTAGE,
state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.DIAGNOSTIC,
entity_registry_enabled_default=False,
value_fn=lambda device: device.info.wifi.signal if device.info.wifi else None,
),
WLEDSensorEntityDescription(
key="wifi_rssi",
translation_key="wifi_rssi",
native_unit_of_measurement=SIGNAL_STRENGTH_DECIBELS_MILLIWATT,
device_class=SensorDeviceClass.SIGNAL_STRENGTH,
state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.DIAGNOSTIC,
entity_registry_enabled_default=False,
value_fn=lambda device: device.info.wifi.rssi if device.info.wifi else None,
),
WLEDSensorEntityDescription(
key="wifi_channel",
translation_key="wifi_channel",
entity_category=EntityCategory.DIAGNOSTIC,
entity_registry_enabled_default=False,
value_fn=lambda device: device.info.wifi.channel if device.info.wifi else None,
),
WLEDSensorEntityDescription(
key="wifi_bssid",
translation_key="wifi_bssid",
entity_category=EntityCategory.DIAGNOSTIC,
entity_registry_enabled_default=False,
value_fn=lambda device: device.info.wifi.bssid if device.info.wifi else None,
),
WLEDSensorEntityDescription(
key="ip",
translation_key="ip",
entity_category=EntityCategory.DIAGNOSTIC,
value_fn=lambda device: device.info.ip,
),
)
async def async_setup_entry(
hass: HomeAssistant,
entry: WLEDConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback,
) -> None:
"""Set up WLED sensor based on a config entry."""
coordinator = entry.runtime_data
async_add_entities(
WLEDSensorEntity(coordinator, description)
for description in SENSORS
if description.exists_fn(coordinator.data)
)
class WLEDSensorEntity(WLEDEntity, SensorEntity):
"""Defines a WLED sensor entity."""
entity_description: WLEDSensorEntityDescription
def __init__(
self,
coordinator: WLEDDataUpdateCoordinator,
description: WLEDSensorEntityDescription,
) -> None:
"""Initialize a WLED sensor entity."""
super().__init__(coordinator=coordinator)
self.entity_description = description
self._attr_unique_id = f"{coordinator.data.info.mac_address}_{description.key}"
@property
@override
def native_value(self) -> datetime | StateType:
"""Return the state of the sensor."""
return self.entity_description.value_fn(self.coordinator.data)