Files
core/homeassistant/components/droplet/binary_sensor.py
T

98 lines
3.1 KiB
Python

"""Support for Droplet binary sensors."""
from collections.abc import Callable
from dataclasses import dataclass
from typing import override
from pydroplet.droplet import Droplet
from homeassistant.components.binary_sensor import (
BinarySensorDeviceClass,
BinarySensorEntity,
BinarySensorEntityDescription,
)
from homeassistant.core import HomeAssistant
from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from .const import DOMAIN, KEY_HIGH_FLOW, KEY_UNUSUAL_FLOW
from .coordinator import DropletConfigEntry, DropletDataCoordinator
PARALLEL_UPDATES = 0
@dataclass(kw_only=True, frozen=True)
class DropletBinarySensorEntityDescription(BinarySensorEntityDescription):
"""Describes Droplet binary sensor entity."""
value_fn: Callable[[Droplet], bool | None]
BINARY_SENSORS: list[DropletBinarySensorEntityDescription] = [
DropletBinarySensorEntityDescription(
key=KEY_UNUSUAL_FLOW,
translation_key=KEY_UNUSUAL_FLOW,
device_class=BinarySensorDeviceClass.PROBLEM,
value_fn=lambda device: device.get_low_leak(),
),
DropletBinarySensorEntityDescription(
key=KEY_HIGH_FLOW,
translation_key=KEY_HIGH_FLOW,
device_class=BinarySensorDeviceClass.PROBLEM,
value_fn=lambda device: device.get_high_leak(),
),
]
async def async_setup_entry(
hass: HomeAssistant,
config_entry: DropletConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback,
) -> None:
"""Set up the Droplet binary sensors from config entry."""
coordinator = config_entry.runtime_data
async_add_entities(
[DropletBinarySensor(coordinator, sensor) for sensor in BINARY_SENSORS]
)
class DropletBinarySensor(
CoordinatorEntity[DropletDataCoordinator], BinarySensorEntity
):
"""Representation of a Droplet binary sensor."""
entity_description: DropletBinarySensorEntityDescription
_attr_has_entity_name = True
def __init__(
self,
coordinator: DropletDataCoordinator,
entity_description: DropletBinarySensorEntityDescription,
) -> None:
"""Initialize the sensor."""
super().__init__(coordinator)
self.entity_description = entity_description
unique_id = coordinator.config_entry.unique_id
self._attr_unique_id = f"{unique_id}_{entity_description.key}"
self._attr_device_info = DeviceInfo(
identifiers={(DOMAIN, self.coordinator.unique_id)},
manufacturer=self.coordinator.droplet.get_manufacturer(),
model=self.coordinator.droplet.get_model(),
sw_version=self.coordinator.droplet.get_fw_version(),
serial_number=self.coordinator.droplet.get_sn(),
)
@property
@override
def available(self) -> bool:
"""Get Droplet's availability."""
return self.coordinator.get_availability()
@property
@override
def is_on(self) -> bool | None:
"""Return the state of the binary sensor."""
return self.entity_description.value_fn(self.coordinator.droplet)