Home Assistant
ایک نیٹیو HACS انٹیگریشن جو Home Assistant کی entity حالت کی تبدیلیوں کو آپ کے iPhone پر PushWard لائیو سرگرمیوں سے جوڑتی ہے۔
Unlike other PushWard integrations, Home Assistant uses a custom HACS component — no Docker container required.
Requirements
- Home Assistant 2025.7.0 or newer
- PushWard iOS app installed on your iPhone
- A PushWard integration key (your default key works out of the box)
Installation
Via HACS (Recommended)
PushWard is in the default HACS store, so there is no custom repository to add.
- Open HACS in Home Assistant
- Search for "PushWard"
- Open it and click Download
- Restart Home Assistant
Manual
Copy custom_components/pushward/ from the repository into your Home Assistant's custom_components/ directory and restart.
Setup
Go to Settings > Devices & Services > Add Integration > PushWard.
| Field | Description |
|---|---|
| Integration Key | Your hlk_ integration key (the default key works) |
PushWard ایپ میں Settings → Integration Key کے تحت اپنی ڈیفالٹ انٹیگریشن کلید استعمال کریں، یا اِس انٹیگریشن کے لیے ایک محدود دائرہ کار کلید بنائیں۔
Adding Entities
After setup, click "Add tracked entity" on the integration card. Each entity becomes a Live Activity.
| Field | Default | Description |
|---|---|---|
| Entity | — | Any Home Assistant entity |
| Activity Slug | Auto (ha-<entity-id>) | Unique identifier on PushWard |
| Activity Name | Entity ID | Display name shown on iPhone |
| Icon | Domain default | SF Symbol name (e.g., washer, thermometer) or MDI icon with mdi: prefix (e.g., mdi:washing-machine, mdi:thermometer) |
| Priority | 1 | 0–10 eviction priority |
| Template | generic | generic, countdown, alert, steps, gauge, timeline, board, or log |
| Start States | Domain default | Comma-separated states that start the activity |
| End States | Domain default | Comma-separated states that end the activity |
| Min. Update Interval | 5s | Cooldown between mid-activity updates |
| Progress Entity / Attribute | — | 0–100 percentage, from the tracked entity or a separate one |
| Remaining Time Entity / Attribute | — | Remaining seconds, from the tracked entity or a separate one (auto-parses timestamp, duration, H:MM:SS, or plain seconds) |
| Accent Color | Blue | Color for the Live Activity accent |
Each value (remaining time, progress, subtitle, gauge value, current step, fired-at) can read from a separate entity or attribute, so an appliance with separate state and time-remaining sensors needs no template helper.
The board and log templates compose several entities into one activity. A board shows 1–4 tiles, each reading from a separate entity; a log shows a
newest-first list of up to 20 lines, with optional extra columns (an attribute or another entity's value) and a
per-line severity level.
Domain Defaults
Start/end states and icons are pre-filled based on the entity's domain. The default icons are Material Design (mdi:) names, which PushWard accepts alongside SF Symbols:
| Domain | Icon | Start States | End States |
|---|---|---|---|
binary_sensor | mdi:toggle-switch-variant | on | off |
switch | mdi:toggle-switch-variant | on | off |
climate | mdi:thermostat | heating, cooling | off, idle |
vacuum | mdi:robot-vacuum | cleaning | docked, idle |
media_player | mdi:cast | playing | off, idle, paused |
lock | mdi:lock | unlocked | locked |
cover | mdi:window-open | opening, closing | open, closed |
timer | mdi:timer-outline | active | idle, paused |
sensor | mdi:eye | manual | manual |
Activity Lifecycle
Start
The integration listens for state changes on the entities you configure. When an entity enters a start state (e.g., a washer turns on), it creates the activity on PushWard (if it doesn't exist) and a Live Activity appears on your Lock Screen via push-to-start.
Updates
While active, any state or attribute change — on the tracked entity or any configured companion entity — triggers a throttled update. Rapid changes are coalesced — only the latest state is sent when the cooldown expires. The integration is entirely event-driven, so the update interval is a rate-limiter, not a polling period.
End
When the entity reaches an end state, a two-phase dismissal runs:
- A "Complete" update is sent (green accent, checkmark icon). The progress bar keeps its last value rather than jumping to 100% -- only the steps and gauge templates fill the bar to its maximum.
- After 5 seconds, the activity is ended and dismissed from the Lock Screen
If the entity starts again during the 5-second window, the end is cancelled.
HA Restart
On Home Assistant restart, any tracked entity already in a start state automatically resumes its Live Activity.
Notifications, Widgets & Email
Beyond mirroring entities to Live Activities, the integration exposes services for the rest of the PushWard surface. Each needs the matching permission on your integration key — your default key has all of them:
- iOS widgets — add a tracked widget sub-entry (event- or
poll-triggered, 10–3600 s) to push Home Screen widgets in the
value,progress,gauge,status, andstat_listtemplates, or callpushward.widget_refreshto force a refresh andpushward.delete_widgetto remove one. Needswidgetsatwrite. - Push notifications — the
pushward.send_notificationservice sends a regular (non-Live-Activity) push with title, body, level (includingcritical), actions, and rich media. It can also send the notification later or on a repeating schedule, and its buttons can record an answer for the automation to act on. Needsnotificationsatsend, orschedulefor scheduled ones. - Transactional email — the
pushward.send_emailservice delivers email to a verified recipient of your account. Needsemailsatsend.
For driving an activity straight from an automation (rather than tracking an entity), the create, update, end,
and delete services are all available. Update actions are template-specific — pushward.update_activity_generic, …_steps, …_gauge, and so on — so each
action's form only shows the fields that template uses.
Scheduled and repeating notifications
Add send_at to pushward.send_notification and PushWard holds the notification and
sends it at that time, at most 365 days ahead. A time picked in the action editor has no UTC offset, so it is
read in Home Assistant's time zone. The send happens on PushWard's side: Home Assistant does not have to be
running when it goes out. For reminders from the due dates on a to-do list, with no script to write, use a tracked to-do list.
To repeat it, add a recurrence object:
| Field | Required | Description |
|---|---|---|
cron | Yes | A 5-field cron expression (minute, hour, day of month, month, day of week) or one of @hourly, @daily, @weekly, @monthly, @yearly. Sends must be at least 15 minutes apart. |
timezone | No | IANA time zone name, such as Europe/Warsaw. Defaults to the time zone configured in Home
Assistant, so 08:00 means 08:00 at home, across daylight saving changes too. |
until | No | Date and time of the last allowed send. |
count | No | Number of sends, 1-1000. |
- Set
untilorcount, not both. With neither, the series runs until you cancel it. - With a
recurrence,send_atis optional and marks where the series starts. Without it, the first send is the next time the cron expression matches, which must be within 365 days. - A repeating notification keeps one id for the whole series and takes one of the 25 slots an account has for pending scheduled notifications.
- Scheduling is free. Each send counts toward your notification quota when it goes out.
Set response_variable on the action to get the id back. A scheduled or repeating send returns scheduled_notification_id, send_at (the next send) and recurrence; one
sent right away returns notification_id and answerable. The response only lives
for that run, so the example below keeps the id in an input_text helper for the script that
stops the reminder.
script:
start_school_run_reminder:
alias: Start the school run reminder
sequence:
- action: pushward.send_notification
data:
title: School run in 15 minutes
body: Shoes, bags, lunch boxes.
source: home
recurrence:
cron: "0 8 * * 1-5"
response_variable: reminder
- action: input_text.set_value
target:
entity_id: input_text.school_run_reminder_id
data:
value: "{{ reminder.scheduled_notification_id }}"
stop_school_run_reminder:
alias: Stop the school run reminder
sequence:
- action: pushward.cancel_scheduled_notification
data:
scheduled_notification_id: "{{ states('input_text.school_run_reminder_id') | int }}"pushward.cancel_scheduled_notification cancels the schedule, and the PushWard app shows it as
canceled for 24 hours. For a repeating one that stops the whole series, even while one of its sends is going
out: that send arrives only if it had already gone out, and nothing is sent after it. An id that no longer exists is ignored, so running the
stop script twice does no harm.
pushward.list_scheduled_notifications returns scheduled_notifications, a list. status picks which ones: scheduled (the default: still pending, including one being
sent right now), sent and failed (both kept for 7 days), canceled (kept
for 24 hours) or all. Repeating items also carry recurrence, occurrence (sends so far) and last_sent_at. It only sees
the notifications scheduled with this integration's key.
Statuses, failure reasons and more cron examples are on the scheduled notifications page.
Notification answers
Give a notification action no url and PushWard records the tap itself: which button was chosen,
and when. Add text_input: true to such an action and the person can type a reply, which is
recorded with it (text_input_placeholder and text_input_button_title label the
field). An action with foreground: true and no url only opens the app and is never recorded.
When at least one action will be recorded, the send_notification response has answerable: true.
pushward.get_notification_answer reads the answer for a notification_id. It waits
up to timeout seconds (default 300, at most 86400) and returns as soon as the answer lands, so
the automation pauses on that step and the person has that long to tap. timeout: 0 reads once
without waiting.
automation:
- alias: Ask before closing the garage door
triggers:
- trigger: state
entity_id: cover.garage_door
to: open
for: "00:30:00"
actions:
- action: pushward.send_notification
data:
title: Garage door open
body: It has been open for 30 minutes. Close it?
level: time-sensitive
actions:
- id: close
title: Close
icon: door.garage.closed
- id: ignore
title: Ignore
destructive: true
response_variable: sent
- action: pushward.get_notification_answer
data:
notification_id: "{{ sent.notification_id }}"
timeout: 3600
response_variable: answer
- choose:
- conditions:
- condition: template
value_template: "{{ answer.action_id == 'close' }}"
sequence:
- action: cover.close_cover
target:
entity_id: cover.garage_doorIgnore, and no answer within the hour, both leave the door as it is. The response carries these fields:
| Field | Description |
|---|---|
answered | true once someone has answered. |
status | pending or answered. |
action_id | The id of the action that was tapped. |
text | The typed reply, for a text_input action. |
answered_at | When the answer was recorded. |
reason | Only when the timeout ran out first. The response then has answered: false and status: pending. |
- The first answer wins. Once one device has answered, later taps on any device change nothing.
- Answers are kept for 30 days. An automation that should not sit and wait can store the
notification_idand read the answer later withtimeout: 0. - A Home Assistant restart stops a waiting automation like any other. The answer stays on PushWard, so a
later read with
timeout: 0still finds it.
How recording works, and its limits, is covered on the notification answers page.
یہ سیکشن ایک ایپ اپڈیٹ کی اُس خصوصیت کو بیان کرتا ہے جو App Store کے جائزے کے لیے زیرِ التوا ہے۔ اپڈیٹ لائیو ہوتے ہی یہ یہاں خودکار طور پر اَن لاک ہو جائے گی۔
Acknowledged notifications
For alerts that must not be missed (a leak, an alarm, a door left open), integration 0.51.0 and later take acknowledge on pushward.send_notification: PushWard re-sends the push until someone
answers it on one of their devices, or until it expires. acknowledge: true repeats every minute
for an hour; an object sets repeat_seconds (30-3600), expire_seconds (60-10800) and action_title. Any tap on an action without a url that does not open the app
(foreground off) counts, and when the notification has none, PushWard adds an Acknowledge
button. An acknowledged send without a collapse_id gets a random one, so if Home Assistant
retries the request, the retry replaces the first alert instead of repeating next to it. Repeats do not count toward your quota, and at most 25 can be
repeating at once.
- action: pushward.send_notification
data:
title: "Water leak"
body: "Sensor under the kitchen sink"
level: time-sensitive
acknowledge:
repeat_seconds: 120
action_title: "On it"
tags: [leak]
response_variable: sentWith a response requested, the service returns the receipt next to notification_id. tags and callback_url need acknowledge. callback_url gets a
signed POST when the notification is acknowledged or expires, and it has to be a public https URL:
PushWard cannot reach homeassistant:8123 or anything else on your LAN, so for a webhook trigger
use the Home Assistant Cloud URL.
pushward.cancel_notifications stops the repeats, for one notification_id or for every
active notification with a tag. It reaches only notifications sent with this integration's key,
and no callback is sent for them.
- alias: Leak cleared, stop nagging
triggers:
- trigger: state
entity_id: binary_sensor.kitchen_leak
to: "off"
actions:
- action: pushward.cancel_notifications
data:
tag: leakReceipts, callbacks and their signature are covered on the acknowledged alerts page.
End-to-end encryption
Integration 0.51.0 and later can seal the title, subtitle, body and url of every notification they send, so PushWard only stores and forwards an envelope it cannot open. Your devices open it with the same key.
- In the PushWard app (1.17.0 or later), open Settings > End-to-End Encryption, create a key and copy it.
- In Home Assistant, open Settings > Devices & Services > PushWard > Configure and paste it. The form shows its Key ID, which should match the one in the app.
The form never shows the stored key: leaving the field empty keeps the key in use, pasting another one
replaces it, and Remove the encryption key turns encryption off. An hlk_ integration key pasted there is refused, and an integration key that belongs to an organization cannot send encrypted notifications at all: to-do reminders
sent with one then raise a repair issue in Home Assistant instead of failing quietly.
pushward.send_notificationand to-do reminders are sealed whether they go out now or are scheduled. Notifications scheduled before you set or change the key go out the way they were queued.- The server cannot check sealed text, so the integration does: an empty title or body, a blocked url scheme, or text too long to encrypt (about 2.2 KB for title, subtitle, body and url together) fails the action call. To-do reminders are cut to fit instead, the description first and then the title.
- Diagnostics leave the key out and show only its Key ID.
Everything else, Live Activities and widgets included, stays readable to PushWard. What exactly is covered, and what a device without the key shows, is on the end-to-end encryption page.
To-do reminders
A tracked to-do list turns the due dates on a Home Assistant to-do list into PushWard reminders. Add one under Settings > Devices & Services > PushWard > Add tracked to-do list and pick any todo entity, such as a Local To-do list. Every open item with a due date gets a scheduled notification: the item's title is the push title, and its
description is the body (the list name when it has no description).
| Option | Default | Description |
|---|---|---|
| Remind before due | 0 min | Send the reminder this long before the due time, up to 7 days. |
| Time for date-only items | 09:00 | An item with a due date but no time is reminded at this time on that day. |
| Notification level | active | passive, active or time-sensitive. |
| Done button | On | Adds a Done button to the push. Tapping it completes the item in Home Assistant. |
| Most reminders scheduled at once | 10 | 1-25. Only the soonest items are scheduled; the rest follow as those go out. |
Say the list has a 30 minute lead and you add "Dentist", due tomorrow at 15:00. PushWard schedules a push titled Dentist for 14:30 tomorrow, with a Done button. Tap Done and the item is ticked off in Home Assistant; move the appointment to 16:00 and the reminder moves to 15:30.
- Adding or editing an item schedules or replaces its reminder right away. Completing or deleting it cancels the reminder.
- PushWard sends the push itself, so it arrives even if Home Assistant is offline at that time.
- An item due more than 365 days out is scheduled once it comes within range. An item whose reminder time has already passed gets its reminder within a minute, unless it is more than 90 minutes past due; then it gets none.
- If you stop a reminder in the PushWard app, the item stays open and gets no new reminder until you change its due date or time. Renaming an item whose reminder already went out does not send it again either.
- After a reminder goes out, the item stays open until you tick it off. With the Done button, Home Assistant watches for the tap for 24 hours.
- Every pending reminder takes one of the 25 slots the account has for scheduled notifications, shared with anything else that schedules them. Leave room below 25 if your automations schedule notifications too.
- Which reminder belongs to which item is kept in Home Assistant's storage, not in the item, so notes synced to other apps (Apple Reminders through the Home Assistant app's Reminders Sync, for example) stay clean.
- Removing the list, or the whole integration, cancels its pending reminders.
Account Sensors
The integration also creates five sensors that track your PushWard usage against your plan, refreshed about every 15 minutes:
sensor.pushward_notifications_usedsensor.pushward_live_activity_updates_usedsensor.pushward_widget_updates_usedsensor.pushward_emails_usedsensor.pushward_subscription_tier—freeorpremium
Example: Washing Machine
Track a washing machine using a sensor entity with a progress attribute:
| Setting | Value |
|---|---|
| Entity | sensor.washing_machine_status |
| Icon | washer (or mdi:washing-machine) |
| Template | generic |
| Start States | washing, rinsing, spinning |
| End States | off, complete, idle |
| Progress Attribute | progress_percent |
| Accent Color | Blue |