From 1142e9ddd7d1e5949d64081664be9d5a58f28afd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20den=20Berg?= Date: Sun, 1 Oct 2023 02:40:37 +0200 Subject: [PATCH] [CHANGE] More resilient and slightly faster PTZ --- frigate/ptz/onvif.py | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/frigate/ptz/onvif.py b/frigate/ptz/onvif.py index b8794b6f1..d6acafb48 100644 --- a/frigate/ptz/onvif.py +++ b/frigate/ptz/onvif.py @@ -98,6 +98,19 @@ 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 @@ -122,9 +135,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"] @@ -146,7 +157,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 @@ -154,13 +165,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}) @@ -486,7 +490,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 as e: + 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