Skip to content

Commit

Permalink
Align with official integration changes. (#141)
Browse files Browse the repository at this point in the history
  • Loading branch information
RenierM26 authored May 5, 2024
1 parent ffee918 commit 16a5253
Show file tree
Hide file tree
Showing 24 changed files with 124 additions and 641 deletions.
1 change: 1 addition & 0 deletions custom_components/ezviz_cloud/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
"""Support for EZVIZ camera."""

import logging

from pyezviz.client import EzvizClient
Expand Down
34 changes: 12 additions & 22 deletions custom_components/ezviz_cloud/alarm_control_panel.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
"""Support for Ezviz alarm."""

from __future__ import annotations

from dataclasses import dataclass
Expand All @@ -21,14 +22,10 @@
)
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers.entity import DeviceInfo
from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback

from .const import (
DATA_COORDINATOR,
DOMAIN,
MANUFACTURER,
)
from .const import DATA_COORDINATOR, DOMAIN, MANUFACTURER
from .coordinator import EzvizDataUpdateCoordinator

_LOGGER = logging.getLogger(__name__)
Expand All @@ -37,20 +34,13 @@
PARALLEL_UPDATES = 0


@dataclass
class EzvizAlarmControlPanelEntityDescriptionMixin:
"""Mixin values for EZVIZ Alarm control panel entities."""
@dataclass(frozen=True, kw_only=True)
class EzvizAlarmControlPanelEntityDescription(AlarmControlPanelEntityDescription):
"""Describe an EZVIZ Alarm control panel entity."""

ezviz_alarm_states: list


@dataclass
class EzvizAlarmControlPanelEntityDescription(
AlarmControlPanelEntityDescription, EzvizAlarmControlPanelEntityDescriptionMixin
):
"""Describe an EZVIZ Alarm control panel entity."""


ALARM_TYPE = EzvizAlarmControlPanelEntityDescription(
key="ezviz_alarm",
ezviz_alarm_states=[
Expand All @@ -70,12 +60,12 @@ async def async_setup_entry(
DATA_COORDINATOR
]

device_info: DeviceInfo = {
"identifiers": {(DOMAIN, entry.unique_id)}, # type: ignore[arg-type]
"name": "EZVIZ Alarm",
"model": "EZVIZ Alarm",
"manufacturer": MANUFACTURER,
}
device_info = DeviceInfo(
identifiers={(DOMAIN, entry.unique_id)}, # type: ignore[arg-type]
name="EZVIZ Alarm",
model="EZVIZ Alarm",
manufacturer=MANUFACTURER,
)

async_add_entities(
[EzvizAlarm(coordinator, entry.entry_id, device_info, ALARM_TYPE)]
Expand Down
1 change: 1 addition & 0 deletions custom_components/ezviz_cloud/binary_sensor.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
"""Support for EZVIZ binary sensors."""

from __future__ import annotations

from homeassistant.components.binary_sensor import (
Expand Down
22 changes: 6 additions & 16 deletions custom_components/ezviz_cloud/button.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
"""Support for EZVIZ button controls."""

from __future__ import annotations

from collections.abc import Callable
Expand All @@ -22,26 +23,18 @@
PARALLEL_UPDATES = 1


@dataclass
class EzvizButtonEntityDescriptionMixin:
"""Mixin values for EZVIZ button entities."""
@dataclass(frozen=True, kw_only=True)
class EzvizButtonEntityDescription(ButtonEntityDescription):
"""Describe a EZVIZ Button."""

method: Callable[[EzvizClient, str, str], Any]
supported_ext: str


@dataclass
class EzvizButtonEntityDescription(
ButtonEntityDescription, EzvizButtonEntityDescriptionMixin
):
"""Describe a EZVIZ Button."""


BUTTON_ENTITIES = (
EzvizButtonEntityDescription(
key="ptz_up",
translation_key="ptz_up",
icon="mdi:pan",
method=lambda pyezviz_client, serial, run: pyezviz_client.ptz_control(
"UP", serial, run
),
Expand All @@ -50,7 +43,6 @@ class EzvizButtonEntityDescription(
EzvizButtonEntityDescription(
key="ptz_down",
translation_key="ptz_down",
icon="mdi:pan",
method=lambda pyezviz_client, serial, run: pyezviz_client.ptz_control(
"DOWN", serial, run
),
Expand All @@ -59,7 +51,6 @@ class EzvizButtonEntityDescription(
EzvizButtonEntityDescription(
key="ptz_left",
translation_key="ptz_left",
icon="mdi:pan",
method=lambda pyezviz_client, serial, run: pyezviz_client.ptz_control(
"LEFT", serial, run
),
Expand All @@ -68,7 +59,6 @@ class EzvizButtonEntityDescription(
EzvizButtonEntityDescription(
key="ptz_right",
translation_key="ptz_right",
icon="mdi:pan",
method=lambda pyezviz_client, serial, run: pyezviz_client.ptz_control(
"RIGHT", serial, run
),
Expand All @@ -92,9 +82,9 @@ async def async_setup_entry(
async_add_entities(
EzvizButtonEntity(coordinator, camera, entity_description)
for camera in coordinator.data
for capibility, value in coordinator.data[camera]["supportExt"].items()
for capability, value in coordinator.data[camera]["supportExt"].items()
for entity_description in BUTTON_ENTITIES
if capibility == entity_description.supported_ext
if capability == entity_description.supported_ext
if value == "1"
)

Expand Down
138 changes: 2 additions & 136 deletions custom_components/ezviz_cloud/camera.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
"""Support ezviz camera devices."""

from __future__ import annotations

import logging

from pyezviz.exceptions import HTTPError, InvalidHost, PyEzvizError
import voluptuous as vol

from homeassistant.components import ffmpeg
from homeassistant.components.camera import Camera, CameraEntityFeature
Expand All @@ -17,36 +17,19 @@
)
from homeassistant.const import CONF_IP_ADDRESS, CONF_PASSWORD, CONF_USERNAME
from homeassistant.core import HomeAssistant
from homeassistant.helpers import (
config_validation as cv,
discovery_flow,
issue_registry as ir,
)
from homeassistant.helpers import discovery_flow
from homeassistant.helpers.entity_platform import (
AddEntitiesCallback,
async_get_current_platform,
)

from .const import (
ATTR_DIRECTION,
ATTR_ENABLE,
ATTR_LEVEL,
ATTR_SERIAL,
ATTR_SPEED,
ATTR_TYPE,
CONF_FFMPEG_ARGUMENTS,
DATA_COORDINATOR,
DEFAULT_CAMERA_USERNAME,
DEFAULT_FFMPEG_ARGUMENTS,
DIR_DOWN,
DIR_LEFT,
DIR_RIGHT,
DIR_UP,
DOMAIN,
SERVICE_ALARM_SOUND,
SERVICE_ALARM_TRIGGER,
SERVICE_DETECTION_SENSITIVITY,
SERVICE_PTZ,
SERVICE_WAKE_DEVICE,
)
from .coordinator import EzvizDataUpdateCoordinator
Expand Down Expand Up @@ -128,44 +111,10 @@ async def async_setup_entry(

platform = async_get_current_platform()

platform.async_register_entity_service(
SERVICE_PTZ,
{
vol.Required(ATTR_DIRECTION): vol.In(
[DIR_UP, DIR_DOWN, DIR_LEFT, DIR_RIGHT]
),
vol.Required(ATTR_SPEED): cv.positive_int,
},
"perform_ptz",
)

platform.async_register_entity_service(
SERVICE_ALARM_TRIGGER,
{
vol.Required(ATTR_ENABLE): cv.positive_int,
},
"perform_sound_alarm",
)

platform.async_register_entity_service(
SERVICE_WAKE_DEVICE, {}, "perform_wake_device"
)

platform.async_register_entity_service(
SERVICE_ALARM_SOUND,
{vol.Required(ATTR_LEVEL): cv.positive_int},
"perform_alarm_sound",
)

platform.async_register_entity_service(
SERVICE_DETECTION_SENSITIVITY,
{
vol.Required(ATTR_LEVEL): cv.positive_int,
vol.Required(ATTR_TYPE): cv.positive_int,
},
"perform_set_alarm_detection_sensibility",
)


class EzvizCamera(EzvizEntity, Camera):
"""An implementation of a EZVIZ security camera."""
Expand Down Expand Up @@ -262,92 +211,9 @@ async def stream_source(self) -> str | None:

return self._rtsp_stream

def perform_ptz(self, direction: str, speed: int) -> None:
"""Perform a PTZ action on the camera."""
ir.async_create_issue(
self.hass,
DOMAIN,
"service_depreciation_ptz",
breaks_in_ha_version="2024.2.0",
is_fixable=True,
is_persistent=True,
severity=ir.IssueSeverity.WARNING,
translation_key="service_depreciation_ptz",
)

try:
self.coordinator.ezviz_client.ptz_control(
str(direction).upper(), self._serial, "START", speed
)
self.coordinator.ezviz_client.ptz_control(
str(direction).upper(), self._serial, "STOP", speed
)

except HTTPError as err:
raise HTTPError("Cannot perform PTZ") from err

def perform_sound_alarm(self, enable: int) -> None:
"""Sound the alarm on a camera."""
ir.async_create_issue(
self.hass,
DOMAIN,
"service_depreciation_sound_alarm",
breaks_in_ha_version="2024.3.0",
is_fixable=True,
is_persistent=True,
severity=ir.IssueSeverity.WARNING,
translation_key="service_depreciation_sound_alarm",
)

try:
self.coordinator.ezviz_client.sound_alarm(self._serial, enable)
except HTTPError as err:
raise HTTPError("Cannot sound alarm") from err

def perform_wake_device(self) -> None:
"""Basically wakes the camera by querying the device."""
try:
self.coordinator.ezviz_client.get_detection_sensibility(self._serial)
except (HTTPError, PyEzvizError) as err:
raise PyEzvizError("Cannot wake device") from err

def perform_alarm_sound(self, level: int) -> None:
"""Enable/Disable movement sound alarm."""
ir.async_create_issue(
self.hass,
DOMAIN,
"service_deprecation_alarm_sound_level",
breaks_in_ha_version="2024.2.0",
is_fixable=True,
is_persistent=True,
severity=ir.IssueSeverity.WARNING,
translation_key="service_deprecation_alarm_sound_level",
)
try:
self.coordinator.ezviz_client.alarm_sound(self._serial, level, 1)
except HTTPError as err:
raise HTTPError(
"Cannot set alarm sound level for on movement detected"
) from err

def perform_set_alarm_detection_sensibility(
self, level: int, type_value: int
) -> None:
"""Set camera detection sensibility level service."""
try:
self.coordinator.ezviz_client.detection_sensibility(
self._serial, level, type_value
)
except (HTTPError, PyEzvizError) as err:
raise PyEzvizError("Cannot set detection sensitivity level") from err

ir.async_create_issue(
self.hass,
DOMAIN,
"service_depreciation_detection_sensibility",
breaks_in_ha_version="2023.12.0",
is_fixable=True,
is_persistent=True,
severity=ir.IssueSeverity.WARNING,
translation_key="service_depreciation_detection_sensibility",
)
Loading

0 comments on commit 16a5253

Please sign in to comment.