Setting up Frigate in 2025

I’ve just got Frigate mostly working as I want in HA, but it has taken a day going through many posts with not quite current info and often more config than needed just to get things working. Maybe this will help other Frigate newbies get going and maybe someone can help sort out the remaining niggles with the Reolink E1 Outdoor Pro.

My cameras are:

  1. 1 x Reolink E1 Outdoor Pro (4K), 8MP, 3840*2160 with PTZ
  2. 2 x Reolink CX410W (2K), 4MP, 2560*1440
  3. 2 x ESP32CAM ESPHome firmware set to 1280x1024

but to minimize the config shown here, I’ll include only one camera of each type. As far as I can tell there is no way to change the codec on my cameras; the Reolink E1 Outdoor Pro at 3840*2160 uses h265, the Reolink CX410W at 2560*1440 uses h264 and the ESP32CAM uses MJPEG. At some stage I’ll see if the Reolink E1 Outdoor Pro changes to h264 at lower resolutions as per: Frigate H264 on (some) 8MP Reolink Cameras Working · blakeblackshear/frigate · Discussion #3594 · GitHub

I started with the Reolink cameras working in HA using the Reolink integration.

Install and Configure Frigate

On HassOS HA:
Settings > Add-ons > ADD-ON STORE > Frigate (Full Access)
The Add-on runs Frigate in a container. I suggest saying yes to adding a tab for it in the left side-bar (it saves going Settings > Add-ons > Frigate each time to get to Frigate’s UI). You have to hand craft frigate.yaml in your HA config dir before you start the add-on. You have to get your cameras working in Frigate before continuing with the Frigate - Home Assistant Integration below.

The docs suggest trying the non-Full Access one first and then only the Full Access one if you have problems, but I’d suggest that everyone always has problems! The difference is not well explained anywhere I can find, but it seems to be about access to hardware accelerators/GPUs, so perhaps it is about running under root privileges. The Full Access version provides a switch to turn on/off Full Access so that’s why I suggest using it. Try getting it working with Full Access on, then test to see if it still works with Full Access off.

Frigate uses MQTT and under HassOS, HA users are MQTT users. So I created a HA username: frigate with password, Local access only and not Administrator.

Here is my simplified frigate.yaml (you can use ssh, Samba share or the File editor add-ons to create the file):

mqtt:
  host: 192.168.1.101
  port: 1883
  topic_prefix: frigate
  client_id: frigate
  user: frigate
  password: password
  stats_interval: 60

birdseye:
  enabled: true
  mode: continuous

detectors:
  ov:
    type: cpu

ffmpeg:
  hwaccel_args: preset-intel-qsv-h264

go2rtc:
  streams:
    cam1: rtsp://admin:[email protected]:554/Preview_01_main
    cam1sub: rtsp://admin:[email protected]:554/Preview_01_sub
    cam2: rtsp://admin:[email protected]:554/Preview_01_main
    cam2sub: rtsp://admin:[email protected]:554/Preview_01_sub
    cam4: ffmpeg:http://espcam1.local:8080#video=h264#width=1280#height=1024#hardware

cameras:
  cam1:
    ffmpeg:
      inputs:
        - path: rtsp://127.0.0.1:8554/cam1
          roles:
            - record
        - path: rtsp://127.0.0.1:8554/cam1sub
          roles:
            - detect
      output_args:
        record: preset-record-generic-audio-aac
    onvif:
      host: 192.168.1.223
      port: 8000
      user: admin
      password: password
  cam2:
    ffmpeg:
      inputs:
        - path: rtsp://127.0.0.1:8554/cam2
          roles:
            - record
        - path: rtsp://127.0.0.1:8554/cam2sub
          roles:
            - detect
      output_args:
        record: preset-record-generic-audio-aac
  cam4:
    ffmpeg:
      inputs:
        - path: rtsp://127.0.0.1:8554/cam4
          roles:
            - record
            - detect

objects:
  track:
    - person
  filters:
    person:
      threshold: 0.7

detect:
  width: 800
  height: 480

snapshots:
  enabled: true
  timestamp: true
  bounding_box: true
  retain:
    default: 14

record:
  enabled: true
  retain:
    days: 0
  alerts:
    retain:
      days: 4
  detections:
    retain:
      days: 4
version: 0.15-1

Notes on frigate config:

  1. detectors I’m using a NUC with Intel N150 CPU (Gen 14 3.60 GHz 4 Cores, 4 Threads, Intel UHD Graphics with 24 EUs), 6W base power. I was hoping I could use the iGPU for object detection with openvino, but it turns out that although openvino can use Intel UHD Graphics it can only do so on supported CPUs (of which the N150 is not one). Intel Core CPUs work, but they also draw a lot more power. See System Requirements — OpenVINO™ documentation . Looks like I will need a Coral USB TPU, but for now I’m falling back to type: cpu.
  2. hwaccel_args ffmpeg can use the N150’s GPU.
  3. go2rtc only one stream is opened to the camera for each resolution. go2rtc shares the stream to all clients.
  4. go2rtc > cam4 the ESP32CAM’s MJPEG stream is transcoded to h264 using the GPU. Adjust the width and height to suit your ESP32CAM’s firmware.
  5. cam1 > onvif provides access to the PTZ.
  6. This works with Full Access off.
  7. Frigate appears to display the full resolution of the Reolink E1 Outdoor Pro in Firefox (which I did not think had support for h265) allong with all the PTZ controls.

Frigate - Home Assistant integration

In HACS, download Frigate Home Assistant Integration & Advanced Camera Card - Formerly known as: Frigate Card.
Restart HA to load the integration then:
Settings > Devices & sevices > + ADD INTEGRATION > Select Brand , Search: frig > Frigate

The integration setup requires the URL to your frigate installation, which depends on the Add-on version installed, as explained here Home Assistant Integration | Frigate. For Frigate (Full Access) it is http://ccab4aaf-frigate-fa:5000. Then you have a bunch of HA devices and entities corresponding to Frigate and it’s cameras.

Notes:

  1. If I use the Frigate entity for the Reolink E1 Outdoor Pro in the UI, it displays, but there are no PTZ or full screen display controls.
  2. If I use the Reolink Integration’s Fluent (low res) entity for the Reolink E1 Outdoor Pro in the UI, I get all the PTZ and full screen display controls (but it’s ugly low res).
2 Likes

Nice to see this write up. I have a couple of Reolink camera too. If you change the resolution from 4k or higher, to one below it falls back to h264. H265 still doesn’t support WebRTC properly (at least, not that I know of).

I have spend a lot of time trying to optimize too. I’m running the beta2 of 0.16.

My config:

mqtt:
  enabled: true
  host: 192.168.20.72
  user: mosquitto
  password: none
  stats_interval: 60

detect:
  enabled: true

record:
  enabled: true
  expire_interval: 5
  sync_recordings: true
  retain:
    days: 3
    mode: all
  alerts:
    retain:
      days: 30
    pre_capture: 30
    post_capture: 30
  detections:
    retain:
      days: 30
    pre_capture: 30
    post_capture: 30

semantic_search:
  enabled: true
  reindex: false
  model_size: large

face_recognition:
  enabled: true
  model_size: large

detectors:
  ov:
    type: openvino
    device: GPU

#model:
#  model_type: yolonas
#  width: 640 # <--- should match whatever was set in notebook
#  height: 640 # <--- should match whatever was set in notebook
#  input_tensor: nchw
#  input_pixel_format: bgr
#  path: /config/yolo_nas_l.onnx
#  labelmap_path: /labelmap/coco-80.txt

model:
  width: 300
  height: 300
  input_tensor: nhwc
  input_pixel_format: bgr
  path: /openvino-model/ssdlite_mobilenet_v2.xml
  labelmap_path: /openvino-model/coco_91cl_bkgr.txt

genai:
  enabled: true
  provider: gemini
  api_key: AIzaSyCzji3fsfsfslfslfk
  model: gemini-1.5-flash
#  model: gemini-2.0-flash

review:
  alerts:
    labels:
      - car
      - cat
      - dog
      - person
      - bird
      - car
      - backpack
      - handbag
      - suitcase
      - face

objects:
  track:
    - person
    - face
    - license_plate
    - dog
    - cat
    - car
    - amazon
    - fedex
    - ups
    - package
    - postnl
  filters:
    person:
      min_area: 1000
      #min_score: 76  
      threshold: 0.7

# geen idee wat dit doet:
motion:
  threshold: 50

audio:
  min_volume: 200
  listen:
    - bark
    - fire_alarm
    - scream
    - speech
    - yell

ffmpeg:
  apple_compatibility: true
  hwaccel_args: preset-vaapi
  output_args:
    record: preset-record-generic-audio-aac

go2rtc:
  webrtc:
    candidates:
      - stun:8555
  streams:
    deurbel:
      - ffmpeg:http://192.168.22.52/flv?port=1935&app=bcs&stream=channel0_main.bcs&user=admin&password=password#video=copy#audio=copy#audio=opus
      - rtsp://admin:[email protected]/Preview_01_sub
    deurbel_sub:
      - ffmpeg:http://192.168.22.52/flv?port=1935&app=bcs&stream=channel0_ext.bcs&user=admin&password=Nijlpaard0123
    deurbel_noaudio:
      - rtsp://127.0.0.1:8554/deurbel_sub?video
    deurbel_noaudio_hires:
      - rtsp://127.0.0.1:8554/deurbel?video
    fietsen:
      - ffmpeg:rtmp://192.168.22.48/bcs/channel0_main.bcs?channel=0&stream=0&user=admin&password=password#video=copy#hardware#audio=copy#audio=opus
    fietsen_sub:
      - ffmpeg:rtmp://192.168.22.48/bcs/channel0_ext.bcs?channel=0&stream=0&user=admin&password=pasword#video=copy#hardware#audio=copy#audio=opus
    fietsen_noaudio:
      - rtsp://127.0.0.1:8554/fietsen_sub?video
    fietsen_noaudio_hires:
      - rtsp://127.0.0.1:8554/fietsen?video
    wallboard:
      - http://192.168.24.96:2323/?cmd=getCamshot&password=passwor
      - ffmpeg:http://127.0.0.1:1984/api/stream.mjpeg?src=wallboard#video=h264#hardware

cameras:
  wallboard:
    live:
      streams:
        main_stream: wallboard
    ffmpeg:
      inputs:
        - path: rtsp://127.0.0.1:8554/wallboard
          input_args: preset-rtsp-restream
          roles:
            - detect
            - record
    objects:
      track:
        - person
    snapshots:
      enabled: true
      timestamp: false
      bounding_box: true
      retain:
        default: 0
    detect:
      enabled: false
      fps: 3
      width: 352
      height: 288
    record:
      enabled: false
    motion:
      mask:
        - 352,288,352,0,184,0,178,288
        - 94,288,173,288,198,209,165,64,102,50
  fietsen:
    live:
      streams:
        main_stream: fietsen
        sub_stream: fietsen_sub
    audio:
      enabled: true
    onvif:
      host: 192.168.22.48
      port: 80
      user: admin
      password: password
    ffmpeg:
      inputs:
        - path: rtsp://127.0.0.1:8554/fietsen_sub
          input_args: preset-rtsp-restream
          roles:
            - audio
        - path: rtsp://127.0.0.1:8554/fietsen
          input_args: preset-rtsp-restream
          roles:
            - record
            - detect
    objects:
      track:
        - person
        - dog
        - cat
        - bicycle
        - motorcycle
        - face
      mask: 0.069,0.433,0.052,0.272,0.136,0.226,0.141,0.387
      filters:
        motorcycle:
          mask:
            - 0.069,0.433,0.052,0.272,0.136,0.226,0.141,0.387
            - 0.069,0.433,0.052,0.272,0.136,0.226,0.141,0.387
            - 0.231,0.719,0.373,0.409,0.777,0.401,0.937,0.69,0.996,0.995,0.133,0.997
        bicycle:
          mask:
            - 0.069,0.433,0.052,0.272,0.136,0.226,0.141,0.387
            - 0.113,1,0.308,0.556,0.373,0.409,0.783,0.405,0.936,0.679,1,1
        person:
          mask:
            - 0.069,0.433,0.052,0.272,0.136,0.226,0.141,0.387
            - 0.238,0.359,0.455,0.359,0.466,0.582,0.251,0.566
    snapshots:
      enabled: true
      timestamp: false
      bounding_box: true
      retain:
        default: 1
        objects:
          person: 30
    record:
      enabled: true
      retain:
        days: 1
      alerts:
        retain:
          days: 1
      detections:
        retain:
          days: 14
    detect:
      enabled: true
      fps: 5
      width: 896
      height: 512
    motion:
      mask:
        - 0.688,0.073,0.683,0,1,0,1,0.073
        - 0.02,0.569,0.172,0.593,0.141,0.181,0,0.217
        - 0.246,0.6,0.48,0.617,0.465,0.118,0.214,0.148
    zones:
      Poort:
        coordinates: 0.616,0.084,0.823,0.091,0.803,0.63,0.614,0.642
        loitering_time: 0
        inertia: 3
  deurbel:
    live:
      streams:
        main_stream: deurbel
        sub_stream: deurbel_sub
    audio:
      enabled: true
    ffmpeg:
      inputs:
        - path: rtsp://127.0.0.1:8554/deurbel_sub
          input_args: preset-rtsp-restream
          roles:
            - audio
        - path: rtsp://127.0.0.1:8554/deurbel
          input_args: preset-rtsp-restream
          roles:
            - record
            - detect
    objects:
      track:
        - person
        - dog
        - cat
        - bicycle
        - motorcycle
        - face
    snapshots:
      enabled: true
      timestamp: false
      bounding_box: true
      retain:
        default: 30
        objects:
          person: 30
    record:
      enabled: true
      retain:
        days: 7
      alerts:
        retain:
          days: 1
      detections:
        retain:
          days: 14
    detect:
      enabled: true
      fps: 5
      width: 640
      height: 480
    motion:
      improve_contrast: true
      mask:
        - 0.562,0.06,1,0.061,1,0,0.558,0
        - 0.763,0.131,0.789,0.276,0.801,0.401,0.804,0.5,0.799,0.639,0.782,0.777,0.76,0.902,0.718,1,1,1,1,0,0.749,0,0.759,0.065
        - 0.472,0.766,0.65,0.853,0.669,0.704,0.671,0.548,0.671,0.389,0.661,0.241,0.484,0.295
        - 0.155,0.275,0.147,0.397,0.139,0.585,0.108,0.688,0,0.785,0,0.232,0.099,0.284
    zones:
      Voordeur:
        coordinates: 
          0.622,0.254,0.747,0.055,0.968,0.44,0.954,0.998,0.083,1,0.215,0.727,0.236,0.07,0.51,0.082,0.495,0.755,0.62,0.751
        loitering_time: 0
version: 0.16-0



lpr:
  enabled: true
classification:
  bird:
    enabled: true

I have detect resolutions per camera configured because not all EXT streams have the same resolution.

With 0.16 there have been some new advices regarding presets and have added those too.

Am still busy with improvements, so any suggestions, more than welcome. I do use the openvino on GPU because I’m using an old i5 10500. Have been playing with different models, but can’t seem to get it to work, and what does work results in seriously high ms in detection.

this is just a kernel issue, once the HA OS kernel is updated it should be supported

Great news. Can I ask what specifically needs to change in the kernel for this? Adding the right driver? Is this planned for the near term or is it something I can do for myself? Any pointers appreciated.

Well the kernel already supports it, just the kernel version is not new enough in Debian

Can you tell me the required version and would it be easy enough to build Hass OS myself with that version? [ok so you don’t know my skill level, but assuming I’m not too senile]

It would probably be pretty involved. Here’s a related discussion [HW Accel Support]: VAAPI Hardware Acceleration Failing on Intel N150 · blakeblackshear/frigate · Discussion #17441 · GitHub

Of note: The Frigate UI shows the Reolink E1 Outdoor Pro full-screen in glorious hi res (h265 in Firefox?), but the HA integration doesn’t. So for now I’ll be using the Frigate UI. I wouldn’t want to drop the camera resolution unnecessarily.

OK, that says I believe kernel 6.12 is needed for the N150

uname -r
6.12.23-haos

So I should be able to get object detection using the N150 iGPU.

Looking into Firefox (on linux) support for h265 I came across https://www.phoronix.com/news/Firefox-137-VA-API-HEVC , I currently have 138, so that’s why Frigate can display the Reolink E1 Outdoor Pro in glorious hi-res.