From d102ebf855ed59783a2b3302b974a8f0a7191832 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20den=20Berg?= Date: Sun, 22 Oct 2023 16:08:05 +0200 Subject: [PATCH] [CHANGE] More resilient and slightly faster PTZ (#8009) * [CHANGE] More resilient and slightly faster PTZ * Make "Check Black" happy. * Make "check black" happier * Remove unused named exception --------- Co-authored-by: Nicolas Mowen --- frigate/ptz/onvif.py | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/frigate/ptz/onvif.py b/frigate/ptz/onvif.py index 5bd245167..05b1d6331 100644 --- a/frigate/ptz/onvif.py +++ b/frigate/ptz/onvif.py @@ -99,6 +99,17 @@ class OnvifController: None, ) + # status request for autotracking and filling ptz-parameters + status_request = ptz.create_type("GetStatus") + status_request.ProfileToken = profile.token + self.cams[camera_name]["status_request"] = status_request + try: + status = ptz.GetStatus(status_request) + logger.debug(f"Onvif status config for {camera_name}: {status}") + except Exception as e: + logger.warning(f"Unable to get status from camera: {camera_name}: {e}") + status = None + # autoracking relative panning/tilting needs a relative zoom value set to 0 # if camera supports relative movement if self.config.cameras[camera_name].onvif.autotracking.zooming: @@ -122,9 +133,7 @@ class OnvifController: move_request = ptz.create_type("RelativeMove") move_request.ProfileToken = profile.token if move_request.Translation is None and fov_space_id is not None: - move_request.Translation = ptz.GetStatus( - {"ProfileToken": profile.token} - ).Position + move_request.Translation = status.Position move_request.Translation.PanTilt.space = ptz_config["Spaces"][ "RelativePanTiltTranslationSpace" ][fov_space_id]["URI"] @@ -152,7 +161,7 @@ class OnvifController: ) if move_request.Speed is None: - move_request.Speed = ptz.GetStatus({"ProfileToken": profile.token}).Position + move_request.Speed = status.Position if status else None self.cams[camera_name]["relative_move_request"] = move_request # setup absolute moving request for autotracking zooming @@ -160,13 +169,6 @@ class OnvifController: move_request.ProfileToken = profile.token self.cams[camera_name]["absolute_move_request"] = move_request - # status request for autotracking - status_request = ptz.create_type("GetStatus") - status_request.ProfileToken = profile.token - self.cams[camera_name]["status_request"] = status_request - status = ptz.GetStatus(status_request) - logger.debug(f"Onvif status config for {camera_name}: {status}") - # setup existing presets try: presets: list[dict] = ptz.GetPresets({"ProfileToken": profile.token}) @@ -494,7 +496,10 @@ class OnvifController: onvif: ONVIFCamera = self.cams[camera_name]["onvif"] status_request = self.cams[camera_name]["status_request"] - status = onvif.get_service("ptz").GetStatus(status_request) + try: + status = onvif.get_service("ptz").GetStatus(status_request) + except Exception: + pass # We're unsupported, that'll be reported in the next check. # there doesn't seem to be an onvif standard with this optional parameter # some cameras can report MoveStatus with or without PanTilt or Zoom attributes