diff --git a/.coveragerc b/.coveragerc index 6b2870e84881af..52350a498d91d6 100644 --- a/.coveragerc +++ b/.coveragerc @@ -317,6 +317,7 @@ omit = homeassistant/components/ezviz/__init__.py homeassistant/components/ezviz/binary_sensor.py homeassistant/components/ezviz/camera.py + homeassistant/components/ezviz/image.py homeassistant/components/ezviz/light.py homeassistant/components/ezviz/coordinator.py homeassistant/components/ezviz/number.py diff --git a/homeassistant/components/ezviz/__init__.py b/homeassistant/components/ezviz/__init__.py index 9aeba56360e8d8..4355d3d2595cb3 100644 --- a/homeassistant/components/ezviz/__init__.py +++ b/homeassistant/components/ezviz/__init__.py @@ -35,6 +35,7 @@ ATTR_TYPE_CLOUD: [ Platform.BINARY_SENSOR, Platform.CAMERA, + Platform.IMAGE, Platform.LIGHT, Platform.NUMBER, Platform.SELECT, diff --git a/homeassistant/components/ezviz/image.py b/homeassistant/components/ezviz/image.py new file mode 100644 index 00000000000000..a5dbdea1d6f8ea --- /dev/null +++ b/homeassistant/components/ezviz/image.py @@ -0,0 +1,88 @@ +"""Support EZVIZ last motion image.""" +from __future__ import annotations + +import logging + +from homeassistant.components.image import Image, ImageEntity, ImageEntityDescription +from homeassistant.config_entries import ( + ConfigEntry, +) +from homeassistant.core import HomeAssistant, callback +from homeassistant.helpers.entity_platform import ( + AddEntitiesCallback, +) +from homeassistant.util import dt as dt_util + +from .const import ( + DATA_COORDINATOR, + DOMAIN, +) +from .coordinator import EzvizDataUpdateCoordinator +from .entity import EzvizEntity + +_LOGGER = logging.getLogger(__name__) +GET_IMAGE_TIMEOUT = 10 + +IMAGE_TYPE = ImageEntityDescription( + key="last_motion_image", + translation_key="last_motion_image", +) + + +async def async_setup_entry( + hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback +) -> None: + """Set up EZVIZ image entities based on a config entry.""" + + coordinator: EzvizDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id][ + DATA_COORDINATOR + ] + + async_add_entities( + EzvizLastMotion(hass, coordinator, camera) for camera in coordinator.data + ) + + +class EzvizLastMotion(EzvizEntity, ImageEntity): + """Return Last Motion Image from Ezviz Camera.""" + + _attr_has_entity_name = True + + def __init__( + self, hass: HomeAssistant, coordinator: EzvizDataUpdateCoordinator, serial: str + ) -> None: + """Initialize a image entity.""" + super().__init__(coordinator, serial) + ImageEntity.__init__(self, hass) + self._attr_unique_id = f"{serial}_{IMAGE_TYPE.key}" + self.entity_description = IMAGE_TYPE + self._attr_image_url = self.data["last_alarm_pic"] + self._attr_image_last_updated = dt_util.parse_datetime( + str(self.data["last_alarm_time"]) + ) + + async def _async_load_image_from_url(self, url: str) -> Image | None: + """Load an image by url.""" + if response := await self._fetch_url(url): + return Image( + content=response.content, + content_type="image/jpeg", # Actually returns binary/octet-stream + ) + return None + + @callback + def _handle_coordinator_update(self) -> None: + """Handle updated data from the coordinator.""" + if ( + self.data["last_alarm_pic"] + and self.data["last_alarm_pic"] != self._attr_image_url + ): + _LOGGER.debug("Image url changed to %s", self.data["last_alarm_pic"]) + + self._attr_image_url = self.data["last_alarm_pic"] + self._cached_image = None + self._attr_image_last_updated = dt_util.parse_datetime( + str(self.data["last_alarm_time"]) + ) + + super()._handle_coordinator_update() diff --git a/homeassistant/components/ezviz/sensor.py b/homeassistant/components/ezviz/sensor.py index 075fe6bd6d1b7d..1a8bfba21fb7a8 100644 --- a/homeassistant/components/ezviz/sensor.py +++ b/homeassistant/components/ezviz/sensor.py @@ -33,7 +33,6 @@ key="Seconds_Last_Trigger", entity_registry_enabled_default=False, ), - "last_alarm_pic": SensorEntityDescription(key="last_alarm_pic"), "supported_channels": SensorEntityDescription(key="supported_channels"), "local_ip": SensorEntityDescription(key="local_ip"), "wan_ip": SensorEntityDescription(key="wan_ip"), diff --git a/homeassistant/components/ezviz/strings.json b/homeassistant/components/ezviz/strings.json index aec1f892b1fbc2..1b244182059df3 100644 --- a/homeassistant/components/ezviz/strings.json +++ b/homeassistant/components/ezviz/strings.json @@ -93,6 +93,11 @@ "silent": "Silent" } } + }, + "image": { + "last_motion_image": { + "name": "Last motion image" + } } }, "services": {