Compare commits

..

7 Commits

Author SHA1 Message Date
GuoQing Liu
37daec8610
Merge 39f9491971 into 011ad8eda7 2026-04-28 20:23:59 +00:00
GuoQing Liu
39f9491971
Remove port 5000 configuration for security reasons
Removed unauthenticated Web UI port 5000 from configuration due to security risks.
2026-04-29 04:23:56 +08:00
GuoQing Liu
25031618c7
Rename heading from 'Generic Hardware Acceleration' to 'Generic Hardware Devices' 2026-04-29 04:11:35 +08:00
GuoQing Liu
9769e59e69
Update docs/src/components/DockerComposeGenerator/config/config.yaml
Co-authored-by: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com>
2026-04-29 04:08:40 +08:00
GuoQing Liu
deaf67fd8a
Update docs/src/components/DockerComposeGenerator/config/config.yaml
Co-authored-by: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com>
2026-04-29 04:08:19 +08:00
GuoQing Liu
cef4355e28
Update docs/src/components/DockerComposeGenerator/config/config.yaml
Co-authored-by: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com>
2026-04-29 04:07:51 +08:00
Josh Hawkins
011ad8eda7
Miscellaneous fixes (#23017)
Some checks are pending
CI / AMD64 Build (push) Waiting to run
CI / ARM Build (push) Waiting to run
CI / Jetson Jetpack 6 (push) Waiting to run
CI / AMD64 Extra Build (push) Blocked by required conditions
CI / ARM Extra Build (push) Blocked by required conditions
CI / Synaptics Build (push) Blocked by required conditions
CI / Assemble and push default build (push) Blocked by required conditions
* add ui to camera config update topics enum

* add mqtt to camera config update enum

* ensure cleanup runs when an event end skips post-processing

* end any in-progress audio events when audio detection is disabled

we already end in-progress audio events when we disable a camera, but this mirrors that logic for specifically disabling audio detection

* Improve GenAI metadata

* fix invalid recording segment topic being misrouted to the valid handler

* Add confidence default to avoid unnecessary field causing issues

---------

Co-authored-by: Nicolas Mowen <nickmowen213@gmail.com>
2026-04-28 08:54:09 -06:00
8 changed files with 35 additions and 26 deletions

View File

@ -42,7 +42,7 @@ function HardwareCheckbox({
export default function HardwareOptions({ deviceId, hardwareEnabled, onToggle, isDisabled }: Props) {
return (
<div className={styles.formSection}>
<h4>Generic Hardware Acceleration</h4>
<h4>Generic Hardware Devices</h4>
{deviceId !== "stable" && (
<p className={styles.helpText}>
Some options have been auto-configured based on your device type.

View File

@ -104,7 +104,7 @@ devices:
imageTagSuffix: "-standard-arm64"
autoHardware:
- "video11"
helpText: "Raspberry Pi automatically configures the Video11 device and uses the arm64 image."
helpText: "Raspberry Pi automatically configures the video11 device (RPi 4) and uses the arm64 image."
helpType: "info"
- id: "stable-rk"
@ -180,7 +180,7 @@ hardware:
devices:
- host: "/dev/dri"
container: "/dev/dri"
comment: "GPU hardware acceleration"
comment: "Intel/AMD GPU hardware acceleration"
- id: "intelNpu"
label: "Intel NPU (/dev/accel)"
@ -242,7 +242,7 @@ hardware:
comment: "AXERA libraries"
- id: "video11"
label: "Raspberry Pi Video11"
label: "Raspberry Pi video11"
description: "Pass through /dev/video11 for Raspberry Pi 4B hardware acceleration."
disabledWhen:
- "stable-tensorrt"
@ -267,18 +267,6 @@ ports:
defaultEnabled: true
locked: true
- id: "5000"
host: 5000
container: 5000
protocol: "tcp"
description: "Unauthenticated Web UI port (not recommended)"
defaultEnabled: false
requiresConfirmation: true
warningType: "danger"
warningContent: "Exposing port 5000 allows **unauthenticated access** to your Frigate instance. Anyone on your network (or the internet if you have a public IP) could access it without any credentials. This may lead to **unauthorized access**, **privacy leaks**, or further attacks. Ensure you have proper firewall rules or VPN in place before enabling this."
confirmationLabel: "I understand the risk and confirm enabling port 5000"
cooldownSeconds: 10
- id: "8554"
host: 8554
container: 8554
@ -305,4 +293,4 @@ ports:
container: 1984
protocol: "tcp"
description: "Go2RTC Web UIport"
defaultEnabled: false
defaultEnabled: false

View File

@ -20,6 +20,7 @@ class CameraConfigUpdateEnum(str, Enum):
ffmpeg = "ffmpeg"
live = "live"
motion = "motion" # includes motion and motion masks
mqtt = "mqtt"
notifications = "notifications"
objects = "objects"
object_genai = "object_genai"
@ -33,6 +34,7 @@ class CameraConfigUpdateEnum(str, Enum):
lpr = "lpr"
snapshots = "snapshots"
timestamp_style = "timestamp_style"
ui = "ui"
zones = "zones"

View File

@ -27,7 +27,7 @@ class ReviewMetadata(BaseModel):
)
title: str = Field(
max_length=80,
description="A short title characterizing what took place and where, under 10 words.",
description="Under 10 words. Name the apparent purpose or outcome of the activity together with the location involved. Do not narrate or list the sequence of actions step by step.",
)
scene: str = Field(
min_length=150,
@ -36,7 +36,7 @@ class ReviewMetadata(BaseModel):
)
shortSummary: str = Field(
min_length=70,
max_length=100,
max_length=120,
description="A brief 2-sentence summary of the scene, suitable for notifications.",
)
confidence: float = Field(

View File

@ -517,10 +517,16 @@ class EmbeddingMaintainer(threading.Thread):
try:
event: Event = Event.get(Event.id == event_id)
except DoesNotExist:
for processor in self.post_processors:
if isinstance(processor, ObjectDescriptionProcessor):
processor.cleanup_event(event_id)
continue
# Skip the event if not an object
if event.data.get("type") != "object":
for processor in self.post_processors:
if isinstance(processor, ObjectDescriptionProcessor):
processor.cleanup_event(event_id)
continue
# Extract valid thumbnail

View File

@ -205,6 +205,7 @@ class AudioEventMaintainer(threading.Thread):
self.transcription_thread.start()
self.was_enabled = camera.enabled
self.was_audio_enabled = camera.audio.enabled
def detect_audio(self, audio: np.ndarray) -> None:
if not self.camera_config.audio.enabled or self.stop_event.is_set():
@ -363,6 +364,17 @@ class AudioEventMaintainer(threading.Thread):
time.sleep(0.1)
continue
audio_enabled = self.camera_config.audio.enabled
if audio_enabled != self.was_audio_enabled:
if not audio_enabled:
self.logger.debug(
f"Disabling audio detections for {self.camera_config.name}, ending events"
)
self.requestor.send_data(
EXPIRE_AUDIO_ACTIVITY, self.camera_config.name
)
self.was_audio_enabled = audio_enabled
self.read_audio()
if self.audio_listener:

View File

@ -201,9 +201,10 @@ Each line represents a detection state, not necessarily unique individuals. The
except json.JSONDecodeError as je:
logger.error("Failed to parse review description JSON: %s", je)
return None
# observations is required on the model; fill an empty default
# observations and confidence are required on the model; fill an empty default
# if the response omitted it so attribute access stays safe.
raw.setdefault("observations", [])
raw.setdefault("confidence", 0.0)
metadata = ReviewMetadata.model_construct(**raw)
except Exception as e:
logger.error(

View File

@ -317,16 +317,16 @@ class CameraWatchdog(threading.Thread):
if camera != self.config.name:
continue
if topic.endswith(RecordingsDataTypeEnum.valid.value):
self.logger.debug(
f"Latest valid recording segment time on {camera}: {segment_time}"
)
self.latest_valid_segment_time = segment_time
elif topic.endswith(RecordingsDataTypeEnum.invalid.value):
if topic.endswith(RecordingsDataTypeEnum.invalid.value):
self.logger.warning(
f"Invalid recording segment detected for {camera} at {segment_time}"
)
self.latest_invalid_segment_time = segment_time
elif topic.endswith(RecordingsDataTypeEnum.valid.value):
self.logger.debug(
f"Latest valid recording segment time on {camera}: {segment_time}"
)
self.latest_valid_segment_time = segment_time
elif topic.endswith(RecordingsDataTypeEnum.latest.value):
if segment_time is not None:
self.latest_cache_segment_time = segment_time