Allow changing object detection via MQTT.

This commit is contained in:
Manuel Klimek 2025-08-15 10:57:39 +02:00
parent c2f8de94e8
commit 6a2a4bd79d
3 changed files with 41 additions and 12 deletions

View File

@ -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)

View File

@ -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():

View File

@ -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,
)
)