Home Assistant Unofficial Reference 2024.12.1
update.py
Go to the documentation of this file.
1 """Support for EZVIZ sensors."""
2 
3 from __future__ import annotations
4 
5 from typing import Any
6 
7 from pyezviz import HTTPError, PyEzvizError
8 
10  UpdateDeviceClass,
11  UpdateEntity,
12  UpdateEntityDescription,
13  UpdateEntityFeature,
14 )
15 from homeassistant.config_entries import ConfigEntry
16 from homeassistant.core import HomeAssistant
17 from homeassistant.exceptions import HomeAssistantError
18 from homeassistant.helpers.entity_platform import AddEntitiesCallback
19 
20 from .const import DATA_COORDINATOR, DOMAIN
21 from .coordinator import EzvizDataUpdateCoordinator
22 from .entity import EzvizEntity
23 
24 PARALLEL_UPDATES = 1
25 
26 UPDATE_ENTITY_TYPES = UpdateEntityDescription(
27  key="version",
28  device_class=UpdateDeviceClass.FIRMWARE,
29 )
30 
31 
33  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
34 ) -> None:
35  """Set up EZVIZ sensors based on a config entry."""
36  coordinator: EzvizDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id][
37  DATA_COORDINATOR
38  ]
39 
41  EzvizUpdateEntity(coordinator, camera, sensor, UPDATE_ENTITY_TYPES)
42  for camera in coordinator.data
43  for sensor, value in coordinator.data[camera].items()
44  if sensor in UPDATE_ENTITY_TYPES.key
45  if value
46  )
47 
48 
50  """Representation of a EZVIZ Update entity."""
51 
52  _attr_supported_features = (
53  UpdateEntityFeature.INSTALL
54  | UpdateEntityFeature.PROGRESS
55  | UpdateEntityFeature.RELEASE_NOTES
56  )
57 
58  def __init__(
59  self,
60  coordinator: EzvizDataUpdateCoordinator,
61  serial: str,
62  sensor: str,
63  description: UpdateEntityDescription,
64  ) -> None:
65  """Initialize the sensor."""
66  super().__init__(coordinator, serial)
67  self._attr_unique_id_attr_unique_id = f"{serial}_{sensor}"
68  self.entity_descriptionentity_description = description
69 
70  @property
71  def installed_version(self) -> str | None:
72  """Version installed and in use."""
73  return self.datadatadata["version"]
74 
75  @property
76  def in_progress(self) -> bool:
77  """Update installation progress."""
78  return bool(self.datadatadata["upgrade_in_progress"])
79 
80  @property
81  def latest_version(self) -> str | None:
82  """Latest version available for install."""
83  if self.datadatadata["upgrade_available"]:
84  return self.datadatadata["latest_firmware_info"]["version"]
85 
86  return self.installed_versioninstalled_versioninstalled_versioninstalled_version
87 
88  def release_notes(self) -> str | None:
89  """Return full release notes."""
90  if self.datadatadata["latest_firmware_info"]:
91  return self.datadatadata["latest_firmware_info"].get("desc")
92  return None
93 
94  @property
95  def update_percentage(self) -> int | None:
96  """Update installation progress."""
97  if self.datadatadata["upgrade_in_progress"]:
98  return self.datadatadata["upgrade_percent"]
99  return None
100 
101  async def async_install(
102  self, version: str | None, backup: bool, **kwargs: Any
103  ) -> None:
104  """Install an update."""
105  try:
106  await self.hasshasshass.async_add_executor_job(
107  self.coordinator.ezviz_client.upgrade_device, self._serial_serial
108  )
109 
110  except (HTTPError, PyEzvizError) as err:
111  raise HomeAssistantError(
112  f"Failed to update firmware on {self.name}"
113  ) from err
None async_install(self, str|None version, bool backup, **Any kwargs)
Definition: update.py:103
None __init__(self, EzvizDataUpdateCoordinator coordinator, str serial, str sensor, UpdateEntityDescription description)
Definition: update.py:64
web.Response get(self, web.Request request, str config_key)
Definition: view.py:88
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: update.py:34