Home Assistant Unofficial Reference 2024.12.1
update.py
Go to the documentation of this file.
1 """Platform for update integration."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Awaitable, Callable
6 from dataclasses import dataclass
7 from typing import Any
8 
9 from devolo_plc_api.device import Device
10 from devolo_plc_api.device_api import UpdateFirmwareCheck
11 from devolo_plc_api.exceptions.device import DevicePasswordProtected, DeviceUnavailable
12 
14  UpdateDeviceClass,
15  UpdateEntity,
16  UpdateEntityDescription,
17  UpdateEntityFeature,
18 )
19 from homeassistant.const import EntityCategory
20 from homeassistant.core import HomeAssistant
21 from homeassistant.exceptions import HomeAssistantError
22 from homeassistant.helpers.entity_platform import AddEntitiesCallback
23 
24 from . import DevoloHomeNetworkConfigEntry
25 from .const import DOMAIN, REGULAR_FIRMWARE
26 from .coordinator import DevoloDataUpdateCoordinator
27 from .entity import DevoloCoordinatorEntity
28 
29 PARALLEL_UPDATES = 0
30 
31 
32 @dataclass(frozen=True, kw_only=True)
34  """Describes devolo update entity."""
35 
36  latest_version: Callable[[UpdateFirmwareCheck], str]
37  update_func: Callable[[Device], Awaitable[bool]]
38 
39 
40 UPDATE_TYPES: dict[str, DevoloUpdateEntityDescription] = {
41  REGULAR_FIRMWARE: DevoloUpdateEntityDescription(
42  key=REGULAR_FIRMWARE,
43  device_class=UpdateDeviceClass.FIRMWARE,
44  entity_category=EntityCategory.CONFIG,
45  latest_version=lambda data: data.new_firmware_version.split("_")[0],
46  update_func=lambda device: device.device.async_start_firmware_update(), # type: ignore[union-attr]
47  ),
48 }
49 
50 
52  hass: HomeAssistant,
53  entry: DevoloHomeNetworkConfigEntry,
54  async_add_entities: AddEntitiesCallback,
55 ) -> None:
56  """Get all devices and sensors and setup them via config entry."""
57  coordinators = entry.runtime_data.coordinators
58 
60  [
62  entry,
63  coordinators[REGULAR_FIRMWARE],
64  UPDATE_TYPES[REGULAR_FIRMWARE],
65  )
66  ]
67  )
68 
69 
71  """Representation of a devolo update."""
72 
73  _attr_supported_features = (
74  UpdateEntityFeature.INSTALL | UpdateEntityFeature.PROGRESS
75  )
76 
77  entity_description: DevoloUpdateEntityDescription
78 
79  def __init__(
80  self,
81  entry: DevoloHomeNetworkConfigEntry,
82  coordinator: DevoloDataUpdateCoordinator,
83  description: DevoloUpdateEntityDescription,
84  ) -> None:
85  """Initialize entity."""
86  self.entity_descriptionentity_description = description
87  super().__init__(entry, coordinator)
88  self._in_progress_old_version_in_progress_old_version: str | None = None
89 
90  @property
91  def installed_version(self) -> str:
92  """Version currently in use."""
93  return self.device.firmware_version
94 
95  @property
96  def latest_version(self) -> str:
97  """Latest version available for install."""
98  if latest_version := self.entity_descriptionentity_description.latest_version(
99  self.coordinator.data
100  ):
101  return latest_version
102  return self.device.firmware_version
103 
104  @property
105  def in_progress(self) -> bool:
106  """Update installation in progress."""
107  return self._in_progress_old_version_in_progress_old_version == self.installed_versioninstalled_versioninstalled_versioninstalled_version
108 
109  async def async_install(
110  self, version: str | None, backup: bool, **kwargs: Any
111  ) -> None:
112  """Turn the entity on."""
113  self._in_progress_old_version_in_progress_old_version = self.installed_versioninstalled_versioninstalled_versioninstalled_version
114  try:
115  await self.entity_descriptionentity_description.update_func(self.device)
116  except DevicePasswordProtected as ex:
117  self.entry.async_start_reauth(self.hasshass)
118  raise HomeAssistantError(
119  translation_domain=DOMAIN,
120  translation_key="password_protected",
121  translation_placeholders={"title": self.entry.title},
122  ) from ex
123  except DeviceUnavailable as ex:
124  raise HomeAssistantError(
125  translation_domain=DOMAIN,
126  translation_key="no_response",
127  translation_placeholders={"title": self.entry.title},
128  ) from ex
None __init__(self, DevoloHomeNetworkConfigEntry entry, DevoloDataUpdateCoordinator coordinator, DevoloUpdateEntityDescription description)
Definition: update.py:84
None async_install(self, str|None version, bool backup, **Any kwargs)
Definition: update.py:111
None async_setup_entry(HomeAssistant hass, DevoloHomeNetworkConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: update.py:55