Home Assistant Actionable Notifications: Complete Guide to Push Notification Buttons on iOS & Android
Build actionable push notifications in Home Assistant with tap-to-act buttons, camera snapshots, critical alerts, and notification grouping. Complete YAML examples from a production system.
Home Assistant Actionable Notifications: Complete Guide for iOS & Android
Standard Home Assistant notifications are one-way. You get a message, you read it, you open the app to do something about it. Actionable notifications fix that. They put buttons directly on the notification so you can respond without opening anything.
Garage has been open for 10 minutes? Tap "Close" right from the lock screen. Alarm triggered? Tap "Disarm" without fumbling through the app. Camera caught motion? See the snapshot and tap "View Live" to pull up the feed.
This is how I handle notifications across a 700+ entity system. Every example here runs in production.
How Actionable Notifications Work
The flow has two parts:
1. **Send** a notification with an `actions` array. Each action gets a button on the notification.
2. **Listen** for the `mobile_app_notification_action` event. When the user taps a button, HA fires this event with the action identifier.
The send and the response handler are separate automations. This trips people up — the button on the notification does nothing by itself. You need a second automation that listens for the tap and executes the response.
Basic Push Notification
Before adding buttons, make sure basic notifications work. Every phone running the HA Companion App registers a `notify.mobile_app_*` service.
automation:
trigger:
entity_id: binary_sensor.front_door
to: "on"
action:
data:
title: "Front Door"
message: "Front door opened at {{ now().strftime('%I:%M %p') }}"
Replace `notify.mobile_app_phone` with your device's notify service. Find it in Developer Tools > Services — search for "notify" and look for the one matching your phone.
Actionable Buttons: The Actions Array
Add buttons by including an `actions` array in the notification's `data` block. Each action needs:
Example: Garage Auto-Close with "Keep Open" Button
This is the most useful actionable notification I run. When the garage has been open for 8 minutes, it sends a warning with a "Keep Open" button. If you don't tap it within 2 minutes, a second automation closes the garage.
**The notification automation:**
automation:
trigger:
entity_id: cover.garage_bay_1
to: "open"
for: "00:08:00"
action:
data:
title: "Garage Open"
message: "Bay 1 has been open 8 minutes. Closing in 2 minutes."
data:
tag: "garage-autoclose"
actions:
title: "Keep Open"
title: "Close Now"
Wait 2 minutes, then close unless cancelled
entity_id: input_boolean.garage_keep_open
state: "off"
target:
entity_id: cover.garage_bay_1
data:
title: "Garage Closed"
message: "Bay 1 auto-closed after 10 minutes."
data:
tag: "garage-autoclose"
**The event listener automation (handles the button tap):**
automation:
trigger:
event_type: mobile_app_notification_action
event_data:
action: GARAGE_KEEP_OPEN
event_type: mobile_app_notification_action
event_data:
action: GARAGE_CLOSE_NOW
action:
value_template: "{{ trigger.event.data.action == 'GARAGE_KEEP_OPEN' }}"
sequence:
target:
entity_id: input_boolean.garage_keep_open
data:
message: "Garage will stay open."
data:
tag: "garage-autoclose"
value_template: "{{ trigger.event.data.action == 'GARAGE_CLOSE_NOW' }}"
sequence:
target:
entity_id: cover.garage_bay_1
input_boolean:
garage_keep_open:
name: Garage Keep Open Override
Key details:
Camera Snapshot in Notifications
Attach a camera image to any notification. The Companion App downloads the image from your HA instance and displays it inline.
Example: Camera Motion with Snapshot
automation:
trigger:
entity_id: input_boolean.front_camera_motion
to: "on"
condition:
entity_id: input_boolean.front_camera_cooldown
state: "off"
action:
Start cooldown
target:
entity_id: input_boolean.front_camera_cooldown
target:
entity_id: timer.front_camera_cooldown_timer
Delay for subject to be fully in frame
Grab snapshot from camera
Wait for file write
Send notification with snapshot and actions
data:
title: "Motion: Front Driveway"
message: "{{ now().strftime('%I:%M %p') }}"
data:
image: /local/snapshots/front_latest.jpg
tag: "motion-front"
group: "camera-motion"
actions:
title: "View Camera"
uri: /lovelace/cameras
title: "Dismiss"
Reset motion boolean
target:
entity_id: input_boolean.front_camera_motion
The `image` field points to `/local/snapshots/front_latest.jpg`, which maps to `/config/www/snapshots/front_latest.jpg` on disk. The Companion App fetches this via your HA internal URL.
The `URI` action type is special — it opens a URL instead of firing an event. Use it for "View Camera" or "Open Dashboard" buttons. On iOS, `uri` supports HA dashboard paths and external URLs. On Android, use `uri` the same way.
For the snapshot itself, grab it directly from the camera's CGI endpoint (not from the RTSP stream). See my [camera notifications guide](/blog/home-assistant-camera-notifications) for the full setup.
Critical Alerts (Override Do Not Disturb)
iOS supports critical alerts that bypass Do Not Disturb and the silent switch. These should be reserved for genuine security events — alarm triggers, water leaks, smoke detection.
Example: Alarm Triggered with Disarm Button
automation:
trigger:
entity_id: alarm_control_panel.area_1
to: "triggered"
action:
data:
title: "ALARM TRIGGERED"
message: >
{{ trigger.to_state.attributes.changed_by | default('Unknown zone') }}
at {{ now().strftime('%I:%M %p') }}
data:
push:
sound:
name: default
critical: 1
volume: 1.0
tag: "alarm-triggered"
actions:
title: "Disarm"
destructive: true
title: "View Cameras"
uri: /lovelace/cameras
**The disarm handler:**
automation:
trigger:
event_type: mobile_app_notification_action
event_data:
action: ALARM_DISARM
action:
target:
entity_id: alarm_control_panel.area_1
data:
code: !secret alarm_code
data:
title: "Alarm Disarmed"
message: "Disarmed via notification at {{ now().strftime('%I:%M %p') }}"
data:
tag: "alarm-triggered"
iOS critical alert details:
**Android equivalent:**
Android does not have the exact same critical alert mechanism, but you can achieve similar behavior:
data:
ttl: 0
priority: high
channel: alarm_stream
importance: max
Set `priority: high` and `importance: max` to ensure the notification arrives immediately. Create a notification channel (`alarm_stream`) in the Companion App settings with sound and vibration set to override DND.
Notification Groups
When you have multiple cameras or sensors firing, notifications stack up fast. Grouping collapses them.
data:
group: "camera-motion"
All notifications with the same `group` value are collapsed into a stack on iOS. Android uses `channel` similarly, but grouping is handled differently — set `group` on Android as well and the Companion App handles it.
For camera notifications, I group all motion alerts together:
Front camera notification
data:
group: "camera-motion"
tag: "motion-front"
Backyard camera notification
data:
group: "camera-motion"
tag: "motion-backyard"
The `group` collapses them into a stack. The `tag` keeps each camera's notification as a separate, replaceable entry within the group. New motion on the front camera replaces the old front camera notification but does not touch the backyard one.
Replacing and Updating Notifications
The `tag` field is the key to clean notification management. When you send a notification with a tag that matches an existing notification, it replaces it.
Use cases:
Clear a notification by tag
data:
message: clear_notification
data:
tag: "alarm-triggered"
On iOS, sending `clear_notification` as the message with a matching tag removes the notification from the notification center entirely.
Multi-Device Notifications
For a household with multiple phones, create a notification group in `configuration.yaml`:
notify:
name: all_phones
services:
Then use `notify.all_phones` in your automations. The action events still fire per-device, so only the person who taps the button triggers the response. You do not get duplicate actions.
Putting It All Together
A complete actionable notification setup for a typical home:
1. **Garage auto-close** — warning with Keep Open / Close Now buttons
2. **Alarm triggered** — critical alert with Disarm button
3. **Camera motion** — snapshot with View Camera link
4. **Door left open** — reminder with Dismiss button
5. **Person arrives home** — informational with Disarm / Ignore buttons
Each one needs two automations: the sender and the action handler. Use packages to keep the sender, handler, and helpers together in one file.
Common mistakes to avoid:
Get 25 Production Notification Automations
Every example in this guide is extracted from the **[HA Automation Cookbook](https://beslain.gumroad.com/l/ha-automation-cookbook)** — 25 drop-in automations packaged as individual YAML files with complete action handlers, helpers, and inline documentation. Garage, security, camera, presence, and quality-of-life automations ready to customize and deploy.
Use code **LAUNCH50** for 50% off.
---
*This post is part of [The Automated Home](/) — practical Home Assistant guides from a 700+ entity production system.*
Enjoyed this guide?
Get more like it delivered weekly. Real configs, tested YAML, zero fluff.
Join 0+ smart home builders. No spam, unsubscribe anytime.