Card for 17th Track

Hello,

here is a card I made to follow my parcels comming all around the world from ebay or aliexpress…

With a short click on the logo, you jump on the web site, with a long click, it is the mobile web site.
The cards will be hidden if there are no item concerned.
Just add the tracking number on the web site or the mobile app, it will be displayed and updated on tour dashboard.
You can archive a parcel, it will disappear from the screen. here is my 17track configuration (standard integration):
image

The image /local/images/divers/full_owt_296x48.svg comes from https://res.17track.net/global-v2/imgs/logo/svg/full_owt_296x48.svg

type: vertical-stack
cards:
  - type: picture
    image: /local/images/divers/full_owt_296x48.svg
    tap_action:
      action: url
      url_path: https://buyer.17track.net/en/myshipment
    hold_action:
      action: url
      url_path: https://m.17track.net/en/track
  - type: conditional
    conditions:
      - condition: numeric_state
        entity: sensor.seventeentrack_packages_not_found
        above: 0
    card:
      type: markdown
      content: >-
        {% for package in
        states.sensor.seventeentrack_packages_not_found.attributes.packages %}
        >- <ha-icon icon="mdi:timer-sand"></ha-icon><font color= grey> **{{
        package.friendly_name }} ({{ package.tracking_number }})</font>:** {{
        package.info_text }} {{'\n'}} {% endfor %}
  - type: conditional
    conditions:
      - condition: numeric_state
        entity: sensor.seventeentrack_packages_in_transit
        above: 0
    card:
      type: markdown
      content: >-
        {% for package in
        states.sensor.seventeentrack_packages_in_transit.attributes.packages %}
        >- <ha-icon icon="mdi:airplane"></ha-icon><font color= Deepskyblue> **{{
        package.friendly_name }} ({{ package.tracking_number }})</font>:** {{
        package.info_text }}  {{'\n'}} {% endfor %}
  - type: conditional
    conditions:
      - condition: numeric_state
        entity: sensor.seventeentrack_packages_ready_to_be_picked_up
        above: 0
    card:
      type: markdown
      content: >-
        {% for package in
        states.sensor.seventeentrack_packages_ready_to_be_picked_up.attributes.packages
        %} >- <ha-icon icon="mdi:flag-outline"></ha-icon><font color= royalblue>
        **{{ package.friendly_name }} ({{ package.tracking_number }})</font>:**
        {{ package.info_text }} {{'\n'}} {% endfor %}
  - type: conditional
    conditions:
      - condition: numeric_state
        entity: sensor.seventeentrack_packages_delivered
        above: 0
    card:
      type: markdown
      content: >-
        {% for package in
        states.sensor.seventeentrack_packages_delivered.attributes.packages %}
        >- <ha-icon icon="mdi:check"></ha-icon><font color= limegreen> **{{
        package.friendly_name }} ({{ package.tracking_number }})</font>:** {{
        package.info_text }} {{'\n'}} {% endfor %}
  - type: conditional
    conditions:
      - condition: numeric_state
        entity: sensor.seventeentrack_packages_returned
        above: 0
    card:
      type: markdown
      content: >-
        {% for package in
        states.sensor.seventeentrack_packages_returned.attributes.packages %} >-
        <ha-icon icon="mdi:alert-box"></ha-icon><font color= red> **{{
        package.friendly_name }} ({{ package.tracking_number }})</font>:** {{
        package.info_text }} {{'\n'}} {% endfor %}
  - type: conditional
    conditions:
      - condition: numeric_state
        entity: sensor.seventeentrack_packages_undelivered
        above: 0
    card:
      type: markdown
      content: >-
        {% for package in
        states.sensor.seventeentrack_packages_undelivered.attributes.packages %}
        >- <ha-icon icon="mdi:alert-box"></ha-icon><font color= red> **{{
        package.friendly_name }} ({{ package.tracking_number }})</font>:** {{
        package.info_text }} {{'\n'}} {% endfor %}
  - type: conditional
    conditions:
      - condition: numeric_state
        entity: sensor.seventeentrack_packages_expired
        above: 0
    card:
      type: markdown
      content: >-
        {% for package in
        states.sensor.seventeentrack_packages_expired.attributes.packages %} >-
        <ha-icon icon="mdi:alert-box"></ha-icon><font color= red> **{{
        package.friendly_name }} ({{ package.tracking_number }})</font>:** {{
        package.info_text }} {{'\n'}} {% endfor %}

Have fun,

Benoît.

4 Likes

Is this still working with the new sensor names? I get error in the templates:

        {% for package in states.sensor.17track_in_transit.attributes.packages %}
        >- <ha-icon icon="mdi:airplane"></ha-icon><font color= Deepskyblue> **{{
        package.friendly_name }} ({{ package.tracking_number }})</font>:** {{
        package.info_text }}  {{'\n'}} {% endfor %}

ERROR: TemplateSyntaxError: expected token 'end of statement block', got 'track_in_transit'

Something to do with the sensor having a number right after the “sensor.”?

Thanks in advance

1 Like

Hello,

I didn’t see any issue up to november version of HA.
I usually wait at least the 15th of the month before any upgrade :wink:

Hello,
I had ro reinstall the application, so I have the new sensors.

and I had some issues. Corrected below:

type: vertical-stack
cards:
  - type: picture
    image: /local/images/divers/17track_296x48.svg
    tap_action:
      action: url
      url_path: https://buyer.17track.net/en/myshipment
    hold_action:
      action: url
      url_path: https://m.17track.net/en/track
  - type: conditional
    conditions:
      - condition: numeric_state
        entity: sensor.17track_not_found
        above: 0
    card:
      type: markdown
      content: >-
        {% for package in state_attr('sensor.17track_not_found','packages') %}
        >- <ha-icon icon="mdi:timer-sand"></ha-icon><font color= grey> **{{
        package.friendly_name }} ({{ package.tracking_number }})</font>:** {{
        package.info_text }} {{'\n'}} {% endfor %}
  - type: conditional
    conditions:
      - condition: numeric_state
        entity: sensor.17track_in_transit
        above: 0
    card:
      type: markdown
      content: >-
        {% for package in state_attr('sensor.17track_in_transit','packages') %}
        >- <ha-icon icon="mdi:airplane"></ha-icon><font color= Deepskyblue> **{{
        package.friendly_name }} ({{ package.tracking_number }})</font>:** {{
        package.info_text }}  {{'\n'}} {% endfor %}
  - type: conditional
    conditions:
      - condition: numeric_state
        entity: sensor.17track_ready_to_be_picked_up
        above: 0
    card:
      type: markdown
      content: >-
        {% for package in
        state_attr('sensor.17track_ready_to_be_picked_up','packages') %} >-
        <ha-icon icon="mdi:flag"></ha-icon><font color=blue> **{{
        package.friendly_name }} ({{ package.tracking_number }})</font>:** {{
        package.info_text }} {{'\n'}} {% endfor %}
  - type: conditional
    conditions:
      - condition: numeric_state
        entity: sensor.17track_delivered
        above: 0
    card:
      type: markdown
      content: >-
        {% for package in state_attr('sensor.17track_delivered','packages') %}
        >- <ha-icon icon="mdi:check"></ha-icon><font color= limegreen> **{{
        package.friendly_name }} ({{ package.tracking_number }})</font>:** {{
        package.info_text }} {{'\n'}} {% endfor %}
  - type: conditional
    conditions:
      - condition: numeric_state
        entity: sensor.17track_undelivered
        above: 0
    card:
      type: markdown
      content: >-
        {% for package in state_attr('sensor.17track_undelivered','packages') %}
        >- <ha-icon icon="mdi:emoticon-sad-outline"></ha-icon><font color= red>
        **{{ package.friendly_name }} ({{ package.tracking_number }})</font>:**
        {{ package.info_text }} {{'\n'}} {% endfor %}
  - type: conditional
    conditions:
      - condition: numeric_state
        entity: sensor.17track_expired
        above: 0
    card:
      type: markdown
      content: >-
        {% for package in state_attr('sensor.17track_expired','packages') %} >-
        <ha-icon icon="mdi:history"></ha-icon><font color=brown> **{{
        package.friendly_name }} ({{ package.tracking_number }})</font>:** {{
        package.info_text }} {{'\n'}} {% endfor %}
  - type: conditional
    conditions:
      - condition: numeric_state
        entity: sensor.17track_none
        above: 0
    card:
      type: markdown
      content: >-
        {% for package in state_attr('sensor.17track_none','packages') %} >-
        <ha-icon icon="mdi:alert-box"></ha-icon><font color= orange> **{{
        package.friendly_name }} ({{ package.tracking_number }})</font>:** {{
        package.info_text }} {{'\n'}} {% endfor %}


Regards,
Benoit.

2 Likes

I use a Markdown card instead, jinja macros are our friends:

type: markdown
title: 17Track Packages
content: >
  {%- set details = {
      'sensor.17track_in_transit': {'icon': 'mdi:airplane', 'color': 'deepskyblue'},
      'sensor.17track_undelivered': {'icon': 'mdi:alert-box', 'color': 'red'},
      'sensor.17track_not_found': {'icon': 'mdi:timer-sand', 'color':'grey'},
      'sensor.17track_expired': {'icon': 'mdi:alert-box', 'color': 'red'},
      'sensor.17track_ready_to_be_picked_up': {'icon': 'mdi:flag-outline', 'color': 'royalblue'},
      'sensor.17track_delivered': {'icon': 'mdi:check', 'color': 'limegreen'},
      'sensor.17track_none': {'icon': 'mdi:alert-box', 'color': 'red'}
  } -%}

  {%- macro format_package(package, sensor) -%}

  <p><ha-icon icon="{{details[sensor].icon}}"></ha-icon> <b><font
  color="{{details[sensor].color}}">

  {%- if package.friendly_name -%}
    {{ package.friendly_name}} ({{ package.tracking_number }})
  {%- else -%}
    {{ package.tracking_number }}
  {%- endif -%}</font></b><br/>

  {{ package.info_text | regex_replace(',? Carrier note:.*', '') }}

  {%- if package.location %} {{ package.location }}{%- endif %}<br/>

  <i>Updated: {{as_timestamp(package.timestamp) | timestamp_custom("%a %h %d
  %-I:%M%p", local=True) }}</i></p>

  {%- endmacro -%}

  {% for sensor in device_entities(device_id('sensor.17track_delivered')) %}

  {% if state_attr(sensor, 'packages') %}

  #### {{ state_attr(sensor, 'friendly_name')|replace('17Track ', '') }}

  {% for package in state_attr(sensor, 'packages') %}

  {{ format_package(package, sensor) -}}

  {% endfor %}

  {% endif %}

  {% endfor %}

never mind, it works after removing and reinstalling

that’s neat !!!

but if I have this line:

  <i>Updated: {{as_timestamp(package.timestamp) | timestamp_custom("%a %h %d
  %-I:%M%p", local=True) }}</i></p>

i get the message

ValueError: Template error: as_timestamp got invalid input 'None' when rendering template '{%- set details = { 'sensor.17track_in_transit': {'icon': 'mdi:airplane', 'color': 'deepskyblue'}, 'sensor.17track_undelivered': {'icon': 'mdi:alert-box', 'color': 'red'}, 'sensor.17track_not_found': {'icon': 'mdi:timer-sand', 'color':'grey'}, 'sensor.17track_expired': {'icon': 'mdi:alert-box', 'color': 'red'}, 'sensor.17track_ready_to_be_picked_up': {'icon': 'mdi:flag-outline', 'color': 'royalblue'}, 'sensor.17track_delivered': {'icon': 'mdi:check', 'color': 'limegreen'}, 'sensor.17track_none': {'icon': 'mdi:alert-box', 'color': 'red'} } -%} {%- macro format_package(package, sensor) -%} <p><ha-icon icon="{{details[sensor].icon}}"></ha-icon> <b><font color="{{details[sensor].color}}"> {%- if package.friendly_name -%} {{ package.friendly_name}} ({{ package.tracking_number }}) {%- else -%} {{ package.tracking_number }} {%- endif -%}</font></b><br/> {{ package.info_text | regex_replace(',? Carrier note:.*', '') }} {%- if package.location %} {{ package.location }}{%- endif %}<br/> <i>Updated: {{as_timestamp(package.timestamp) | timestamp_custom("%a %h %d %-I:%M%p", local=True) }}</i></p> {%- endmacro -%} {% for sensor in device_entities(device_id('sensor.17track_delivered')) %} {% if state_attr(sensor, 'packages') %} #### {{ state_attr(sensor, 'friendly_name')|replace('17Track ', '') }} {% for package in state_attr(sensor, 'packages') %} {{ format_package(package, sensor) -}} {% endfor %} {% endif %} {% endfor %}' but no default was specified