diff --git a/frigate/config/camera/audio.py b/frigate/config/camera/audio.py index 7bb605809..f52ccd337 100644 --- a/frigate/config/camera/audio.py +++ b/frigate/config/camera/audio.py @@ -25,7 +25,7 @@ class AudioFilterConfig(FrigateBaseModel): class AudioConfig(FrigateBaseModel): enabled: bool = Field( default=False, - title="Enable audio", + title="Enable audio detection", description="Enable or disable audio event detection; can be overridden per-camera.", ) max_not_heard: int = Field( diff --git a/frigate/config/camera/detect.py b/frigate/config/camera/detect.py index 4af837949..35b0d759c 100644 --- a/frigate/config/camera/detect.py +++ b/frigate/config/camera/detect.py @@ -69,12 +69,12 @@ class DetectConfig(FrigateBaseModel): ) min_initialized: Optional[int] = Field( default=None, - title="Min initialization hits", + title="Minimum initialization frames", description="Number of consecutive detection hits required before creating a tracked object. Increase to reduce false initializations. Default value is fps divided by 2.", ) max_disappeared: Optional[int] = Field( default=None, - title="Max disappeared frames", + title="Maximum disappeared frames", description="Number of frames without a detection before a tracked object is considered gone.", ) stationary: StationaryConfig = Field( diff --git a/frigate/config/camera/ffmpeg.py b/frigate/config/camera/ffmpeg.py index 3233e0dc5..9a9ad1cfb 100644 --- a/frigate/config/camera/ffmpeg.py +++ b/frigate/config/camera/ffmpeg.py @@ -124,8 +124,8 @@ class CameraInput(FrigateBaseModel): ) global_args: Union[str, list[str]] = Field( default_factory=list, - title="FFmpeg args", - description="FFmpeg arguments for this input stream.", + title="FFmpeg global args", + description="FFmpeg global arguments for this input stream.", ) hwaccel_args: Union[str, list[str]] = Field( default_factory=list, diff --git a/web/public/locales/en/config/audio.json b/web/public/locales/en/config/audio.json index 49fa2f0d4..a8ba98f59 100644 --- a/web/public/locales/en/config/audio.json +++ b/web/public/locales/en/config/audio.json @@ -2,7 +2,7 @@ "label": "Audio events", "description": "Settings for audio-based event detection; can be overridden per-camera.", "enabled": { - "label": "Enable audio", + "label": "Enable audio detection", "description": "Enable or disable audio event detection; can be overridden per-camera." }, "max_not_heard": { diff --git a/web/public/locales/en/config/cameras.json b/web/public/locales/en/config/cameras.json index 69f9a2174..6fc485f81 100644 --- a/web/public/locales/en/config/cameras.json +++ b/web/public/locales/en/config/cameras.json @@ -17,7 +17,7 @@ "label": "Audio events", "description": "Settings for audio-based event detection; can be overridden per-camera.", "enabled": { - "label": "Enable audio", + "label": "Enable audio detection", "description": "Enable or disable audio event detection; can be overridden per-camera." }, "max_not_heard": { @@ -96,11 +96,11 @@ "description": "Desired frames per second to run detection on; lower values reduce CPU usage (recommended value is 5, only set higher - at most 10 - if tracking extremely fast moving objects)." }, "min_initialized": { - "label": "Min initialization hits", + "label": "Minimum initialization frames", "description": "Number of consecutive detection hits required before creating a tracked object. Increase to reduce false initializations. Default value is fps divided by 2." }, "max_disappeared": { - "label": "Max disappeared frames", + "label": "Maximum disappeared frames", "description": "Number of frames without a detection before a tracked object is considered gone." }, "stationary": { @@ -203,8 +203,8 @@ "description": "Roles for this input stream (for example: detect, record, audio)." }, "global_args": { - "label": "FFmpeg args", - "description": "FFmpeg arguments for this input stream." + "label": "FFmpeg global args", + "description": "FFmpeg global arguments for this input stream." }, "hwaccel_args": { "label": "Hardware acceleration args", diff --git a/web/public/locales/en/config/detect.json b/web/public/locales/en/config/detect.json index 82a2621df..c3826fef1 100644 --- a/web/public/locales/en/config/detect.json +++ b/web/public/locales/en/config/detect.json @@ -18,11 +18,11 @@ "description": "Desired frames per second to run detection on; lower values reduce CPU usage (recommended value is 5, only set higher - at most 10 - if tracking extremely fast moving objects)." }, "min_initialized": { - "label": "Min initialization hits", + "label": "Minimum initialization frames", "description": "Number of consecutive detection hits required before creating a tracked object. Increase to reduce false initializations. Default value is fps divided by 2." }, "max_disappeared": { - "label": "Max disappeared frames", + "label": "Maximum disappeared frames", "description": "Number of frames without a detection before a tracked object is considered gone." }, "stationary": { diff --git a/web/public/locales/en/config/ffmpeg.json b/web/public/locales/en/config/ffmpeg.json index b00c8fdcf..1ba1bde15 100644 --- a/web/public/locales/en/config/ffmpeg.json +++ b/web/public/locales/en/config/ffmpeg.json @@ -53,8 +53,8 @@ "description": "Roles for this input stream (for example: detect, record, audio)." }, "global_args": { - "label": "FFmpeg args", - "description": "FFmpeg arguments for this input stream." + "label": "FFmpeg global args", + "description": "FFmpeg global arguments for this input stream." }, "hwaccel_args": { "label": "Hardware acceleration args", diff --git a/web/src/components/config-form/sections/AudioSection.tsx b/web/src/components/config-form/sections/AudioSection.tsx index 347f5f94b..9e18a91b5 100644 --- a/web/src/components/config-form/sections/AudioSection.tsx +++ b/web/src/components/config-form/sections/AudioSection.tsx @@ -16,7 +16,7 @@ export const AudioSection = createConfigSection({ "num_threads", ], fieldGroups: { - detection: ["listen", "filters"], + detection: ["enabled", "listen", "filters"], sensitivity: ["min_volume", "max_not_heard"], }, hiddenFields: ["enabled_in_config"], diff --git a/web/src/components/config-form/sections/DetectSection.tsx b/web/src/components/config-form/sections/DetectSection.tsx index 30d6b4736..eb3043b8d 100644 --- a/web/src/components/config-form/sections/DetectSection.tsx +++ b/web/src/components/config-form/sections/DetectSection.tsx @@ -18,7 +18,7 @@ export const DetectSection = createConfigSection({ "stationary", ], fieldGroups: { - resolution: ["width", "height"], + resolution: ["enabled", "width", "height"], tracking: ["min_initialized", "max_disappeared"], }, hiddenFields: ["enabled_in_config"], diff --git a/web/src/components/config-form/sections/MotionSection.tsx b/web/src/components/config-form/sections/MotionSection.tsx index f4ee9a21c..e1c5d32ad 100644 --- a/web/src/components/config-form/sections/MotionSection.tsx +++ b/web/src/components/config-form/sections/MotionSection.tsx @@ -20,7 +20,7 @@ export const MotionSection = createConfigSection({ "mqtt_off_delay", ], fieldGroups: { - sensitivity: ["threshold", "contour_area"], + sensitivity: ["enabled", "threshold", "contour_area"], algorithm: ["improve_contrast", "delta_alpha", "frame_alpha"], }, hiddenFields: ["enabled_in_config", "mask", "raw_mask"], diff --git a/web/src/components/config-form/sections/RecordSection.tsx b/web/src/components/config-form/sections/RecordSection.tsx index 2e2256842..188bea42b 100644 --- a/web/src/components/config-form/sections/RecordSection.tsx +++ b/web/src/components/config-form/sections/RecordSection.tsx @@ -18,7 +18,7 @@ export const RecordSection = createConfigSection({ "export", ], fieldGroups: { - retention: ["continuous", "motion"], + retention: ["enabled", "continuous", "motion"], events: ["alerts", "detections"], }, hiddenFields: ["enabled_in_config", "sync_recordings"], diff --git a/web/src/components/config-form/sections/ReviewSection.tsx b/web/src/components/config-form/sections/ReviewSection.tsx index 301830aef..024001c73 100644 --- a/web/src/components/config-form/sections/ReviewSection.tsx +++ b/web/src/components/config-form/sections/ReviewSection.tsx @@ -7,7 +7,7 @@ export const ReviewSection = createConfigSection({ sectionPath: "review", i18nNamespace: "config/review", defaultConfig: { - fieldOrder: ["alerts", "detections"], + fieldOrder: ["alerts", "detections", "genai"], fieldGroups: {}, hiddenFields: [ "enabled_in_config", @@ -20,6 +20,16 @@ export const ReviewSection = createConfigSection({ "genai.enabled_in_config", ], advancedFields: [], + uiSchema: { + genai: { + additional_concerns: { + "ui:widget": "textarea", + }, + activity_context_prompt: { + "ui:widget": "textarea", + }, + }, + }, }, }); diff --git a/web/src/components/config-form/sections/SnapshotsSection.tsx b/web/src/components/config-form/sections/SnapshotsSection.tsx index bb5deb5b1..db009dc50 100644 --- a/web/src/components/config-form/sections/SnapshotsSection.tsx +++ b/web/src/components/config-form/sections/SnapshotsSection.tsx @@ -16,7 +16,7 @@ export const SnapshotsSection = createConfigSection({ "retain", ], fieldGroups: { - display: ["bounding_box", "crop", "quality", "timestamp"], + display: ["enabled", "bounding_box", "crop", "quality", "timestamp"], }, hiddenFields: ["enabled_in_config"], advancedFields: ["quality", "retain"], diff --git a/web/src/components/config-form/sections/TimestampSection.tsx b/web/src/components/config-form/sections/TimestampSection.tsx index 69befd662..2a107a573 100644 --- a/web/src/components/config-form/sections/TimestampSection.tsx +++ b/web/src/components/config-form/sections/TimestampSection.tsx @@ -8,10 +8,7 @@ export const TimestampSection = createConfigSection({ i18nNamespace: "config/timestamp_style", defaultConfig: { fieldOrder: ["position", "format", "color", "thickness"], - fieldGroups: { - appearance: ["color", "thickness"], - }, - hiddenFields: ["enabled_in_config"], + hiddenFields: ["effect", "enabled_in_config"], advancedFields: [], }, }); diff --git a/web/src/components/config-form/theme/templates/FieldTemplate.tsx b/web/src/components/config-form/theme/templates/FieldTemplate.tsx index a4af19f4e..8022c7f8f 100644 --- a/web/src/components/config-form/theme/templates/FieldTemplate.tsx +++ b/web/src/components/config-form/theme/templates/FieldTemplate.tsx @@ -46,7 +46,9 @@ export function FieldTemplate(props: FieldTemplateProps) { // Determine field characteristics const isAdvanced = uiOptions.advanced === true; - const isBoolean = schema.type === "boolean"; + const isBoolean = + schema.type === "boolean" || + (Array.isArray(schema.type) && schema.type.includes("boolean")); const isObjectField = schema.type === "object"; const isNullableUnion = isNullableUnionSchema(schema as StrictRJSFSchema); const suppressMultiSchema = @@ -135,7 +137,7 @@ export function FieldTemplate(props: FieldTemplateProps) { )} {finalDescription && !isMultiSchemaWrapper && ( -
+
{finalDescription}
)} diff --git a/web/src/views/settings/GlobalConfigView.tsx b/web/src/views/settings/GlobalConfigView.tsx index 3eb7cc232..386c5db62 100644 --- a/web/src/views/settings/GlobalConfigView.tsx +++ b/web/src/views/settings/GlobalConfigView.tsx @@ -175,7 +175,7 @@ const globalSectionConfigs: Record< telemetry: { i18nNamespace: "config/telemetry", fieldOrder: ["network_interfaces", "stats", "version_check"], - advancedFields: ["stats"], + advancedFields: [], }, birdseye: { i18nNamespace: "config/birdseye",