feat(frigate): initial rework (#4408)

* feat(frigate): initial rework

* some comment cleanup

* add mqtt

* update storage

* add some UI

* add ffmpeg

* more

* switch to custom defined configmap...

* add models

* add logger

* add birdseye

* add ffmpeg

* fix UI

* add detect

* remove values

* add ojbect

* add motion

* no default for some ints

* add record

* floats can't be strings ?>!

* make confmap content a string

* add snapshot and rtmp

* add timestamp style

* finito

* port

* stringify

* stringify

* precommit

* add some required values for CI

* emty lines

* hmm

* fix lint

* don't install frigate on ci
This commit is contained in:
Stavros Kois
2022-11-14 01:19:55 +02:00
committed by GitHub
parent 5347e23acc
commit 6ac1219e30
8 changed files with 2187 additions and 513 deletions
+2
View File
@@ -29,6 +29,8 @@ excluded-charts:
- charts/stable/zigbee2mqtt - charts/stable/zigbee2mqtt
- charts/stable/alertmanager-bot - charts/stable/alertmanager-bot
- charts/stable/storj-node - charts/stable/storj-node
- charts/incubator/frigate
- charts/stable/frigate
- charts/stable/orbital-sync - charts/stable/orbital-sync
- charts/incubator/orbital-sync - charts/incubator/orbital-sync
- charts/incubator/amcrest2mqtt - charts/incubator/amcrest2mqtt
+1 -1
View File
@@ -24,7 +24,7 @@ sources:
- https://github.com/blakeblackshear/frigate - https://github.com/blakeblackshear/frigate
- https://hub.docker.com/r/blakeblackshear/frigate - https://hub.docker.com/r/blakeblackshear/frigate
type: application type: application
version: 3.0.4 version: 4.0.0
annotations: annotations:
truecharts.org/catagories: | truecharts.org/catagories: |
- nvr - nvr
@@ -0,0 +1,11 @@
# Installation instructions
## Hardcoded values
We hardcoded some values, so the chart/app can work correctly based on how it's written.
Those values are:
```yaml
database:
path: /db/frigate.db
```
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,356 @@
{{/* Define the configmap */}}
{{- define "frigate.configmap" -}}
{{- $configName := printf "%s-frigate-config" (include "tc.common.names.fullname" .) }}
---
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ $configName }}
labels:
{{- include "tc.common.labels" . | nindent 4 }}
data:
config.yml: |
database:
path: /db/frigate.db
mqtt:
host: {{ required "You need to provide an MQTT host" .Values.frigate.mqtt.host }}
port: {{ .Values.frigate.mqtt.port | default 1883 }}
topic_prefix: {{ .Values.frigate.mqtt.topic_prefix | default "frigate" }}
client_id: {{ .Values.frigate.mqtt.client_id | default "frigate" }}
stats_interval: {{ .Values.frigate.mqtt.stats_interval| default 60 }}
{{- with .Values.frigate.mqtt.user }}
user: {{ . }}
{{- end }}
{{- with .Values.frigate.mqtt.password }}
password: {{ . }}
{{- end }}
{{- if .Values.frigate.detectors.enabled }}
{{- if .Values.frigate.detectors.config }}
detectors:
{{- range .Values.frigate.detectors.config }}
{{ required "You need to provide a detector name" .name }}:
type: {{ .type }}
{{- with .device }}
device: {{ . }}
{{- end }}
{{- with .num_threads }}
num_threads: {{ . }}
{{- end }}
{{- end }}
{{- end }}
{{- end }}
{{- if .Values.frigate.model.render_config }}
model:
{{- with .Values.frigate.model.path }}
path: {{ . }}
{{- end }}
{{- with .Values.frigate.model.labelmap_path }}
path: {{ . }}
{{- end }}
width: {{ .Values.frigate.model.width | default 320 }}
height: {{ .Values.frigate.model.height | default 320 }}
{{- with .Values.frigate.model.labelmap }}
labelmap:
{{- range . }}
{{ .model }}: {{ .name }}
{{- end }}
{{- end }}
{{- end }}
{{- if .Values.frigate.logger.render_config }}
logger:
default: {{ .Values.frigate.logger.default | default "info" }}
{{- with .Values.frigate.logger.logs }}
logs:
{{- range . }}
{{ .component }}: {{ .verbosity }}
{{- end }}
{{- end }}
{{- end }}
{{- if .Values.frigate.birdseye.render_config }}
birdseye:
enabled: {{ ternary "True" "False" .Values.frigate.birdseye.enabled }}
width: {{ .Values.frigate.birdseye.width | default 1280 }}
height: {{ .Values.frigate.birdseye.height | default 720 }}
quality: {{ .Values.frigate.birdseye.quality | default 8 }}
model: {{ .Values.frigate.birdseye.mode | default "objects" }}
{{- end }}
{{- if .Values.frigate.ffmpeg.render_config }}
ffmpeg:
global_args: {{ .Values.frigate.ffmpeg.global_args | default "-hide_banner -loglevel warning" }}
input_args: {{ .Values.frigate.ffmpeg.input_args | default "-avoid_negative_ts make_zero -fflags +genpts+discardcorrupt -rtsp_transport tcp -timeout 5000000 -use_wallclock_as_timestamps 1" }}
{{- with .Values.frigate.ffmpeg.hwaccel_args }}
hwaccel_args: {{ . }}
{{- end }}
output_args:
detect: {{ .Values.frigate.ffmpeg.output_args.detect | default "-f rawvideo -pix_fmt yuv420p" }}
record: {{ .Values.frigate.ffmpeg.output_args.detect | default "-f segment -segment_time 10 -segment_format mp4 -reset_timestamps 1 -strftime 1 -c copy -an" }}
rtmp: {{ .Values.frigate.ffmpeg.output_args.detect | default "-c copy -f flv" }}
{{- end }}
{{- if .Values.frigate.detect.render_config }}
detect:
enabled: {{ ternary "True" "False" .Values.frigate.detect.enabled }}
width: {{ .Values.frigate.detect.width | default 1280 }}
width: {{ .Values.frigate.detect.height | default 720 }}
fps: {{ .Values.frigate.detect.fps | default 5 }}
max_disappeared: {{ .Values.frigate.detect.max_disappeared | default 25 }}
stationary:
interval: {{ .Values.frigate.detect.stationary.interval | default 0 }}
threshold: {{ .Values.frigate.detect.stationary.threshold | default 50 }}
{{- if (hasKey .Values.frigate.detect.stationary "max_frames") }}
{{- if or (hasKey .Values.frigate.detect.stationary.max_frames "default") (hasKey .Values.frigate.detect.stationary.max_frames "objects") }}
max_frames:
{{- with .Values.frigate.detect.stationary.max_frames.default }}
default: {{ . }}
{{- end }}
{{- with .Values.frigate.detect.stationary.max_frames.objects }}
objects:
{{- range . }}
{{ .object }}: {{ .frames }}
{{- end }}
{{- end }}
{{- end }}
{{- end }}
{{- end }}
{{- if .Values.frigate.objects.render_config }}
objects:
{{- with .Values.frigate.objects.track }}
track:
{{- range . }}
- {{ . }}
{{- end }}
{{- end }}
{{- with .Values.frigate.objects.mask }}
mask: {{ . }}
{{- end }}
{{- with .Values.frigate.objects.filters }}
filters:
{{- range . }}
{{ .object }}:
{{- with .min_area }}
min_area: {{ . }}
{{- end }}
{{- with .max_area }}
max_area: {{ . }}
{{- end }}
{{- with .min_ratio }}
min_ratio: {{ . }}
{{- end }}
{{- with .max_ratio }}
max_ratio: {{ . }}
{{- end }}
{{- with .min_score }}
min_score: {{ . }}
{{- end }}
{{- with .threshold }}
threshold: {{ . }}
{{- end }}
{{- with .mask }}
mask: {{ . }}
{{- end }}
{{- end }}
{{- end }}
{{- end }}
{{- if .Values.frigate.motion.render_config }}
motion:
threshold: {{ .Values.frigate.motion.threshold | default 25 }}
contour_area: {{ .Values.frigate.motion.contour_area | default 30 }}
delta_alpha: {{ .Values.frigate.motion.delta_alpha | default 0.2 }}
frame_alpha: {{ .Values.frigate.motion.frame_alpha | default 0.2 }}
frame_height: {{ .Values.frigate.motion.frame_height | default 50 }}
{{- with .Values.frigate.motion.mask }}
mask: {{ . }}
{{- end }}
improve_contrast: {{ ternary "True" "False" .Values.frigate.motion.improve_contrast }}
mqtt_off_delay: {{ .Values.frigate.motion.mqtt_off_delay | default 30 }}
{{- end }}
{{- if .Values.frigate.record.render_config }}
record:
enable: {{ ternary "True" "False" .Values.frigate.record.enabled }}
expire_interval: {{ .Values.frigate.record.expire_interval | default 60 }}
{{- if .Values.frigate.record.retain.render_config }}
retain:
days: {{ .Values.frigate.record.retain.days | default 0 }}
mode: {{ .Values.frigate.record.retain.mode | default "all" }}
{{- end }}
events:
pre_capture: {{ .Values.frigate.record.events.pre_capture | default 5 }}
post_capture: {{ .Values.frigate.record.events.post_capture | default 5 }}
{{- with .Values.frigate.record.events.objects }}
objects:
{{- range . }}
- {{ . }}
{{- end }}
{{- end }}
{{- with .Values.frigate.record.events.required_zones }}
required_zones:
{{- range . }}
- {{ . }}
{{- end }}
{{- end }}
{{- if .Values.frigate.record.events.retain.render_config }}
retain:
default: {{ .Values.frigate.record.events.retain.default | default 10 }}
mode: {{ .Values.frigate.record.events.retain.mode | default "motion" }}
{{- with .Values.frigate.record.events.retain.objects }}
objects:
{{- range . }}
{{ .object }}: {{ .days }}
{{- end }}
{{- end }}
{{- end }}
{{- end }}
{{- if .Values.frigate.snapshots.render_config }}
snapshots:
enabled: {{ ternary "True" "False" .Values.frigate.snapshots.enabled }}
clean_copy: {{ ternary "True" "False" .Values.frigate.snapshots.clean_copy }}
timestamp: {{ ternary "True" "False" .Values.frigate.snapshots.timestamp }}
bounding_box: {{ ternary "True" "False" .Values.frigate.snapshots.bounding_box }}
crop: {{ ternary "True" "False" .Values.frigate.snapshots.crop }}
{{- with .Values.frigate.snapshots.height }}
height: {{ . }}
{{- end }}
{{- with .Values.frigate.snapshots.required_zones }}
required_zones:
{{- range . }}
- {{ . }}
{{- end }}
{{- end }}
{{- if .Values.frigate.snapshots.retain.render_config }}
retain:
default: {{ .Values.frigate.snapshots.retain.default | default 10 }}
{{- with .Values.frigate.snapshots.retain.objects }}
objects:
{{- range . }}
{{ .object }}: {{ .days }}
{{- end }}
{{- end }}
{{- end }}
{{- end }}
{{- if .Values.frigate.rtmp.render_config }}
rtmp:
enabled: {{ ternary "True" "False" .Values.frigate.rtmp.enabled }}
height: {{ .Values.frigate.live.height | default 720 }}
quality: {{ .Values.frigate.live.height | default 8 }}
{{- end }}
{{- if .Values.frigate.timestamp_style.render_config }}
timestamp_style:
position: {{ .Values.frigate.timestamp_style.position | default "tl" }}
format: {{ .Values.frigate.timestamp_style.format | quote }}
color:
red: {{ .Values.frigate.timestamp_style.color.red | default 255 }}
green: {{ .Values.frigate.timestamp_style.color.green | default 255 }}
blue: {{ .Values.frigate.timestamp_style.color.blue | default 255 }}
thickness: {{ .Values.frigate.timestamp_style.thickness | default 2 }}
effect: {{ .Values.frigate.timestamp_style.effect | default "None" }}
{{- end }}
cameras:
{{- range .Values.frigate.cameras }}
{{ .camera_name }}:
ffmpeg:
{{- with .ffmpeg }}
inputs:
{{- range .inputs }}
- path: {{ .path }}
{{- with .roles }}
roles:
{{- range . }}
- {{ . }}
{{- end }}
{{- end }} {{/* end with roles*/}}
{{- with .global_args }}
global_args: {{ . }}
{{- end }}
{{- with .hwaccel_args }}
hwaccel_args: {{ . }}
{{- end }}
{{- with .input_args }}
input_args: {{ . }}
{{- end }}
{{- end }} {{/* end range inputs */}}
{{- with .global_args }}
global_args: {{ . }}
{{- end }}
{{- with .hwaccel_args }}
hwaccel_args: {{ . }}
{{- end }}
{{- with .input_args }}
input_args: {{ . }}
{{- end }}
{{- with .output_args }}
output_args: {{ . }}
{{- end }}
{{- end }} {{/* end with ffmpeg */}}
best_image_timeout: {{ .best_image_timeout | default 60 }}
{{- with .zones }}
zones:
{{- range . }}
{{ .name }}:
coordinates: {{ required "You have to specify coordinates" .coordinates }}
{{- with .objects }}
objects:
{{- range . }}
- {{ . }}
{{- end }}
{{- end }} {{/* end with objects*/}}
{{- with .filters }}
filters:
{{- range . }}
{{ .object }}:
{{- with .min_area }}
min_area: {{ . }}
{{- end }}
{{- with .max_area }}
max_area: {{ . }}
{{- end }}
{{- with .threshold }}
threshold: {{ . }}
{{- end }}
{{- end }} {{/* end range filters */}}
{{- end }} {{/* end with filter */}}
{{- end }} {{/* end range zones */}}
{{- end }} {{/* end with zones */}}
{{- if .mqtt.render_config }}
{{- with .mqtt }}
mqtt:
enabled: {{ ternary "True" "False" .enabled }}
timestamp: {{ ternary "True" "False" .timestamp }}
bounding_box: {{ ternary "True" "False" .bounding_box }}
crop: {{ ternary "True" "False" .crop }}
height: {{ .height | default 270 }}
quality: {{ .quality | default 70 }}
{{- with .required_zones }}
required_zones:
{{- range . }}
- {{ . }}
{{- end }}
{{- end }}
{{- end }} {{/* end with mqtt */}}
{{- end }} {{/* end if mqtt.render_config */}}
{{- if .ui.render_config }}
{{- with .ui }}
ui:
{{- if or .order (eq (int .order) 0) }}
order: {{ .order }}
{{- end }}
dashboard: {{ ternary "True" "False" .dashboard }}
{{- end }} {{/* end with ui */}}
{{- end }} {{/* end if ui.render_config */}}
{{- end }} {{/* end range cameras */}}
{{- end }}
@@ -1,5 +1,7 @@
{{/* Make sure all variables are set properly */}} {{/* Make sure all variables are set properly */}}
{{- include "tc.common.loader.init" . }} {{- include "tc.common.loader.init" . }}
{{- include "frigate.configmap" . -}}
{{/* Render the templates */}} {{/* Render the templates */}}
{{ include "tc.common.loader.apply" . }} {{ include "tc.common.loader.apply" . }}
+444 -464
View File
@@ -1,492 +1,472 @@
image: image:
repository: tccr.io/truecharts/frigate-nvidia repository: tccr.io/truecharts/frigate
pullPolicy: IfNotPresent pullPolicy: IfNotPresent
tag: latest@sha256:9facc1383ebbf148873bcc2fba501868b0e09417cffff7f6c06fb31b9c9b95ec tag: 0.11.1@sha256:8dd7273eebf396563d7bbc14778fd3d58c624e5063ffcf74b5b0afe63e7cdd7f
securityContext: securityContext:
readOnlyRootFilesystem: false readOnlyRootFilesystem: false
runAsNonRoot: false runAsNonRoot: false
configmap:
config:
enabled: true
data:
config.yml: |
mqtt:
# Required: host name
host: {{ .Values.frigate.mqtt.host }}
# Optional: port (default: shown below)
port: {{ .Values.frigate.mqtt.port }}
# Optional: topic prefix (default: shown below)
# NOTE: must be unique if you are running multiple instances
topic_prefix: frigate
# Optional: client id (default: shown below)
# NOTE: must be unique if you are running multiple instances
client_id: frigate
{{- if .Values.frigate.mqtt.authenticated }}
user: {{ .Values.frigate.mqtt.username }}
password: {{ .Values.frigate.mqtt.password }}
# Optional: user
# user: mqtt_user
# Optional: password
# NOTE: MQTT password can be specified with an environment variables that must begin with 'FRIGATE_'.
# e.g. password: '{FRIGATE_MQTT_PASSWORD}'
# password: password
{{- end }}
# Optional: tls_ca_certs for enabling TLS using self-signed certs (default: None)
# tls_ca_certs: /path/to/ca.crt
# Optional: tls_client_cert and tls_client key in order to use self-signed client
# certificates (default: None)
# NOTE: certificate must not be password-protected
# do not set user and password when using a client certificate
# tls_client_cert: /path/to/client.crt
# tls_client_key: /path/to/client.key
# Optional: tls_insecure (true/false) for enabling TLS verification of
# the server hostname in the server certificate (default: None)
# tls_insecure: false
# Optional: interval in seconds for publishing stats (default: shown below)
stats_interval: 60
# Optional: Detectors configuration. Defaults to a single CPU detector
detectors:
# Required: name of the detector
{{- if .Values.persistence.coral }}
{{- if .Values.persistence.coral.enabled }}
coral:
# Required: type of the detector
# Valid values are 'edgetpu' (requires device property below) and 'cpu'.
type: edgetpu
# Optional: device name as defined here: https://coral.ai/docs/edgetpu/multiple-edgetpu/#using-the-tensorflow-lite-python-api
device: usb
{{- else }}
cpu1:
type: cpu
# Optional: num_threads value passed to the tflite.Interpreter (default: shown below)
# This value is only used for CPU types
num_threads: 2
{{- end }}
{{- end }}
# Optional: Database configuration
# database:
# The path to store the SQLite DB (default: shown below)
# path: /media/frigate/frigate.db
# Optional: model modifications
# model:
# Optional: path to the model (default: automatic based on detector)
# path: /edgetpu_model.tflite
# Optional: path to the labelmap (default: shown below)
# labelmap_path: /labelmap.txt
# Required: Object detection model input width (default: shown below)
# width: 320
# Required: Object detection model input height (default: shown below)
# height: 240
# Optional: Label name modifications. These are merged into the standard labelmap.
# labelmap:
# 2: vehicle
# Optional: logger verbosity settings
logger:
# Optional: Default log verbosity (default: shown below)
default: info
# Optional: Component specific logger overrides
# logs:
# frigate.event: info
# Optional: set environment variables
# environment_vars:
# EXAMPLE_VAR: value
# Optional: birdseye configuration
birdseye:
# Optional: Enable birdseye view (default: shown below)
enabled: {{ .Values.frigate.birdseye.enabled }}
# Optional: Width of the output resolution (default: shown below)
width: 1280
# Optional: Height of the output resolution (default: shown below)
height: 720
# Optional: Encoding quality of the mpeg1 feed (default: shown below)
# 1 is the highest quality, and 31 is the lowest. Lower quality feeds utilize less CPU resources.
quality: 8
# Optional: Mode of the view. Available options are: objects, motion, and continuous
# objects - cameras are included if they have had a tracked object within the last 30 seconds
# motion - cameras are included if motion was detected in the last 30 seconds
# continuous - all cameras are included always
mode: {{ .Values.frigate.birdseye.mode }}
# Optional: ffmpeg configuration
ffmpeg:
# Optional: global ffmpeg args (default: shown below) warning instead of debug
global_args: -hide_banner -loglevel debug
# Optional: global hwaccel args (default: shown below)
# NOTE: See hardware acceleration docs for your specific device
# hwaccel_args: []
# Optional: global input args (default: shown below)
# input_args: -avoid_negative_ts make_zero -fflags +genpts+discardcorrupt -rtsp_transport tcp -stimeout 5000000 -use_wallclock_as_timestamps 1
# Optional: global output args
# output_args:
# Optional: output args for detect streams (default: shown below)
# detect: -f rawvideo -pix_fmt yuv420p
# Optional: output args for record streams (default: shown below)
# record: -f segment -segment_time 10 -segment_format mp4 -reset_timestamps 1 -strftime 1 -c copy -an
# Optional: output args for rtmp streams (default: shown below)
# rtmp: -c copy -f flv
# Optional: Detect configuration
# NOTE: Can be overridden at the camera level
detect:
# Optional: width of the frame for the input with the detect role (default: shown below)
width: 1280
# Optional: height of the frame for the input with the detect role (default: shown below)
height: 720
# Optional: desired fps for your camera for the input with the detect role (default: shown below)
# NOTE: Recommended value of 5. Ideally, try and reduce your FPS on the camera.
fps: 5
# Optional: enables detection for the camera (default: True)
# This value can be set via MQTT and will be updated in startup based on retained value
enabled: True
# Optional: Number of frames without a detection before frigate considers an object to be gone. (default: 5x the frame rate)
# max_disappeared: 25
# Optional: Frequency for running detection on stationary objects (default: 10x the frame rate)
# stationary_interval: 50
# Optional: Object configuration
# NOTE: Can be overridden at the camera level
objects:
# Optional: list of objects to track from labelmap.txt (default: shown below)
track:
- person
- car
- motorcyle
- cat
- dog
# Optional: mask to prevent all object types from being detected in certain areas (default: no mask)
# Checks based on the bottom center of the bounding box of the object.
# NOTE: This mask is COMBINED with the object type specific mask below
# mask: 0,0,1000,0,1000,200,0,200
# Optional: filters to reduce false positives for specific object types
filters:
person:
# Optional: minimum width*height of the bounding box for the detected object (default: 0)
min_area: 5000
# Optional: maximum width*height of the bounding box for the detected object (default: 24000000)
max_area: 100000
# Optional: minimum score for the object to initiate tracking (default: shown below)
# min_score: 0.5
# Optional: minimum decimal percentage for tracked object's computed score to be considered a true positive (default: shown below)
# threshold: 0.7
# Optional: mask to prevent this object type from being detected in certain areas (default: no mask)
# Checks based on the bottom center of the bounding box of the object
# mask: 0,0,1000,0,1000,200,0,200
# Optional: Motion configuration
# NOTE: Can be overridden at the camera level
motion:
# Optional: The threshold passed to cv2.threshold to determine if a pixel is different enough to be counted as motion. (default: shown below)
# Increasing this value will make motion detection less sensitive and decreasing it will make motion detection more sensitive.
# The value should be between 1 and 255.
# threshold: 25
# Optional: Minimum size in pixels in the resized motion image that counts as motion (default: 30)
# Increasing this value will prevent smaller areas of motion from being detected. Decreasing will
# make motion detection more sensitive to smaller moving objects.
# As a rule of thumb:
# - 15 - high sensitivity
# - 30 - medium sensitivity
# - 50 - low sensitivity
contour_area: 30
# Optional: Alpha value passed to cv2.accumulateWeighted when averaging the motion delta across multiple frames (default: shown below)
# Higher values mean the current frame impacts the delta a lot, and a single raindrop may register as motion.
# Too low and a fast moving person wont be detected as motion.
# delta_alpha: 0.2
# Optional: Alpha value passed to cv2.accumulateWeighted when averaging frames to determine the background (default: shown below)
# Higher values mean the current frame impacts the average a lot, and a new object will be averaged into the background faster.
# Low values will cause things like moving shadows to be detected as motion for longer.
# https://www.geeksforgeeks.org/background-subtraction-in-an-image-using-concept-of-running-average/
# frame_alpha: 0.2
# Optional: Height of the resized motion frame (default: 50)
# This operates as an efficient blur alternative. Higher values will result in more granular motion detection at the expense
# of higher CPU usage. Lower values result in less CPU, but small changes may not register as motion.
# frame_height: 50
# Optional: motion mask
# NOTE: see docs for more detailed info on creating masks
# mask: 0,900,1080,900,1080,1920,0,1920
# Optional: Record configuration
# NOTE: Can be overridden at the camera level
record:
# Optional: Enable recording (default: shown below)
enabled: False
# Optional: Retention settings for recording
retain:
# Optional: Number of days to retain recordings regardless of events (default: shown below)
# NOTE: This should be set to 0 and retention should be defined in events section below
# if you only want to retain recordings of events.
days: 7
# Optional: Mode for retention. Available options are: all, motion, and active_objects
# all - save all recording segments regardless of activity
# motion - save all recordings segments with any detected motion
# active_objects - save all recording segments with active/moving objects
# NOTE: this mode only applies when the days setting above is greater than 0
mode: motion
# Optional: Event recording settings
events:
# Optional: Maximum length of time to retain video during long events. (default: shown below)
# NOTE: If an object is being tracked for longer than this amount of time, the retained recordings
# will be the last x seconds of the event unless retain->days under record is > 0.
max_seconds: 300
# Optional: Number of seconds before the event to include (default: shown below)
pre_capture: 5
# Optional: Number of seconds after the event to include (default: shown below)
post_capture: 5
# Optional: Objects to save recordings for. (default: all tracked objects)
# objects:
# - person
# Optional: Restrict recordings to objects that entered any of the listed zones (default: no required zones)
# required_zones: []
# Optional: Retention settings for recordings of events
retain:
# Required: Default retention days (default: shown below)
default: 14
# Optional: Mode for retention. (default: shown below)
# all - save all recording segments for events regardless of activity
# motion - save all recordings segments for events with any detected motion
# active_objects - save all recording segments for event with active/moving objects
#
# NOTE: If the retain mode for the camera is more restrictive than the mode configured
# here, the segments will already be gone by the time this mode is applied.
# For example, if the camera retain mode is "motion", the segments without motion are
# never stored, so setting the mode to "all" here won't bring them back.
mode: active_objects
# Optional: Per object retention days
# objects:
# person: 15
# Optional: Configuration for the jpg snapshots written to the clips directory for each event
# NOTE: Can be overridden at the camera level
snapshots:
# Optional: Enable writing jpg snapshot to /media/frigate/clips (default: shown below)
# This value can be set via MQTT and will be updated in startup based on retained value
enabled: False
# Optional: print a timestamp on the snapshots (default: shown below)
# timestamp: False
# Optional: draw bounding box on the snapshots (default: shown below)
# bounding_box: False
# Optional: crop the snapshot (default: shown below)
# crop: False
# Optional: height to resize the snapshot to (default: original size)
# height: 175
# Optional: Restrict snapshots to objects that entered any of the listed zones (default: no required zones)
required_zones: []
# Optional: Camera override for retention settings (default: global values)
retain:
# Required: Default retention days (default: shown below)
default: 10
# Optional: Per object retention days
objects:
person: 15
# Optional: RTMP configuration
# NOTE: Can be overridden at the camera level
rtmp:
# Optional: Enable the RTMP stream (default: True)
enabled: True
# Optional: Live stream configuration for WebUI
# NOTE: Can be overridden at the camera level
live:
# Optional: Set the height of the live stream. (default: 720)
# This must be less than or equal to the height of the detect stream. Lower resolutions
# reduce bandwidth required for viewing the live stream. Width is computed to match known aspect ratio.
# height: 720
# Optional: Set the encode quality of the live stream (default: shown below)
# 1 is the highest quality, and 31 is the lowest. Lower quality feeds utilize less CPU resources.
quality: 8
# Optional: in-feed timestamp style configuration
# NOTE: Can be overridden at the camera level
# timestamp_style:
# Optional: Position of the timestamp (default: shown below)
# "tl" (top left), "tr" (top right), "bl" (bottom left), "br" (bottom right)
# position: "tl"
# Optional: Format specifier conform to the Python package "datetime" (default: shown below)
# Additional Examples:
# german: "%d.%m.%Y %H:%M:%S"
# format: "%m/%d/%Y %H:%M:%S"
# Optional: Color of font
# color:
# All Required when color is specified (default: shown below)
# red: 255
# green: 255
# blue: 255
# Optional: Line thickness of font (default: shown below)
# thickness: 2
# Optional: Effect of lettering (default: shown below)
# None (No effect),
# "solid" (solid background in inverse color of font)
# "shadow" (shadow for font)
effect: solid
# Required
cameras:
{{- range .Values.frigate.cameras }}
# Required: name of the camera
{{ .name }}:
objects:
# Optional: list of objects to track from labelmap.txt (default: shown below)
track:
{{- range .objects.track }}
- {{ . }}
{{- end }}
detect:
width: {{ .detect.width }}
height: {{ .detect.height }}
# Required: ffmpeg settings for the camera
ffmpeg:
# Required: A list of input streams for the camera. See documentation for more information.
inputs:
{{- range .inputs }}
- path: {{ .path }}
roles:
{{- range .roles }}
- {{ . }}
{{- end }}
{{- end }}
record:
enabled: {{ .record.enabled }}
# Optional: timeout for highest scoring image before allowing it
# to be replaced by a newer image. (default: shown below)
best_image_timeout: 60
snapshots:
enabled: {{ .snapshots.enabled }}
# Optional: zones for this camera
# zones:
# Required: name of the zone
# NOTE: This must be different than any camera names, but can match with another zone on another
# camera.
# front_steps:
# Required: List of x,y coordinates to define the polygon of the zone.
# NOTE: Coordinates can be generated at https://www.image-map.net/
# coordinates: 545,1077,747,939,788,805
# Optional: List of objects that can trigger this zone (default: all tracked objects)
# objects:
# - person
# Optional: Zone level object filters.
# NOTE: The global and camera filters are applied upstream.
# filters:
# person:
# min_area: 5000
# max_area: 100000
# threshold: 0.7
# Optional: Configuration for the jpg snapshots published via MQTT
# mqtt:
# Optional: Enable publishing snapshot via mqtt for camera (default: shown below)
# NOTE: Only applies to publishing image data to MQTT via 'frigate/<camera_name>/<object_name>/snapshot'.
# All other messages will still be published.
# enabled: true
# Optional: print a timestamp on the snapshots (default: shown below)
# timestamp: True
# Optional: draw bounding box on the snapshots (default: shown below)
# bounding_box: True
# Optional: crop the snapshot (default: shown below)
# crop: True
# Optional: height to resize the snapshot to (default: shown below)
# height: 270
# Optional: jpeg encode quality (default: shown below)
# quality: 70
# Optional: Restrict mqtt messages to objects that entered any of the listed zones (default: no required zones)
# required_zones: []
{{- end }}
podSecurityContext: podSecurityContext:
runAsUser: 0 runAsUser: 0
runAsGroup: 0 runAsGroup: 0
service: global:
main: isSCALE: true
ports:
main: # -- In most cases the "enabled" key is only used internally to "render" or not the configuration
targetPort: 5000 # - Some parts of the config bellow are slightly modified so they can be added on SCALE UI. Mainly lists.
port: 5000 # - Do not blindly copy paste configuration from upstream.
rtmp: frigate:
mqtt:
host: mqtt.server.com
port: 1883
# -- NOTE: Must be unique if you are running multiple instances
topic_prefix: frigate
# -- NOTE: Must be unique if you are running multiple instances
client_id: frigate
user: mqtt_user
password: password
stats_interval: 60
detectors:
# -- Enable it to add the configuration in the config file
render_config: false
config:
[]
# -- Required: Name of the detector
# - name: coral
# # -- Valid values are 'edgetpu' (requires device property below) and 'cpu'.
# type: edgetpu
# # -- Device name as defined here: https://coral.ai/docs/edgetpu/multiple-edgetpu/#using-the-tensorflow-lite-python-api
# device: usb
# # -- This value is only used for CPU types
# num_threads: 3
model:
# -- Enable it to add the configuration in the config file
render_config: false
# -- Optional: Path to the model
path: /edgetpu_model.tflite
# -- Optional: Path to the labelmap
labelmap_path: /labelmap.txt
# -- Required: Object detection model input width
width: 320
# -- Required: Object detection model input height
height: 320
# -- Optional: Label name modifications.
labelmap:
[]
# - model: "2"
# name: vehicle
# - model: 3
# name: vehicle
logger:
# -- Enable it to add the configuration in the config file
render_config: false
# -- Optional: Default log verbosity (default: shown below)
default: info
# -- Optional: Component specific logger overrides
logs:
- component: frigate.event
verbosity: debug
birdseye:
# -- Enable it to add the configuration in the config file
render_config: false
# -- Enables birdseye
enabled: true enabled: true
ports: # -- Optional: Width of the output resolution
rtmp: width: 1280
protocol: TCP # -- Optional: Height of the output resolution
height: 720
# -- Optional: Encoding quality of the mpeg1 feed
# - 1 is the highest quality, and 31 is the lowest. Lower quality feeds utilize less CPU resources.
quality: 8
# -- Optional: Mode of the view. Available options are: objects, motion, and continuous
# - objects - cameras are included if they have had a tracked object within the last 30 seconds
# - motion - cameras are included if motion was detected in the last 30 seconds
# - continuous - all cameras are included always
mode: objects
ffmpeg:
# -- Enable it to add the configuration in the config file
render_config: false
# -- Optional: global ffmpeg args
global_args: -hide_banner -loglevel warning
# -- Optional: global input args
input_args: -avoid_negative_ts make_zero -fflags +genpts+discardcorrupt -rtsp_transport tcp -timeout 5000000 -use_wallclock_as_timestamps 1
# -- Optional: global hwaccel args
# - NOTE: See hardware acceleration docs for your specific device
hwaccel_args: ""
# -- Optional: global output args
output_args:
# -- Optional: output args for detect streams
detect: -f rawvideo -pix_fmt yuv420p
# -- Optional: output args for record streams
record: -f segment -segment_time 10 -segment_format mp4 -reset_timestamps 1 -strftime 1 -c copy -an
# -- Optional: output args for rtmp streams
rtmp: -c copy -f flv
detect:
# -- Enable it to add the configuration in the config file
render_config: false
# -- Enables detection for the camera.
# - This value can be set via MQTT and will be updated in startup based on retained value
enabled: true
# -- Optional: width of the frame for the input with the detect role
width: 1280
# -- Optional: height of the frame for the input with the detect role
height: 720
# -- Optional: desired fps for your camera for the input with the detect role
# - NOTE: Recommended value of 5. Ideally, try and reduce your FPS on the camera.
fps: 5
# -- Optional: Number of frames without a detection before frigate considers an object to be gone. (default: 5x the frame rate)
max_disappeared: 25
# -- Optional: Configuration for stationary object tracking
stationary:
# -- Optional: Frequency for confirming stationary objects
# - When set to 0, object detection will not confirm stationary objects until movement is detected.
# - If set to 10, object detection will run to confirm the object still exists on every 10th frame.
interval: 0
# -- Optional: Number of frames without a position change for an object to be considered stationary (default: 10x the frame rate or 10s)
threshold: 50
# -- Optional: Define a maximum number of frames for tracking a stationary object (default: not set, track forever)
# - This can help with false positives for objects that should only be stationary for a limited amount of time.
# - It can also be used to disable stationary object tracking. For example, you may want to set a value for person, but leave
# - car at the default.
# - WARNING: Setting these values overrides default behavior and disables stationary object tracking.
# - There are very few situations where you would want it disabled. It is NOT recommended to
# - copy these values from the example config into your config unless you know they are needed.
# max_frames:
# # -- Optional: Default for all object types (default: not set, track forever)
# default:
# # -- Optional: Object specific values
# objects:
# - object: person
# frames: 1000
objects:
# -- Enable it to add the configuration in the config file
render_config: false
# -- Optional: list of objects to track from labelmap.txt
track:
- person
# -- Optional: mask to prevent all object types from being detected in certain areas (default: no mask)
# - Checks based on the bottom center of the bounding box of the object.
# - NOTE: This mask is COMBINED with the object type specific mask below
mask: 0,0,1000,0,1000,200,0,200
# - Optional: filters to reduce false positives for specific object types
filters:
[]
# - object: person
# # -- Optional: Minimum width*height of the bounding box for the detected object
# min_area: 5000
# # -- Optional: Maximum width*height of the bounding box for the detected object
# max_area: 100000
# # -- Optional: Minimum width/height of the bounding box for the detected object
# min_ratio: 0.5
# # -- Optional: Maximum width/height of the bounding box for the detected object
# max_ratio: 2.0
# # -- Optional: Minimum score for the object to initiate tracking
# min_score: 0.5
# # -- Optional: Minimum decimal percentage for tracked object's computed score to be considered a true positive
# threshold: 0.7
# # -- Optional: Mask to prevent this object type from being detected in certain areas
# # - Checks based on the bottom center of the bounding box of the object
# mask: 0,0,1000,0,1000,200,0,200
motion:
# -- Enable it to add the configuration in the config file
render_config: false
# -- Optional: The threshold passed to cv2.threshold to determine if a pixel is different enough to be counted as motion.
# - Increasing this value will make motion detection less sensitive and decreasing it will make motion detection more sensitive.
# - The value should be between 1 and 255.
threshold: 25
# -- Optional: Minimum size in pixels in the resized motion image that counts as motion
# - Increasing this value will prevent smaller areas of motion from being detected. Decreasing will
# - make motion detection more sensitive to smaller moving objects.
# - As a rule of thumb:
# - 15 - high sensitivity
# - 30 - medium sensitivity
# - 50 - low sensitivity
contour_area: 30
# -- Optional: Alpha value passed to cv2.accumulateWeighted when averaging the motion delta across multiple frames
# - Higher values mean the current frame impacts the delta a lot, and a single raindrop may register as motion.
# - Too low and a fast moving person wont be detected as motion.
delta_alpha: 0.2
# -- Optional: Alpha value passed to cv2.accumulateWeighted when averaging frames to determine the background
# - Higher values mean the current frame impacts the average a lot, and a new object will be averaged into the background faster.
# - Low values will cause things like moving shadows to be detected as motion for longer.
# - https://www.geeksforgeeks.org/background-subtraction-in-an-image-using-concept-of-running-average/
frame_alpha: 0.2
# -- Optional: Height of the resized motion frame (default: 50)
# - This operates as an efficient blur alternative. Higher values will result in more granular motion detection at the expense
# - of higher CPU usage. Lower values result in less CPU, but small changes may not register as motion.
frame_height: 50
# -- Optional: motion mask
# - NOTE: see docs for more detailed info on creating masks
mask: 0,900,1080,900,1080,1920,0,1920
# -- Optional: improve contrast
# - Enables dynamic contrast improvement. This should help improve night detections at the cost of making motion detection more sensitive
# - for daytime.
improve_contrast: False
# -- Optional: Delay when updating camera motion through MQTT from ON -> OFF
mqtt_off_delay: 30
record:
# -- Enable it to add the configuration in the config file
render_config: false
# -- Optional: Enable recording
# - WARNING: If recording is disabled in the config, turning it on via
# - the UI or MQTT later will have no effect.
# - WARNING: Frigate does not currently support limiting recordings based
# - on available disk space automatically. If using recordings,
# - you must specify retention settings for a number of days that
# - will fit within the available disk space of your drive or Frigate will crash.
enabled: False
# -- Optional: Number of minutes to wait between cleanup runs
# - This can be used to reduce the frequency of deleting recording segments from disk if you want to minimize i/o
expire_interval: 60
# -- Optional: Retention settings for recording
retain:
# -- Render retain config
render_config: false
# -- Optional: Number of days to retain recordings regardless of events
# - NOTE: This should be set to 0 and retention should be defined in events section below
# - if you only want to retain recordings of events.
days: 0
# -- Optional: Mode for retention. Available options are: all, motion, and active_objects
# - all - save all recording segments regardless of activity
# - motion - save all recordings segments with any detected motion
# - active_objects - save all recording segments with active/moving objects
# - NOTE: this mode only applies when the days setting above is greater than 0
mode: all
# -- Optional: Event recording settings
events:
# -- Optional: Number of seconds before the event to include
pre_capture: 5
# -- Optional: Number of seconds after the event to include
post_capture: 5
# -- Optional: Objects to save recordings for. Defaults to all
objects:
[]
# - person
# -- Optional: Restrict recordings to objects that entered any of the listed zones
required_zones: []
# -- Optional: Retention settings for recordings of events
retain:
# -- Render retain config
render_config: false
# -- Required: Default retention days
default: 10
# -- Optional: Mode for retention.
# - all - save all recording segments for events regardless of activity
# - motion - save all recordings segments for events with any detected motion
# - active_objects - save all recording segments for event with active/moving objects
mode: motion
# -- Optional: Per object retention days
objects:
- object: person
days: 15
snapshots:
# -- Enable it to add the configuration in the config file
render_config: false
# -- Optional: Enable writing jpg snapshot to /media/frigate/clips
# - This value can be set via MQTT and will be updated in startup based on retained value
enabled: false
# -- Optional: Save a clean PNG copy of the snapshot image
clean_copy: true
# -- Optional: print a timestamp on the snapshots
timestamp: false
# -- Optional: draw bounding box on the snapshots
bounding_box: false
# -- Optional: crop the snapshot
crop: false
# -- Optional: height to resize the snapshot to (default: original size)
height:
# -- Optional: Restrict snapshots to objects that entered any of the listed zones (default: no required zones)
required_zones: []
# -- Optional: Camera override for retention settings (default: global values)
retain:
# -- Render retain config
render_config: false
# -- Required: Default retention days (default: shown below)
default: 10
# -- Optional: Per object retention days
objects:
- object: person
days: 15
rtmp:
# -- Enable it to add the configuration in the config file
render_config: false
# - Optional: Enable the RTMP stream
enabled: True
live:
# -- Enable it to add the configuration in the config file
render_config: false
# -- Optional: Set the height of the live stream. (default: 720)
# - This must be less than or equal to the height of the detect stream. Lower resolutions
# - reduce bandwidth required for viewing the live stream. Width is computed to match known aspect ratio.
height: 720
# -- Optional: Set the encode quality of the live stream (default: shown below)
# - 1 is the highest quality, and 31 is the lowest. Lower quality feeds utilize less CPU resources.
quality: 8
timestamp_style:
# -- Enable it to add the configuration in the config file
render_config: false
# -- Optional: Position of the timestamp
# - "tl" (top left), "tr" (top right), "bl" (bottom left), "br" (bottom right)
position: "tl"
# -- Optional: Format specifier conform to the Python package "datetime"
# - Additional Examples:
# - german: "%d.%m.%Y %H:%M:%S"
format: "%m/%d/%Y %H:%M:%S"
# -- Optional: Color of font
color:
# -- All Required when color is specified (default: shown below)
red: 255
green: 255
blue: 255
# -- Optional: Line thickness of font (default: shown below)
thickness: 2
# -- Optional: Effect of lettering (default: shown below)
# - None (No effect),
# - "solid" (solid background in inverse color of font)
# - "shadow" (shadow for font)
effect: None
cameras:
# -- Required: name of the camera
- camera_name: back
# -- Required: ffmpeg settings for the camera
ffmpeg:
# -- Required: A list of input streams for the camera. See documentation for more information.
inputs:
# -- Required: the path to the stream
- path: rtsp://viewer:password@10.0.10.10:554/cam/realmonitor?channel=1&subtype=2
# -- Required: list of roles for this stream. valid values are: detect,record,rtmp
# - NOTICE: In addition to assigning the record, and rtmp roles,
# - they must also be enabled in the camera config.
roles:
- detect
- rtmp
# -- Optional: stream specific global args
global_args:
# - Optional: stream specific hwaccel args
hwaccel_args:
# - Optional: stream specific input args
input_args:
# -- Optional: camera specific global args
global_args:
# -- Optional: camera specific hwaccel args
hwaccel_args:
# -- Optional: camera specific input args
input_args:
# -- Optional: camera specific output args
output_args:
# -- Optional: timeout for highest scoring image before allowing it
# - to be replaced by a newer image.
best_image_timeout: 60
# -- Optional: zones for this camera
zones:
# -- Required: name of the zone
# - NOTE: This must be different than any camera names, but can match with another zone on another camera
- name: front_steps
# -- Required: List of x,y coordinates to define the polygon of the zone.
# - NOTE: Presence in a zone is evaluated only based on the bottom center of the objects bounding box.
coordinates: 545,1077,747,939,788,805
# -- Optional: List of objects that can trigger this zone (default: all tracked objects)
objects:
- person
# -- Optional: Zone level object filters.
# -NOTE: The global and camera filters are applied upstream.
filters:
- object: person
min_area: 5000
max_area: 100000
threshold: 0.7
# -- Optional: Configuration for the jpg snapshots published via MQTT
mqtt:
# -- Enable it to add the configuration in the config file
render_config: false
# -- Optional: Enable publishing snapshot via mqtt for camera
# - NOTE: Only applies to publishing image data to MQTT via 'frigate/<camera_name>/<object_name>/snapshot'.
# - All other messages will still be published.
enabled: true enabled: true
port: 1935 # -- Optional: print a timestamp on the snapshots
targetPort: 1935 timestamp: true
# -- Optional: draw bounding box on the snapshots
bounding_box: true
# -- Optional: crop the snapshot
crop: true
# -- Optional: height to resize the snapshot to
height: 270
# -- Optional: jpeg encode quality
quality: 70
# -- Optional: Restrict mqtt messages to objects that entered any of the listed zones
required_zones: []
# -- Optional: Configuration for how camera is handled in the GUI.
ui:
# -- Enable it to add the configuration in the config file
render_config: false
# -- Optional: Adjust sort order of cameras in the UI. Larger numbers come later
# - By default the cameras are sorted alphabetically.
order: 0
# -- Optional: Whether or not to show the camera in the Frigate UI
dashboard: true
ingress: ingress:
rtmp: rtmp:
autoLink: true autoLink: true
frigate: service:
mqtt: main:
host: mosquitto.ix-mosquitto.svc.cluster.local ports:
port: 1883 main:
authentitcated: false port: 10500
username: mqtt_user protocol: HTTP
password: password targetPort: 5000
birdseye: rtmp:
enabled: true enabled: true
mode: motion ports:
cameras: rtmp:
- name: camera1
objects:
# Optional: list of objects to track from labelmap.txt (default: shown below)
track:
- person
- car
- motorcyle
- cat
- dog
detect:
height: 720
width: 1280
inputs:
# Required: the path to the stream
# NOTE: path may include environment variables, which must begin with 'FRIGATE_' and be referenced in {}
- path: rtsp://username:password@highres.url
# Required: list of roles for this stream. valid values are: detect,record,rtmp
# NOTICE: In addition to assigning the record, and rtmp roles,
# they must also be enabled in the camera config.
roles:
- record
- path: rtsp://username:password@lowres.url
roles:
- detect
- rtmp
record:
enabled: True
# Optional: timeout for highest scoring image before allowing it
# to be replaced by a newer image. (default: shown below)
best_image_timeout: 60
snapshots:
enabled: true enabled: true
port: 1935
targetPort: 1935
persistence: persistence:
cache:
enabled: true
mountPath: "/tmp/cache"
type: "emptyDir"
shm:
enabled: true
mountPath: "/dev/shm"
type: "emptyDir"
medium: "Memory"
media: media:
enabled: true enabled: true
mountPath: "/media" mountPath: /media
size: 256Gi
db:
enabled: true
mountPath: /db
size: 256Gi
type: emptyDir
cache:
enabled: true
mountPath: /tmp/cache
type: emptyDir
shm:
enabled: true
mountPath: /dev/shm
type: emptyDir
medium: Memory
frigate-config: frigate-config:
enabled: true enabled: true
mountPath: "/config/config.yml" mountPath: /config
subPath: "config.yml" type: configMap
type: "custom" objectName: '{{ template "tc.common.names.fullname" . }}-frigate-config'
volumeSpec: items:
configMap: - key: config.yml
name: '{{ template "tc.common.names.fullname" . }}-config' path: config.yml
portal: portal:
enabled: true enabled: true
@@ -8,7 +8,9 @@ Ingress for this chart is **required**
In both Native Helm and TrueNAS Scale, keys that start with `_` are **unset**. In both Native Helm and TrueNAS Scale, keys that start with `_` are **unset**.
## TrueNAS Scale ## Configuration
### TrueNAS Scale
In order to be able to expose some options in the GUI, In order to be able to expose some options in the GUI,
but also give users the option to users to **unset** those values, but also give users the option to users to **unset** those values,
@@ -79,6 +81,33 @@ Please use the exact casing as in the [MeshCentral's json schema](https://github
::: :::
## Native Helm ### Native Helm
Native Helm users won't be affected with the above. Native Helm users won't be affected with the above.
## Hardcoded values
We hardcoded some values, so the chart/app can work correctly based on how it's written.
Those values are:
```json
{
"$schema": "http://info.meshcentral.com/downloads/meshcentral-config-schema.json",
"settings": {
"mongoDB": "actual-generated-mongodb-url",
"mongoDbName": "actual-mongodb-name",
"sessionKey": "32char-long-random-generated-key",
"port": "to-the-same-port-as-your-main-service",
"selfUpdate": false,
"cleanNpmCacheOnUpdate": false
},
"domains": {
// This applies to ALL domains
"": {
"myServer": {
"Upgrade": false
}
}
}
}
```