diff --git a/frigate/comms/dispatcher.py b/frigate/comms/dispatcher.py index 87891ec88..a874234b4 100644 --- a/frigate/comms/dispatcher.py +++ b/frigate/comms/dispatcher.py @@ -68,6 +68,8 @@ class Dispatcher: "birdseye_mode": self._on_birdseye_mode_command, "review_alerts": self._on_alerts_command, "review_detections": self._on_detections_command, + "object_detection_enable": self._on_object_detection_enable_command, + "object_detection_disable": self._on_object_detection_disable_command, } self._global_settings_handlers: dict[str, Callable] = { "notifications": self._on_global_notification_command, @@ -641,3 +643,27 @@ class Dispatcher: self.config_updater.publish(f"config/review/{camera_name}", review_settings) self.publish(f"{camera_name}/review_detections/state", payload, retain=True) + + def _on_object_detection_enable_command( + self, camera_name: str, object_name: str + ) -> None: + """Callback for object detect topic.""" + objects_settings = self.config.cameras[camera_name].objects + + if object_name not in objects_settings.track: + logger.info(f"Turning on detection for {object_name} on {camera_name}") + objects_settings.track.append(object_name) + + self.config_updater.publish(f"config/objects/{camera_name}", objects_settings) + + def _on_object_detection_disable_command( + self, camera_name: str, object_name: str + ) -> None: + """Callback for object detect topic.""" + objects_settings = self.config.cameras[camera_name].objects + + if object_name in objects_settings.track: + logger.info(f"Turning off detection for {object_name} on {camera_name}") + objects_settings.track.remove(object_name) + + self.config_updater.publish(f"config/objects/{camera_name}", objects_settings) diff --git a/frigate/comms/mqtt.py b/frigate/comms/mqtt.py index e487b30ee..4e5611160 100644 --- a/frigate/comms/mqtt.py +++ b/frigate/comms/mqtt.py @@ -197,9 +197,7 @@ class MqttClient(Communicator): # type: ignore[misc] payload="offline", qos=1, retain=True, - ) - - # register callbacks + ) # register callbacks callback_types = [ "enabled", "recordings", @@ -215,6 +213,8 @@ class MqttClient(Communicator): # type: ignore[misc] "birdseye_mode", "review_alerts", "review_detections", + "object_detection_enable", + "object_detection_disable", ] for name in self.config.cameras.keys(): diff --git a/frigate/video.py b/frigate/video.py index f2197ed66..e8ccaac48 100755 --- a/frigate/video.py +++ b/frigate/video.py @@ -17,7 +17,7 @@ from setproctitle import setproctitle from frigate.camera import CameraMetrics, PTZMetrics from frigate.comms.config_updater import ConfigSubscriber from frigate.comms.inter_process import InterProcessRequestor -from frigate.config import CameraConfig, DetectConfig, ModelConfig +from frigate.config import CameraConfig, DetectConfig, ModelConfig, ObjectConfig from frigate.config.camera.camera import CameraTypeEnum from frigate.const import ( CACHE_DIR, @@ -508,8 +508,6 @@ def track_camera( frame_queue = camera_metrics.frame_queue frame_shape = config.frame_shape - objects_to_track = config.objects.track - object_filters = config.objects.filters motion_detector = ImprovedMotionDetector( frame_shape, @@ -543,8 +541,7 @@ def track_camera( object_tracker, detected_objects_queue, camera_metrics, - objects_to_track, - object_filters, + config.objects, stop_event, ptz_metrics, region_grid, @@ -610,8 +607,7 @@ def process_frames( object_tracker: ObjectTracker, detected_objects_queue: Queue, camera_metrics: CameraMetrics, - objects_to_track: list[str], - object_filters, + objects_config: ObjectConfig, stop_event: MpEvent, ptz_metrics: PTZMetrics, region_grid: list[list[dict[str, Any]]], @@ -619,6 +615,7 @@ def process_frames( ): next_region_update = get_tomorrow_at_time(2) detect_config_subscriber = ConfigSubscriber(f"config/detect/{camera_name}", True) + objects_config_subscriber = ConfigSubscriber(f"config/objects/{camera_name}", True) enabled_config_subscriber = ConfigSubscriber(f"config/enabled/{camera_name}", True) fps_tracker = EventsPerSecond() @@ -692,6 +689,12 @@ def process_frames( if updated_detect_config: detect_config = updated_detect_config + # check for updated objects config + _, updated_objects_config = objects_config_subscriber.check_for_update() + + if updated_objects_config: + objects_config = updated_objects_config + if ( datetime.datetime.now().astimezone(datetime.timezone.utc) > next_region_update @@ -836,8 +839,8 @@ def process_frames( frame, model_config, region, - objects_to_track, - object_filters, + objects_config.track, + objects_config.filters, ) )