From 04655f0bc42fd6672a53d980acb1c1b31a816fb2 Mon Sep 17 00:00:00 2001 From: Nick Mowen Date: Tue, 25 Apr 2023 10:07:58 -0600 Subject: [PATCH] Add support back for setting record via MQTT and WS --- frigate/app.py | 12 +++++++++--- frigate/comms/dispatcher.py | 12 ++++++++++-- frigate/record/maintainer.py | 9 ++++++--- frigate/record/record.py | 4 +++- frigate/types.py | 4 ++++ 5 files changed, 32 insertions(+), 9 deletions(-) diff --git a/frigate/app.py b/frigate/app.py index d08febc80..b78099fb6 100644 --- a/frigate/app.py +++ b/frigate/app.py @@ -35,7 +35,7 @@ from frigate.timeline import TimelineProcessor from frigate.version import VERSION from frigate.video import capture_camera, track_camera from frigate.watchdog import FrigateWatchdog -from frigate.types import CameraMetricsTypes +from frigate.types import CameraMetricsTypes, RecordMetricsTypes logger = logging.getLogger(__name__) @@ -50,6 +50,7 @@ class FrigateApp: self.log_queue: Queue = mp.Queue() self.plus_api = PlusApi() self.camera_metrics: dict[str, CameraMetricsTypes] = {} + self.record_metrics: dict[str, RecordMetricsTypes] = {} def set_environment_vars(self) -> None: for key, value in self.config.environment_vars.items(): @@ -109,6 +110,11 @@ class FrigateApp: "capture_process": None, "process": None, } + self.record_metrics[camera_name] = { + "record_enabled": mp.Value( + "i", self.config.cameras[camera_name].record.enabled + ) + } def set_log_levels(self) -> None: logging.getLogger().setLevel(self.config.logger.default.value.upper()) @@ -162,7 +168,7 @@ class FrigateApp: recording_process = mp.Process( target=manage_recordings, name="recording_manager", - args=(self.config, self.recordings_info_queue), + args=(self.config, self.recordings_info_queue, self.record_metrics), ) recording_process.daemon = True self.recording_process = recording_process @@ -203,7 +209,7 @@ class FrigateApp: comms.append(WebSocketClient(self.config)) self.dispatcher = Dispatcher( - self.config, self.onvif_controller, self.camera_metrics, comms + self.config, self.onvif_controller, self.camera_metrics, self.record_metrics, comms ) def start_detectors(self) -> None: diff --git a/frigate/comms/dispatcher.py b/frigate/comms/dispatcher.py index 7a2c98392..0ba3e0e68 100644 --- a/frigate/comms/dispatcher.py +++ b/frigate/comms/dispatcher.py @@ -7,8 +7,12 @@ from typing import Any, Callable from abc import ABC, abstractmethod from frigate.config import FrigateConfig +<<<<<<< HEAD from frigate.ptz import OnvifController, OnvifCommandEnum from frigate.types import CameraMetricsTypes +======= +from frigate.types import CameraMetricsTypes, RecordMetricsTypes +>>>>>>> ab49f2f7 (Add support back for setting record via MQTT and WS) from frigate.util import restart_frigate @@ -42,11 +46,13 @@ class Dispatcher: config: FrigateConfig, onvif: OnvifController, camera_metrics: dict[str, CameraMetricsTypes], + record_metrics: dict[str, RecordMetricsTypes], communicators: list[Communicator], ) -> None: self.config = config self.onvif = onvif self.camera_metrics = camera_metrics + self.record_metrics = record_metrics self.comms = communicators for comm in self.comms: @@ -192,13 +198,15 @@ class Dispatcher: record_settings = self.config.cameras[camera_name].record if payload == "ON": - if not record_settings.enabled: + if not self.record_metrics[camera_name]["record_enabled"].value: logger.info(f"Turning on recordings for {camera_name}") record_settings.enabled = True + self.record_metrics[camera_name]["record_enabled"].value = True elif payload == "OFF": - if record_settings.enabled: + if self.record_metrics[camera_name]["record_enabled"].value: logger.info(f"Turning off recordings for {camera_name}") record_settings.enabled = False + self.record_metrics[camera_name]["record_enabled"].value = False self.publish(f"{camera_name}/recordings/state", payload, retain=True) diff --git a/frigate/record/maintainer.py b/frigate/record/maintainer.py index b2b467ae6..651bd1214 100644 --- a/frigate/record/maintainer.py +++ b/frigate/record/maintainer.py @@ -19,6 +19,7 @@ from typing import Any, Tuple from frigate.config import RetainModeEnum, FrigateConfig from frigate.const import CACHE_DIR, MAX_SEGMENT_DURATION, RECORD_DIR from frigate.models import Event, Recordings +from frigate.types import RecordMetricsTypes from frigate.util import area logger = logging.getLogger(__name__) @@ -29,12 +30,14 @@ class RecordingMaintainer(threading.Thread): self, config: FrigateConfig, recordings_info_queue: mp.Queue, + process_info: dict[str, RecordMetricsTypes], stop_event: MpEvent, ): threading.Thread.__init__(self) - self.name = "recording_maint" + self.name = "recording_maintainer" self.config = config self.recordings_info_queue = recordings_info_queue + self.process_info = process_info self.stop_event = stop_event self.recordings_info: dict[str, Any] = defaultdict(list) self.end_time_cache: dict[str, Tuple[datetime.datetime, float]] = {} @@ -125,7 +128,7 @@ class RecordingMaintainer(threading.Thread): # Just delete files if recordings are turned off if ( not camera in self.config.cameras - or not self.config.cameras[camera].record.enabled + or not self.process_info[camera]["record_enabled"].value ): Path(cache_path).unlink(missing_ok=True) self.end_time_cache.pop(cache_path, None) @@ -369,7 +372,7 @@ class RecordingMaintainer(threading.Thread): regions, ) = self.recordings_info_queue.get(False) - if self.config.cameras[camera].record.enabled: + if self.process_info[camera]["record_enabled"].value: self.recordings_info[camera].append( ( frame_time, diff --git a/frigate/record/record.py b/frigate/record/record.py index 0669479ed..7b43b6bb9 100644 --- a/frigate/record/record.py +++ b/frigate/record/record.py @@ -15,6 +15,7 @@ from frigate.config import FrigateConfig from frigate.models import Event, Recordings, Timeline from frigate.record.cleanup import RecordingCleanup from frigate.record.maintainer import RecordingMaintainer +from frigate.types import RecordMetricsTypes from frigate.util import listen logger = logging.getLogger(__name__) @@ -23,6 +24,7 @@ logger = logging.getLogger(__name__) def manage_recordings( config: FrigateConfig, recordings_info_queue: mp.Queue, + process_info: dict[str, RecordMetricsTypes], ) -> None: stop_event = mp.Event() @@ -40,7 +42,7 @@ def manage_recordings( models = [Event, Recordings, Timeline] db.bind(models) - maintainer = RecordingMaintainer(config, recordings_info_queue, stop_event) + maintainer = RecordingMaintainer(config, recordings_info_queue, process_info, stop_event) maintainer.start() cleanup = RecordingCleanup(config, stop_event) diff --git a/frigate/types.py b/frigate/types.py index 04339e366..9da4027c9 100644 --- a/frigate/types.py +++ b/frigate/types.py @@ -24,6 +24,10 @@ class CameraMetricsTypes(TypedDict): skipped_fps: Synchronized +class RecordMetricsTypes(TypedDict): + record_enabled: Synchronized + + class StatsTrackingTypes(TypedDict): camera_metrics: dict[str, CameraMetricsTypes] detectors: dict[str, ObjectDetectProcess]