Home Assistant Unofficial Reference 2024.12.1
update.py
Go to the documentation of this file.
1 """Update entities for Ubiquiti network devices."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable, Coroutine
6 from dataclasses import dataclass
7 import logging
8 from typing import Any, TypeVar
9 
10 import aiounifi
11 from aiounifi.interfaces.api_handlers import ItemEvent
12 from aiounifi.interfaces.devices import Devices
13 from aiounifi.models.device import Device, DeviceUpgradeRequest
14 
16  UpdateDeviceClass,
17  UpdateEntity,
18  UpdateEntityDescription,
19  UpdateEntityFeature,
20 )
21 from homeassistant.core import HomeAssistant, callback
22 from homeassistant.helpers.entity_platform import AddEntitiesCallback
23 
24 from . import UnifiConfigEntry
25 from .entity import (
26  UnifiEntity,
27  UnifiEntityDescription,
28  async_device_available_fn,
29  async_device_device_info_fn,
30 )
31 
32 LOGGER = logging.getLogger(__name__)
33 
34 _DataT = TypeVar("_DataT", bound=Device)
35 _HandlerT = TypeVar("_HandlerT", bound=Devices)
36 
37 
38 async def async_device_control_fn(api: aiounifi.Controller, obj_id: str) -> None:
39  """Control upgrade of device."""
40  await api.request(DeviceUpgradeRequest.create(obj_id))
41 
42 
43 @dataclass(frozen=True, kw_only=True)
45  UpdateEntityDescription, UnifiEntityDescription[_HandlerT, _DataT]
46 ):
47  """Class describing UniFi update entity."""
48 
49  control_fn: Callable[[aiounifi.Controller, str], Coroutine[Any, Any, None]]
50  state_fn: Callable[[aiounifi.Controller, _DataT], bool]
51 
52 
53 ENTITY_DESCRIPTIONS: tuple[UnifiUpdateEntityDescription, ...] = (
54  UnifiUpdateEntityDescription[Devices, Device](
55  key="Upgrade device",
56  device_class=UpdateDeviceClass.FIRMWARE,
57  api_handler_fn=lambda api: api.devices,
58  available_fn=async_device_available_fn,
59  control_fn=async_device_control_fn,
60  device_info_fn=async_device_device_info_fn,
61  object_fn=lambda api, obj_id: api.devices[obj_id],
62  state_fn=lambda api, device: device.state == 4,
63  unique_id_fn=lambda hub, obj_id: f"device_update-{obj_id}",
64  ),
65 )
66 
67 
69  hass: HomeAssistant,
70  config_entry: UnifiConfigEntry,
71  async_add_entities: AddEntitiesCallback,
72 ) -> None:
73  """Set up update entities for UniFi Network integration."""
74  config_entry.runtime_data.entity_loader.register_platform(
75  async_add_entities,
76  UnifiDeviceUpdateEntity,
77  ENTITY_DESCRIPTIONS,
78  )
79 
80 
81 class UnifiDeviceUpdateEntity(UnifiEntity[_HandlerT, _DataT], UpdateEntity):
82  """Representation of a UniFi device update entity."""
83 
84  entity_description: UnifiUpdateEntityDescription[_HandlerT, _DataT]
85 
86  @callback
87  def async_initiate_state(self) -> None:
88  """Initiate entity state."""
89  self._attr_supported_features_attr_supported_features = UpdateEntityFeature.PROGRESS
90  if self.hubhub.is_admin:
91  self._attr_supported_features_attr_supported_features |= UpdateEntityFeature.INSTALL
92 
93  self.async_update_stateasync_update_stateasync_update_state(ItemEvent.ADDED, self._obj_id_obj_id)
94 
95  async def async_install(
96  self, version: str | None, backup: bool, **kwargs: Any
97  ) -> None:
98  """Install an update."""
99  await self.entity_descriptionentity_description.control_fn(self.apiapi, self._obj_id_obj_id)
100 
101  @callback
102  def async_update_state(self, event: ItemEvent, obj_id: str) -> None:
103  """Update entity state.
104 
105  Update in_progress, installed_version and latest_version.
106  """
107  description = self.entity_descriptionentity_description
108 
109  obj = description.object_fn(self.apiapi, self._obj_id_obj_id)
110  self._attr_in_progress_attr_in_progress_attr_in_progress = description.state_fn(self.apiapi, obj)
111  self._attr_installed_version_attr_installed_version = obj.version
112  self._attr_latest_version_attr_latest_version = obj.upgrade_to_firmware or obj.version
None async_update_state(self, ItemEvent event, str obj_id)
Definition: entity.py:262
None async_update_state(self, ItemEvent event, str obj_id)
Definition: update.py:102
None async_install(self, str|None version, bool backup, **Any kwargs)
Definition: update.py:97
None async_setup_entry(HomeAssistant hass, UnifiConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: update.py:72
None async_device_control_fn(aiounifi.Controller api, str obj_id)
Definition: update.py:38