{{/* 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: {{- include "frigate.mqtt" .Values.frigate.mqtt | indent 6 }} {{- if and .Values.frigate.detectors.render_config .Values.frigate.detectors.config }} detectors: {{- include "frigate.detectors" .Values.frigate.detectors | indent 6 }} {{- end }} {{- if .Values.frigate.model.render_config }} model: {{- include "frigate.model" .Values.frigate.model | indent 6 }} {{- end }} {{- if .Values.frigate.logger.render_config }} logger: {{- include "frigate.logger" .Values.frigate.logger | indent 6 }} {{- end }} {{- if .Values.frigate.birdseye.render_config }} birdseye: {{- include "frigate.birdseye" .Values.frigate.birdseye | indent 6 }} {{- end }} {{- if .Values.frigate.ffmpeg.render_config }} ffmpeg: {{- include "frigate.ffmpeg" .Values.frigate.ffmpeg | indent 6 }} {{- end }} {{- if .Values.frigate.detect.render_config }} detect: {{- include "frigate.detect" .Values.frigate.detect | indent 6 }} {{- end -}} {{- if .Values.frigate.objects.render_config }} objects: {{- include "frigate.objects" .Values.frigate.objects | indent 6 }} {{- end }} {{- if .Values.frigate.motion.render_config }} motion: {{- include "frigate.motion" .Values.frigate.motion | indent 6 }} {{- end }} {{- if .Values.frigate.record.render_config }} record: {{- include "frigate.record" .Values.frigate.record | indent 6 }} {{- end }} {{- if .Values.frigate.snapshots.render_config }} snapshots: {{- include "frigate.snapshots" .Values.frigate.snapshots | indent 6 }} {{- end }} {{- if .Values.frigate.rtmp.render_config }} rtmp: {{- include "frigate.rtmp" .Values.frigate.rtmp | indent 6 }} {{- end }} {{- if .Values.frigate.live.render_config }} live: {{- include "frigate.live" .Values.frigate.live | indent 6 }} {{- end }} {{- if .Values.frigate.timestamp_style.render_config }} timestamp_style: {{- include "frigate.timestamp_style" .Values.frigate.timestamp_style | indent 6 }} {{- end }} {{- $cameras := .Values.frigate.cameras }} cameras: {{- range $cam := $cameras }} {{ $cam.camera_name | required "You need to provide a camera name" }}: ffmpeg: inputs: {{- range $input := $cam.ffmpeg.inputs }} - path: {{ $input.path | required "You need to provide a path" }} roles: {{- range $role := $input.roles }} - {{ $role }} {{- else -}} {{- fail "You need to provide roles" -}} {{- end -}} {{- include "frigate.ffmpeg" $input | indent 14 }} {{- end -}} {{/* End range $cam.ffmpeg.inputs */}} {{- include "frigate.ffmpeg" $cam.ffmpeg | indent 10 }} {{- with $cam.best_image_timeout }} best_image_timeout: {{ . }} {{- end -}} {{- with $cam.zones }} zones: {{- range $zone := . }} {{ $zone.name | required "You have to specify a zone name" }}: coordinates: {{ required "You have to specify coordinates" .coordinates }} {{- with $zone.objects }} objects: {{- range $obj := . }} - {{ $obj }} {{- end -}} {{- end -}} {{- with $zone.filters }} filters: {{- range $filter := . }} {{ $filter.object | required "You have to specify an object" }}: {{- with $filter.min_area }} min_area: {{ . }} {{- end -}} {{- with $filter.max_area }} max_area: {{ . }} {{- end -}} {{- with $filter.threshold }} threshold: {{ . }} {{- end -}} {{- end -}} {{/* end range filters */}} {{- end -}} {{/* end with filter */}} {{- end -}} {{/* end range zones */}} {{- end -}} {{/* end with zones */}} {{- if $cam.mqtt.render_config -}} {{- with $cam.mqtt }} mqtt: enabled: {{ ternary "True" "False" .enabled }} timestamp: {{ ternary "True" "False" .timestamp }} bounding_box: {{ ternary "True" "False" .bounding_box }} crop: {{ ternary "True" "False" .crop }} {{- with .height }} height: {{ . }} {{- end -}} {{- with .quality }} quality: {{ . }} {{- end -}} {{- with .required_zones }} required_zones: {{- range $zone := . }} - {{ $zone }} {{- end -}} {{- end -}} {{- end -}} {{/* end with mqtt */}} {{- end -}} {{/* end if mqtt.render_config */}} {{- if $cam.ui.render_config -}} {{- with $cam.ui }} ui: {{- if not (kindIs "invalid" .order) }} order: {{ .order }} {{- end }} dashboard: {{ ternary "True" "False" .dashboard }} {{- end -}} {{/* end with ui */}} {{- end -}} {{/* end if ui.render_config */}} {{- end -}} {{/* end range cameras */}} {{- end }} {{- define "frigate.ffmpeg" -}} {{- $ffmpeg := . -}} {{- with $ffmpeg.global_args }} global_args: {{ . }} {{- end -}} {{- with $ffmpeg.input_args }} input_args: {{ . }} {{- end -}} {{- with $ffmpeg.hwaccel_args }} hwaccel_args: {{ . }} {{- end -}} {{- if $ffmpeg.output_args -}} {{- if or $ffmpeg.output_args.detect $ffmpeg.output_args.record $ffmpeg.output_args.rtmp }} output_args: {{- with $ffmpeg.output_args.detect }} detect: {{ . }} {{- end -}} {{- with $ffmpeg.output_args.record }} record: {{ . }} {{- end -}} {{- with $ffmpeg.output_args.rtmp }} rtmp: {{ . }} {{- end -}} {{- end -}} {{- end -}} {{- end -}} {{- define "frigate.detect" -}} {{- $detect := . }} enabled: {{ ternary "True" "False" $detect.enabled }} {{- with $detect.width }} width: {{ . }} {{- end -}} {{- with $detect.height }} height: {{ . }} {{- end -}} {{- with $detect.fps }} fps: {{ . }} {{- end -}} {{- with $detect.max_disappeared }} max_disappeared: {{ . }} {{- end -}} {{- if or (not (kindIs "invalid" $detect.stationary.interval)) $detect.stationary.threshold $detect.stationary.set_max_frames }} stationary: {{- if not (kindIs "invalid" $detect.stationary.interval) }} {{/* invalid kind means its empty (0 is not empty) */}} interval: {{ $detect.stationary.interval }} {{- end -}} {{- with $detect.stationary.threshold }} threshold: {{ . }} {{- end -}} {{- if (hasKey $detect.stationary "max_frames") }} {{- if or $detect.stationary.max_frames.default $detect.stationary.max_frames.objects }} max_frames: {{- with $detect.stationary.max_frames.default }} default: {{ . }} {{- end -}} {{- with $detect.stationary.max_frames.objects }} objects: {{- range $obj := . }} {{ $obj.object | required "You need to provide an object" }}: {{ $obj.frames | required "You need to provide frames" }} {{- end -}} {{- end -}} {{- end -}} {{- end -}} {{- end -}} {{- end -}} {{- define "frigate.motion" -}} {{- $motion := . -}} {{- with $motion.threshold }} threshold: {{ . }} {{- end -}} {{- with $motion.contour_area }} contour_area: {{ . }} {{- end -}} {{- with $motion.delta_alpha }} delta_alpha: {{ . }} {{- end -}} {{- with $motion.frame_alpha }} frame_alpha: {{ . }} {{- end -}} {{- with $motion.frame_height }} frame_height: {{ . }} {{- end -}} {{- with $motion.mask }} mask: {{ . }} {{- end }} improve_contrast: {{ ternary "True" "False" $motion.improve_contrast }} {{- with $motion.mqtt_off_delay }} mqtt_off_delay: {{ . }} {{- end -}} {{- end -}} {{- define "frigate.record" -}} {{- $record := . }} enabled: {{ ternary "True" "False" $record.enabled }} {{- with $record.expire_interval }} expire_interval: {{ . }} {{- end -}} {{- if $record.retain.render_config }} retain: {{- if not (kindIs "invalid" $record.retain.days) }} days: {{ $record.retain.days }} {{- end -}} {{- with $record.retain.mode }} mode: {{ . }} {{- end -}} {{- end -}} {{- if $record.events.render_config }} events: {{- if not (kindIs "invalid" $record.events.pre_capture) }} pre_capture: {{ $record.events.pre_capture }} {{- end -}} {{- if not (kindIs "invalid" $record.events.post_capture) }} post_capture: {{ $record.events.post_capture }} {{- end -}} {{- with $record.events.objects }} objects: {{- range $obj := . }} - {{ $obj }} {{- end -}} {{- end -}} {{- with $record.events.required_zones }} required_zones: {{- range $zone := . }} - {{ $zone }} {{- end -}} {{- end -}} {{- if $record.events.retain.render_config }} retain: default: {{ $record.events.retain.default | required "You need to provide default retain days" }} {{- with $record.events.retain.mode }} mode: {{ . }} {{- end -}} {{- with $record.events.retain.objects }} objects: {{- range $obj := . }} {{ $obj.object | required "You need to provide an object" }}: {{ $obj.days | required "You need to provide default retain days" }} {{- end -}} {{- end -}} {{- end -}} {{- end -}} {{- end -}} {{- define "frigate.objects" -}} {{- $objects := . -}} {{- with $objects.track }} track: {{- range $track := . }} - {{ $track }} {{- end -}} {{- end -}} {{- with $objects.mask }} mask: {{ . }} {{- end -}} {{- with $objects.filters }} filters: {{- range $filter := . }} {{ $filter.object | required "You need to provide an object" }}: {{- with $filter.min_area }} min_area: {{ . }} {{- end -}} {{- with $filter.max_area }} max_area: {{ . }} {{- end -}} {{- with $filter.min_ratio }} min_ratio: {{ . }} {{- end -}} {{- with $filter.max_ratio }} max_ratio: {{ . }} {{- end -}} {{- with $filter.min_score }} min_score: {{ . }} {{- end -}} {{- with $filter.threshold }} threshold: {{ . }} {{- end -}} {{- with $filter.mask }} mask: {{ . }} {{- end -}} {{- end -}} {{- end -}} {{- end -}} {{- define "frigate.birdseye" -}} {{- $birdseye := . }} enabled: {{ ternary "True" "False" $birdseye.enabled }} {{- with $birdseye.width }} width: {{ . }} {{- end -}} {{- with $birdseye.height }} height: {{ . }} {{- end -}} {{- with $birdseye.quality }} quality: {{ . }} {{- end -}} {{- with $birdseye.mode }} mode: {{ . }} {{- end -}} {{- end -}} {{- define "frigate.timestamp_style" -}} {{- $timestamp_style := . -}} {{- with $timestamp_style.position }} position: {{ . }} {{- end -}} {{- with $timestamp_style.format }} format: {{ . }} {{- end -}} {{- if $timestamp_style.color.render_config }} color: red: {{ $timestamp_style.color.red }} green: {{ $timestamp_style.color.green }} blue: {{ $timestamp_style.color.blue }} {{- end -}} {{- with $timestamp_style.thickness }} thickness: {{ . }} {{- end -}} {{- with $timestamp_style.effect }} effect: {{ $timestamp_style.effect }} {{- end -}} {{- end -}} {{- define "frigate.live" -}} {{- $live := . -}} {{- with $live.height }} height: {{ . }} {{- end -}} {{- with $live.quality }} quality: {{ . }} {{- end -}} {{- end -}} {{- define "frigate.rtmp" -}} {{- $rtmp := . }} enabled: {{ ternary "True" "False" $rtmp.enabled }} {{- end -}} {{- define "frigate.snapshots" -}} {{- $snapshots := . }} enabled: {{ ternary "True" "False" $snapshots.enabled }} clean_copy: {{ ternary "True" "False" $snapshots.clean_copy }} timestamp: {{ ternary "True" "False" $snapshots.timestamp }} bounding_box: {{ ternary "True" "False" $snapshots.bounding_box }} crop: {{ ternary "True" "False" $snapshots.crop }} {{- with $snapshots.height }} height: {{ . }} {{- end -}} {{- with $snapshots.required_zones }} required_zones: {{- range $zone := . }} - {{ $zone }} {{- end -}} {{- end -}} {{- if $snapshots.retain.render_config }} retain: default: {{ $snapshots.retain.default | required "You need to provide default retain days" }} {{- with $snapshots.retain.objects }} objects: {{- range $obj := . }} {{ $obj.object | required "You need to provide an object" }}: {{ $obj.days | required "You need to provide default retain days" }} {{- end -}} {{- end -}} {{- end -}} {{- end -}} {{- define "frigate.detectors" -}} {{- $detectors := . -}} {{- range $detector := $detectors.config }} {{ $detector.name | required "You need to provide a detector name" }}: type: {{ $detector.type | required "You need to provide a detector type" }} {{- with $detector.device }} device: {{ . }} {{- end -}} {{- with $detector.num_threads }} num_threads: {{ . }} {{- end -}} {{- end -}} {{- end -}} {{- define "frigate.model" -}} {{ $model := . }} width: {{ $model.width | required "You need to provide a model width" }} height: {{ $model.height | required "You need to provide a model height" }} {{- with $model.path }} path: {{ . }} {{- end -}} {{- with $model.labelmap_path }} labelmap_path: {{ . }} {{- end -}} {{- with $model.labelmap }} labelmap: {{- range $lmap := . }} {{ $lmap.model | required "You need to provide a labelmap model" }}: {{ $lmap.name | required "You need to provide a labelmap name" }} {{- end -}} {{- end -}} {{- end -}} {{- define "frigate.logger" -}} {{- $logger := . }} default: {{ $logger.default }} {{- with $logger.logs }} logs: {{- range $log := . }} {{ $log.component | required "You need to provide a logger cmponent" }}: {{ $log.verbosity | required "You need to provide logger verbosity" }} {{- end -}} {{- end -}} {{- end -}} {{- define "frigate.mqtt" -}} {{- $mqtt := . }} host: {{ required "You need to provide an MQTT host" $mqtt.host }} {{- with $mqtt.port }} port: {{ . }} {{- end -}} {{- with $mqtt.topic_prefix }} topic_prefix: {{ . }} {{- end -}} {{- with $mqtt.client_id }} client_id: {{ . }} {{- end -}} {{- if not (kindIs "invalid" $mqtt.stats_interval) }} stats_interval: {{ $mqtt.stats_interval }} {{- end -}} {{- with $mqtt.user }} user: {{ . }} {{- end -}} {{- with $mqtt.password }} password: {{ . }} {{- end -}} {{- end -}}