From 144264e760c41528d86c5971c37b459e19022785 Mon Sep 17 00:00:00 2001 From: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com> Date: Mon, 28 Aug 2023 13:01:14 -0500 Subject: [PATCH] don't zoom if camera doesn't support it --- frigate/ptz/autotrack.py | 4 ++-- frigate/ptz/onvif.py | 30 +++++++++++++++++++++--------- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/frigate/ptz/autotrack.py b/frigate/ptz/autotrack.py index 935d49250..cc79efa68 100644 --- a/frigate/ptz/autotrack.py +++ b/frigate/ptz/autotrack.py @@ -176,7 +176,7 @@ class PtzAutoTracker: return - if not self.onvif.cams[camera_name]["relative_fov_supported"]: + if "pt-r-fov" not in self.onvif.cams[camera_name]["features"]: cam.onvif.autotracking.enabled = False self.ptz_metrics[camera_name]["ptz_autotracker_enabled"].value = False logger.warning( @@ -219,7 +219,7 @@ class PtzAutoTracker: # on some cameras with cheaper motors it seems like small values can cause jerky movement # TODO: double check, might not need this if abs(pan) > 0.02 or abs(tilt) > 0.02: - self.onvif._move_relative(camera, pan, tilt, 1) + self.onvif._move_relative(camera, pan, tilt, 0, 1) else: logger.debug( f"Not moving, pan and tilt too small: {pan}, {tilt}" diff --git a/frigate/ptz/onvif.py b/frigate/ptz/onvif.py index 63a195651..58c95b37b 100644 --- a/frigate/ptz/onvif.py +++ b/frigate/ptz/onvif.py @@ -89,6 +89,17 @@ class OnvifController: None, ) + zoom_space_id = next( + ( + i + for i, space in enumerate( + ptz_config.Spaces.RelativeZoomTranslationSpace + ) + if "TranslationGenericSpace" in space["URI"] + ), + None, + ) + # setup continuous moving request move_request = ptz.create_type("ContinuousMove") move_request.ProfileToken = profile.token @@ -104,9 +115,10 @@ class OnvifController: move_request.Translation.PanTilt.space = ptz_config["Spaces"][ "RelativePanTiltTranslationSpace" ][fov_space_id]["URI"] - move_request.Translation.Zoom.space = ptz_config["Spaces"][ - "RelativeZoomTranslationSpace" - ][0]["URI"] + if zoom_space_id is not None: + move_request.Translation.Zoom.space = ptz_config["Spaces"][ + "RelativeZoomTranslationSpace" + ][0]["URI"] if move_request.Speed is None: move_request.Speed = ptz.GetStatus({"ProfileToken": profile.token}).Position self.cams[camera_name]["relative_move_request"] = move_request @@ -153,8 +165,6 @@ class OnvifController: "relative_fov_range" ] = ptz_config.Spaces.RelativePanTiltTranslationSpace[fov_space_id] - self.cams[camera_name]["relative_fov_supported"] = fov_space_id is not None - self.cams[camera_name]["features"] = supported_features self.cams[camera_name]["init"] = True @@ -204,8 +214,8 @@ class OnvifController: onvif.get_service("ptz").ContinuousMove(move_request) - def _move_relative(self, camera_name: str, pan, tilt, speed) -> None: - if not self.cams[camera_name]["relative_fov_supported"]: + def _move_relative(self, camera_name: str, pan, tilt, zoom, speed) -> None: + if "pt-r-fov" not in self.cams[camera_name]["features"]: logger.error(f"{camera_name} does not support ONVIF RelativeMove (FOV).") return @@ -251,12 +261,14 @@ class OnvifController: "x": speed, "y": speed, }, - "Zoom": 0, } move_request.Translation.PanTilt.x = pan move_request.Translation.PanTilt.y = tilt - move_request.Translation.Zoom.x = 0 + + if "zoom-r" in self.cams[camera_name]["features"]: + move_request.Speed["Zoom"] = 0 + move_request.Translation.Zoom.x = zoom onvif.get_service("ptz").RelativeMove(move_request)