diff --git a/frigate/comms/dispatcher.py b/frigate/comms/dispatcher.py index f83a117510..6cb4f21b07 100644 --- a/frigate/comms/dispatcher.py +++ b/frigate/comms/dispatcher.py @@ -588,6 +588,10 @@ class Dispatcher: self.ptz_metrics[camera_name].start_time.value = 0 ptz_autotracker_settings.enabled = False + self.config_updater.publish_update( + CameraConfigUpdateTopic(CameraConfigUpdateEnum.autotracking, camera_name), + ptz_autotracker_settings, + ) self.publish(f"{camera_name}/ptz_autotracker/state", payload, retain=True) def _on_motion_contour_area_command(self, camera_name: str, payload: int) -> None: diff --git a/frigate/config/camera/updater.py b/frigate/config/camera/updater.py index afa501904a..c0b9260873 100644 --- a/frigate/config/camera/updater.py +++ b/frigate/config/camera/updater.py @@ -14,6 +14,7 @@ class CameraConfigUpdateEnum(str, Enum): add = "add" # for adding a camera audio = "audio" audio_transcription = "audio_transcription" + autotracking = "autotracking" # ptz autotracking only, without an onvif reinit birdseye = "birdseye" detect = "detect" enabled = "enabled" @@ -145,6 +146,8 @@ class CameraConfigUpdateSubscriber: config.snapshots = updated_config elif update_type == CameraConfigUpdateEnum.onvif: config.onvif = updated_config + elif update_type == CameraConfigUpdateEnum.autotracking: + config.onvif.autotracking = updated_config elif update_type == CameraConfigUpdateEnum.timestamp_style: config.timestamp_style = updated_config elif update_type == CameraConfigUpdateEnum.zones: diff --git a/frigate/ptz/autotrack.py b/frigate/ptz/autotrack.py index 4e27e2653d..7cb78fcc8e 100644 --- a/frigate/ptz/autotrack.py +++ b/frigate/ptz/autotrack.py @@ -20,6 +20,10 @@ from norfair.camera_motion import ( from frigate.camera import PTZMetrics from frigate.comms.dispatcher import Dispatcher from frigate.config import CameraConfig, FrigateConfig, ZoomingModeEnum +from frigate.config.camera.updater import ( + CameraConfigUpdateEnum, + CameraConfigUpdateSubscriber, +) from frigate.const import ( AUTOTRACKING_MAX_AREA_RATIO, AUTOTRACKING_MAX_MOVE_METRICS, @@ -194,7 +198,9 @@ class PtzAutoTrackerThread(threading.Thread): def run(self): while not self.stop_event.wait(1): - for camera, camera_config in self.config.cameras.items(): + self.ptz_autotracker.config_subscriber.check_for_updates() + + for camera, camera_config in list(self.config.cameras.items()): if not camera_config.enabled: continue @@ -211,6 +217,7 @@ class PtzAutoTrackerThread(threading.Thread): self.ptz_autotracker.tracked_object[camera] = None self.ptz_autotracker.tracked_object_history[camera].clear() + self.ptz_autotracker.config_subscriber.stop() logger.info("Exiting autotracker...") @@ -244,6 +251,15 @@ class PtzAutoTracker: self.zoom_time: dict[str, float] = {} self.zoom_factor: dict[str, object] = {} + self.config_subscriber = CameraConfigUpdateSubscriber( + self.config, + self.config.cameras, + [ + CameraConfigUpdateEnum.add, + CameraConfigUpdateEnum.autotracking, + ], + ) + # if cam is set to autotrack, onvif should be set up for camera, camera_config in self.config.cameras.items(): if not camera_config.enabled: