Home Assistant Unofficial Reference 2024.12.1
vacuum.py
Go to the documentation of this file.
1 """Support for Litter-Robot "Vacuum"."""
2 
3 from __future__ import annotations
4 
5 from datetime import time
6 from typing import Any
7 
8 from pylitterbot import LitterRobot
9 from pylitterbot.enums import LitterBoxStatus
10 import voluptuous as vol
11 
13  STATE_CLEANING,
14  STATE_DOCKED,
15  STATE_ERROR,
16  STATE_PAUSED,
17  StateVacuumEntity,
18  StateVacuumEntityDescription,
19  VacuumEntityFeature,
20 )
21 from homeassistant.core import HomeAssistant
22 from homeassistant.helpers import config_validation as cv, entity_platform
23 from homeassistant.helpers.entity_platform import AddEntitiesCallback
24 import homeassistant.util.dt as dt_util
25 
26 from . import LitterRobotConfigEntry
27 from .entity import LitterRobotEntity
28 
29 SERVICE_SET_SLEEP_MODE = "set_sleep_mode"
30 
31 LITTER_BOX_STATUS_STATE_MAP = {
32  LitterBoxStatus.CLEAN_CYCLE: STATE_CLEANING,
33  LitterBoxStatus.EMPTY_CYCLE: STATE_CLEANING,
34  LitterBoxStatus.CLEAN_CYCLE_COMPLETE: STATE_DOCKED,
35  LitterBoxStatus.CAT_DETECTED: STATE_DOCKED,
36  LitterBoxStatus.CAT_SENSOR_TIMING: STATE_DOCKED,
37  LitterBoxStatus.DRAWER_FULL_1: STATE_DOCKED,
38  LitterBoxStatus.DRAWER_FULL_2: STATE_DOCKED,
39  LitterBoxStatus.READY: STATE_DOCKED,
40  LitterBoxStatus.CAT_SENSOR_INTERRUPTED: STATE_PAUSED,
41  LitterBoxStatus.OFF: STATE_DOCKED,
42 }
43 
44 LITTER_BOX_ENTITY = StateVacuumEntityDescription(
45  key="litter_box", translation_key="litter_box"
46 )
47 
48 
50  hass: HomeAssistant,
51  entry: LitterRobotConfigEntry,
52  async_add_entities: AddEntitiesCallback,
53 ) -> None:
54  """Set up Litter-Robot cleaner using config entry."""
55  hub = entry.runtime_data
56  entities = [
57  LitterRobotCleaner(robot=robot, hub=hub, description=LITTER_BOX_ENTITY)
58  for robot in hub.litter_robots()
59  ]
60  async_add_entities(entities)
61 
62  platform = entity_platform.async_get_current_platform()
63  platform.async_register_entity_service(
64  SERVICE_SET_SLEEP_MODE,
65  {
66  vol.Required("enabled"): cv.boolean,
67  vol.Optional("start_time"): cv.time,
68  },
69  "async_set_sleep_mode",
70  )
71 
72 
73 class LitterRobotCleaner(LitterRobotEntity[LitterRobot], StateVacuumEntity):
74  """Litter-Robot "Vacuum" Cleaner."""
75 
76  _attr_supported_features = (
77  VacuumEntityFeature.START | VacuumEntityFeature.STATE | VacuumEntityFeature.STOP
78  )
79 
80  @property
81  def state(self) -> str:
82  """Return the state of the cleaner."""
83  return LITTER_BOX_STATUS_STATE_MAP.get(self.robotrobot.status, STATE_ERROR)
84 
85  @property
86  def status(self) -> str:
87  """Return the status of the cleaner."""
88  return (
89  f"{self.robot.status.text}{' (Sleeping)' if self.robot.is_sleeping else ''}"
90  )
91 
92  async def async_start(self) -> None:
93  """Start a clean cycle."""
94  await self.robotrobot.set_power_status(True)
95  await self.robotrobot.start_cleaning()
96 
97  async def async_stop(self, **kwargs: Any) -> None:
98  """Stop the vacuum cleaner."""
99  await self.robotrobot.set_power_status(False)
100 
102  self, enabled: bool, start_time: str | None = None
103  ) -> None:
104  """Set the sleep mode."""
105  await self.robotrobot.set_sleep_mode(
106  enabled, self.parse_time_at_default_timezoneparse_time_at_default_timezone(start_time)
107  )
108 
109  @staticmethod
110  def parse_time_at_default_timezone(time_str: str | None) -> time | None:
111  """Parse a time string and add default timezone."""
112  if time_str is None:
113  return None
114 
115  if (parsed_time := dt_util.parse_time(time_str)) is None:
116  return None
117 
118  return (
119  dt_util.start_of_local_day()
120  .replace(
121  hour=parsed_time.hour,
122  minute=parsed_time.minute,
123  second=parsed_time.second,
124  )
125  .timetz()
126  )
127 
128  @property
129  def extra_state_attributes(self) -> dict[str, Any]:
130  """Return device specific state attributes."""
131  return {
132  "is_sleeping": self.robotrobot.is_sleeping,
133  "sleep_mode_enabled": self.robotrobot.sleep_mode_enabled,
134  "power_status": self.robotrobot.power_status,
135  "status": self.statusstatus,
136  }
time|None parse_time_at_default_timezone(str|None time_str)
Definition: vacuum.py:110
None async_set_sleep_mode(self, bool enabled, str|None start_time=None)
Definition: vacuum.py:103
None async_setup_entry(HomeAssistant hass, LitterRobotConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: vacuum.py:53