Litchi : s'amuser avec les Opendata du Grand Lyon

Posté le Mar 22, 2026

Il y quelques mois, j’ai acheté sur Leboncoin une raspberry pi 3b avec un écran tactile 7 pouces. Et puis il fallait bien en faire quelque chose.

L’idée primaire

Mon achat n’est pas surgit par hasard, j’avais une première idée en tête : afficher les horaires de passage des transports en commun près de chez moi sur un petit écran dans mon salon.

J’habite à Lyon, et chance : les horaires des transports TCL sont disponibles en opendata sur le site de la métropole du Grand Lyon. On a accès aux horaires théoriques et aux horaires en temps réel, ainsi qu’aux points d’arrêts du réseau.

Première version de l’application

A l’époque où j’ai acheté la raspberry, j’ai donc fait un première essai d’application. Malheureusement, l’API pour les horaires en temps réel ne fonctionnait pas, donc je me suis basé sur les horaires théoriques. On se base pour celui-ci sur des fichiers csv qui contiennent toutes les horaires de tous les moyens de transports du réseau, à tous les arrêts et dans toutes les directions. Le fichier principal fait plus d’un million de lignes. Pas idéal.

Avec beaucoup d’efforts j’arrive à le parser efficacement et à faire tourner ça sur la raspberry avec Symfony, un framework PHP que j’ai choisi pour l’occasion. Je l’ai surtout choisi pour l’apprendre, mais il n’était pas vraiment adapté au projet.

En parallèle, je rajoute les disponibilités des stations Velo’v autour de chez moi grâce a un autre endpoint API de la métropole, beaucoup plus simple à manipuler, et les infos récentes avec le flux RSS des titres de Franceinfo.

La première version du projet est ainsi née, à l’époque sous le nom de Pain De Mie (Projet Applicatif Interfacé au Net De Maison Intelligente Electronique). Je peux rapidement voir les horaires des transports en bas de chez moi, si des Velo’v sont disponibles, les infos… L’application marche plutôt bien, malgré sa complexité !

Mais cette version est assez lourde (PHP…), requiert une base de données pour fonctionner, et est difficile à maintenir. Avec le temps, la métropole fait des changements sur ses API et l’application ne fonctionne plus. Je finis par décommissioner totalement l’application, et l’écran reste éteint pendant quelques mois.

Renaissance du projet et seconde version simplifiée

Je parle de temps en temps de Pain De Mie autour de moi, alors que l’application est toujours morte. Un jour, un collègue me dit qu’il a envie d’essayer de faire quelque chose de similaire, et ça me motive à recréer l’application.

Litchi est né.

Le fonctionnement est sensiblement le même, à un détail près : l’API des horaires en temps réel fonctionne. Celle-ci est beaucoup plus simple que l’API des horaires théoriques : il s’agit d’une simple API REST. On peut obtenir les horaires pour une liste d’arrêts et de lignes, plutôt que de devoir gérer toutes les lignes à tous les coups (en fouillant dans la documentation du portail).

Je monte cette fois l’application en Python avec Fastapi, un framework très simple pour construire un serveur web. Le frontend est assez old school : un fichier HTML avec du Javascript qui émet des requêtes AJAX vers le serveur.

Je me limite cette fois aux transports en communs pour la raspberry pi. Le temps de la rallumer et de comprendre comment faire fonctionner l’écran (ce qui s’avère être la partie la plus compliquée du projet), et l’application reprend vie.

photo de litchi sur l’écran d’une raspberry pi Photo de litchi sur l’écran de ma raspberry pi. Exemple d’URL : https://litchi.vqlion.fr/tcl?lines=A,T1,C19,49&stops=33777,33775,30101,30459,32107,32106

Pour le choix des stations & lignes à afficher, la aussi j’ai choisi plus de simplicité. Pour que l’application soit utilisable par tout le monde sans avoir à gérer de compte, de cookie ou même de sélection dans l’interface, la sélection se fait via des paramètres dans l’URI directement. De cette manière, il est simple de construire l’URI qui nous convient avec les bons arrêts, puis de le sauvegarder (ou au hasard de l’afficher sur un écran en mode kiosque, comme ci-dessus).

Le code source de l’application est bien sûr disponible sur mon github.

Litchi m’est utile, mais peut l’être encore plus !

A ce moment, Litchi est arrivé au bout des fonctionnalités que j’avais en tête. J’avais volontairement prévu qu’il soit plus simple que Pain De Mie, pour qu’il soit plus simple à faire évoluer et maintenir, et aussi parce que les autres fonctionnalités m’étaient moins utiles. Je voulais que la version “kiosque” de litchi (celle affichée sur l’écran dans mon salon) reste le plus simple possible, et n’affiche donc que les horaires des TCL.

J’ai donc décidé de faire évoluer Litchi au-delà de cet écran !

Le problème des Vélo’v

J’utilise les Vélo’v régulièrement, bien que moins maintenant que j’ai un vélo. Récemment une station a ouvert à côté de mon travail, et il se trouve que je peux l’utiliser pour mon trajet.

Le problème, c’est que les stations (de départ et d’arrivée) sont souvent (respectivement) vide ou pleines. Pour être sûr que je peux faire le trajet, il faut donc que je vérifie sur l’appli Vélo’v qu’il y a un vélo à la station de départ, et une place à la station d’arrivée. L’appli permet de mettre des stations en favori, mais accéder à la liste est bizarrement assez complexe.

Je voulais pouvoir voir en un seul coup d’oeil si mon trajet est possible ou non. L’API Vélo’v est simple à utiliser, donc je rajoute cette fonctionnalité à Litchi. Même principe que pour TCL, mais on donne cette fois des pairs de station (départ/arrivée) en paramètre dans l’URI. L’application se charge d’afficher le résultat :

  • si la station de départ n’a pas de vélo disponible OU la station d’arrivée n’a pas de place disponible, la ligne s’affiche en rouge
  • si la station de départ a moins de 2 vélos disponibles OU la station d’arrivée a moins de 2 places disponibles, la ligne s’affiche en orange
  • sinon, la ligne s’affiche en vert

On peut ainsi afficher plusieurs pairs de stations, donc plusieurs trajets !

exemple d’affichage de litchi pour les Velov Exemple d’affichage de litchi velov, avec les trois cas possibles. Exemple d’URL : https://litchi.vqlion.fr/velov?pairs=8058,8053&pairs=10002,10004&pairs=3066,7016

En pratique, je l’utilise uniquement sur mon téléphone : j’ai un raccourci sur mon bureau avec les trajets qui m’intéressent, et je peux rapidement checker si besoin.

Les… parkings relais ?

Je n’ai pas le permis. J’ai ajouté à Litchi le taux de remplissage des parkings relais de la métropole.

Comme Litchi était fonctionnel pour moi, je me suis dit qu’il pourrait peut-être aider d’autres gens. J’ai donc fait un post sur le subreddit r/Lyon pour présenter un peu le projet. Les gens ont bien aimé le projet dans l’ensemble, et quelqu’un m’a demandé s’il était possible de l’adapter pour les parkings relais.

L’endpoint API pour les parkings relais est encore plus simple que celui des Vélo’v. Donc même principe, mais cette fois on peut afficher tous les parkings par défaut (il n’y en a que 12), ou bien filtrer sur leur nom court toujours via l’URI.

example d’affichage de litchi park Exemple d’affichage de Litchi pour les parkings relai. La couleur de fond de la barre change en fonction du nombre de places restantes. Exemple d’URL : https://litchi.vqlion.fr/park?parks=MEYP,GOR,BELA

Le développement de cette fonctionnalité était très simple. C’est un simple appel API avec un peu d’affichage, avec tout de même un point de complexité sur la barre de fond qui se remplit en fonction du nombre de places. Un peu de magie avec les linear-gradient de CSS, comme souvent :)

Litchi est bien mûr

Pour l’heure, je n’ai pas de fonctionnalité supplémentaire à ajouter à l’application. De son ambition initiale limitée aux TCL, je l’ai finalement étendu à plusieurs endpoints de la métropole. Je suis content de l’état actuel de Litchi.

La plupart de mes projets prennent des noms de choses qui se mangent. En général je choisis quelque chose puis je trouve l’acronyme plus tard. Alors il reste une ultime étape à Litchi : lui trouver un acronyme. A votre bon coeur, toute idée est bonne à prendre !

Vous pouvez retrouver le code source de litchi (et les détails pour les paramètres d’URL) sur mon github, ou bien essayer l’application :

A plus tard !