Remonter les données V’Lille en MQTT avec Python

V’Lille est le système de vélos en libre-service et de vélos en location longue durée de la Métropole Européenne de Lille (MEL). Je suis un adepte de ce service depuis son implantation à Lille que ce soit pour aller au boulot, rentrer de soirée ou tout simplement me promener…

Au delà de l’intérêt que j’ai pour ce concept pratique, j’exploite également ce service pour en créer de nouveaux avec les données numériques que les stations remontent. J’ai découvert grâce à l’article de ce blog, qu’il existe une API pour récupérer les données au format XML des stations V’Lille (dommage que ce soit le seul service en open data sur la Métropole):

Avec ces deux API, le langage Python et quelques librairies, je vais vous accompagner au travers de cet article à la création d’un client python MQTT qui publie les données des stations V’Lille en temps réel. Le tutoriel se passera sous Linux (Ubuntu/Debian/Raspbian), mais il est tout à fait adaptable sur d’autre plateforme.

 

Installation de Python-pip et des librairies

Pour installer la plupart des bibliothèques python, nous allons utiliser un gestionnaire de paquets écrits en Python nommé pip. L’utilitaire pip fonctionne de la même manière que le gestionnaire apt-get sous debian et ubuntu et permet d’installer, de supprimer ou de mettre à jour une librairie python avec une simple commande.

Pour finir, pour développer en python, j’utilise l’IDE Eclipse et le module d’extension pydev, c’est ce que je vais d’ailleurs utiliser pour ce tutoriel. Néanmoins, vous pouvez utiliser un simple éditeur de texte.

Récupération de la liste des stations V’Lille

Utilisation de l’API stations V’Lille

En premier lieux, nous allons récupérer la liste de l’ensemble des stations V’Lille grâce à l’API suivante: http://vlille.fr/stations/xml-stations.aspx

Cette API, lorsqu’elle est appelée nous retourne au format XML l’ensemble des stations de la MEL (Métropole Européenne de Lille) avec leur identifiant et leurs coordonnées GPS. Si vous souhaitez avoir plus d’informations sur le XML, je vous invite à consulter l’article de Wikipedia, mais grosso modo, voila ce que l’on va obtenir:

Pour récupérer ce document en XML, nous allons utiliser la bibliothèque Python Tornado. J’apprécie et utilise beaucoup cette bibliothèque python car elle offre la possibilité de créer d’une part un serveur web léger et scalable et permet également de développer un client HTTP. Pour ce tutoriel, je vais utiliser la fonctionnalité client http avec le module tornado.httpclient. Je ferai très prochainement un article sur la création d’un serveur web avec cette bibliothèque.

Voici le code python qui permet de récupérer dans une variable nommée stationsVlilleXML le document XML de la page http://vlille.fr/stations/xml-stations.aspx.

Je vous invite à copier/coller ce code dans un fichier nommé main.py et ensuite exécuter avec la commande python3 main.py . Pour le moment, la sortie du script python n’est pas très sexy, mais vous constaterez que nous avons bien reçu notre document XML sur l’ensemble des stations V’Lille de la MEL.

La seconde étape de notre tutoriel est de parser (analyser) ce document au format XML que nous avons reçu. Le but, vous l’aurez compris, est de récupérer les informations qui nous intéressent. L’avantage du langage python est qu’il est orienté objets, ce qui nous permettra de stocker ces informations sur les stations v’Lille dans des objets Python et de faire ensuite un tableau de stations v’Lille. Le XML est un format de donnée qui représente la donnée sous la forme d’un arbre.

Analyse du document XML des stations V’Lille

Pour parser ce document, nous allons utiliser la bibliothèque ElementTree qui est normalement installée par défaut sous ubuntu. Cette bibliothèque nous permet de naviguer au travers des différentes branches de l’arbre représenté par le document XML. Le document a pour racine « markers », et cette racine contient des enfants « marker » avec des attributs. Ce sont ces attributs qui nous intéressent car ils contiennent les paramètres suivants: lat, lng, id et name.

Attention, le document en XML contient à priori une erreur, il est marqué en encodage utf16 alors qu’il est en utf8, il faut donc modifier le document pour y spécifier le bon encodage.

Il faut importer la bibliothèque en haut du main.py

et à la fin du main.py insérer les lignes suivantes

On récupère dans child.attrib, les informations qui vont nous être utiles pour créer nos objets stations V’Lille. Créons la classe station dans un fichier nommé station.py.

Création de la classe station dans station.py

Cette classe contient 3 méthodes:

  • init: méthode qui permet d’instancier (créer) l’objet station
  • __str__ : méthode qui est appelée lorsque l’on veut afficher l’objet, nous effectuons un rafraîchissement de la donnée et utilisons le format JSON pour l’affichage
  • refresh: méthode qui sera implémentée par la suite et qui permettra de mettre à jour les données de la station

Dans un premier temps, nous importons dans main.py la classe station, et dans un second temps on copie les informations du fichier XML dans un tableau (ici un dictionnaire en python) de station. Pour finir, à la fin du script python, on affiche les informations sur la station V’Lille de la Métropole Européenne de Lille (MEL) données par cette première API.

Finalement, nous obtenons le fichier main.py suivant:

Ensuite, lorsque l’on exécute ce script avec la commande python3 main.py, on obtient:

Allons maintenant chercher les données qu’il nous manque…

Récupération des données d’une station V’Lille

Nous allons maintenant implémenter la fonction refresh de la classe station (dans station.py). Pour récupérer les informations d’une station V’Lille, nous avons à notre disposition l’API suivante: http://vlille.fr/stations/xml-station.aspx?borne=<ID>. ID représente l’identifiant de la station que nous avons récupéré dans l’étape précédente. Nous allons donc générer l’url sur laquelle nous allons faire des requêtes par la suite

On applique ensuite la même méthode avec la bibliothèque python tornado, pour récupérer un fichier XML propre à la station V’Lille. Par exemple, ici avec la station d’Euratechnologies (id=83):

Une fois la requête effectuée, on récupère le document XML dans une variable et de nouveau on effectue la correction utf16 vers utf8. Il faut ensuite récupérer les valeurs des paramètres du XML de nouveau avec la bibliothèque ElementTree et les stocker dans les variables de la classe. On obtient finalement le code suivant pour la méthode refresh de la classe station:

Maintenant lorsque nous exécutons python3 main.py, on obtient:

Maintenant que nous avons toutes les informations nécessaires passons à l’envoi de ces données en MQTT, sur le serveur du frugal prototype: mqtt.frugalprototype.com

Envoi des données d’une station V’Lille en MQTT

Pour cette dernière étape, je vous propose de connecter la station V’Lille de la mairie de Roubaix en MQTT (identifiant 221). Nous allons utiliser la bibliothèque paho-mqtt qui existe dans beaucoup de langages dont le langage python. Pour ce tutoriel, un simple envoi MQTT est nécessaire, donc la bibliothèque paho-mqtt sera très peu utilisée, mais je ferai un tutoriel plus complet sur cette librairie. Pour ce faire, je vous propose d’utiliser la fonction single, qui sert à publier un simple message et se déconnecter instantanément.

topic: le topic dans lequel l’information va être publiée
payload: la donnée à envoyer
qos: qualité de service voulue
retain: message gardé ou non en mémoire dans le topic par le broker
hostname: broker MQTT
port: port du serveur MQTT

Je vous invite à lire l’article d’Ali Benfattoum sur le sujet des protocoles applicatifs pour l’IoT pour plus de renseignements sur les différents paramètres de cette méthode

Finalement on obtient:

Lancez votre service avec la commande python3 main.py et vous pourrez vérifier en vous connectant sur mqtt.frugalprototype.com que vos données V’Lille sont publiées toute les minutes en vous inscrivant par exemple au topic « vlille/# ».

Voici donc un premier client MQTT avec des données récupérées en open data, qui donnera naissance à un service pour les citoyens par le Citizen Clan.

Si des erreurs se sont glissées dans l’article, n’hésitez pas à nous en faire part.

Merci, et à très vite dans le futur sur Frugal Prototype!

 

Frugal Newsletter

Apprenez les rudiments du prototypage frugal !
Votre adresse email
Partagez cet article !
Share on LinkedInTweet about this on TwitterShare on FacebookShare on Google+
Romain Tribout

Romain Tribout

J'ai soif de prototypage!

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.