core/homeassistant/components/snoo/sensor.py

72 lines
2.0 KiB
Python

"""Support for Snoo Sensors."""
from __future__ import annotations
from collections.abc import Callable
from dataclasses import dataclass
from python_snoo.containers import SnooData, SnooStates
from homeassistant.components.sensor import (
EntityCategory,
SensorDeviceClass,
SensorEntity,
SensorEntityDescription,
StateType,
)
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from .coordinator import SnooConfigEntry
from .entity import SnooDescriptionEntity
@dataclass(frozen=True, kw_only=True)
class SnooSensorEntityDescription(SensorEntityDescription):
"""Describes a Snoo sensor."""
value_fn: Callable[[SnooData], StateType]
SENSOR_DESCRIPTIONS: list[SnooSensorEntityDescription] = [
SnooSensorEntityDescription(
key="state",
translation_key="state",
value_fn=lambda data: data.state_machine.state.name,
device_class=SensorDeviceClass.ENUM,
options=[e.name for e in SnooStates],
),
SnooSensorEntityDescription(
key="time_left",
translation_key="time_left",
value_fn=lambda data: data.state_machine.time_left_timestamp,
device_class=SensorDeviceClass.TIMESTAMP,
entity_category=EntityCategory.DIAGNOSTIC,
),
]
async def async_setup_entry(
hass: HomeAssistant,
entry: SnooConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback,
) -> None:
"""Set up Snoo device."""
coordinators = entry.runtime_data
async_add_entities(
SnooSensor(coordinator, description)
for coordinator in coordinators.values()
for description in SENSOR_DESCRIPTIONS
)
class SnooSensor(SnooDescriptionEntity, SensorEntity):
"""A sensor using Snoo coordinator."""
entity_description: SnooSensorEntityDescription
@property
def native_value(self) -> StateType:
"""Return the value reported by the sensor."""
return self.entity_description.value_fn(self.coordinator.data)