Home Assistant Unofficial Reference 2024.12.1
update.py
Go to the documentation of this file.
1 """Update entities for Linn devices."""
2 
3 from __future__ import annotations
4 
5 import logging
6 from typing import Any
7 
8 import aiohttp
9 from async_upnp_client.client import UpnpError
10 
12  UpdateDeviceClass,
13  UpdateEntity,
14  UpdateEntityFeature,
15 )
16 from homeassistant.config_entries import ConfigEntry
17 from homeassistant.core import HomeAssistant
18 from homeassistant.exceptions import HomeAssistantError
19 from homeassistant.helpers.device_registry import DeviceInfo
20 from homeassistant.helpers.entity_platform import AddEntitiesCallback
21 
22 from .const import DOMAIN
23 
24 _LOGGER = logging.getLogger(__name__)
25 
26 
28  hass: HomeAssistant,
29  config_entry: ConfigEntry,
30  async_add_entities: AddEntitiesCallback,
31 ) -> None:
32  """Set up update entities for Reolink component."""
33 
34  _LOGGER.debug("Setting up config entry: %s", config_entry.unique_id)
35 
36  device = hass.data[DOMAIN][config_entry.entry_id]
37 
38  entity = OpenhomeUpdateEntity(device)
39 
40  await entity.async_update()
41 
42  async_add_entities([entity])
43 
44 
46  """Update entity for a Linn DS device."""
47 
48  _attr_device_class = UpdateDeviceClass.FIRMWARE
49  _attr_supported_features = UpdateEntityFeature.INSTALL
50  _attr_has_entity_name = True
51  _attr_name = None
52 
53  def __init__(self, device):
54  """Initialize a Linn DS update entity."""
55  self._device_device = device
56  self._attr_unique_id_attr_unique_id = f"{device.uuid()}-update"
57  self._attr_device_info_attr_device_info = DeviceInfo(
58  identifiers={
59  (DOMAIN, device.uuid()),
60  },
61  manufacturer=device.manufacturer(),
62  model=device.model_name(),
63  name=device.friendly_name(),
64  )
65 
66  async def async_update(self) -> None:
67  """Update state of entity."""
68 
69  software_status = await self._device_device.software_status()
70 
71  if not software_status:
72  self._attr_installed_version_attr_installed_version = None
73  self._attr_latest_version_attr_latest_version = None
74  self._attr_release_summary_attr_release_summary = None
75  self._attr_release_url_attr_release_url = None
76  return
77 
78  self._attr_installed_version_attr_installed_version = software_status["current_software"]["version"]
79 
80  if software_status["status"] == "update_available":
81  self._attr_latest_version_attr_latest_version = software_status["update_info"]["updates"][0][
82  "version"
83  ]
84  self._attr_release_summary_attr_release_summary = software_status["update_info"]["updates"][0][
85  "description"
86  ]
87  self._attr_release_url_attr_release_url = software_status["update_info"]["releasenotesuri"]
88 
89  async def async_install(
90  self, version: str | None, backup: bool, **kwargs: Any
91  ) -> None:
92  """Install the latest firmware version."""
93  try:
94  if self.latest_versionlatest_version:
95  await self._device_device.update_firmware()
96  except (TimeoutError, aiohttp.ClientError, UpnpError) as err:
97  raise HomeAssistantError(
98  f"Error updating {self._device.device.friendly_name}: {err}"
99  ) from err
None async_install(self, str|None version, bool backup, **Any kwargs)
Definition: update.py:91
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: update.py:31