mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-06-29 16:41:16 +03:00
listen for config updates in activity manager
This commit is contained in:
parent
122866927b
commit
ecd8854fcb
@ -13,6 +13,10 @@ from frigate.comms.event_metadata_updater import (
|
|||||||
EventMetadataTypeEnum,
|
EventMetadataTypeEnum,
|
||||||
)
|
)
|
||||||
from frigate.config import CameraConfig, FrigateConfig
|
from frigate.config import CameraConfig, FrigateConfig
|
||||||
|
from frigate.config.camera.updater import (
|
||||||
|
CameraConfigUpdateEnum,
|
||||||
|
CameraConfigUpdateSubscriber,
|
||||||
|
)
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -29,6 +33,11 @@ class CameraActivityManager:
|
|||||||
self.zone_all_object_counts: dict[str, Counter] = {}
|
self.zone_all_object_counts: dict[str, Counter] = {}
|
||||||
self.zone_active_object_counts: dict[str, Counter] = {}
|
self.zone_active_object_counts: dict[str, Counter] = {}
|
||||||
self.all_zone_labels: dict[str, set[str]] = {}
|
self.all_zone_labels: dict[str, set[str]] = {}
|
||||||
|
self.config_subscriber = CameraConfigUpdateSubscriber(
|
||||||
|
config,
|
||||||
|
config.cameras,
|
||||||
|
[CameraConfigUpdateEnum.zones, CameraConfigUpdateEnum.objects],
|
||||||
|
)
|
||||||
|
|
||||||
for camera_config in config.cameras.values():
|
for camera_config in config.cameras.values():
|
||||||
if not camera_config.enabled_in_config:
|
if not camera_config.enabled_in_config:
|
||||||
@ -56,7 +65,40 @@ class CameraActivityManager:
|
|||||||
else camera_config.objects.track
|
else camera_config.objects.track
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def __rebuild_zone_labels(self) -> None:
|
||||||
|
"""Rebuild zone label tracking after a runtime zones/objects change."""
|
||||||
|
new_zone_labels: dict[str, set[str]] = {}
|
||||||
|
|
||||||
|
for camera_config in self.config.cameras.values():
|
||||||
|
if not camera_config.enabled_in_config or camera_config.name is None:
|
||||||
|
continue
|
||||||
|
|
||||||
|
for zone, zone_config in camera_config.zones.items():
|
||||||
|
new_zone_labels.setdefault(zone, set()).update(
|
||||||
|
zone_config.objects
|
||||||
|
if zone_config.objects
|
||||||
|
else camera_config.objects.track
|
||||||
|
)
|
||||||
|
|
||||||
|
# drop counters for zones that no longer exist
|
||||||
|
for zone in list(self.zone_all_object_counts.keys()):
|
||||||
|
if zone not in new_zone_labels:
|
||||||
|
self.zone_all_object_counts.pop(zone, None)
|
||||||
|
self.zone_active_object_counts.pop(zone, None)
|
||||||
|
|
||||||
|
# ensure counters exist for new zones so the first count is published
|
||||||
|
for zone in new_zone_labels:
|
||||||
|
self.zone_all_object_counts.setdefault(zone, Counter())
|
||||||
|
self.zone_active_object_counts.setdefault(zone, Counter())
|
||||||
|
|
||||||
|
self.all_zone_labels = new_zone_labels
|
||||||
|
|
||||||
def update_activity(self, new_activity: dict[str, dict[str, Any]]) -> None:
|
def update_activity(self, new_activity: dict[str, dict[str, Any]]) -> None:
|
||||||
|
updated_topics = self.config_subscriber.check_for_updates()
|
||||||
|
|
||||||
|
if "zones" in updated_topics or "objects" in updated_topics:
|
||||||
|
self.__rebuild_zone_labels()
|
||||||
|
|
||||||
all_objects: list[dict[str, Any]] = []
|
all_objects: list[dict[str, Any]] = []
|
||||||
|
|
||||||
for camera in new_activity.keys():
|
for camera in new_activity.keys():
|
||||||
@ -161,6 +203,9 @@ class CameraActivityManager:
|
|||||||
self.publish(f"{camera}/all", sum(list(all_objects.values())))
|
self.publish(f"{camera}/all", sum(list(all_objects.values())))
|
||||||
self.publish(f"{camera}/all/active", sum(list(active_objects.values())))
|
self.publish(f"{camera}/all/active", sum(list(active_objects.values())))
|
||||||
|
|
||||||
|
def stop(self) -> None:
|
||||||
|
self.config_subscriber.stop()
|
||||||
|
|
||||||
|
|
||||||
class AudioActivityManager:
|
class AudioActivityManager:
|
||||||
def __init__(
|
def __init__(
|
||||||
|
|||||||
@ -397,6 +397,8 @@ class Dispatcher:
|
|||||||
comm.publish(topic, payload, retain)
|
comm.publish(topic, payload, retain)
|
||||||
|
|
||||||
def stop(self) -> None:
|
def stop(self) -> None:
|
||||||
|
self.camera_activity.stop()
|
||||||
|
|
||||||
for comm in self.comms:
|
for comm in self.comms:
|
||||||
comm.stop()
|
comm.stop()
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user