Home Assistant Unofficial Reference 2024.12.1
update.py
Go to the documentation of this file.
1 """Demo platform that offers fake update entities."""
2 
3 from __future__ import annotations
4 
5 import asyncio
6 from typing import Any
7 
9  UpdateDeviceClass,
10  UpdateEntity,
11  UpdateEntityFeature,
12 )
13 from homeassistant.config_entries import ConfigEntry
14 from homeassistant.core import HomeAssistant
15 from homeassistant.helpers.device_registry import DeviceInfo
16 from homeassistant.helpers.entity_platform import AddEntitiesCallback
17 
18 from . import DOMAIN
19 
20 FAKE_INSTALL_SLEEP_TIME = 0.5
21 
22 
24  hass: HomeAssistant,
25  config_entry: ConfigEntry,
26  async_add_entities: AddEntitiesCallback,
27 ) -> None:
28  """Set up demo update platform."""
30  [
31  DemoUpdate(
32  unique_id="update_no_install",
33  device_name="Demo Update No Install",
34  title="Awesomesoft Inc.",
35  installed_version="1.0.0",
36  latest_version="1.0.1",
37  release_summary="Awesome update, fixing everything!",
38  release_url="https://www.example.com/release/1.0.1",
39  support_install=False,
40  ),
41  DemoUpdate(
42  unique_id="update_2_date",
43  device_name="Demo No Update",
44  title="AdGuard Home",
45  installed_version="1.0.0",
46  latest_version="1.0.0",
47  ),
48  DemoUpdate(
49  unique_id="update_addon",
50  device_name="Demo add-on",
51  title="AdGuard Home",
52  installed_version="1.0.0",
53  latest_version="1.0.1",
54  release_summary="Awesome update, fixing everything!",
55  release_url="https://www.example.com/release/1.0.1",
56  ),
57  DemoUpdate(
58  unique_id="update_light_bulb",
59  device_name="Demo Living Room Bulb Update",
60  title="Philips Lamps Firmware",
61  installed_version="1.93.3",
62  latest_version="1.94.2",
63  release_summary="Added support for effects",
64  release_url="https://www.example.com/release/1.93.3",
65  device_class=UpdateDeviceClass.FIRMWARE,
66  ),
67  DemoUpdate(
68  unique_id="update_support_progress",
69  device_name="Demo Update with Progress",
70  title="Philips Lamps Firmware",
71  installed_version="1.93.3",
72  latest_version="1.94.2",
73  support_progress=True,
74  release_summary="Added support for effects",
75  support_release_notes=True,
76  release_url="https://www.example.com/release/1.93.3",
77  device_class=UpdateDeviceClass.FIRMWARE,
78  update_steps=10,
79  ),
80  DemoUpdate(
81  unique_id="update_support_decimal_progress",
82  device_name="Demo Update with Decimal Progress",
83  title="Philips Lamps Firmware",
84  installed_version="1.93.3",
85  latest_version="1.94.2",
86  support_progress=True,
87  release_summary="Added support for effects",
88  support_release_notes=True,
89  release_url="https://www.example.com/release/1.93.3",
90  device_class=UpdateDeviceClass.FIRMWARE,
91  display_precision=2,
92  update_steps=1000,
93  ),
94  ]
95  )
96 
97 
98 async def _fake_install() -> None:
99  """Fake install an update."""
100  await asyncio.sleep(FAKE_INSTALL_SLEEP_TIME)
101 
102 
104  """Representation of a demo update entity."""
105 
106  _attr_has_entity_name = True
107  _attr_name = None
108  _attr_should_poll = False
109 
110  def __init__(
111  self,
112  *,
113  unique_id: str,
114  device_name: str,
115  title: str | None,
116  installed_version: str | None,
117  latest_version: str | None,
118  release_summary: str | None = None,
119  release_url: str | None = None,
120  support_progress: bool = False,
121  support_install: bool = True,
122  support_release_notes: bool = False,
123  device_class: UpdateDeviceClass | None = None,
124  display_precision: int = 0,
125  update_steps: int = 100,
126  ) -> None:
127  """Initialize the Demo select entity."""
128  self._attr_installed_version_attr_installed_version = installed_version
129  self._attr_device_class_attr_device_class = device_class
130  self._attr_display_precision_attr_display_precision = display_precision
131  self._attr_latest_version_attr_latest_version = latest_version
132  self._attr_release_summary_attr_release_summary = release_summary
133  self._attr_release_url_attr_release_url = release_url
134  self._attr_title_attr_title = title
135  self._attr_unique_id_attr_unique_id = unique_id
136  self._attr_device_info_attr_device_info = DeviceInfo(
137  identifiers={(DOMAIN, unique_id)},
138  name=device_name,
139  )
140  self._update_steps_update_steps = update_steps
141  if support_install:
142  self._attr_supported_features |= (
143  UpdateEntityFeature.INSTALL
144  | UpdateEntityFeature.BACKUP
145  | UpdateEntityFeature.SPECIFIC_VERSION
146  )
147  if support_progress:
148  self._attr_supported_features |= UpdateEntityFeature.PROGRESS
149 
150  if support_release_notes:
151  self._attr_supported_features |= UpdateEntityFeature.RELEASE_NOTES
152 
153  async def async_install(
154  self, version: str | None, backup: bool, **kwargs: Any
155  ) -> None:
156  """Install an update."""
157  if self.supported_featuressupported_featuressupported_features & UpdateEntityFeature.PROGRESS:
158  self._attr_in_progress_attr_in_progress_attr_in_progress = True
159  for progress in range(0, self._update_steps_update_steps, 1):
160  self._attr_update_percentage_attr_update_percentage = progress / (self._update_steps_update_steps / 100)
161  self.async_write_ha_stateasync_write_ha_state()
162  await _fake_install()
163 
164  self._attr_in_progress_attr_in_progress_attr_in_progress = False
165  self._attr_update_percentage_attr_update_percentage = None
166  self._attr_installed_version_attr_installed_version = (
167  version if version is not None else self.latest_versionlatest_version
168  )
169  self.async_write_ha_stateasync_write_ha_state()
170 
171  def release_notes(self) -> str | None:
172  """Return the release notes."""
173  return (
174  "Long release notes.\n\n**With** "
175  f"markdown support!\n\n***\n\n{self.release_summary}"
176  )
None async_install(self, str|None version, bool backup, **Any kwargs)
Definition: update.py:155
None __init__(self, *str unique_id, str device_name, str|None title, str|None installed_version, str|None latest_version, str|None release_summary=None, str|None release_url=None, bool support_progress=False, bool support_install=True, bool support_release_notes=False, UpdateDeviceClass|None device_class=None, int display_precision=0, int update_steps=100)
Definition: update.py:126
UpdateEntityFeature supported_features(self)
Definition: __init__.py:327
int|None supported_features(self)
Definition: entity.py:861
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: update.py:27