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, or steps |
| 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 Attribute | — | HA attribute holding 0–100 percentage |
| Remaining Time Attribute | — | HA attribute holding remaining seconds |
| Accent Color | Blue | Color for the Live Activity accent |
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 triggers a throttled update. Rapid changes are coalesced — only the latest state is sent when the cooldown expires. If progress_attribute is configured, the progress bar reflects the attribute 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.
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.