core/homeassistant/components/technove/sensor.py

151 lines
5.2 KiB
Python

"""Platform for sensor integration."""
from __future__ import annotations
from collections.abc import Callable
from dataclasses import dataclass
from technove import Station as TechnoVEStation, Status
from homeassistant.components.sensor import (
SensorDeviceClass,
SensorEntity,
SensorEntityDescription,
SensorStateClass,
)
from homeassistant.const import (
SIGNAL_STRENGTH_DECIBELS_MILLIWATT,
EntityCategory,
UnitOfElectricCurrent,
UnitOfElectricPotential,
UnitOfEnergy,
)
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import StateType
from . import TechnoVEConfigEntry
from .coordinator import TechnoVEDataUpdateCoordinator
from .entity import TechnoVEEntity
STATUS_TYPE = [s.value for s in Status if s != Status.UNKNOWN]
@dataclass(frozen=True, kw_only=True)
class TechnoVESensorEntityDescription(SensorEntityDescription):
"""Describes TechnoVE sensor entity."""
value_fn: Callable[[TechnoVEStation], StateType]
SENSORS: tuple[TechnoVESensorEntityDescription, ...] = (
TechnoVESensorEntityDescription(
key="voltage_in",
translation_key="voltage_in",
native_unit_of_measurement=UnitOfElectricPotential.VOLT,
device_class=SensorDeviceClass.VOLTAGE,
state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.DIAGNOSTIC,
value_fn=lambda station: station.info.voltage_in,
),
TechnoVESensorEntityDescription(
key="voltage_out",
translation_key="voltage_out",
native_unit_of_measurement=UnitOfElectricPotential.VOLT,
device_class=SensorDeviceClass.VOLTAGE,
state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.DIAGNOSTIC,
value_fn=lambda station: station.info.voltage_out,
),
TechnoVESensorEntityDescription(
key="max_station_current",
translation_key="max_station_current",
native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
device_class=SensorDeviceClass.CURRENT,
state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.DIAGNOSTIC,
value_fn=lambda station: station.info.max_station_current,
),
TechnoVESensorEntityDescription(
key="current",
native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
device_class=SensorDeviceClass.CURRENT,
state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.DIAGNOSTIC,
value_fn=lambda station: station.info.current,
),
TechnoVESensorEntityDescription(
key="energy_total",
translation_key="energy_total",
native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
device_class=SensorDeviceClass.ENERGY,
state_class=SensorStateClass.TOTAL,
entity_category=EntityCategory.DIAGNOSTIC,
value_fn=lambda station: station.info.energy_total,
),
TechnoVESensorEntityDescription(
key="energy_session",
translation_key="energy_session",
native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
device_class=SensorDeviceClass.ENERGY,
state_class=SensorStateClass.TOTAL_INCREASING,
entity_category=EntityCategory.DIAGNOSTIC,
value_fn=lambda station: station.info.energy_session,
),
TechnoVESensorEntityDescription(
key="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 station: station.info.rssi,
),
TechnoVESensorEntityDescription(
key="ssid",
translation_key="ssid",
entity_category=EntityCategory.DIAGNOSTIC,
entity_registry_enabled_default=False,
value_fn=lambda station: station.info.network_ssid,
),
TechnoVESensorEntityDescription(
key="status",
translation_key="status",
device_class=SensorDeviceClass.ENUM,
options=STATUS_TYPE,
entity_category=EntityCategory.DIAGNOSTIC,
value_fn=lambda station: station.info.status.value,
),
)
async def async_setup_entry(
hass: HomeAssistant,
entry: TechnoVEConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up the sensor platform."""
async_add_entities(
TechnoVESensorEntity(entry.runtime_data, description) for description in SENSORS
)
class TechnoVESensorEntity(TechnoVEEntity, SensorEntity):
"""Defines a TechnoVE sensor entity."""
entity_description: TechnoVESensorEntityDescription
def __init__(
self,
coordinator: TechnoVEDataUpdateCoordinator,
description: TechnoVESensorEntityDescription,
) -> None:
"""Initialize a TechnoVE sensor entity."""
super().__init__(coordinator, description.key)
self.entity_description = description
@property
def native_value(self) -> StateType:
"""Return the state of the sensor."""
return self.entity_description.value_fn(self.coordinator.data)