Merci à @akunia et @thomaj pour la base et son amélioration.
Ayant besoin des horaires de départs et d’arrivée en gare, j’ai ré-écris les sensors rest et le template pour pouvoir afficher les départs comme les arrivées de trains utilisant un code couleur identique aux affichages en gare (départs=bleu et arrivées=vert) avec en options:
- un sous titre automatique du nom de la gare et du sens Départs/Arrivée (subtitle: true)
- affichage du numéro de train (num_train: true)
- affichage de l’heure de mise a jour (updated_time: true)
- filtre sur le nom de la gare (filter: ‘Marseille Saint-Charles’)
- limite du nombre de trains à afficher (limit: 4)
J’ai conservé l’affichage via ha-alert et la gestion des trains en retards ou annulés de @thomaj.
J’ai réussi à aligner les numéros des trains en simulant une colonne et en utilisant une fonte monospace avec la balise html tt. L’affichage est centralisé sur une seule ligne, ce qui permet de pouvoir modifier l’affichage assez facilement.
Définition des sensors dans rest.yaml:
- resource: https://$API-KEY$@api.sncf.com/v1/coverage/sncf/stop_areas/stop_area:SNCF:87751008/departures?data_freshness=realtime
scan_interval: 60
sensor:
- name: SNCF_from_13000
value_template: >
{% set message = value_json['message'] %}
{% set terminus = value_json['terminus'] %}
{% set departures = value_json['departures'] %}
{% if message %}
unavailable
{% elif departures | length >= 1 %}
{% set dep1 = departures[0]['stop_date_time']['departure_date_time'] %}
{{ strptime(dep1, '%Y%m%dT%H%M%S').strftime('%Y-%m-%d %H:%M:%S') }}
{% else %}
No upcoming departures
{% endif %}
json_attributes:
- message
- terminus
- departures
- resource: https://$API-KEY$@api.sncf.com/v1/coverage/sncf/stop_areas/stop_area:SNCF:87751008/arrivals?data_freshness=realtime
scan_interval: 60
sensor:
- name: SNCF_to_13000
value_template: >
{% set message = value_json['message'] %}
{% set origins = value_json['origins'] %}
{% set arrivals = value_json['arrivals'] %}
{% if message %}
unavailable
{% elif arrivals | length >= 1 %}
{% set arr1 = arrivals[0]['stop_date_time']['arrival_date_time'] %}
{{ strptime(arr1, '%Y%m%dT%H%M%S').strftime('%Y-%m-%d %H:%M:%S') }}
{% else %}
No upcoming arrivals
{% endif %}
json_attributes:
- message
- origins
- arrivals
Définition des cartes dans un dashboard lovelace:
- type: markdown
title: carte départs minimale
entity: sensor.sncf_from_13000
content: !include sncf.markdown
- type: markdown
title: carte départs toutes options
entity: sensor.sncf_from_13000
subtitle: true
num_train: true
updated_time: true
limit: 6
filter: 'Marseille Saint-Charles'
content: !include sncf.markdown
card_mod:
style: |
ha-markdown { max-height: 600px; overflow-y: auto; }
- type: markdown
title: carte arrivées toutes options
entity: sensor.sncf_to_13000
subtitle: true
num_train: true
updated_time: true
limit: 6
filter: 'Toulon'
content: !include sncf.markdown
card_mod:
style: |
ha-markdown { max-height: 600px; overflow-y: auto; }
Fichier include du content markdown: sncf.markdown
>-
{% if state_attr(config.entity,'message') %}
<ha-alert alert-type="error">{{ state_attr(config.entity,'message') }}
{% elif state_attr(config.entity,'departures') %}
{% set trains = state_attr(config.entity,'departures') %}
{% set remotes = state_attr(config.entity,'terminus') %}
{% set remote_type = 'terminus' %}
{% set date_type = 'departure_date_time' %}
{% set alert_type = 'info' %}
{% set subtitle = 'Départs' %}
{% elif state_attr(config.entity,'arrivals') %}
{% set trains = state_attr(config.entity,'arrivals') %}
{% set remotes = state_attr(config.entity,'origins') %}
{% set remote_type = 'origin' %}
{% set date_type = 'arrival_date_time' %}
{% set alert_type = 'success' %}
{% set subtitle = 'Arrivées' %}
{% else %}
<ha-alert alert-type="error">Unknown error
{% endif %}
{% if trains | length >= 1 %}
{% if config.subtitle is true %}
{% set stop_point_name = trains[0].stop_point.name %}
{% if config.filter is defined %}
{% if remote_type == 'terminus' %}
{% set subtitle = subtitle + ' pour ' + config.filter %}
{% else %}
{% set subtitle = subtitle + ' de ' + config.filter %}
{% endif %}
{% endif %}
<h2>{{ stop_point_name }}</h2>
<h3>{{ subtitle }}</h3>
{% endif %}
{% for train in trains[:config.limit|default(10)] | sort(attribute='stop_date_time.' + date_type) %}
{% set time_raw = train.stop_date_time[date_type] %}
{% set time = strptime(time_raw,'%Y%m%dT%H%M%S').strftime('%H:%M') %}
{% set ns = namespace() %}
{% for link in train.stop_date_time.links if link.category == remote_type %}
{% set ns.id = link['id'] %}
{% endfor %}
{% for remote in remotes if remote.id == ns.id %}
{% set ns.remote = remote['name'] %}
{% endfor %}
{% if config.filter is not defined or config.filter == ns.remote %}
{% set basetime = '' %}
{% if 'canceled' in train.get('additional_informations', []) %}
{% set status = "<br>🚫 Annulé" %}
{% set alert_type = "error" %}
{% elif train.stop_date_time['base_' + date_type] is defined and train.stop_date_time['base_' + date_type] != time_raw %}
{% set basetime_raw = train.stop_date_time['base_' + date_type] %}
{% set basetime = ' '+strptime(basetime_raw,'%Y%m%dT%H%M%S').strftime('%H:%M') %}
{% set delay = ((strptime(time_raw, '%Y%m%dT%H%M%S') - strptime(basetime_raw, '%Y%m%dT%H%M%S')).seconds / 60) | int %}
{% set status = "<br>🚨 Retard: " ~ delay ~ " min" %}
{% set alert_type = "warning" %}
{% endif %}
{% if config.num_train is true %}
{% set train_network = train.display_informations.network %}
{% if train_network.startswith('REGION') %}
{% set train_network = 'TER' %}
{% endif %}
{% set num_train = train_network ~ ' ' ~ train.display_informations.headsign %}
{% set indent = 40 - basetime|length - time|length - ns.remote|length -num_train|length %}
{% set spaces = ' '*indent %}
{% if indent < 0 %}
{% set num_train = '<br>'+num_train %}
{% endif %}
{% endif %}
<ha-alert alert-type="{{alert_type}}"><tt><s>{{basetime|default('')}}</s> {{time}} - <b>{{ns.remote}}</b> {{spaces|default('')}}<i>{{num_train|default('')}}</i></tt>{{status|default('')}}
{% endif %}
{% endfor %}
{% else %}
🚫 Aucun train
{% endif %}
{% if config.updated_time is true %}
<h6>Mis à jour à {{ as_timestamp(states[config.entity].last_reported) | timestamp_custom('%H:%M',True) }} </h6>
{% endif %}
Exemple:
