From a73a66bb0c8ce213850beae29a5b212e6be14edf Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Thu, 4 May 2023 13:54:57 +0200 Subject: [PATCH] Add entity descriptions to binary sensors of Rituals Perfume Genie (#92485) --- .../rituals_perfume_genie/binary_sensor.py | 62 +++++++++++++++---- 1 file changed, 50 insertions(+), 12 deletions(-) diff --git a/homeassistant/components/rituals_perfume_genie/binary_sensor.py b/homeassistant/components/rituals_perfume_genie/binary_sensor.py index 77fae53778c18..37d60522dea69 100644 --- a/homeassistant/components/rituals_perfume_genie/binary_sensor.py +++ b/homeassistant/components/rituals_perfume_genie/binary_sensor.py @@ -1,9 +1,15 @@ """Support for Rituals Perfume Genie binary sensors.""" from __future__ import annotations +from collections.abc import Callable +from dataclasses import dataclass + +from pyrituals import Diffuser + from homeassistant.components.binary_sensor import ( BinarySensorDeviceClass, BinarySensorEntity, + BinarySensorEntityDescription, ) from homeassistant.config_entries import ConfigEntry from homeassistant.const import EntityCategory @@ -15,6 +21,33 @@ from .entity import DiffuserEntity +@dataclass +class RitualsentityDescriptionMixin: + """Mixin values for Rituals entities.""" + + is_on_fn: Callable[[Diffuser], bool] + has_fn: Callable[[Diffuser], bool] + + +@dataclass +class RitualsBinarySensorEntityDescription( + BinarySensorEntityDescription, RitualsentityDescriptionMixin +): + """Class describing Rituals binary sensor entities.""" + + +ENTITY_DESCRIPTIONS = ( + RitualsBinarySensorEntityDescription( + key="charging", + name="Battery Charging", + device_class=BinarySensorDeviceClass.BATTERY_CHARGING, + entity_category=EntityCategory.DIAGNOSTIC, + is_on_fn=lambda diffuser: diffuser.charging, + has_fn=lambda diffuser: diffuser.has_battery, + ), +) + + async def async_setup_entry( hass: HomeAssistant, config_entry: ConfigEntry, @@ -26,25 +59,30 @@ async def async_setup_entry( ] async_add_entities( - DiffuserBatteryChargingBinarySensor(coordinator) + RitualsBinarySensorEntity(coordinator, description) for coordinator in coordinators.values() - if coordinator.diffuser.has_battery + for description in ENTITY_DESCRIPTIONS + if description.has_fn(coordinator.diffuser) ) -class DiffuserBatteryChargingBinarySensor(DiffuserEntity, BinarySensorEntity): - """Representation of a diffuser battery charging binary sensor.""" +class RitualsBinarySensorEntity(DiffuserEntity, BinarySensorEntity): + """Defines a Rituals binary sensor entity.""" - _attr_device_class = BinarySensorDeviceClass.BATTERY_CHARGING - _attr_entity_category = EntityCategory.DIAGNOSTIC + entity_description: RitualsBinarySensorEntityDescription - def __init__(self, coordinator: RitualsDataUpdateCoordinator) -> None: - """Initialize the battery charging binary sensor.""" + def __init__( + self, + coordinator: RitualsDataUpdateCoordinator, + description: RitualsBinarySensorEntityDescription, + ) -> None: + """Initialize Rituals binary sensor entity.""" super().__init__(coordinator) - self._attr_unique_id = f"{coordinator.diffuser.hublot}-charging" - self._attr_name = f"{coordinator.diffuser.name} Battery Charging" + self.entity_description = description + self._attr_unique_id = f"{coordinator.diffuser.hublot}-{description.key}" + self._attr_name = f"{coordinator.diffuser.name} {description.name}" @property def is_on(self) -> bool: - """Return the state of the battery charging binary sensor.""" - return self.coordinator.diffuser.charging + """Return the state of the binary sensor.""" + return self.entity_description.is_on_fn(self.coordinator.diffuser)