Parcel App

If you are using Parcel App, you can use the API. This is now my integration, happy if you can adjust to look it more fancy :slight_smile:

Go to the parcel app website and request an API Code. See below in the configuration, where to add.

In the configuration.yaml following

sensor:
  - platform: rest
    name: Parcel Deliveries
    resource: https://api.parcel.app/external/deliveries/?filter_mode=active
    method: GET
    headers:
      api-key: "YOUR_API_CODE"
    scan_interval: 300  # alle 5 Minuten
    value_template: "{{ value_json.deliveries | length }}"
    json_attributes:
      - deliveries
      
template:
  - sensor:
      - name: "Lieferung 1 Info"
        state: >
          {% set d = state_attr('sensor.parcel_deliveries', 'deliveries') %}
          {% if d and d | length > 0 %}
            {% set s = d[0].status_code %}
            {% set status = {
              0: 'βœ… Lieferung abgeschlossen',
              1: '🧊 Keine Updates mehr erwartet',
              2: 'πŸ“¦ Unterwegs',
              3: 'πŸ“¬ Abholung erwartet',
              4: '🚚 Wird zugestellt',
              5: '❌ Nicht gefunden',
              6: 'πŸ“› Zustellung fehlgeschlagen',
              7: '⚠️ Problem – Eingreifen nΓΆtig!',
              8: 'πŸ“„ Label erstellt, noch nicht erhalten'
            } %}
            {{ status.get(s, '❓ Unbekannter Status') }}
          {% else %}
            ⏳ Keine Lieferung gefunden
          {% endif %}

      - name: "Lieferung 2 Info"
        state: >
          {% set d = state_attr('sensor.parcel_deliveries', 'deliveries') %}
          {% if d and d | length > 1 %}
            {% set s = d[1].status_code %}
            {% set status = {
              0: 'βœ… Lieferung abgeschlossen',
              1: '🧊 Keine Updates mehr erwartet',
              2: 'πŸ“¦ Unterwegs',
              3: 'πŸ“¬ Abholung erwartet',
              4: '🚚 Wird zugestellt',
              5: '❌ Nicht gefunden',
              6: 'πŸ“› Zustellung fehlgeschlagen',
              7: '⚠️ Problem – Eingreifen nΓΆtig!',
              8: 'πŸ“„ Label erstellt, noch nicht erhalten'
            } %}
            {{ status.get(s, '❓ Unbekannter Status') }}
          {% else %}
            ⏳ Keine Lieferung gefunden
          {% endif %}

      - name: "Lieferung 3 Info"
        state: >
          {% set d = state_attr('sensor.parcel_deliveries', 'deliveries') %}
          {% if d and d | length > 2 %}
            {% set s = d[2].status_code %}
            {% set status = {
              0: 'βœ… Lieferung abgeschlossen',
              1: '🧊 Keine Updates mehr erwartet',
              2: 'πŸ“¦ Unterwegs',
              3: 'πŸ“¬ Abholung erwartet',
              4: '🚚 Wird zugestellt',
              5: '❌ Nicht gefunden',
              6: 'πŸ“› Zustellung fehlgeschlagen',
              7: '⚠️ Problem – Eingreifen nΓΆtig!',
              8: 'πŸ“„ Label erstellt, noch nicht erhalten'
            } %}
            {{ status.get(s, '❓ Unbekannter Status') }}
          {% else %}
            ⏳ Keine Lieferung gefunden
          {% endif %}

      - name: "Lieferung 4 Info"
        state: >
          {% set d = state_attr('sensor.parcel_deliveries', 'deliveries') %}
          {% if d and d | length > 3 %}
            {% set s = d[3].status_code %}
            {% set status = {
              0: 'βœ… Lieferung abgeschlossen',
              1: '🧊 Keine Updates mehr erwartet',
              2: 'πŸ“¦ Unterwegs',
              3: 'πŸ“¬ Abholung erwartet',
              4: '🚚 Wird zugestellt',
              5: '❌ Nicht gefunden',
              6: 'πŸ“› Zustellung fehlgeschlagen',
              7: '⚠️ Problem – Eingreifen nΓΆtig!',
              8: 'πŸ“„ Label erstellt, noch nicht erhalten'
            } %}
            {{ status.get(s, '❓ Unbekannter Status') }}
          {% else %}
            ⏳ Keine Lieferung gefunden
          {% endif %}

      - name: "Lieferung 5 Info"
        state: >
          {% set d = state_attr('sensor.parcel_deliveries', 'deliveries') %}
          {% if d and d | length > 4 %}
            {% set s = d[4].status_code %}
            {% set status = {
              0: 'βœ… Lieferung abgeschlossen',
              1: '🧊 Keine Updates mehr erwartet',
              2: 'πŸ“¦ Unterwegs',
              3: 'πŸ“¬ Abholung erwartet',
              4: '🚚 Wird zugestellt',
              5: '❌ Nicht gefunden',
              6: 'πŸ“› Zustellung fehlgeschlagen',
              7: '⚠️ Problem – Eingreifen nΓΆtig!',
              8: 'πŸ“„ Label erstellt, noch nicht erhalten'
            } %}
            {{ status.get(s, '❓ Unbekannter Status') }}
          {% else %}
            ⏳ Keine Lieferung gefunden
          {% endif %}

  - sensor:
      - name: "Lieferung 1 Name"
        state: >
          {% set d = state_attr('sensor.parcel_deliveries', 'deliveries') %}
          {% if d and d | length > 0 %}
            {{ d[0].description }}
          {% else %}
            Lieferung 1
          {% endif %}
      - name: "Lieferung 2 Name"
        state: >
          {% set d = state_attr('sensor.parcel_deliveries', 'deliveries') %}
          {% if d and d | length > 1 %}
            {{ d[1].description }}
          {% else %}
            Lieferung 2
          {% endif %}
      - name: "Lieferung 3 Name"
        state: >
          {% set d = state_attr('sensor.parcel_deliveries', 'deliveries') %}
          {% if d and d | length > 2 %}
            {{ d[2].description }}
          {% else %}
            Lieferung 3
          {% endif %}
      - name: "Lieferung 4 Name"
        state: >
          {% set d = state_attr('sensor.parcel_deliveries', 'deliveries') %}
          {% if d and d | length > 3 %}
            {{ d[3].description }}
          {% else %}
            Lieferung 4
          {% endif %}
      - name: "Lieferung 5 Name"
        state: >
          {% set d = state_attr('sensor.parcel_deliveries', 'deliveries') %}
          {% if d and d | length > 4 %}
            {{ d[4].description }}
          {% else %}
            Lieferung 5
          {% endif %}

And later on for the dashboard:

type: grid
title: πŸ“¦ Meine Lieferungen
columns: 2
square: false
cards:
  - type: custom:button-card
    name: "[[[ return states['sensor.lieferung_1_name'].state; ]]]"
    label: "[[[ return states['sensor.lieferung_1_info'].state; ]]]"
    show_icon: false
    show_name: true
    show_label: true
    tap_action:
      action: more-info
    styles:
      card:
        - padding: 12px
        - font-size: 14px
        - text-align: left
        - border-radius: 12px
        - background-color: "#f4f4f4"
  - type: custom:button-card
    name: "[[[ return states['sensor.lieferung_2_name'].state; ]]]"
    label: "[[[ return states['sensor.lieferung_2_info'].state; ]]]"
    show_icon: false
    show_name: true
    show_label: true
    tap_action:
      action: more-info
    styles:
      card:
        - padding: 12px
        - font-size: 14px
        - text-align: left
        - border-radius: 12px
        - background-color: "#f4f4f4"
  - type: custom:button-card
    name: "[[[ return states['sensor.lieferung_3_name'].state; ]]]"
    label: "[[[ return states['sensor.lieferung_3_info'].state; ]]]"
    show_icon: false
    show_name: true
    show_label: true
    tap_action:
      action: more-info
    styles:
      card:
        - padding: 12px
        - font-size: 14px
        - text-align: left
        - border-radius: 12px
        - background-color: "#f4f4f4"
  - type: custom:button-card
    name: "[[[ return states['sensor.lieferung_4_name'].state; ]]]"
    label: "[[[ return states['sensor.lieferung_4_info'].state; ]]]"
    show_icon: false
    show_name: true
    show_label: true
    tap_action:
      action: more-info
    styles:
      card:
        - padding: 12px
        - font-size: 14px
        - text-align: left
        - border-radius: 12px
        - background-color: "#f4f4f4"
  - type: custom:button-card
    name: "[[[ return states['sensor.lieferung_5_name'].state; ]]]"
    label: "[[[ return states['sensor.lieferung_5_info'].state; ]]]"
    show_icon: false
    show_name: true
    show_label: true
    tap_action:
      action: more-info
    styles:
      card:
        - padding: 12px
        - font-size: 14px
        - text-align: left
        - border-radius: 12px
        - background-color: "#f4f4f4"

The result:

For the status, you have to adjust following to have it in English:
0 - completed delivery.

1 - frozen delivery. There were no updates for a long time or something else makes the app believe that it will never be updated in the future.

2 - delivery in transit.

3 - delivery expecting a pickup by the recipient.

4 - out for delivery.

5 - delivery not found.

6 - failed delivery attempt.

7 - delivery exception, something is wrong and requires your attention.

8 - carrier has received information about a package, but has not physically received it yet.

2 Likes

Nice work, Too bad there is no android version (yet)

1 Like

True. But if you have a Mac you can create an account and setup the sync with Amazon.