Home Assistant Unofficial Reference 2024.12.1
update.py
Go to the documentation of this file.
1 """Support for WLED updates."""
2 
3 from __future__ import annotations
4 
5 from typing import Any, cast
6 
8  UpdateDeviceClass,
9  UpdateEntity,
10  UpdateEntityFeature,
11 )
12 from homeassistant.core import HomeAssistant
13 from homeassistant.helpers.entity_platform import AddEntitiesCallback
14 
15 from . import WLED_KEY, WLEDConfigEntry
16 from .coordinator import WLEDDataUpdateCoordinator, WLEDReleasesDataUpdateCoordinator
17 from .entity import WLEDEntity
18 from .helpers import wled_exception_handler
19 
20 
22  hass: HomeAssistant,
23  entry: WLEDConfigEntry,
24  async_add_entities: AddEntitiesCallback,
25 ) -> None:
26  """Set up WLED update based on a config entry."""
27  async_add_entities([WLEDUpdateEntity(entry.runtime_data, hass.data[WLED_KEY])])
28 
29 
31  """Defines a WLED update entity."""
32 
33  _attr_device_class = UpdateDeviceClass.FIRMWARE
34  _attr_supported_features = (
35  UpdateEntityFeature.INSTALL | UpdateEntityFeature.SPECIFIC_VERSION
36  )
37  _attr_title = "WLED"
38 
39  def __init__(
40  self,
41  coordinator: WLEDDataUpdateCoordinator,
42  releases_coordinator: WLEDReleasesDataUpdateCoordinator,
43  ) -> None:
44  """Initialize the update entity."""
45  super().__init__(coordinator=coordinator)
46  self.releases_coordinatorreleases_coordinator = releases_coordinator
47  self._attr_unique_id_attr_unique_id = coordinator.data.info.mac_address
48 
49  async def async_added_to_hass(self) -> None:
50  """When entity is added to hass.
51 
52  Register extra update listener for the releases coordinator.
53  """
54  await super().async_added_to_hass()
55  self.async_on_removeasync_on_remove(
56  self.releases_coordinatorreleases_coordinator.async_add_listener(
57  self._handle_coordinator_update
58  )
59  )
60 
61  @property
62  def available(self) -> bool:
63  """Return if entity is available."""
64  return super().available and self.releases_coordinatorreleases_coordinator.last_update_success
65 
66  @property
67  def installed_version(self) -> str | None:
68  """Version currently installed and in use."""
69  if (version := self.coordinator.data.info.version) is None:
70  return None
71  return str(version)
72 
73  @property
74  def latest_version(self) -> str | None:
75  """Latest version available for install."""
76  # If we already run a pre-release, we consider being on the beta channel.
77  # Offer beta version upgrade, unless stable is newer
78  if (
79  (beta := self.releases_coordinatorreleases_coordinator.data.beta) is not None
80  and (current := self.coordinator.data.info.version) is not None
81  and (current.alpha or current.beta or current.release_candidate)
82  and (
83  (stable := self.releases_coordinatorreleases_coordinator.data.stable) is None
84  or (stable is not None and stable < beta and current > stable)
85  )
86  ):
87  return str(beta)
88 
89  if (stable := self.releases_coordinatorreleases_coordinator.data.stable) is not None:
90  return str(stable)
91 
92  return None
93 
94  @property
95  def release_url(self) -> str | None:
96  """URL to the full release notes of the latest version available."""
97  if (version := self.latest_versionlatest_versionlatest_version) is None:
98  return None
99  return f"https://github.com/Aircoookie/WLED/releases/tag/v{version}"
100 
101  @wled_exception_handler
102  async def async_install(
103  self, version: str | None, backup: bool, **kwargs: Any
104  ) -> None:
105  """Install an update."""
106  if version is None:
107  # We cast here, as we know that the latest_version is a string.
108  version = cast(str, self.latest_versionlatest_versionlatest_version)
109  await self.coordinator.wled.upgrade(version=version)
110  await self.coordinator.async_refresh()
None async_install(self, str|None version, bool backup, **Any kwargs)
Definition: update.py:104
None __init__(self, WLEDDataUpdateCoordinator coordinator, WLEDReleasesDataUpdateCoordinator releases_coordinator)
Definition: update.py:43
None async_on_remove(self, CALLBACK_TYPE func)
Definition: entity.py:1331
Callable[[], None] async_add_listener(self, CALLBACK_TYPE update_callback, Any context=None)
None async_setup_entry(HomeAssistant hass, WLEDConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: update.py:25