Package tracking in Home Assistant — PostNL, DHL, DPD, GLS + 17 more carriers

Track your packages in Home Assistant. This is a suite of custom integrations for 21 parcel carriers across Europe — PostNL, DHL, DPD, GLS, PostNord, Hermes, Swiss Post, Correos, Packeta, Österreichische Post and more — plus an aggregator that merges them into one set of sensors. Every integration speaks the same parcel contract, so your automations and dashboards work the same no matter who delivers.

:open_book: Full documentation: https://ha-parcel-integrations.github.io/
:package: All repositories: Home Assistant Parcel / Package Integrations · GitHub

Most carriers need nothing but a tracking number — no account, no API key, no developer portal.

Supported carriers

Carrier Country / region What you need
:netherlands: PostNL Netherlands Account — parcels and announced MyMail letters, incoming & outgoing
:netherlands: DHL eCommerce Netherlands Account — incoming & outgoing
:netherlands: DPD Netherlands myDPD account — incoming & outgoing
:netherlands: GLS Netherlands Tracking number + postal code
:netherlands: Trunkrs Netherlands Trunkrs number + postal code
:netherlands: Dragonfly Shipping Netherlands Track & Trace code only
:netherlands: Dynalogic Netherlands — also sold as MediaMarkt, Samsung, Nespresso, Menken Order number + postal code
:netherlands::belgium::luxembourg::france: Vinted Go (formerly Homerr) Benelux & France Passwordless e-mail login — incoming & outgoing
:germany: Hermes Germany Tracking number
:austria: Österreichische Post Austria Tracking number
:switzerland: Swiss Post Switzerland Tracking number
:switzerland::liechtenstein: Planzer Switzerland & Liechtenstein — the carrier behind IKEA home delivery Shipment number or IKEA order number
:spain: Correos Spain Tracking number
:sweden::denmark::norway::finland: PostNord Nordics Tracking number
:sweden::denmark::norway::finland::netherlands::belgium: Budbee Nordics & Benelux — home delivery and Budbee Box lockers Tracking or order number, no e-mail address needed
:norway: Helthjem Norway Tracking number
:czechia::slovakia::hungary::poland::romania: Packeta (Zásilkovna) Central Europe — pickup points & lockers “Z” tracking number
:romania::hungary::bulgaria: Sameday South-East Europe — easybox lockers AWB number
:globe_showing_europe_africa: Cainiao Cross-border Tracking number — AliExpress, Temu, Shein and similar

The carriers page has the same list with versions, what each one exposes, and which ones are still marked early release (they work, but their status vocabulary hasn’t been confirmed against enough real shipments yet).

Parcel Aggregator — all carriers, one set of sensors

Running more than one of the above? The optional Parcel Aggregator discovers them automatically and re-emits everything merged:

  • sensor.parcel_aggregator_incoming_parcels / _outgoing_parcels / _delivered_parcels / _awaiting_pickup
  • sensor.parcel_aggregator_next_delivery — the earliest expected delivery across every carrier
  • calendar.parcel_aggregator_deliveries — every expected delivery in one agenda
  • one unified event stream

Nothing to configure, no credentials. A carrier you install next month is picked up without a reload.

One automation, every carrier

triggers:
  - trigger: event
    event_type: parcel_aggregator_parcel_status_changed
    event_data:
      new_status: out_for_delivery

actions:
  - action: notify.mobile_app
    data:
      title: "📦 On its way"
      message: >-
        {{ trigger.event.data.carrier }} is delivering
        {{ trigger.event.data.sender or 'your parcel' }} today.

Without the aggregator the same recipe works per carrier — swap parcel_aggregator_ for postnl_, dhl_nl_, gls_, … The parcel data inside is identical either way, which is the whole point of the parcel contract: eight status values, one parcel shape, four events.

More paste-as-is examples: automations · dashboard cards

Missing your carrier, or your country?

That is the most useful thing you can tell me. Open a carrier request — writing the code is rarely the blocker, getting real tracking data to confirm the status vocabulary is. If a listed carrier already works in your country but isn’t enabled for it yet, say so too; that is usually a small change plus a tester.

Bugs and unknown statuses belong in the issue tracker of the integration itself — every carrier logs a warning with a ready-made report link when it meets a status it doesn’t know.

18 Likes

I think this is already looking very good! Going to use it for sure when realeased for public!

Great job

Always like new features. Looks nice.

That said, i’ll be ‘frank’. I never open the post nl app to see what envelopes i am getting. It is nice that it could show it but it takes up a lot of screen. Would at least seperate the 2, 1 card for mail and 1 card for packages. That way it doesn’t matter what the preference is of a person since he can choose both if he/she wants too (or 1 card that does it all)

For the packages an option how many delivered packages it would show is a nice bonus.

And i presume to far fetched but what about an option that it counts the number of mail items untill a reset is given? So if you could have a sensor that just adds up the number of mail, that way you can automate your mailbox further (most have a sensor in the mail to trigger it) but now you could even say “you have more then 5 mail items in your box, it really is time to empty it” just thinking out loud here :wink:
(I actually have a mailbox outside, doesn’t really matter for the people where the mail drops in the house)

Thanks for the input! I had the same feeling with the images.

Already changed some stuff. I’m now waiting for the 0.92 release of HA, since I am overwriting the current component to achieve my results and they made some changes in this release. After that, I have a guide on how to achieve the Lovelace card. Depending on input, I can perhaps override the current component with my component, so you only need to install the lovelace card.

Meanwhile, I am also waiting for a package or mail to arrive. Since I currently have to work with delivered packages and an empty mailbox, which makes it hard to test :frowning:

Well if you want a mail card, just private message your address. Least i can do ha :wink:

Awaiting the 0.92 release (should be available today) to create instructions to have more people test this.

If you click on the ID of the letter, you get to see the image.
If you click on the name of the package, you are taken to the web interface of PostNL itself.

27

Hi Peter, in case you need more beta testers, I’m gladly to help. Regards, Ramon

Yeah definetly need testers. Will post instructions tomorrow!

Thanks!

1 Like

Topic description has been updated! Hope it contains enough information for you guys to know what to do.

Happy to hear your thoughts and feedback. Also see the list of known issues and upcoming features.

Best to report features and bugs within the Github repository for easy tracking.

Thanks!

Made an issue, if your on discord could just look into it but don’t know your nick there.

Solved some issues with help from @riemers.
Custom component as well as the lovelace card have been updated.

Hi i’m getting the following error:

[homeassistant.components.sensor] Error while setting up platform postnl_custom Traceback (most recent call last): File "/usr/src/app/homeassistant/helpers/entity_platform.py", line 126, in _async_setup_platform SLOW_SETUP_MAX_WAIT, loop=hass.loop) File "/usr/local/lib/python3.7/asyncio/tasks.py", line 416, in wait_for return fut.result() File "/usr/local/lib/python3.7/concurrent/futures/thread.py", line 57, in run result = self.fn(*self.args, **self.kwargs) File "/config/custom_components/postnl_custom/sensor.py", line 34, in setup_platform from postnlpy.postnlapi import PostnlApi ModuleNotFoundError: No module named 'postnlpy'

I’m running version 0.92 in a docker container.

I’ve updated the gist by adding a manifest.json file. This is now a requirement as of HA 0.92.

After restart, It should work.

Thanks alot @ptnijssen! Wish I could tell you that it fixed the issue. But I get a different error now…:frowning:

Traceback (most recent call last):
File “/usr/src/app/homeassistant/helpers/entity_platform.py”, line 261, in _async_add_entity
await entity.async_device_update(warning=False)
File “/usr/src/app/homeassistant/helpers/entity.py”, line 377, in async_device_update
await self.hass.async_add_executor_job(self.update)
File “/usr/local/lib/python3.7/concurrent/futures/thread.py”, line 57, in run
result = self.fn(*self.args, **self.kwargs)
File “/usr/src/app/homeassistant/util/init.py”, line 224, in wrapper
result = method(*args, **kwargs)
File “/config/custom_components/postnl/sensor.py”, line 92, in update
shipments = self._api.get_package_deliveries(True)
File “/config/deps/lib/python3.7/site-packages/postnlpy/postnlapi.py”, line 114, in get_package_deliveries
self.update()
File “/config/deps/lib/python3.7/site-packages/postnlpy/postnlapi.py”, line 79, in update
self.update_letters()
File “/config/deps/lib/python3.7/site-packages/postnlpy/postnlapi.py”, line 105, in update_letters
document_id = documents.get(‘documents’)[0].get(‘documentId’)
IndexError: list index out of range
2019-04-27 07:07:15 ERROR (MainThread) [homeassistant.components.sensor] postnl: Error on device update!
Traceback (most recent call last):
File “/usr/src/app/homeassistant/helpers/entity_platform.py”, line 261, in _async_add_entity
await entity.async_device_update(warning=False)
File “/usr/src/app/homeassistant/helpers/entity.py”, line 377, in async_device_update
await self.hass.async_add_executor_job(self.update)
File “/usr/local/lib/python3.7/concurrent/futures/thread.py”, line 57, in run
result = self.fn(*self.args, **self.kwargs)
File “/usr/src/app/homeassistant/util/init.py”, line 224, in wrapper
result = method(*args, **kwargs)
File “/config/custom_components/postnl/sensor.py”, line 140, in update
letters = self._api.get_letters()
File “/config/deps/lib/python3.7/site-packages/postnlpy/postnlapi.py”, line 132, in get_letters
self.update()
File “/config/deps/lib/python3.7/site-packages/postnlpy/postnlapi.py”, line 79, in update
self.update_letters()
File “/config/deps/lib/python3.7/site-packages/postnlpy/postnlapi.py”, line 105, in update_letters
document_id = documents.get(‘documents’)[0].get(‘documentId’)
IndexError: list index out of range

Could this be an user error on my side? Running version 92.1 now.

Seems like something I need to fix. I suppose not every letter has an image or the API is not giving a good response.

Let me try to fix something over here. Will report back in half an hour.

Thanks. Take your time.

I’ve updated the custom component. Please see the change in the gist. (Basically change the dependency to 0.2.4).

Either it’s solved, or you will have a very similar error. I aim for the first case :wink:

1 Like

Thank you for the quick fixes! It works now :smiley:

1 Like

very nice!! maybe it’s an idea to add it into the custom updater? so we can update the component and the card very easy. and never miss some work of you :slight_smile:

Thanks Remco!
I’ve already marked it as an thing to do: https://github.com/peternijssen/lovelace-postnl/issues/5

In the end, I also want to update the component in HA. Just making sure it’s now feature complete and it’s working for everyone, before breaking stuff :wink:

2 Likes