A custom Home Assistant integration for tracking packages at your building's concierge desk. Uses the Spike Global platform API that underpins the B.Life mobile app.
- Simple setup: Username and password only — no device ID required
- Async-first: Built with modern async patterns using DataUpdateCoordinator
- Package sensor: Count of pending packages with full details as attributes
- Locker details: Access code and locker description fetched for each pending package
- Auto-refresh: Polls every 5 minutes
- Reauth support: Handles token expiry gracefully
- Open HACS in your Home Assistant
- Click on Integrations
- Click the three dots menu → Custom repositories
- Add this repository URL and select Integration as the category
- Install "BLife Concierge Packages"
- Restart Home Assistant
- Copy the
custom_components/blife_packagesfolder to your Home Assistant'scustom_componentsdirectory - Restart Home Assistant
- Go to Settings → Devices & Services
- Click + Add Integration
- Search for "BLife Concierge Packages"
- Enter your credentials:
- Username: Your B.Life account email
- Password: Your B.Life account password
- Entity ID:
sensor.{firstname}_packages_ready_to_collect - State: Count of pending (uncollected) packages
- Attributes:
packages: List of pending packages
Each package in the list includes:
| Field | Description |
|---|---|
package_id |
Unique identifier |
reference |
Numeric pickup reference |
status |
pending or collected |
access_code |
PIN/code to open the locker |
locker_description |
Locker location (e.g. Red 4) |
tracking_number |
Courier tracking number (if set) |
created_date |
Arrival timestamp (ISO 8601) |
collected_date |
Collection timestamp (ISO 8601, null if pending) |
- Credentials are entered in Home Assistant's UI and stored in HA config — never in this repo.
- Deploy script: Do not hardcode your Home Assistant host or SSH user. Use environment variables:
export HA_HOST=192.168.0.117(orhomeassistant.local)export HA_USER=rootexport HA_CONFIG_PATH=/config- Then run
./deploy.sh
- Optional: create a
deploy.local.shthat sets these and run that instead;deploy.local.shis gitignored.
automation:
- alias: "New Package Notification"
trigger:
- platform: state
entity_id: sensor.mihail_packages_ready_to_collect
condition:
- condition: template
value_template: "{{ trigger.to_state.state | int > trigger.from_state.state | int }}"
action:
- service: notify.mobile_app
data:
title: "New Package!"
message: >
{{ trigger.to_state.attributes.packages | length }} package(s) waiting.
{% set p = trigger.to_state.attributes.packages[0] %}
Locker: {{ p.locker_description }}. Code: {{ p.access_code }}.automation:
- alias: "Daily Package Reminder"
trigger:
- platform: time
at: "18:00:00"
condition:
- condition: numeric_state
entity_id: sensor.mihail_packages_ready_to_collect
above: 0
action:
- service: notify.mobile_app
data:
title: "Package Reminder"
message: >
{{ states('sensor.mihail_packages_ready_to_collect') }} package(s) waiting.
{% for p in state_attr('sensor.mihail_packages_ready_to_collect', 'packages') %}
Ref {{ p.reference }} — {{ p.locker_description }}, code {{ p.access_code }}.
{% endfor %}Authenticates against https://auth.spikeglobal.io, then queries the building's Spike community API via GraphQL (POST /query). Locker details fetched via REST (GET /mobile/v1/delivery/{id}) for pending packages only.
custom_components/blife_packages/
├── __init__.py # Integration setup
├── config_flow.py # Configuration UI flow
├── const.py # Constants
├── coordinator.py # Data update coordinator
├── manifest.json # Integration metadata
├── sensor.py # Sensor entities
├── strings.json # Translation strings
└── translations/
└── en.json # English translations
- Home Assistant 2024.1.0 or later
- Python 3.11+
MIT License