mirror of
https://github.com/home-assistant/core.git
synced 2025-07-17 18:27:09 +00:00
Add onvif PTZ GotoPreset (#34420)
* Added PTZ GotoPreset support * Update camera.py Processed flake8 error * Update services.yaml Removed trailing spaces * Update camera.py black formatted code
This commit is contained in:
parent
d3bbd9ec65
commit
d416029e82
@ -54,6 +54,7 @@ ATTR_DISTANCE = "distance"
|
|||||||
ATTR_SPEED = "speed"
|
ATTR_SPEED = "speed"
|
||||||
ATTR_MOVE_MODE = "move_mode"
|
ATTR_MOVE_MODE = "move_mode"
|
||||||
ATTR_CONTINUOUS_DURATION = "continuous_duration"
|
ATTR_CONTINUOUS_DURATION = "continuous_duration"
|
||||||
|
ATTR_PRESET = "preset"
|
||||||
|
|
||||||
DIR_UP = "UP"
|
DIR_UP = "UP"
|
||||||
DIR_DOWN = "DOWN"
|
DIR_DOWN = "DOWN"
|
||||||
@ -67,6 +68,7 @@ ZOOM_FACTOR = {ZOOM_IN: 1, ZOOM_OUT: -1}
|
|||||||
CONTINUOUS_MOVE = "ContinuousMove"
|
CONTINUOUS_MOVE = "ContinuousMove"
|
||||||
RELATIVE_MOVE = "RelativeMove"
|
RELATIVE_MOVE = "RelativeMove"
|
||||||
ABSOLUTE_MOVE = "AbsoluteMove"
|
ABSOLUTE_MOVE = "AbsoluteMove"
|
||||||
|
GOTOPRESET_MOVE = "GotoPreset"
|
||||||
|
|
||||||
SERVICE_PTZ = "ptz"
|
SERVICE_PTZ = "ptz"
|
||||||
|
|
||||||
@ -99,10 +101,13 @@ SERVICE_PTZ_SCHEMA = vol.Schema(
|
|||||||
vol.Optional(ATTR_PAN): vol.In([DIR_LEFT, DIR_RIGHT]),
|
vol.Optional(ATTR_PAN): vol.In([DIR_LEFT, DIR_RIGHT]),
|
||||||
vol.Optional(ATTR_TILT): vol.In([DIR_UP, DIR_DOWN]),
|
vol.Optional(ATTR_TILT): vol.In([DIR_UP, DIR_DOWN]),
|
||||||
vol.Optional(ATTR_ZOOM): vol.In([ZOOM_OUT, ZOOM_IN]),
|
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_CONTINUOUS_DURATION, default=0.5): cv.small_float,
|
||||||
vol.Optional(ATTR_DISTANCE, default=0.1): 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_SPEED, default=0.5): cv.small_float,
|
||||||
|
vol.Optional(ATTR_PRESET, default="0"): cv.string,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -120,6 +125,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info=
|
|||||||
speed = service.data[ATTR_SPEED]
|
speed = service.data[ATTR_SPEED]
|
||||||
move_mode = service.data.get(ATTR_MOVE_MODE)
|
move_mode = service.data.get(ATTR_MOVE_MODE)
|
||||||
continuous_duration = service.data[ATTR_CONTINUOUS_DURATION]
|
continuous_duration = service.data[ATTR_CONTINUOUS_DURATION]
|
||||||
|
preset = service.data[ATTR_PRESET]
|
||||||
all_cameras = hass.data[ONVIF_DATA][ENTITIES]
|
all_cameras = hass.data[ONVIF_DATA][ENTITIES]
|
||||||
entity_ids = await async_extract_entity_ids(hass, service)
|
entity_ids = await async_extract_entity_ids(hass, service)
|
||||||
target_cameras = []
|
target_cameras = []
|
||||||
@ -131,7 +137,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info=
|
|||||||
]
|
]
|
||||||
for camera in target_cameras:
|
for camera in target_cameras:
|
||||||
await camera.async_perform_ptz(
|
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(
|
hass.services.async_register(
|
||||||
@ -435,7 +441,7 @@ class ONVIFHassCamera(Camera):
|
|||||||
_LOGGER.debug("Completed set up of the ONVIF camera component")
|
_LOGGER.debug("Completed set up of the ONVIF camera component")
|
||||||
|
|
||||||
async def async_perform_ptz(
|
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."""
|
"""Perform a PTZ action on the camera."""
|
||||||
if self._ptz_service is None:
|
if self._ptz_service is None:
|
||||||
@ -447,13 +453,15 @@ class ONVIFHassCamera(Camera):
|
|||||||
tilt_val = distance * TILT_FACTOR.get(tilt, 0)
|
tilt_val = distance * TILT_FACTOR.get(tilt, 0)
|
||||||
zoom_val = distance * ZOOM_FACTOR.get(zoom, 0)
|
zoom_val = distance * ZOOM_FACTOR.get(zoom, 0)
|
||||||
speed_val = speed
|
speed_val = speed
|
||||||
|
preset_val = preset
|
||||||
_LOGGER.debug(
|
_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,
|
move_mode,
|
||||||
pan_val,
|
pan_val,
|
||||||
tilt_val,
|
tilt_val,
|
||||||
zoom_val,
|
zoom_val,
|
||||||
speed_val,
|
speed_val,
|
||||||
|
preset_val,
|
||||||
)
|
)
|
||||||
try:
|
try:
|
||||||
req = self._ptz_service.create_type(move_mode)
|
req = self._ptz_service.create_type(move_mode)
|
||||||
@ -489,6 +497,13 @@ class ONVIFHassCamera(Camera):
|
|||||||
"Zoom": {"x": speed_val},
|
"Zoom": {"x": speed_val},
|
||||||
}
|
}
|
||||||
await self._ptz_service.AbsoluteMove(req)
|
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:
|
except exceptions.ONVIFError as err:
|
||||||
if "Bad Request" in err.reason:
|
if "Bad Request" in err.reason:
|
||||||
self._ptz_service = None
|
self._ptz_service = None
|
||||||
|
@ -25,7 +25,10 @@ ptz:
|
|||||||
description: "Set ContinuousMove delay in seconds before stopping the move"
|
description: "Set ContinuousMove delay in seconds before stopping the move"
|
||||||
default: 0.5
|
default: 0.5
|
||||||
example: 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:
|
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"
|
default: "RelativeMove"
|
||||||
example: "ContinuousMove"
|
example: "ContinuousMove"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user