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:
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:
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.
- Enable Advanced Mode in HA: click your user profile icon (bottom-left sidebar) → toggle Advanced Mode on.
- Go to Settings → Devices & Services → Frigate → Configure (gear icon).
- Check "Enable the unauthenticated notification event proxy".
- 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:
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):
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.
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
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¶
newthenend. Frigate publishes a review message when an alert starts (new), severalupdates, and anend. The automation only reacts tonewandend. Because both pushes sharetag: frigate-<review id>, the second one replaces the first on the phone, andalert_oncekeeps it quiet. The result is one notification that buzzes immediately and later quietly gains the full clip ("clip ready").mode: queuedso a burst of alerts across cameras isn't dropped while one is still sending.targetsis a plain list ofnotify.mobile_app_*services. Add or remove phones there; the names come from Developer Tools → Actions, searchnotify.mobile_app.ttl: 0+priority: high(Android) deliver immediately even when the phone is dozing.channelcreates a separate Android notification channel, so you can give camera alerts their own sound.ha_urlmust 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.
-
Settings → Automations & Scenes → Blueprints → Import Blueprint, paste:
-
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:
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:
-
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:
502 Bad Gateway on Clip/Snapshot¶
- TLS not disabled: Frigate defaults to a self-signed cert on 8971. Add
tls: enabled: falseto 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_urlis reachable from your phone. - Confirm the notification proxy is enabled (Step 3).
- Check that
recordandsnapshotsare 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 butseverityis alwaysdetection, the label isn't inreview.alerts.labelsor the object isn't in arequired_zoneszone. - 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¶
- Frigate HA Notifications Guide
- Frigate MQTT topics (
frigate/reviews) - Frigate HA Integration Docs
- Frigate review / alerts
- Frigate TLS Configuration
- HA Companion: notification options (tag, group, channel, ttl, alert_once)
- HA Companion: actionable notifications
- HA: MQTT trigger
- HA: timer integration
- SgtBatten Blueprint — GitHub
- Advanced Camera Card — GitHub