Home Assistant push notifications
PushPiper sends Home Assistant alerts to your phone, free for 10,000 messages a month. Setup is a few lines of YAML for Home Assistant's built-in RESTful Notifications platform (notify.rest), no custom integration needed.
Before you start
You need two keys from PushPiper, both 30 characters long.
- Sign in at pushpiper.com/app. It's free and needs no credit card.
- Create an app called Home Assistant. Its API token is your
APP_TOKEN. - Copy your user key from the dashboard. That's your
USER_KEY. - Open PushPiper on your phone and allow notifications. On iPhone or iPad, add it to your Home Screen first (iOS 16.4 or later).
Send notifications with notify.rest
Put your keys in secrets.yaml and add a rest notify platform to configuration.yaml. Restart Home Assistant afterwards.
pushpiper_token: APP_TOKEN
pushpiper_user: USER_KEYnotify:
- name: pushpiper
platform: rest
resource: https://api.pushpiper.com/1/messages.json
method: POST
title_param_name: title
data:
token: !secret pushpiper_token
user: !secret pushpiper_user
priority: "{{ data.priority | default(0) }}"That gives you a notify.pushpiper action. method: POST sends a form-encoded body, the same format Pushover clients use. Everything under data: rides along with each message, and the priority line picks up an optional value per call.
action: notify.pushpiper
data:
title: Front door
message: The front door has been open for 10 minutes.
data:
priority: 1No title? The notification says Home Assistant. No inner data:? It goes out at normal priority.
Sounds, links and emergencies with rest_command
notify.rest sends the same fields every time. For per-call sounds, links or an emergency alarm that keeps ringing, use rest_command. It builds the whole request body from a template, so each call can set its own sound, link and priority.
rest_command:
pushpiper:
url: https://api.pushpiper.com/1/messages.json
method: post
content_type: application/x-www-form-urlencoded
payload: >-
{%- set fields = {
"token": "APP_TOKEN",
"user": "USER_KEY",
"title": title | default("Home Assistant"),
"message": message,
"priority": priority | default(0)
} -%}
{%- if sound is defined %}{% set fields = dict(fields, sound=sound) %}{% endif -%}
{%- if url is defined %}{% set fields = dict(fields, url=url) %}{% endif -%}
{%- if fields.priority | int == 2 -%}
{%- set fields = dict(fields, retry=retry | default(60), expire=expire | default(3600)) -%}
{%- endif -%}
{{ fields | urlencode }}action: rest_command.pushpiper
data:
title: Smoke alarm
message: Smoke detected in the hallway.
priority: 2
sound: sirenPriority 2 repeats the alert every retry seconds until someone acknowledges it, for up to expire seconds. The template defaults to 60 and 3600. The API needs retry of at least 30 and expire of at most 10800, see emergency priority.
!secret only works as a whole value, not inside a template, so the keys sit in the payload here. Sharing your config? Move the entire payload into secrets.yaml and write payload: !secret pushpiper_payload.
Priorities and sounds
| Priority | What happens | Good for |
|---|---|---|
-2 | No alert, it just lands in the app | Logs and low-value updates |
-1 | Quiet notification, no sound | Daily summaries |
0 | Normal alert with sound | Most automations |
1 | High priority, bypasses quiet hours | Doors, leaks, failed backups |
2 | Emergency, repeats until acknowledged | Smoke, CO, break-ins |
There are 23 built-in sounds, like pushover (the default), cashregister and siren, plus vibrate and none. Pass one as sound to rest_command. The full list is in the sound reference.
Limits and caveats
- No Pushover integration. Its host is fixed in the library it uses, so it can't reach PushPiper. Use
notify.restorrest_command. - No attachments. Neither
notify.restnorrest_commandcan upload a camera snapshot. - Errors are quiet. A rejected request, like a wrong token (HTTP 400), doesn't stop the automation.
notify.restonly writes it to the Home Assistant log;rest_commandcan hand you the status code throughresponse_variable. - Size limits. Messages up to 1,024 characters, titles up to 250.
- Reloading. Restart Home Assistant after editing the YAML, or use the
rest.reloadaction fornotify:changes andrest_command.reloadforrest_command:changes. - Free plan. 10,000 messages a month. Past that, the API answers HTTP 429 until your quota resets on the 1st.
Sources
Questions and answers
Can I use Home Assistant's built-in Pushover integration with PushPiper?
No. Its setup only asks for an API key and a user key, and the pushover_complete library it uses always sends to api.pushover.net. Use the RESTful Notifications platform (notify.rest) or rest_command from this page. Your PushPiper keys have the same format as Pushover keys.
How do I send an emergency alert that keeps ringing?
Use the rest_command setup and call it with priority 2. The alert repeats every retry seconds (at least 30) until someone acknowledges it, for up to expire seconds (at most 10800).
Can I send camera snapshots?
Not with these YAML setups, because notify.rest and rest_command can't upload files. The API itself takes image attachments up to 5 MB, so a script that sends multipart requests, like curl, can.
Does it work on iPhone?
Yes, through the PushPiper web app. On iOS 16.4 or later, add it to your Home Screen and allow notifications. There are no native apps yet.
Is it really free?
Yes. The free plan includes 10,000 messages a month, 10 devices and every feature, without a credit card. Pro is EUR 4 a month for 50,000 messages.