1 """Support for Litter-Robot selects."""
3 from __future__
import annotations
5 from collections.abc
import Callable, Coroutine
6 from dataclasses
import dataclass
7 from typing
import Any, Generic, TypeVar
9 from pylitterbot
import FeederRobot, LitterRobot, LitterRobot4, Robot
10 from pylitterbot.robot.litterrobot4
import BrightnessLevel
17 from .
import LitterRobotConfigEntry
18 from .entity
import LitterRobotEntity, _RobotT
19 from .hub
import LitterRobotHub
21 _CastTypeT = TypeVar(
"_CastTypeT", int, float, str)
23 BRIGHTNESS_LEVEL_ICON_MAP: dict[BrightnessLevel |
None, str] = {
24 BrightnessLevel.LOW:
"mdi:lightbulb-on-30",
25 BrightnessLevel.MEDIUM:
"mdi:lightbulb-on-50",
26 BrightnessLevel.HIGH:
"mdi:lightbulb-on",
27 None:
"mdi:lightbulb-question",
31 @dataclass(frozen=True)
33 """A class that describes robot select entity required keys."""
35 current_fn: Callable[[_RobotT], _CastTypeT |
None]
36 options_fn: Callable[[_RobotT], list[_CastTypeT]]
37 select_fn: Callable[[_RobotT, str], Coroutine[Any, Any, bool]]
40 @dataclass(frozen=True)
42 SelectEntityDescription, RequiredKeysMixin[_RobotT, _CastTypeT]
44 """A class that describes robot select entities."""
46 entity_category: EntityCategory = EntityCategory.CONFIG
47 icon_fn: Callable[[_RobotT], str] |
None =
None
50 ROBOT_SELECT_MAP: dict[type[Robot], RobotSelectEntityDescription] = {
51 LitterRobot: RobotSelectEntityDescription[LitterRobot, int](
53 translation_key=
"cycle_delay",
54 unit_of_measurement=UnitOfTime.MINUTES,
55 current_fn=
lambda robot: robot.clean_cycle_wait_time_minutes,
56 options_fn=
lambda robot: robot.VALID_WAIT_TIMES,
57 select_fn=
lambda robot, opt: robot.set_wait_time(
int(opt)),
59 LitterRobot4: RobotSelectEntityDescription[LitterRobot4, str](
60 key=
"panel_brightness",
61 translation_key=
"brightness_level",
62 current_fn=
lambda robot: bri.name.lower()
63 if (bri := robot.panel_brightness)
is not None
65 options_fn=
lambda _: [level.name.lower()
for level
in BrightnessLevel],
66 select_fn=
lambda robot, opt: robot.set_panel_brightness(
67 BrightnessLevel[opt.upper()]
69 icon_fn=
lambda robot: BRIGHTNESS_LEVEL_ICON_MAP[robot.panel_brightness],
71 FeederRobot: RobotSelectEntityDescription[FeederRobot, float](
72 key=
"meal_insert_size",
73 translation_key=
"meal_insert_size",
74 unit_of_measurement=
"cups",
75 current_fn=
lambda robot: robot.meal_insert_size,
76 options_fn=
lambda robot: robot.VALID_MEAL_INSERT_SIZES,
77 select_fn=
lambda robot, opt: robot.set_meal_insert_size(
float(opt)),
84 entry: LitterRobotConfigEntry,
85 async_add_entities: AddEntitiesCallback,
87 """Set up Litter-Robot selects using config entry."""
88 hub = entry.runtime_data
91 for robot
in hub.account.robots
92 for robot_type, description
in ROBOT_SELECT_MAP.items()
93 if isinstance(robot, robot_type)
99 LitterRobotEntity[_RobotT], SelectEntity, Generic[_RobotT, _CastTypeT]
101 """Litter-Robot Select."""
103 entity_description: RobotSelectEntityDescription[_RobotT, _CastTypeT]
109 description: RobotSelectEntityDescription[_RobotT, _CastTypeT],
111 """Initialize a Litter-Robot select entity."""
112 super().
__init__(robot, hub, description)
118 """Return the icon to use in the frontend, if any."""
120 return str(icon_fn(self.
robotrobot))
125 """Return the selected entity option to represent the entity state."""
129 """Change the selected option."""
str|None current_option(self)
None async_select_option(self, str option)
None __init__(self, _RobotT robot, LitterRobotHub hub, RobotSelectEntityDescription[_RobotT, _CastTypeT] description)
None async_setup_entry(HomeAssistant hass, LitterRobotConfigEntry entry, AddEntitiesCallback async_add_entities)