Home Assistant Unofficial Reference 2024.12.1
update.py
Go to the documentation of this file.
1 """Support for Synology DSM update platform."""
2 
3 from __future__ import annotations
4 
5 from dataclasses import dataclass
6 from typing import Final
7 
8 from synology_dsm.api.core.upgrade import SynoCoreUpgrade
9 from yarl import URL
10 
11 from homeassistant.components.update import UpdateEntity, UpdateEntityDescription
12 from homeassistant.config_entries import ConfigEntry
13 from homeassistant.const import EntityCategory
14 from homeassistant.core import HomeAssistant
15 from homeassistant.helpers.entity_platform import AddEntitiesCallback
16 
17 from .const import DOMAIN
18 from .coordinator import SynologyDSMCentralUpdateCoordinator
19 from .entity import SynologyDSMBaseEntity, SynologyDSMEntityDescription
20 from .models import SynologyDSMData
21 
22 
23 @dataclass(frozen=True, kw_only=True)
25  UpdateEntityDescription, SynologyDSMEntityDescription
26 ):
27  """Describes Synology DSM update entity."""
28 
29 
30 UPDATE_ENTITIES: Final = [
32  api_key=SynoCoreUpgrade.API_KEY,
33  key="update",
34  translation_key="update",
35  entity_category=EntityCategory.DIAGNOSTIC,
36  )
37 ]
38 
39 
41  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
42 ) -> None:
43  """Set up Synology DSM update entities."""
44  data: SynologyDSMData = hass.data[DOMAIN][entry.unique_id]
46  SynoDSMUpdateEntity(data.api, data.coordinator_central, description)
47  for description in UPDATE_ENTITIES
48  )
49 
50 
52  SynologyDSMBaseEntity[SynologyDSMCentralUpdateCoordinator], UpdateEntity
53 ):
54  """Mixin for update entity specific attributes."""
55 
56  entity_description: SynologyDSMUpdateEntityEntityDescription
57  _attr_title = "Synology DSM"
58 
59  @property
60  def available(self) -> bool:
61  """Return True if entity is available."""
62  return bool(self._api.upgrade) and super().available
63 
64  @property
65  def installed_version(self) -> str | None:
66  """Version installed and in use."""
67  assert self._api.information is not None
68  return self._api.information.version_string
69 
70  @property
71  def latest_version(self) -> str | None:
72  """Latest version available for install."""
73  assert self._api.upgrade is not None
74  if not self._api.upgrade.update_available:
75  return self.installed_versioninstalled_versioninstalled_versioninstalled_version
76  return self._api.upgrade.available_version
77 
78  @property
79  def release_url(self) -> str | None:
80  """URL to the full release notes of the latest version available."""
81  assert self._api.information is not None
82  assert self._api.upgrade is not None
83 
84  if (details := self._api.upgrade.available_version_details) is None:
85  return None
86 
87  url = URL("http://update.synology.com/autoupdate/whatsnew.php")
88  query = {"model": self._api.information.model}
89  if details["nano"] > 0:
90  query["update_version"] = f"{details['buildnumber']}-{details['nano']}"
91  else:
92  query["update_version"] = details["buildnumber"]
93 
94  return url.update_query(query).human_repr()
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: update.py:42