Home Assistant
A native HACS integration that bridges Home Assistant entity state changes to PushWard Live Activities on your iPhone.
Unlike other PushWard integrations, Home Assistant uses a custom HACS component — no Docker container required.
How It Works
The integration listens for state changes on entities you configure. When an entity enters a start state (e.g., a washer turns on), a Live Activity appears on your Lock Screen. As the entity's state or attributes change, the activity updates in real time. When the entity reaches an end state (e.g., turns off), the activity is dismissed.
Requirements
- Home Assistant 2025.7.0 or newer
- PushWard iOS app installed on your iPhone
- A PushWard integration key (recommended scope:
activity:manage, slug pattern:ha-*)
Installation
Via HACS (Recommended)
- Open HACS in Home Assistant
- Click the three-dot menu and select "Custom repositories"
- Add
https://github.com/mac-lucky/pushward-hasswith category Integration - Search for "PushWard" in HACS and install
- 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 |
|---|---|
| Server URL | PushWard server base URL (default: https://api.pushward.app) |
| Integration Key | Your hlk_ token with activity:manage scope |
Create the integration key in the PushWard iOS app under Settings with slug pattern ha-* and activity:manage scope.
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 instead of the tracked entity. Leave the source entity empty to use the tracked entity; set it to read that entity's state, or pair it with an attribute to read an attribute off it. This means an appliance with one sensor for its state and another for the time remaining works without a 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:
| Domain | Icon | Start States | End States |
|---|---|---|---|
binary_sensor | circle.fill | on | off |
switch | power | on | off |
climate | thermometer | heating, cooling | off, idle |
vacuum | fan | cleaning | docked, idle |
media_player | play.circle.fill | playing | off, idle, paused |
lock | lock.fill | unlocked | locked |
cover | rectangle.portrait.arrowtriangle.2.outward | opening, closing | open, closed |
timer | timer | active | idle, paused |
sensor | gauge | manual | manual |
Activity Lifecycle
Start
When an entity enters a start state, the integration creates the activity on PushWard (if it doesn't exist) and sends a push-to-start notification. The Live Activity appears on your iPhone.
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. If a progress source is configured (an attribute or a separate entity), the progress bar reflects its value.
End
When the entity reaches an end state, a two-phase dismissal runs:
- A "Complete" update is sent (green accent, checkmark icon, progress 1.0)
- 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.
The integration is entirely event-driven — it listens for HA state changes, not polling. The update_interval setting is a rate-limiter, not a polling period.
Notifications, Widgets & Email
Beyond mirroring entities to Live Activities, the integration exposes services for the rest of the PushWard surface. Each needs the matching capability on your integration key — your default key has all three enabled:
- 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. Needs thewidgetscapability. - Push notifications — the
pushward.send_notificationservice sends a regular (non-Live-Activity) push with title, body, level (includingcritical), actions, and rich media. Needs thenotificationscapability. - Transactional email — the
pushward.send_emailservice delivers email to a verified recipient of your account. Needs theemailscapability.
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.
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
Use them in automations to warn before you hit a quota, or just to keep an eye on consumption.
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 |
When the washer starts, a Live Activity appears showing "Washing" with a progress bar. As progress_percent increases, the bar fills. When the cycle completes, a green "Complete" notification appears before the activity dismisses.