1 """Support for Rituals Perfume Genie sensors."""
3 from __future__
import annotations
5 from collections.abc
import Callable
6 from dataclasses
import dataclass
8 from pyrituals
import Diffuser
13 SensorEntityDescription,
20 from .const
import DOMAIN
21 from .coordinator
import RitualsDataUpdateCoordinator
22 from .entity
import DiffuserEntity
25 @dataclass(frozen=True, kw_only=True)
27 """Class describing Rituals sensor entities."""
29 has_fn: Callable[[Diffuser], bool] =
lambda _:
True
30 value_fn: Callable[[Diffuser], int | str]
33 ENTITY_DESCRIPTIONS = (
35 key=
"battery_percentage",
36 native_unit_of_measurement=PERCENTAGE,
37 device_class=SensorDeviceClass.BATTERY,
38 value_fn=
lambda diffuser: diffuser.battery_percentage,
39 has_fn=
lambda diffuser: diffuser.has_battery,
43 translation_key=
"fill",
44 value_fn=
lambda diffuser: diffuser.fill,
48 translation_key=
"perfume",
49 value_fn=
lambda diffuser: diffuser.perfume,
52 key=
"wifi_percentage",
53 translation_key=
"wifi_percentage",
54 native_unit_of_measurement=PERCENTAGE,
55 value_fn=
lambda diffuser: diffuser.wifi_percentage,
62 config_entry: ConfigEntry,
63 async_add_entities: AddEntitiesCallback,
65 """Set up the diffuser sensors."""
66 coordinators: dict[str, RitualsDataUpdateCoordinator] = hass.data[DOMAIN][
72 for coordinator
in coordinators.values()
73 for description
in ENTITY_DESCRIPTIONS
74 if description.has_fn(coordinator.diffuser)
79 """Representation of a diffuser sensor."""
81 entity_description: RitualsSensorEntityDescription
82 _attr_entity_category = EntityCategory.DIAGNOSTIC
86 """Return the sensor value."""
str|int native_value(self)
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)