mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-10-14 10:42:49 +03:00
Refactor Birdseye activity types as composable booleans (#23940)
* Add combined motion and object Birdseye mode Add a motion_objects mode that keeps Birdseye active when motion is detected or a confirmed tracked object is present, including stationary objects. Wire the mode through configuration, runtime commands, API schemas, documentation, and UI labels. Exclude false-positive trackers and add regression coverage for Birdseye activation and MQTT validation. * Refactor Birdseye activity types as booleans Replace combination-specific Birdseye modes with composable boolean activity types for motion, active objects, stationary objects, and continuous display. Preserve legacy single-mode configuration and MQTT inputs, support canonical comma-separated MQTT combinations, and allow scalar YAML values to be replaced by nested settings through the config API. * Preserve OpenVINO config translations Regenerate the configuration translations with the OpenVINO detector schema available so the unrelated production detector labels remain intact. * Preserve partial Birdseye mode overrides Allow an empty activity selection with a canonical NONE MQTT state so partial camera and profile overrides can disable inherited flags without failing validation. Add regression coverage for camera and profile inheritance, document the NONE contract, and keep the generated schema fixture scoped to Birdseye. * Address Birdseye activity review feedback Move scalar mode compatibility into the 0.18-1 config migration and reject empty activity selections instead of publishing a NONE state. Pass activity signals through a frozen dataclass, preserve existing active-object tracker behavior, and require confirmed stationary objects. Revert the generic YAML mutation and cover migration, inheritance, MQTT, and activation regressions. * Move Birdseye migration to 0.19 Use the 0.19-0 configuration revision for converting scalar Birdseye modes to composable activity flags, and update the migration regression coverage accordingly. * Remove Birdseye migration test Drop the dedicated config migration test as requested during review while retaining the 0.19-0 migration implementation.
This commit is contained in:
committed by
Nicolas Mowen
parent
7841d41bea
commit
d6a18e79aa
@@ -41,7 +41,7 @@ from .auth import AuthConfig
|
||||
from .base import FrigateBaseModel
|
||||
from .camera import CameraConfig, CameraLiveConfig
|
||||
from .camera.audio import AudioConfig, AudioFilterConfig
|
||||
from .camera.birdseye import BirdseyeConfig
|
||||
from .camera.birdseye import BirdseyeConfig, BirdseyeModeConfig
|
||||
from .camera.detect import DetectConfig
|
||||
from .camera.ffmpeg import FfmpegConfig
|
||||
from .camera.genai import GenAIConfig, GenAIRoleEnum
|
||||
@@ -326,8 +326,20 @@ def verify_required_zones_exist(camera_config: CameraConfig) -> None:
|
||||
|
||||
|
||||
def verify_profile_overrides_match_base(camera_config: CameraConfig) -> None:
|
||||
"""Verify that profile zone and mask IDs reference entries defined on the base camera."""
|
||||
"""Verify profile overrides against the resolved base camera configuration."""
|
||||
for profile_name, profile in camera_config.profiles.items():
|
||||
if profile.birdseye is not None:
|
||||
overrides = profile.birdseye.mode.model_dump(exclude_unset=True)
|
||||
base_mode = camera_config.birdseye.mode.model_dump()
|
||||
resolved_mode = BirdseyeModeConfig.model_validate(
|
||||
deep_merge(overrides, base_mode)
|
||||
)
|
||||
if not resolved_mode.has_enabled_activity():
|
||||
raise ValueError(
|
||||
f"Camera '{camera_config.name}' profile '{profile_name}' must "
|
||||
"enable at least one Birdseye activity type"
|
||||
)
|
||||
|
||||
if profile.zones:
|
||||
for zone_name in profile.zones:
|
||||
if zone_name not in camera_config.zones:
|
||||
@@ -998,6 +1010,10 @@ class FrigateConfig(FrigateBaseModel):
|
||||
self.cameras[name] = camera_config
|
||||
|
||||
verify_config_roles(camera_config)
|
||||
if not camera_config.birdseye.mode.has_enabled_activity():
|
||||
raise ValueError(
|
||||
f"Camera '{name}' must enable at least one Birdseye activity type"
|
||||
)
|
||||
verify_valid_live_stream_names(self, camera_config)
|
||||
verify_recording_segments_setup_with_reasonable_time(camera_config)
|
||||
verify_zone_objects_are_tracked(camera_config)
|
||||
|
||||
Reference in New Issue
Block a user