mirror of
https://github.com/home-assistant/core.git
synced 2025-07-27 07:07:28 +00:00
Add Ezviz last motion picture image entity (#94421)
* Initial commit * Update camera.py * ignore type mismatch on append. * Use new image entity. * coveragerc update * Remove all changes to camera in this pull. * Fix docstring. * remove old "last_alarm_pic" sensor * Update image entity * bypass for content check error * Fix last updated not sting object * Remove redundant url change check. * Remove debug string * Check url change on coordinator data update. * Add translation key for name. * simplify update check * Rebase EzvizLastMotion ImageEntity * Change logging to debug.
This commit is contained in:
parent
0e8c85c5fc
commit
3e429ae081
@ -317,6 +317,7 @@ omit =
|
|||||||
homeassistant/components/ezviz/__init__.py
|
homeassistant/components/ezviz/__init__.py
|
||||||
homeassistant/components/ezviz/binary_sensor.py
|
homeassistant/components/ezviz/binary_sensor.py
|
||||||
homeassistant/components/ezviz/camera.py
|
homeassistant/components/ezviz/camera.py
|
||||||
|
homeassistant/components/ezviz/image.py
|
||||||
homeassistant/components/ezviz/light.py
|
homeassistant/components/ezviz/light.py
|
||||||
homeassistant/components/ezviz/coordinator.py
|
homeassistant/components/ezviz/coordinator.py
|
||||||
homeassistant/components/ezviz/number.py
|
homeassistant/components/ezviz/number.py
|
||||||
|
@ -35,6 +35,7 @@ PLATFORMS_BY_TYPE: dict[str, list] = {
|
|||||||
ATTR_TYPE_CLOUD: [
|
ATTR_TYPE_CLOUD: [
|
||||||
Platform.BINARY_SENSOR,
|
Platform.BINARY_SENSOR,
|
||||||
Platform.CAMERA,
|
Platform.CAMERA,
|
||||||
|
Platform.IMAGE,
|
||||||
Platform.LIGHT,
|
Platform.LIGHT,
|
||||||
Platform.NUMBER,
|
Platform.NUMBER,
|
||||||
Platform.SELECT,
|
Platform.SELECT,
|
||||||
|
88
homeassistant/components/ezviz/image.py
Normal file
88
homeassistant/components/ezviz/image.py
Normal file
@ -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()
|
@ -33,7 +33,6 @@ SENSOR_TYPES: dict[str, SensorEntityDescription] = {
|
|||||||
key="Seconds_Last_Trigger",
|
key="Seconds_Last_Trigger",
|
||||||
entity_registry_enabled_default=False,
|
entity_registry_enabled_default=False,
|
||||||
),
|
),
|
||||||
"last_alarm_pic": SensorEntityDescription(key="last_alarm_pic"),
|
|
||||||
"supported_channels": SensorEntityDescription(key="supported_channels"),
|
"supported_channels": SensorEntityDescription(key="supported_channels"),
|
||||||
"local_ip": SensorEntityDescription(key="local_ip"),
|
"local_ip": SensorEntityDescription(key="local_ip"),
|
||||||
"wan_ip": SensorEntityDescription(key="wan_ip"),
|
"wan_ip": SensorEntityDescription(key="wan_ip"),
|
||||||
|
@ -93,6 +93,11 @@
|
|||||||
"silent": "Silent"
|
"silent": "Silent"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"image": {
|
||||||
|
"last_motion_image": {
|
||||||
|
"name": "Last motion image"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"services": {
|
"services": {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user