Home Assistant Unofficial Reference 2024.12.1
image.py
Go to the documentation of this file.
1 """Support EZVIZ last motion image."""
2 
3 from __future__ import annotations
4 
5 import logging
6 
7 from pyezviz.exceptions import PyEzvizError
8 from pyezviz.utils import decrypt_image
9 
10 from homeassistant.components.image import Image, ImageEntity, ImageEntityDescription
11 from homeassistant.config_entries import ConfigEntry
12 from homeassistant.const import CONF_PASSWORD
13 from homeassistant.core import HomeAssistant, callback
14 from homeassistant.helpers.entity_platform import AddEntitiesCallback
15 from homeassistant.util import dt as dt_util
16 
17 from .const import DATA_COORDINATOR, DOMAIN
18 from .coordinator import EzvizDataUpdateCoordinator
19 from .entity import EzvizEntity
20 
21 _LOGGER = logging.getLogger(__name__)
22 
24  key="last_motion_image",
25  translation_key="last_motion_image",
26 )
27 
28 
30  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
31 ) -> None:
32  """Set up EZVIZ image entities based on a config entry."""
33 
34  coordinator: EzvizDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id][
35  DATA_COORDINATOR
36  ]
37 
39  EzvizLastMotion(hass, coordinator, camera) for camera in coordinator.data
40  )
41 
42 
44  """Return Last Motion Image from Ezviz Camera."""
45 
46  def __init__(
47  self, hass: HomeAssistant, coordinator: EzvizDataUpdateCoordinator, serial: str
48  ) -> None:
49  """Initialize a image entity."""
50  EzvizEntity.__init__(self, coordinator, serial)
51  ImageEntity.__init__(self, hass)
52  self._attr_unique_id_attr_unique_id = f"{serial}_{IMAGE_TYPE.key}"
53  self.entity_descriptionentity_description = IMAGE_TYPE
54  self._attr_image_url_attr_image_url = self.datadatadata["last_alarm_pic"]
55  self._attr_image_last_updated_attr_image_last_updated = dt_util.parse_datetime(
56  str(self.datadatadata["last_alarm_time"])
57  )
58  camera = hass.config_entries.async_entry_for_domain_unique_id(DOMAIN, serial)
59  self.alarm_image_passwordalarm_image_password = (
60  camera.data[CONF_PASSWORD] if camera is not None else None
61  )
62 
63  async def _async_load_image_from_url(self, url: str) -> Image | None:
64  """Load an image by url."""
65  if response := await self._fetch_url_fetch_url(url):
66  image_data = response.content
67  if self.datadatadata["encrypted"] and self.alarm_image_passwordalarm_image_password is not None:
68  try:
69  image_data = decrypt_image(
70  response.content, self.alarm_image_passwordalarm_image_password
71  )
72  except PyEzvizError:
73  _LOGGER.warning(
74  "%s: Can't decrypt last alarm picture, looks like it was encrypted with other password",
75  self.entity_identity_id,
76  )
77  image_data = response.content
78  return Image(
79  content=image_data,
80  content_type="image/jpeg", # Actually returns binary/octet-stream
81  )
82  return None
83 
84  @callback
85  def _handle_coordinator_update(self) -> None:
86  """Handle updated data from the coordinator."""
87  if (
88  self.datadatadata["last_alarm_pic"]
89  and self.datadatadata["last_alarm_pic"] != self._attr_image_url_attr_image_url
90  ):
91  _LOGGER.debug("Image url changed to %s", self.datadatadata["last_alarm_pic"])
92 
93  self._attr_image_url_attr_image_url = self.datadatadata["last_alarm_pic"]
94  self._cached_image_cached_image_cached_image = None
95  self._attr_image_last_updated_attr_image_last_updated = dt_util.parse_datetime(
96  str(self.datadatadata["last_alarm_time"])
97  )
98 
None __init__(self, HomeAssistant hass, EzvizDataUpdateCoordinator coordinator, str serial)
Definition: image.py:48
Image|None _async_load_image_from_url(self, str url)
Definition: image.py:63
httpx.Response|None _fetch_url(self, str url)
Definition: __init__.py:208
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: image.py:31