Skip to content

Frigate Notifications via Home Assistant

Push notifications to the HA Companion App when Frigate raises an alert, with a thumbnail, the clip, and a "Silence 30 min" button.

Architecture: Frigate → MQTT (frigate/reviews) → Home Assistant automation → HA Companion App

I started with the SgtBatten blueprint and still describe it below. The current setup is one hand-written automation instead, for two reasons:

  • One notification per alert. I ended up with two blueprint automations covering the same phones, and every alert arrived twice on one of them. A single automation that loops over a list of phones is easier to reason about.
  • Alerts, not detections. It triggers on Frigate's review items with severity: alert, so it inherits everything tuned in Frigate (review.alerts.labels, required_zones, masks, stationary handling) instead of re-filtering by label in HA.

Prerequisites

Component Minimum Version Notes
Frigate 0.14.0+ MQTT enabled; frigate/reviews topic
Frigate HACS Integration 5.x Installed via HACS; provides the notification proxy
Home Assistant 2024.10.0+ for the triggers:/actions: syntax used below
Mosquitto MQTT Broker Any Connected to both HA and Frigate, each with its own user
HA Companion App Android or iOS Installed and connected to HA

Step 1: Verify MQTT Connectivity

Frigate and Home Assistant must both be connected to the same MQTT broker. This is the most common failure point.

Frigate Config

Enable mqtt in your Frigate config, pointing at your Mosquitto instance, with Frigate's own broker user:

mqtt:
  enabled: true
  host: <MQTT_BROKER_IP>
  port: 1883
  topic_prefix: frigate
  client_id: frigate
  user: frigate
  password: "{FRIGATE_MQTT_PASSWORD}"   # from the container's environment / .env

MQTT Authentication

With allow_anonymous false (see the Mosquitto setup), Frigate must have user and password, and the user needs an ACL entry for the frigate/# topics. Without them Frigate logs MQTT disconnected / Not authorized and HA never sees an event.

Verify the Connection

Check Frigate's logs for MQTT status:

docker logs frigate 2>&1 | grep -i mqtt

Healthy output shows a successful connection. Repeated MQTT disconnected errors indicate a problem — see Troubleshooting.

On the HA side, verify at Settings → Devices & Services → MQTT that the integration shows Connected. Then go to Settings → Devices & Services → MQTT → Configure → Listen to a topic, subscribe to frigate/reviews, and walk in front of a camera: you should see a new message, some updates, and an end.

Step 2: Disable Frigate TLS

Frigate enables TLS with a self-signed certificate by default on port 8971. Home Assistant cannot verify self-signed certs and will return 502 Bad Gateway errors when proxying clip and snapshot requests.

Add this to your Frigate config:

tls:
  enabled: false

Restart Frigate after adding this.

Reference

Frigate TLS Documentation — "You will likely need to set your reverse proxy to allow self signed certificates or you can disable TLS in Frigate's config."

Step 3: Enable the Notification Proxy

The Frigate HACS integration includes an unauthenticated API proxy that serves thumbnails, snapshots, and clips to your phone's push notifications. Without this, notification images will not load.

  1. Enable Advanced Mode in HA: click your user profile icon (bottom-left sidebar) → toggle Advanced Mode on.
  2. Go to Settings → Devices & Services → Frigate → Configure (gear icon).
  3. Check "Enable the unauthenticated notification event proxy".
  4. Save.

The proxy exposes these endpoints under your HA URL:

/api/frigate/notifications/<event-id>/thumbnail.jpg
/api/frigate/notifications/<event-id>/snapshot.jpg
/api/frigate/notifications/<event-id>/<camera>/clip.mp4

Unauthenticated by design

Anyone who can reach your HA URL and knows (or guesses) an event ID can fetch these images. Event IDs are long random strings, but it's one more reason to keep HA off the public internet (see Remote access).

Step 4: Enable Recording and Snapshots

Both must be enabled in your Frigate config for clips and snapshots to be available in notifications:

record:
  enabled: true

snapshots:
  enabled: true

These can be set globally or per-camera. Decide what counts as an alert on the Frigate side too, since the automation only fires for severity: alert:

review:
  alerts:
    labels: [person, car, bear]
cameras:
  cam_03:
    review:
      alerts:
        required_zones: [driveway]   # only alert for objects inside this zone

Step 5: Add the Silence Timer

A timer helper lets anyone tap Silence 30 min on a notification (handy while mowing the lawn). Add it to configuration.yaml (or create it under Settings → Devices & Services → Helpers → Timer):

configuration.yaml
timer:
  frigate_notifications_silence:
    name: Frigate Notifications Silence
    icon: mdi:bell-off

Step 6: Create the Automations

Two automations: one sends (and updates) the notification, the other starts the silence timer when the action button is tapped. Paste them via Settings → Automations → Create automation → ⋮ → Edit in YAML.

Frigate alert push notification
alias: Frigate Alert Push Notification
description: >-
  Pushes a rich notification when Frigate raises a new alert-level review, then
  silently updates that same notification when the review ends so the attached
  clip is the complete one.
mode: queued
max: 15
triggers:
  - trigger: mqtt
    topic: frigate/reviews
conditions:
  - condition: template
    value_template: "{{ trigger.payload_json.type in ['new', 'end'] }}"
  - condition: template
    value_template: "{{ trigger.payload_json.after.severity == 'alert' }}"
  - condition: template
    value_template: "{{ not is_state('timer.frigate_notifications_silence', 'active') }}"
variables:
  review_id: "{{ trigger.payload_json.after.id }}"
  camera: "{{ trigger.payload_json.after.camera }}"
  camera_name: "{{ trigger.payload_json.after.camera | replace('_', ' ') | title }}"
  event_id: "{{ trigger.payload_json.after.data.detections[0] }}"
  objects: >-
    {{ trigger.payload_json.after.data.objects | map('replace', '_', ' ')
       | map('title') | join(', ') }}
  # sub_labels = recognised faces / pets, if face recognition or classification is on
  named: >-
    {{ trigger.payload_json.after.data.sub_labels | default([], true)
       | select('string') | list | join(', ') }}
  subject: "{{ named if named else objects }}"
  zones: >-
    {{ trigger.payload_json.after.data.zones | map('replace', '_', ' ')
       | map('title') | join(', ') }}
  is_end: "{{ trigger.payload_json.type == 'end' }}"
  ha_url: https://homeassistant.<YOUR_DOMAIN>
  targets:
    - notify.mobile_app_<PHONE_1>
    - notify.mobile_app_<PHONE_2>
actions:
  - repeat:
      for_each: "{{ targets }}"
      sequence:
        - action: "{{ repeat.item }}"
          data:
            title: "{{ subject }} - {{ camera_name }}"
            message: >-
              {{ subject }}{% if zones %} in {{ zones }}{% endif %} detected on
              {{ camera_name }}{% if is_end %} - clip ready{% endif %}
            data:
              image: "{{ ha_url }}/api/frigate/notifications/{{ event_id }}/thumbnail.jpg"
              video: "{{ ha_url }}/api/frigate/notifications/{{ event_id }}/{{ camera }}/clip.mp4"
              clickAction: "{{ ha_url }}/api/frigate/notifications/{{ event_id }}/{{ camera }}/clip.mp4"
              tag: "frigate-{{ review_id }}"      # same tag = the 'end' push replaces the 'new' one
              group: "frigate-{{ camera }}"
              channel: Frigate Alerts
              importance: high
              priority: high
              ttl: 0
              alert_once: true                   # the update doesn't buzz a second time
              notification_icon: mdi:cctv
              actions:
                - action: URI
                  title: View Clip
                  uri: "{{ ha_url }}/api/frigate/notifications/{{ event_id }}/{{ camera }}/clip.mp4"
                - action: URI
                  title: View Live
                  uri: "{{ ha_url }}/lovelace/cameras"
                - action: frigate_silence_30
                  title: Silence 30 min
              push:
                interruption-level: time-sensitive   # iOS: break through Focus
Frigate - handle silence action
alias: Frigate - Handle Silence Action
description: Starts the silence timer when "Silence 30 min" is tapped on a Frigate notification.
mode: single
triggers:
  - trigger: event
    event_type: mobile_app_notification_action
    event_data:
      action: frigate_silence_30
actions:
  - action: timer.start
    target:
      entity_id: timer.frigate_notifications_silence
    data:
      duration: "00:30:00"

How it works

  • new then end. Frigate publishes a review message when an alert starts (new), several updates, and an end. The automation only reacts to new and end. Because both pushes share tag: frigate-<review id>, the second one replaces the first on the phone, and alert_once keeps it quiet. The result is one notification that buzzes immediately and later quietly gains the full clip ("clip ready").
  • mode: queued so a burst of alerts across cameras isn't dropped while one is still sending.
  • targets is a plain list of notify.mobile_app_* services. Add or remove phones there; the names come from Developer Tools → Actions, search notify.mobile_app.
  • ttl: 0 + priority: high (Android) deliver immediately even when the phone is dozing. channel creates a separate Android notification channel, so you can give camera alerts their own sound.
  • ha_url must be reachable from wherever the phone is when it opens the notification; see below.

Step 7: Test

Walk in front of the camera. Within a few seconds you should receive a push notification with a thumbnail of the detected object; when the alert ends, the same notification updates to "clip ready".

Check the automation trace if something fails: Settings → Automations → your automation → three dots → Traces. The trace shows the full MQTT payload, which is the quickest way to see why a condition didn't match.

Optional: Frigate Card for Clip Viewing

The View Live action opens a camera dashboard inside the HA app. The Advanced Camera Card (formerly Frigate Card) makes a good one.

Install via HACS

Search for Advanced Camera Card in HACS (by dermotduffy). Install and restart HA.

Source: dermotduffy/advanced-camera-card

Create a Camera Dashboard

Add a view to your dashboard (e.g., path: /lovelace/cameras) with the card:

type: custom:advanced-camera-card
cameras:
  - camera_entity: camera.cam_03
    live_provider: go2rtc
menu:
  buttons:
    clips:
      enabled: true
    snapshots:
      enabled: true
    timeline:
      enabled: true

Alternative: SgtBatten blueprint

If you'd rather not maintain YAML, the community blueprint does most of this through a UI and is the one recommended in the official Frigate notification docs. Don't run it and the automation above for the same phones, or every alert arrives twice.

  1. Settings → Automations & Scenes → Blueprints → Import Blueprint, paste:

    https://github.com/SgtBatten/HA_blueprints/blob/main/Frigate_Camera_Notifications/Stable.yaml
    
  2. Create Automation from it and configure:

alias: Frigate - Camera Notifications
use_blueprint:
  path: SgtBatten/Stable.yaml
  input:
    camera:
      - camera.cam_03          # Your Frigate camera entity
    notify_device: <device-id> # Selected from dropdown
    base_url: https://homeassistant.<YOUR_DOMAIN>
    title: "{{label}} Detected"
    labels:
      - person
      - car
      - dog
      - cat

labels — Only include objects that are in your Frigate objects.track list. If an object isn't tracked by Frigate, it will never generate an event and the filter will never match.

Do NOT set mqtt_topic

The mqtt_topic field is for the MQTT topic prefix, not the full topic path. The blueprint appends /events internally. Setting it to frigate/events would result in the blueprint listening on frigate/events/events — which does not exist.

For a single Frigate instance with the default topic_prefix: frigate, leave this field blank.

To notify more than one phone with the blueprint, create a notification group and set the blueprint's Notification Group field to it:

configuration.yaml
notify:
  - name: family_phones
    platform: group
    services:
      - service: mobile_app_<PHONE_1>
      - service: mobile_app_<PHONE_2>

Remote Access Considerations

Push notification delivery always works regardless of network — notifications route through Google/Apple push services. What needs your HA instance is loading the images and clips, so ha_url / base_url decides where they work.

Option Images/clips load Notes
Local URL only On home Wi-Fi only Simplest and nothing is exposed.
VPN (WireGuard, Tailscale) Anywhere the VPN is up Recommended. Use the HA address reachable over the VPN; the Companion App works normally, and HA stays off the internet.
Public hostname Anywhere Only with the hardening below.

If you do publish HA on a public hostname:

  • Enable MFA (TOTP) for every user, and set users who never need remote access to local network only.
  • Turn on login attempt bans (http: ip_ban_enabled: true + login_attempts_threshold), see Securing Home Assistant.
  • Prefer putting it behind SSO / an identity-aware proxy. Be aware the Companion App can't complete an interactive proxy login (it fails with "Invalid login session"), so it needs a VPN, a client certificate, or a narrowly scoped bypass for the app's own paths.

Troubleshooting

MQTT Disconnects

Repeated MQTT disconnected errors in Frigate logs — check for:

  • Wrong or missing credentials: see who the broker is refusing:

    sudo grep -a 'not authori' /mnt/appdata/mosquitto/log/mosquitto.log | tail
    
  • Client ID collision: If two MQTT clients use the same client_id, the broker kicks one off each time the other connects. Check Mosquitto logs for "already connected" messages.

  • Cross-VLAN firewall rules: If Frigate and Mosquitto are on different subnets, ensure your firewall allows persistent TCP connections on port 1883 (not just initial connection but sustained keepalive).
  • Network connectivity: Test from the Frigate container:

    docker exec frigate bash -c \
      'echo > /dev/tcp/<MQTT_BROKER_IP>/1883 && echo "OK" || echo "FAIL"'
    

502 Bad Gateway on Clip/Snapshot

  • TLS not disabled: Frigate defaults to a self-signed cert on 8971. Add tls: enabled: false to your Frigate config.
  • Notification proxy not enabled: Enable Advanced Mode in HA, then check the proxy setting under the Frigate integration configuration.

Notifications Arrive but No Image

  • Verify ha_url is reachable from your phone.
  • Confirm the notification proxy is enabled (Step 3).
  • Check that record and snapshots are both enabled in Frigate.

Every Alert Arrives Twice

  • Two notifiers are targeting the same phone (e.g. the blueprint and the automation above, or two blueprint automations). Disable all but one.

Automation Never Triggers

  • Confirm MQTT is connected on both sides (Frigate logs + HA MQTT integration).
  • Listen to frigate/reviews (Step 1). If messages arrive but severity is always detection, the label isn't in review.alerts.labels or the object isn't in a required_zones zone.
  • Check the silence timer isn't running (timer.frigate_notifications_silence).
  • Too many alerts instead? Parked cars and IR flare are covered in Lessons learned.

Sources & further reading