From b83ccc91af1dfc90bdb5a2316d8c579336b0681c Mon Sep 17 00:00:00 2001 From: Geronimo2015 Date: Sun, 19 Apr 2020 11:33:50 +0200 Subject: [PATCH 1/4] Added PTZ GotoPreset support --- homeassistant/components/onvif/camera.py | 21 ++++++++++++++++---- homeassistant/components/onvif/services.yaml | 5 ++++- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/onvif/camera.py b/homeassistant/components/onvif/camera.py index 51ea3fab0cc71..da5ffe646e725 100644 --- a/homeassistant/components/onvif/camera.py +++ b/homeassistant/components/onvif/camera.py @@ -54,6 +54,7 @@ ATTR_SPEED = "speed" ATTR_MOVE_MODE = "move_mode" ATTR_CONTINUOUS_DURATION = "continuous_duration" +ATTR_PRESET = "preset" DIR_UP = "UP" DIR_DOWN = "DOWN" @@ -67,6 +68,7 @@ CONTINUOUS_MOVE = "ContinuousMove" RELATIVE_MOVE = "RelativeMove" ABSOLUTE_MOVE = "AbsoluteMove" +GOTOPRESET_MOVE = "GotoPreset" SERVICE_PTZ = "ptz" @@ -99,10 +101,11 @@ vol.Optional(ATTR_PAN): vol.In([DIR_LEFT, DIR_RIGHT]), vol.Optional(ATTR_TILT): vol.In([DIR_UP, DIR_DOWN]), vol.Optional(ATTR_ZOOM): vol.In([ZOOM_OUT, ZOOM_IN]), - ATTR_MOVE_MODE: vol.In([CONTINUOUS_MOVE, RELATIVE_MOVE, ABSOLUTE_MOVE]), + ATTR_MOVE_MODE: vol.In([CONTINUOUS_MOVE, RELATIVE_MOVE, ABSOLUTE_MOVE, GOTOPRESET_MOVE]), vol.Optional(ATTR_CONTINUOUS_DURATION, default=0.5): cv.small_float, vol.Optional(ATTR_DISTANCE, default=0.1): cv.small_float, vol.Optional(ATTR_SPEED, default=0.5): cv.small_float, + vol.Optional(ATTR_PRESET, default="0"): cv.string, } ) @@ -120,6 +123,7 @@ async def async_handle_ptz(service): speed = service.data[ATTR_SPEED] move_mode = service.data.get(ATTR_MOVE_MODE) continuous_duration = service.data[ATTR_CONTINUOUS_DURATION] + preset = service.data[ATTR_PRESET] all_cameras = hass.data[ONVIF_DATA][ENTITIES] entity_ids = await async_extract_entity_ids(hass, service) target_cameras = [] @@ -131,7 +135,7 @@ async def async_handle_ptz(service): ] for camera in target_cameras: await camera.async_perform_ptz( - pan, tilt, zoom, distance, speed, move_mode, continuous_duration + pan, tilt, zoom, distance, speed, move_mode, continuous_duration, preset ) hass.services.async_register( @@ -435,7 +439,7 @@ def setup_ptz(self): _LOGGER.debug("Completed set up of the ONVIF camera component") async def async_perform_ptz( - self, pan, tilt, zoom, distance, speed, move_mode, continuous_duration + self, pan, tilt, zoom, distance, speed, move_mode, continuous_duration, preset ): """Perform a PTZ action on the camera.""" if self._ptz_service is None: @@ -447,13 +451,15 @@ async def async_perform_ptz( tilt_val = distance * TILT_FACTOR.get(tilt, 0) zoom_val = distance * ZOOM_FACTOR.get(zoom, 0) speed_val = speed + preset_val = preset _LOGGER.debug( - "Calling %s PTZ | Pan = %4.2f | Tilt = %4.2f | Zoom = %4.2f | Speed = %4.2f", + "Calling %s PTZ | Pan = %4.2f | Tilt = %4.2f | Zoom = %4.2f | Speed = %4.2f | Preset = %s", move_mode, pan_val, tilt_val, zoom_val, speed_val, + preset_val ) try: req = self._ptz_service.create_type(move_mode) @@ -489,6 +495,13 @@ async def async_perform_ptz( "Zoom": {"x": speed_val}, } await self._ptz_service.AbsoluteMove(req) + elif move_mode == GOTOPRESET_MOVE: + req.PresetToken = preset_val + req.Speed = { + "PanTilt": {"x": speed_val, "y": speed_val}, + "Zoom": {"x": speed_val}, + } + await self._ptz_service.GotoPreset(req) except exceptions.ONVIFError as err: if "Bad Request" in err.reason: self._ptz_service = None diff --git a/homeassistant/components/onvif/services.yaml b/homeassistant/components/onvif/services.yaml index 8d14633cc9c39..9de386df2cd9f 100644 --- a/homeassistant/components/onvif/services.yaml +++ b/homeassistant/components/onvif/services.yaml @@ -25,7 +25,10 @@ ptz: description: "Set ContinuousMove delay in seconds before stopping the move" default: 0.5 example: 0.5 + preset: + description: "PTZ preset profile token. Sets the preset profile token which is executed with GotoPreset" + example: "1" move_mode: - description: "PTZ moving mode. One of ContinuousMove, RelativeMove or AbsoluteMove" + description: "PTZ moving mode. One of ContinuousMove, RelativeMove, AbsoluteMove or GotoPreset" default: "RelativeMove" example: "ContinuousMove" From 71a222c40615aa3c87fc8f5bf8d9c8c281a13824 Mon Sep 17 00:00:00 2001 From: Geronimo2015 Date: Sun, 19 Apr 2020 12:00:28 +0200 Subject: [PATCH 2/4] Update camera.py Processed flake8 error --- homeassistant/components/onvif/camera.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/onvif/camera.py b/homeassistant/components/onvif/camera.py index da5ffe646e725..f59456de5a8f3 100644 --- a/homeassistant/components/onvif/camera.py +++ b/homeassistant/components/onvif/camera.py @@ -501,7 +501,7 @@ async def async_perform_ptz( "PanTilt": {"x": speed_val, "y": speed_val}, "Zoom": {"x": speed_val}, } - await self._ptz_service.GotoPreset(req) + await self._ptz_service.GotoPreset(req) except exceptions.ONVIFError as err: if "Bad Request" in err.reason: self._ptz_service = None From d62bc4823c6c5eecadb77e525111173e4b8610a4 Mon Sep 17 00:00:00 2001 From: Geronimo2015 Date: Sun, 19 Apr 2020 12:12:04 +0200 Subject: [PATCH 3/4] Update services.yaml Removed trailing spaces --- homeassistant/components/onvif/services.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/onvif/services.yaml b/homeassistant/components/onvif/services.yaml index 9de386df2cd9f..e5a8c9fce3516 100644 --- a/homeassistant/components/onvif/services.yaml +++ b/homeassistant/components/onvif/services.yaml @@ -27,7 +27,7 @@ ptz: example: 0.5 preset: description: "PTZ preset profile token. Sets the preset profile token which is executed with GotoPreset" - example: "1" + example: "1" move_mode: description: "PTZ moving mode. One of ContinuousMove, RelativeMove, AbsoluteMove or GotoPreset" default: "RelativeMove" From 3ae7d30eed1d2dcf081e38f5a35f1700728bac39 Mon Sep 17 00:00:00 2001 From: Geronimo2015 Date: Thu, 23 Apr 2020 17:12:39 +0200 Subject: [PATCH 4/4] Update camera.py black formatted code --- homeassistant/components/onvif/camera.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/onvif/camera.py b/homeassistant/components/onvif/camera.py index f59456de5a8f3..7fea75735e086 100644 --- a/homeassistant/components/onvif/camera.py +++ b/homeassistant/components/onvif/camera.py @@ -101,7 +101,9 @@ vol.Optional(ATTR_PAN): vol.In([DIR_LEFT, DIR_RIGHT]), vol.Optional(ATTR_TILT): vol.In([DIR_UP, DIR_DOWN]), vol.Optional(ATTR_ZOOM): vol.In([ZOOM_OUT, ZOOM_IN]), - ATTR_MOVE_MODE: vol.In([CONTINUOUS_MOVE, RELATIVE_MOVE, ABSOLUTE_MOVE, GOTOPRESET_MOVE]), + ATTR_MOVE_MODE: vol.In( + [CONTINUOUS_MOVE, RELATIVE_MOVE, ABSOLUTE_MOVE, GOTOPRESET_MOVE] + ), vol.Optional(ATTR_CONTINUOUS_DURATION, default=0.5): cv.small_float, vol.Optional(ATTR_DISTANCE, default=0.1): cv.small_float, vol.Optional(ATTR_SPEED, default=0.5): cv.small_float, @@ -459,7 +461,7 @@ async def async_perform_ptz( tilt_val, zoom_val, speed_val, - preset_val + preset_val, ) try: req = self._ptz_service.create_type(move_mode)