Home Assistant Unofficial Reference 2024.12.1
update.py
Go to the documentation of this file.
1 """Support for Litter-Robot updates."""
2 
3 from __future__ import annotations
4 
5 from datetime import timedelta
6 from typing import Any
7 
8 from pylitterbot import LitterRobot4
9 
11  UpdateDeviceClass,
12  UpdateEntity,
13  UpdateEntityDescription,
14  UpdateEntityFeature,
15 )
16 from homeassistant.core import HomeAssistant
17 from homeassistant.exceptions import HomeAssistantError
18 from homeassistant.helpers.entity_platform import AddEntitiesCallback
19 
20 from . import LitterRobotConfigEntry
21 from .entity import LitterRobotEntity
22 
23 SCAN_INTERVAL = timedelta(days=1)
24 
25 FIRMWARE_UPDATE_ENTITY = UpdateEntityDescription(
26  key="firmware",
27  device_class=UpdateDeviceClass.FIRMWARE,
28 )
29 
30 
32  hass: HomeAssistant,
33  entry: LitterRobotConfigEntry,
34  async_add_entities: AddEntitiesCallback,
35 ) -> None:
36  """Set up Litter-Robot update platform."""
37  hub = entry.runtime_data
38  entities = [
39  RobotUpdateEntity(robot=robot, hub=hub, description=FIRMWARE_UPDATE_ENTITY)
40  for robot in hub.litter_robots()
41  if isinstance(robot, LitterRobot4)
42  ]
43  async_add_entities(entities, True)
44 
45 
46 class RobotUpdateEntity(LitterRobotEntity[LitterRobot4], UpdateEntity):
47  """A class that describes robot update entities."""
48 
49  _attr_supported_features = (
50  UpdateEntityFeature.INSTALL | UpdateEntityFeature.PROGRESS
51  )
52 
53  @property
54  def installed_version(self) -> str:
55  """Version installed and in use."""
56  return self.robotrobot.firmware
57 
58  @property
59  def in_progress(self) -> bool:
60  """Update installation progress."""
61  return self.robotrobot.firmware_update_triggered
62 
63  @property
64  def should_poll(self) -> bool:
65  """Set polling to True."""
66  return True
67 
68  async def async_update(self) -> None:
69  """Update the entity."""
70  # If the robot has a firmware update already in progress, checking for the
71  # latest firmware informs that an update has already been triggered, no
72  # firmware information is returned and we won't know the latest version.
73  if not self.robotrobot.firmware_update_triggered:
74  latest_version = await self.robotrobot.get_latest_firmware(True)
75  if not await self.robotrobot.has_firmware_update():
76  latest_version = self.robotrobot.firmware
77  self._attr_latest_version_attr_latest_version = latest_version
78 
79  async def async_install(
80  self, version: str | None, backup: bool, **kwargs: Any
81  ) -> None:
82  """Install an update."""
83  if await self.robotrobot.has_firmware_update(True):
84  if not await self.robotrobot.update_firmware():
85  message = f"Unable to start firmware update on {self.robot.name}"
86  raise HomeAssistantError(message)
None async_install(self, str|None version, bool backup, **Any kwargs)
Definition: update.py:81
None async_setup_entry(HomeAssistant hass, LitterRobotConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: update.py:35