core/homeassistant/components/osoenergy/binary_sensor.py

92 lines
2.9 KiB
Python
Raw Normal View History

"""Support for OSO Energy binary sensors."""
from collections.abc import Callable
from dataclasses import dataclass
from apyosoenergyapi import OSOEnergy
from apyosoenergyapi.helper.const import OSOEnergyBinarySensorData
from homeassistant.components.binary_sensor import (
BinarySensorEntity,
BinarySensorEntityDescription,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .const import DOMAIN
from .entity import OSOEnergyEntity
@dataclass(frozen=True, kw_only=True)
class OSOEnergyBinarySensorEntityDescription(BinarySensorEntityDescription):
"""Class describing OSO Energy heater binary sensor entities."""
value_fn: Callable[[OSOEnergy], bool]
SENSOR_TYPES: dict[str, OSOEnergyBinarySensorEntityDescription] = {
"power_save": OSOEnergyBinarySensorEntityDescription(
key="power_save",
translation_key="power_save",
value_fn=lambda entity_data: entity_data.state,
),
"extra_energy": OSOEnergyBinarySensorEntityDescription(
key="extra_energy",
translation_key="extra_energy",
value_fn=lambda entity_data: entity_data.state,
),
"heater_state": OSOEnergyBinarySensorEntityDescription(
key="heating",
translation_key="heating",
value_fn=lambda entity_data: entity_data.state,
),
}
async def async_setup_entry(
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
) -> None:
"""Set up OSO Energy binary sensor."""
osoenergy: OSOEnergy = hass.data[DOMAIN][entry.entry_id]
entities = [
OSOEnergyBinarySensor(osoenergy, sensor_type, dev)
for dev in osoenergy.session.device_list.get("binary_sensor", [])
if (sensor_type := SENSOR_TYPES.get(dev.osoEnergyType.lower()))
]
async_add_entities(entities, True)
class OSOEnergyBinarySensor(
OSOEnergyEntity[OSOEnergyBinarySensorData], BinarySensorEntity
):
"""OSO Energy Sensor Entity."""
entity_description: OSOEnergyBinarySensorEntityDescription
def __init__(
self,
instance: OSOEnergy,
description: OSOEnergyBinarySensorEntityDescription,
entity_data: OSOEnergyBinarySensorData,
) -> None:
"""Set up OSO Energy binary sensor."""
super().__init__(instance, entity_data)
device_id = entity_data.device_id
self._attr_unique_id = f"{device_id}_{description.key}"
self.entity_description = description
@property
def is_on(self) -> bool | None:
"""Return the state of the sensor."""
return self.entity_description.value_fn(self.entity_data)
async def async_update(self) -> None:
"""Update all data for OSO Energy."""
await self.osoenergy.session.update_data()
self.entity_data = await self.osoenergy.binary_sensor.get_sensor(
self.entity_data
)