Use kw_only attribute for remaining entity descriptions in litterrobot (#136202)

* Use kw_only attribute for binary sensor descriptions in litterrobot

* Update time.py with kw_only for litterrobot

* Wrap multiline lambda
This commit is contained in:
Nathan Spencer 2025-01-22 02:14:48 -07:00 committed by GitHub
parent 29f9c88041
commit 67ca9e45b5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 22 additions and 29 deletions

View File

@ -21,29 +21,13 @@ from . import LitterRobotConfigEntry
from .entity import LitterRobotEntity, _RobotT from .entity import LitterRobotEntity, _RobotT
@dataclass(frozen=True) @dataclass(frozen=True, kw_only=True)
class RequiredKeysMixin(Generic[_RobotT]):
"""A class that describes robot binary sensor entity required keys."""
is_on_fn: Callable[[_RobotT], bool]
@dataclass(frozen=True)
class RobotBinarySensorEntityDescription( class RobotBinarySensorEntityDescription(
BinarySensorEntityDescription, RequiredKeysMixin[_RobotT] BinarySensorEntityDescription, Generic[_RobotT]
): ):
"""A class that describes robot binary sensor entities.""" """A class that describes robot binary sensor entities."""
is_on_fn: Callable[[_RobotT], bool]
class LitterRobotBinarySensorEntity(LitterRobotEntity[_RobotT], BinarySensorEntity):
"""Litter-Robot binary sensor entity."""
entity_description: RobotBinarySensorEntityDescription[_RobotT]
@property
def is_on(self) -> bool:
"""Return the state."""
return self.entity_description.is_on_fn(self.robot)
BINARY_SENSOR_MAP: dict[type[Robot], tuple[RobotBinarySensorEntityDescription, ...]] = { BINARY_SENSOR_MAP: dict[type[Robot], tuple[RobotBinarySensorEntityDescription, ...]] = {
@ -90,3 +74,14 @@ async def async_setup_entry(
if isinstance(robot, robot_type) if isinstance(robot, robot_type)
for description in entity_descriptions for description in entity_descriptions
) )
class LitterRobotBinarySensorEntity(LitterRobotEntity[_RobotT], BinarySensorEntity):
"""Litter-Robot binary sensor entity."""
entity_description: RobotBinarySensorEntityDescription[_RobotT]
@property
def is_on(self) -> bool:
"""Return the state."""
return self.entity_description.is_on_fn(self.robot)

View File

@ -19,19 +19,14 @@ from . import LitterRobotConfigEntry
from .entity import LitterRobotEntity, _RobotT from .entity import LitterRobotEntity, _RobotT
@dataclass(frozen=True) @dataclass(frozen=True, kw_only=True)
class RequiredKeysMixin(Generic[_RobotT]): class RobotTimeEntityDescription(TimeEntityDescription, Generic[_RobotT]):
"""A class that describes robot time entity required keys.""" """A class that describes robot time entities."""
value_fn: Callable[[_RobotT], time | None] value_fn: Callable[[_RobotT], time | None]
set_fn: Callable[[_RobotT, time], Coroutine[Any, Any, bool]] set_fn: Callable[[_RobotT, time], Coroutine[Any, Any, bool]]
@dataclass(frozen=True)
class RobotTimeEntityDescription(TimeEntityDescription, RequiredKeysMixin[_RobotT]):
"""A class that describes robot time entities."""
def _as_local_time(start: datetime | None) -> time | None: def _as_local_time(start: datetime | None) -> time | None:
"""Return a datetime as local time.""" """Return a datetime as local time."""
return dt_util.as_local(start).time() if start else None return dt_util.as_local(start).time() if start else None
@ -42,8 +37,11 @@ LITTER_ROBOT_3_SLEEP_START = RobotTimeEntityDescription[LitterRobot3](
translation_key="sleep_mode_start_time", translation_key="sleep_mode_start_time",
entity_category=EntityCategory.CONFIG, entity_category=EntityCategory.CONFIG,
value_fn=lambda robot: _as_local_time(robot.sleep_mode_start_time), value_fn=lambda robot: _as_local_time(robot.sleep_mode_start_time),
set_fn=lambda robot, value: robot.set_sleep_mode( set_fn=(
robot.sleep_mode_enabled, value.replace(tzinfo=dt_util.get_default_time_zone()) lambda robot, value: robot.set_sleep_mode(
robot.sleep_mode_enabled,
value.replace(tzinfo=dt_util.get_default_time_zone()),
)
), ),
) )