Bonjour à tous,
Existe-t-il déjà une intégration disponible ?
Si ce n’est pas le cas, je peux m’en charger.
Bonjour à tous,
Existe-t-il déjà une intégration disponible ?
Si ce n’est pas le cas, je peux m’en charger.
Bonjour à tous,
Je viens de créer l’intégration ici : Intégration SNCF API.
N’hésitez pas à tester et à me faire vos retours ou suggestions ! ![]()
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:
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:
Fait attention, tu as mis ta clé d’api dans le template ![]()
Oops le noob !
C’est corrigé. Merci.
Savez vous s’il est possible d’obtenir les quai de depart ?
Bonjour,
Je n’ai pas vu cette information dans l’API
L’API ne donne pas les quais de départs effectivement car le jeu de données n’est pas gratuit ! Il ne faudrait pas faire concurrence trop facilement à l’appli officielle. Auparavant, j’arrivais à scraper le JSON issu de ce site : https://www.garesetconnexions.sncf/schedule-table/Departures/0087756056
à l’importer dans un sensor en brut, puis le mettre un peu en forme dans un autre sensor. Malheureusement, CloudFlare me barre la route depuis qqs semaines et j’ai abandonné.
Faut dire que je suis une quiche en codage, que Claude et GPT ne m’ont pas été d’une très grande aide, et que Google me pond un charabia incompréhensible pour moi. Mais si quelqu’un veut s’atteler à la tâche de récupérer les voies ainsi que les dessertes pour se concocter un petit tableau de départs style SNCF “maison”, sachez sur le lien donné plus haut, il y a tout en temps réel. Suffit juste de contourner cloudflare ou leur truc antirobots à la mort moi le zob.
Pour info, REST, le shell_command avec une commande curl, le worflow NodeRed… J’ai fait pas mal le tour des solutions des différentes IA sans succès.
Si vous voulez adapter le JSON aux données de la gare proche de chez vous, il suffit de changer le code UIC en fin de lien. /!\ ATTENTION de bien rajouter les deux zéros devant le code UIC sinon vous êtes marrons !
Bonne chance à celui qui s’arrachera les cheveux avec ça ![]()