Repository navigation
Designing Your Notifications
An alerting system lives or dies by its notifications. Too few, and things are missed; too many, and people start ignoring them, and then things are missed anyway. This page is about getting the balance right: who's told, how loudly, how often, and what they can do about it.
Alerts send to notifier groups, never to phones or speakers directly. A group is a set of destinations:
-
Notify entities (
notify.*entities): get the message and, if they can show one, the title. -
Legacy notify actions, such as
notify.mobile_app_alices_phone: can take extra Data (a notification channel, an image, a sound) and a Target, and on the mobile app get the full treatment (below). - A persistent notification in Home Assistant itself.
Think of groups as channels, not people. A good starting set is the one in Getting Started:
| Group | Members | Loud? | Used by |
|---|---|---|---|
| Phone | everyone's mobile app action | no | the defaults |
| Persistent | a persistent notification | no | the defaults |
| Speakers | smart speakers or TTS | yes | alerts that should be heard in the house |
Set Phone and Persistent as the default groups in the options. Most alerts use the defaults; the important ones choose their own groups (adding Speakers); some choose fewer (Phone only), or none at all, for alerts that should only show on the card.
Other groups people find useful:
- One person: just Bob's phone, for alerts that are his to deal with (the server room, if Bob is the one who fixes it).
-
Phone with camera: a mobile app action with Data
image: /api/camera_proxy/camera.front_door, for doorbell and motion alerts. - Neighbour: for escalations when nobody in the house responds.
- TV: a notify action that pops a message up on the television.
The group is where per-destination settings live (data, channels, quiet hours), so the same alert can reach a phone, a speaker, and a TV, each in its own way.
| Priority | Use it for | What it does |
|---|---|---|
| Emergency | Danger to people or property, now: smoke, a major leak, an ignored critical alert | Top of the card, glowing and pulsing. Through quiet hours. iPhone: critical (through silent mode and Do Not Disturb). |
| Critical | Needs action soon: a leak, an unarmed alarm, a bridge down | Glowing on the card. Through quiet hours. iPhone: time-sensitive (through a Focus). |
| Warning | Needs attention: a door left open, a freezer warming | Caution stripes on the card. Through quiet hours (the default threshold). |
| Notice | Worth knowing: laundry done, a door open | Held by loud groups during quiet hours. |
| Informational | Status and chores: bins, batteries, modes | Held by loud groups during quiet hours. Bottom of the card. |
Be stingy with Emergency and Critical. If everything is urgent, nothing is.
Every alert has four messages, all templates:
| Message | Sent | Default |
|---|---|---|
| On message | when it starts firing | "{{ name }} is firing." |
| Card message | (shown on the card instead of the on message) | the on message |
| Reminder message | on its reminder schedule | "{{ name }} is still firing ({{ duration }})." |
| Done message | when it stops | "{{ name }} stopped firing after {{ duration }}." |
The defaults are deliberately generic. Give real alerts real messages: what's wrong, and if it isn't obvious, what to do. Useful variables:
| Variable | Is |
|---|---|
name, entity_id, priority
|
the alert's |
subject_entity_name, subject_entity_id
|
what the alert is about |
duration, duration_seconds
|
how long it's been firing ("1 hour 5 minutes"); while latched, how long ago it stopped |
fire_count |
how many times it has fired (manual and event alerts can fire again) |
fire_data |
the data a manual alert was fired with |
trigger |
trigger and bus event alerts: the trigger's variables |
reason |
on, reminder, or done, for one template that serves all three |
end_reason |
in the done message: resolved, dismissed, no_data, or disabled
|
latched |
true in a latched alert's reminders and done message |
target, target_name
|
generated alerts: the target entity |
Plus anything a Home Assistant template can do: states('sensor.x'),
expand('group.x'), and so on. The card's messages update as the entities they
read change: Alarm not armed while away
lists open doors, and the list shrinks as you close them.
A done message that knows why it ended:
{% if end_reason == 'no_data' %}Lost contact with {{ subject_entity_name }}.
{% elif end_reason == 'disabled' %}{{ name }} was turned off.
{% else %}{{ subject_entity_name }} is back to normal.{% endif %}Reminders follow a schedule: minutes between reminders, where the last gap
repeats. The default, 10, 20, 30, 60, reminds at 10, 30, and 60 minutes, then
hourly. Reminders stop when someone acknowledges the alert, and resume (on the
original schedule) if the acknowledgement is removed or a snooze runs out.
Some schedules that work:
| Schedule | For |
|---|---|
2 or 5
|
Emergencies and leaks: every few minutes until someone responds. |
10, 20, 30, 60 |
The default: most things. |
30 |
Low-urgency things worth nagging about. |
60 |
Chores. |
1440 |
Maintenance: once a day. |
| (empty) | No reminders: the on message is enough, or it's card-only. |
Rather than a very short schedule, consider an escalation: normal reminders, and a second alert that's louder if nobody has responded in 15 minutes.
Quiet hours hold back notifications to loud groups (speakers, TTS) for less
important alerts while a quiet-hours entity is on. Set them in the options: an
entity (a Schedule helper from 22:30 to 07:00, or an input_boolean your bedtime
routine turns on) and a threshold (Warning by default: Notice and Informational
are held; Warning and above get through).
Each loud group either:
- Holds (the default): nothing is sent until quiet hours end. Then each alert that's still firing and unacknowledged gets one reminder, and those that came and went overnight are listed in one Quiet hours summary per group.
- Softens: sends anyway, but with each member's Quiet-hours data in place of its Data. For a speaker, a lower volume; for a phone, a silent channel.
Quiet groups (phones, persistent notifications) are never affected: a phone has its own do-not-disturb. A loud group can also have its own quiet-hours entity and threshold: the nursery speaker can be quiet from 7 p.m.
Example: a phone that rings loudly, except at night. A group Phone (loud) with Loud on and During quiet hours Soften, whose mobile app member has:
| Data | push: {sound: {name: default, critical: 1, volume: 1.0}} |
| Quiet-hours data | push: {interruption-level: passive} |
By day, its alerts ring at full volume. During quiet hours, alerts below the threshold arrive silently, to be found in the morning, and alerts at or above it still ring.
An alert that flaps (fires and ends, fires and ends) can flood your phone. Throttling limits it to so many on notifications in so many minutes. The one that reaches the limit is marked "[Throttling starts]", the rest are held, and when the rate drops, one summary says what happened ("[Throttling ends] Fired 7× while throttled…"). The alert's state isn't affected, only its notifications.
Set a default throttle in the options (none by default), or per alert. Example: Errors in the log, at most 3 in 60 minutes.
Throttling treats the symptom. If the condition flickers (a sensor bouncing between open and closed), fix that with a delay before ending, which stops the alert ending at all for a brief flicker.
With the Home Assistant companion app (notify.mobile_app_* actions), each alert's
notifications behave like one notification:
- A reminder replaces the on message, and the done message replaces the last reminder: one notification per alert, not a pile.
- When the alert is acknowledged (anywhere, by anyone), its notification is cleared from every phone.
- Notifications carry buttons: the alert's own, then Acknowledge and Snooze Alert (for alerts that can be acknowledged). Android shows only three, so the alert's own come first.
Per member, you can keep the notification when acknowledged, or clear it when
the alert ends instead of showing the done message. A legacy action that isn't
notify.mobile_app_* but reaches phones (a notify group of them) can have these
features turned on with Mobile app features. Notify entities can't replace or
clear: each notification arrives separately.
An alert's Notification buttons each have a label and an action (any action sequence, as in a script). They're on the phone notification and the card. Tapping one runs that action, as the person who tapped it, even after the alert has stopped. Ideas:
| Alert | Button |
|---|---|
| Garage door left open | Close door: cover.close_cover
|
| Water leak | Shut off water: valve.close_valve
|
| Hotplate left on | Turn off: switch.turn_off
|
| Bathroom humid | Fan on: fan.turn_on
|
| Filter due | Filter changed: input_datetime.set_datetime
|
| Medication | Taken: input_boolean.turn_on
|
| Front door unlocked | Lock it: lock.lock
|
Turn on Only from an unlocked phone (iOS) for anything security-sensitive: iOS then asks for Face ID or the passcode first, and the card asks for confirmation. A button that unlocks or opens something should always have it.
An automation can press a button too: alert_redux.press_button with the label.
The Snooze Alert button snoozes for the alert's Snooze button duration, or the default from the options (1 hour). (It's not the same as the phone's own snooze for a notification, which only hides the notification.)
On an iPhone, Emergency alerts' on and reminder notifications are sent as critical
(through silent mode and Do Not Disturb; allow Critical Alerts for the app in iOS
settings), and Critical alerts' as time-sensitive (through a Focus). There's no
setting for this. To pin a phone to one level whatever the priority, give its
member Data push: {interruption-level: active}.
A notifier that's missing (its integration hasn't loaded yet) or fails is retried for up to 5 minutes (the retry timeout), surviving a restart. If a notification reaches nobody in its groups, it goes to the fallback group (a persistent notification, unless you choose a group). A legacy notify action that doesn't exist is raised as a Repairs issue naming its group.
- Does every alert have a real on message, saying what's wrong?
- Is Emergency kept for real emergencies?
- Do alerts that need action have a button that takes it?
- Does anything flap? Add a delay before ending, or a throttle.
- Is anything loud allowed to wake you that shouldn't? Check the quiet-hours threshold.
- If someone ignores an important alert, does anything escalate?
- Do the alerts that matter after they stop keep until acknowledged?
Start here
Recipes
- Security and Doors
- Leaks and Climate
- Appliances and Chores
- Devices and Infrastructure
- Reminders and Household Events
Patterns
- Escalation and Supersession
- Keeping Alerts Until Acknowledged
- Generators: One Alert per Device
- Designing Your Notifications
- Taking Alerts Out of Service
- Voice Control
- Building on Alert Redux
- Reacting to Alerts
Moving and maintaining