Releases: ha-parcel-integrations/ha-dpd
Release list
2.7.0
New features
- A dedicated "parcel delivered" event —
dpd_parcel_deliveredfires the moment an incoming parcel is delivered, with a matching device trigger. The final hop now fires this instead of a generic status change.
📦 See every supported carrier — new ones land regularly.
2.6.1
Bug fixes
- New tracking event recognised — the
SPE("Status parcel - Information") event now maps to in transit instead of logging an unrecognised-status warning (#4).
2.6.0
New features
- Automations for parcels you send back — two new events,
dpd_outgoing_parcel_status_changedanddpd_outgoing_parcel_delivered, now fire for your outgoing/return parcels, and both are available as no-code device triggers.
Bug fixes
- All entities load reliably again — the first data fetch now runs during setup, so a transient error no longer leaves you with only part of the entities.
- Richer diagnostics — the diagnostics download now also includes the outgoing-delivered parcel list.
2.5.0
New features
- Delivered outgoing parcels sensor — a new Outgoing delivered parcels sensor shows outgoing shipments (including returns you send back to a shop) that have recently been delivered, alongside the existing active Outgoing parcels sensor. It honours the same delivered-parcels window (last N days / N most recent) as the incoming delivered sensor, matching the naming used by the other carriers.
2.4.0
New features
- Device triggers and a refresh button — build no-code automations that fire when a parcel is registered, changes status, or gets a new expected delivery time, and add a button to poll DPD on demand.
- Deliveries calendar — a per-account calendar entity showing your incoming parcels on their expected delivery day, ready to overlay on your own calendar.
- Diagnostic "Last successful update" sensor — alert on a silently stale integration.
Improvements
- A DPD outage no longer pushes you into re-authentication, and re-authentication is guarded against binding the entry to a different account.
- A failed detail fetch is retried once the parcel's status moves.
- Refresh-interval options are translated, and shared wording is aligned with the other carriers.
2.3.0
What's new
- Parcel history (optional) — enable Parcel history in the integration options to add a
historyattribute to every parcel: the full status timeline (timestamp, status, and the original DPD text), capped to the most recent 20 events. Off by default, and kept out of the long-term recorder database. - New "Awaiting pickup" sensor — parcels that have arrived at a DPD ParcelShop and are ready to collect are now counted separately from those still on their way to the shop. Returns and failed delivery attempts are now recognised as statuses too.
2.2.0
What's new
- Delivery-time updates as an event — the coordinator now fires
dpd_parcel_delivery_time_changedwhen DPD revises a known parcel's expected delivery window (planned_fromorplanned_to) to a value that differs from the previous one. Particularly useful on the day of delivery when DPD narrows the all-day window to a precise hour via Follow My Parcel. Wire it up with the newexamples/automations/notify_when_delivery_time_changes.yamlto get a push notification the moment the ETA shifts.
2.1.0
What's new
- Configurable refresh interval — the options flow now lets you pick how often the integration checks DPD: 15 / 30 / 60 / 120 / 240 minutes (default 30). A slower cadence is gentler on DPD's API. Changes take effect immediately, no Home Assistant restart needed.
- Recipient name on every parcel — every parcel now carries a
receiverfield with the name the parcel is addressed to. Useful in multi-person households for routing notifications to the right person, e.g. "Bob's parcel is out for delivery". Also exposed as an attribute on the Next delivery sensor. Fetched lazily from DPD's per-parcel detail endpoint, so it may benullon the very first refresh after a new barcode appears. - Weight and dimensions on every parcel — every parcel now exposes
weight(kg) anddimensions({length, width, height, text}in cm, withtexta pre-formatted"L x W x H cm"string). Both are fetched from the same per-parcel detail endpoint as the recipient name and are also injected onto the original DPD payload underrawso power users can still read the native values.
2.0.0
What's new
- Carrier-agnostic parcel status (
ParcelStatus) — every parcel now carries a canonicalstatusvalue (registered,in_transit,out_for_delivery,at_pickup_point,delivered,returning,problem,unknown). The original DPD description is preserved on the parcel'sraw_statusattribute. - Parcel events on the HA event bus — the coordinator fires
dpd_parcel_registeredwhen a new barcode appears anddpd_parcel_status_changedwhen a known barcode's normalised status changes. Both events carry the full normalised parcel payload. Events are suppressed on the very first refresh after start-up. - Parcels sorted by delivery date — every bucket is now ordered: active incoming and outgoing ascending on
planned_from, delivered descending ondelivered_at. Parcels without a parseable timestamp always sort to the end. - Translated UI labels — entity names, unit-of-measurement (
parcels→pakkettenin Dutch HA) and icons are sourced fromstrings.json+translations/{en,nl}.json+icons.json. Your HA language drives the labels automatically. - Cleaner device & friendly names — each DPD account becomes a device named
DPD (<your-email>)with entities likeDPD (account@example.com) Incoming parcels. Disambiguates multi-account setups out of the box. examples/folder — ready-to-paste automations (new parcel, out for delivery, ParcelShop pickup, delivery-window TTS) and dashboards (active-parcels grid, summary glance, next-delivery countdown).- Reliable per-parcel sensor cleanup — delivered parcels are now removed deterministically from the entity registry by the summary sensor instead of via a self-remove that occasionally raced and left a permanent "unavailable" ghost.
- Resilient auth flow — when DPD's auth service is temporarily down (5xx + HTML maintenance page), the integration now surfaces a clean
ConfigEntryNotReadyso HA retries with backoff, instead of crashing withorjson.JSONDecodeError.
⚠️ Breaking changes & how to fix them
1. Friendly names changed
| Was (≤ 1.3.x) | Is now (2.0.0) |
|---|---|
DPD Incoming Parcels |
DPD (account@example.com) Incoming parcels |
DPD Parcel <barcode> |
DPD (account@example.com) Parcel <barcode> |
DPD Next Delivery |
DPD (account@example.com) Next delivery |
DPD Outgoing Parcels |
DPD (account@example.com) Outgoing parcels |
DPD Delivered Parcels |
DPD (account@example.com) Delivered parcels |
Entity IDs are preserved for existing installs. Templates that reference sensor.dpd_incoming_parcels etc. keep working as-is.
What to fix: Lovelace cards and Markdown templates that hard-code the friendly name need the new pattern, or switch to the entity ID with the friendly_name attribute.
2. Per-parcel sensor state is the normalised enum, not the raw DPD description
| Was | Is now |
|---|---|
state == "PARCEL_OUT_FOR_DELIVERY" |
state == "out_for_delivery" |
state == "IN_TRANSIT" |
state == "in_transit" |
state == "DELIVERED" |
state == "delivered" |
What to fix: Automations triggering on the per-parcel sensor state need the new canonical ParcelStatus value. See the parcel-status reference in the README for the full mapping. The original raw value is still available on raw_status.
3. Outgoing summary attribute renamed: shipments → parcels
The outgoing summary sensor's list now lives on the parcels attribute, matching every other DPD summary sensor.
What to fix: Replace state_attr('sensor.dpd_..._outgoing_parcels', 'shipments') with state_attr(..., 'parcels').
4. Custom unit-of-measurement is now translated
The hard-coded parcels unit is replaced by a translated one (parcels in English HA, pakketten in Dutch HA).
What to fix: Templates comparing unit_of_measurement == 'parcels' should also accept the Dutch variant, or compare entity IDs instead. Long-term statistics may emit a one-time "unit cannot be converted" warning after upgrading on Dutch HA — fix via Developer Tools → Statistics → Update statistic unit or ignore until rows roll out.
2.0.0b2
Bug fixes
- DPD's narrow delivery window (top-level
deliveryTimeFrom/deliveryTimeTo) is now respected. Active out-for-delivery parcels show the real hour range (e.g. 21:03–22:03) instead of the whole-day 00:00–23:59 fallback. - The raw DPD payload exposed under each parcel's
rawattribute is no longer mutated — derived fields (plannedDeliveryFrom/plannedDeliveryTo) have been removed. Use the carrier-agnosticplanned_from/planned_toinstead.