From 34623cf4f5432a1e6207c6f7550bf15387d63539 Mon Sep 17 00:00:00 2001 From: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com> Date: Thu, 4 Jun 2026 06:21:23 -0500 Subject: [PATCH] add more detect section field messages --- web/public/locales/en/views/settings.json | 6 +- .../config-form/section-configs/detect.ts | 91 +++++++++++++++++-- 2 files changed, 88 insertions(+), 9 deletions(-) diff --git a/web/public/locales/en/views/settings.json b/web/public/locales/en/views/settings.json index 0c46aec581..a5edab9788 100644 --- a/web/public/locales/en/views/settings.json +++ b/web/public/locales/en/views/settings.json @@ -1908,7 +1908,11 @@ "fpsGreaterThanFive": "Setting the detect FPS higher than 5 is not recommended. Higher values may cause performance issues and will not provide any benefit.", "disabled": "Object detection is disabled. Snapshots, review items, and enrichments such as face recognition, license plate recognition, and Generative AI will not function.", "resolutionShouldBeMultipleOfFour": "For best results, detect width and height should be multiples of 4. Other even values may produce visual artifacts or slight distortion in the detect stream.", - "aspectRatioMismatch": "The width and height you've entered don't match the aspect ratio of your current detect resolution. This may produce a stretched or distorted image." + "aspectRatioMismatch": "The width and height you've entered don't match the aspect ratio of your current detect resolution. This may produce a stretched or distorted image.", + "maxFramesSet": "Setting max frames overrides default behavior and disables stationary object tracking. There are very few situations where this is needed, use with caution.", + "squareResolution": "A square detect resolution is unusual. The detect width and height should match your camera's aspect ratio (for example, 16:9), not the dimensions of the object detection model. A mismatched aspect ratio can stretch the image and reduce detection accuracy.", + "resolutionHigh": "This detect resolution is higher than recommended and may cause increased resource usage without improving detection accuracy. A detect resolution at or below 1080p is recommended for most cameras.", + "globalResolutionMultipleCameras": "A global detect resolution is set while multiple cameras are configured. Unless all cameras share the same resolution and aspect ratio, the detect width and height should be defined per camera to match each camera's native aspect ratio." }, "objects": { "genaiNoDescriptionsProvider": "You must configure a GenAI provider with the 'descriptions' role for descriptions to be generated." diff --git a/web/src/components/config-form/section-configs/detect.ts b/web/src/components/config-form/section-configs/detect.ts index 74d170edc6..9176c49a74 100644 --- a/web/src/components/config-form/section-configs/detect.ts +++ b/web/src/components/config-form/section-configs/detect.ts @@ -11,8 +11,12 @@ const detect: SectionConfigOverrides = { condition: (ctx) => ctx.level === "camera" && ctx.formData?.enabled === false, }, + ], + fieldMessages: [ { key: "detect-resolution-not-multiple-of-four", + field: "width", + position: "before", messageKey: "configMessages.detect.resolutionShouldBeMultipleOfFour", severity: "warning", condition: (ctx) => { @@ -23,8 +27,59 @@ const detect: SectionConfigOverrides = { return isEvenButNotFour(width) || isEvenButNotFour(height); }, }, + { + key: "detect-global-resolution-multiple-cameras", + field: "width", + position: "before", + messageKey: "configMessages.detect.globalResolutionMultipleCameras", + severity: "info", + condition: (ctx) => { + if (ctx.level !== "global") return false; + const width = ctx.formData?.width as number | null | undefined; + const height = ctx.formData?.height as number | null | undefined; + if (typeof width !== "number" && typeof height !== "number") { + return false; + } + const cameraCount = Object.keys(ctx.fullConfig?.cameras ?? {}).length; + return cameraCount > 1; + }, + }, + { + key: "detect-resolution-high", + field: "width", + position: "before", + messageKey: "configMessages.detect.resolutionHigh", + severity: "warning", + condition: (ctx) => { + const width = ctx.formData?.width as number | null | undefined; + const height = ctx.formData?.height as number | null | undefined; + if (typeof width !== "number" || typeof height !== "number") { + return false; + } + return Math.min(width, height) > 1080; + }, + }, + { + key: "detect-square-resolution", + field: "width", + position: "before", + messageKey: "configMessages.detect.squareResolution", + severity: "warning", + condition: (ctx) => { + const width = ctx.formData?.width as number | null | undefined; + const height = ctx.formData?.height as number | null | undefined; + return ( + typeof width === "number" && + typeof height === "number" && + width > 0 && + width === height + ); + }, + }, { key: "detect-aspect-ratio-mismatch", + field: "width", + position: "before", messageKey: "configMessages.detect.aspectRatioMismatch", severity: "warning", condition: (ctx) => { @@ -55,8 +110,6 @@ const detect: SectionConfigOverrides = { return Math.abs(newRatio - savedRatio) > 0.01; }, }, - ], - fieldMessages: [ { key: "fps-greater-than-five", field: "fps", @@ -71,6 +124,31 @@ const detect: SectionConfigOverrides = { return detectFps != null && streamFps != null && detectFps > 5; }, }, + { + key: "max-frames-set", + field: "stationary.max_frames", + messageKey: "configMessages.detect.maxFramesSet", + severity: "warning", + position: "after", + condition: (ctx) => { + const stationary = ctx.formData?.stationary as + | { + max_frames?: { + default?: number | null; + objects?: Record; + } | null; + } + | null + | undefined; + const maxFrames = stationary?.max_frames; + if (!maxFrames) return false; + return ( + typeof maxFrames.default === "number" || + (maxFrames.objects != null && + Object.keys(maxFrames.objects).length > 0) + ); + }, + }, ], fieldOrder: [ "enabled", @@ -81,9 +159,9 @@ const detect: SectionConfigOverrides = { "max_disappeared", "annotation_offset", "stationary", - "interval", - "threshold", - "max_frames", + "stationary.interval", + "stationary.threshold", + "stationary.max_frames", ], restartRequired: [], fieldGroups: { @@ -129,9 +207,6 @@ const detect: SectionConfigOverrides = { "max_disappeared", "annotation_offset", "stationary", - "interval", - "threshold", - "max_frames", ], advancedFields: [], },