From 11ffe07ae355ee6b3ef35a4b2710e0b453bc51e5 Mon Sep 17 00:00:00 2001 From: Nick Mowen Date: Thu, 15 Dec 2022 09:42:46 -0700 Subject: [PATCH] Set name --- frigate/app.py | 1 + frigate/comms/dispatcher.py | 2 +- frigate/http.py | 11 +++++++++++ frigate/ptz.py | 24 +++++++++++++++++++++++- 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/frigate/app.py b/frigate/app.py index 11749a15c..54d2825c8 100644 --- a/frigate/app.py +++ b/frigate/app.py @@ -174,6 +174,7 @@ class FrigateApp: self.stats_tracking, self.detected_frames_processor, self.storage_maintainer, + self.onvif_controller, self.plus_api, ) diff --git a/frigate/comms/dispatcher.py b/frigate/comms/dispatcher.py index 86ab35a33..bcd0fc186 100644 --- a/frigate/comms/dispatcher.py +++ b/frigate/comms/dispatcher.py @@ -230,5 +230,5 @@ class Dispatcher: logger.info(f"Setting ptz command to {command} for {camera_name}") except KeyError as k: logger.error(f"Invalid PTZ command {payload}: {k}") - #except Exception as e: + # except Exception as e: # logger.error(f"Error sending {payload} to {camera_name}: {e}") diff --git a/frigate/http.py b/frigate/http.py index efe99c182..cd2a0c523 100644 --- a/frigate/http.py +++ b/frigate/http.py @@ -36,6 +36,7 @@ from frigate.const import CLIPS_DIR, MAX_SEGMENT_DURATION, RECORD_DIR from frigate.models import Event, Recordings, Timeline from frigate.object_processing import TrackedObject from frigate.plus import PlusApi +from frigate.ptz import OnvifController from frigate.stats import stats_snapshot from frigate.util import ( clean_camera_user_pass, @@ -59,6 +60,7 @@ def create_app( stats_tracking, detected_frames_processor, storage_maintainer: StorageMaintainer, + onvif: OnvifController, plus_api: PlusApi, ): app = Flask(__name__) @@ -77,6 +79,7 @@ def create_app( app.stats_tracking = stats_tracking app.detected_frames_processor = detected_frames_processor app.storage_maintainer = storage_maintainer + app.onvif = onvif app.plus_api = plus_api app.camera_error_image = None app.hwaccel_errors = [] @@ -994,6 +997,14 @@ def mjpeg_feed(camera_name): return "Camera named {} not found".format(camera_name), 404 +@bp.route("//ptz/info") +def camera_ptz_info(camera_name): + if camera_name in current_app.frigate_config.cameras: + return jsonify(current_app.onvif.get_camera_info(camera_name)) + else: + return "Camera named {} not found".format(camera_name), 404 + + @bp.route("//latest.jpg") def latest_frame(camera_name): draw_options = { diff --git a/frigate/ptz.py b/frigate/ptz.py index 209bdb3bf..b1e9422d4 100644 --- a/frigate/ptz.py +++ b/frigate/ptz.py @@ -65,7 +65,15 @@ class OnvifController: # get list of supported features ptz_config = ptz.GetConfigurationOptions(request) - logger.error(f"ptz config is {ptz_config}") + supported_features = [] + + if ptz_config.get("Spaces", {}).get("ContinuousPanTiltVelocitySpace"): + supported_features.append("pt") + + if ptz_config.get("Spaces", {}).get("ContinuousZoomVelocitySpace"): + supported_features.append("zoom") + + self.cams[camera_name]["features"] = supported_features self.cams[camera_name]["init"] = True @@ -171,3 +179,17 @@ class OnvifController: self._zoom(camera_name, command) else: self._move(camera_name, command) + + def get_camera_info(self, camera_name: str) -> dict[str, any]: + if camera_name not in self.cams.keys(): + logger.error(f"Onvif is not setup for {camera_name}") + return {} + + if not self.cams[camera_name]["init"]: + self._init_onvif(camera_name) + + return { + "name": camera_name, + "features": self.cams[camera_name]["feautres"], + "presets": self.cams[camera_name]["presets"].keys(), + }