From a33f2f117efb3650ecf71bef34776e8560584b31 Mon Sep 17 00:00:00 2001 From: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com> Date: Mon, 5 Feb 2024 17:52:47 -0600 Subject: [PATCH] more robust onvif checks (#9635) --- frigate/ptz/onvif.py | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/frigate/ptz/onvif.py b/frigate/ptz/onvif.py index e56afe70c..8aae216f1 100644 --- a/frigate/ptz/onvif.py +++ b/frigate/ptz/onvif.py @@ -6,6 +6,7 @@ from enum import Enum import numpy from onvif import ONVIFCamera, ONVIFError +from zeep.exceptions import Fault, TransportError from frigate.config import FrigateConfig, ZoomingModeEnum from frigate.types import PTZMetricsTypes @@ -68,16 +69,19 @@ class OnvifController: media = onvif.create_media_service() try: + # this will fire an exception if camera is not a ptz + capabilities = onvif.get_definition("ptz") + logger.debug(f"Onvif capabilities for {camera_name}: {capabilities}") profile = media.GetProfiles()[0] - except ONVIFError as e: + except (ONVIFError, Fault, TransportError) as e: logger.error(f"Unable to connect to camera: {camera_name}: {e}") return False ptz = onvif.create_ptz_service() - request = ptz.create_type("GetConfigurations") - configs = ptz.GetConfigurations(request)[0] - logger.debug(f"Onvif configs for {camera_name}: {configs}") + # get the PTZ config for the first onvif profile + configs = profile.PTZConfiguration + logger.debug(f"Onvif ptz config for media profile in {camera_name}: {configs}") request = ptz.create_type("GetConfigurationOptions") request.ConfigurationToken = profile.PTZConfiguration.token @@ -187,19 +191,18 @@ class OnvifController: ] = preset["token"] # get list of supported features - ptz_config = ptz.GetConfigurationOptions(request) supported_features = [] - if ptz_config.Spaces and ptz_config.Spaces.ContinuousPanTiltVelocitySpace: + if configs.DefaultContinuousPanTiltVelocitySpace: supported_features.append("pt") - if ptz_config.Spaces and ptz_config.Spaces.ContinuousZoomVelocitySpace: + if configs.DefaultContinuousZoomVelocitySpace: supported_features.append("zoom") - if ptz_config.Spaces and ptz_config.Spaces.RelativePanTiltTranslationSpace: + if configs.DefaultRelativePanTiltTranslationSpace: supported_features.append("pt-r") - if ptz_config.Spaces and ptz_config.Spaces.RelativeZoomTranslationSpace: + if configs.DefaultRelativeZoomTranslationSpace: supported_features.append("zoom-r") try: # get camera's zoom limits from onvif config @@ -218,7 +221,7 @@ class OnvifController: f"Disabling autotracking zooming for {camera_name}: Relative zoom not supported" ) - if ptz_config.Spaces and ptz_config.Spaces.AbsoluteZoomPositionSpace: + if configs.DefaultAbsoluteZoomPositionSpace: supported_features.append("zoom-a") try: # get camera's zoom limits from onvif config @@ -236,7 +239,10 @@ class OnvifController: ) # set relative pan/tilt space for autotracker - if fov_space_id is not None: + if ( + fov_space_id is not None + and configs.DefaultRelativePanTiltTranslationSpace is not None + ): supported_features.append("pt-r-fov") self.cams[camera_name][ "relative_fov_range"