Dans le cadre de la série Mon voyage dans le nuage, j’ai utilisé, entre autres, la carte ESP32 Pico Kit pour envoyer des données de capteurs vers différentes plateformes Cloud. Ces plateformes permettent à l'utilisateur d’afficher les données de ses propres capteurs sur des pages web personnalisables. Il est tout à fait possible d’enregistrer des millions de capteurs, comme sur la plateforme Cloud d’Amazon Web Services (voir l'épisode 25 de la série), laquelle s’adresse aussi aux utilisateurs de l’industrie. Évidemment, un chiffrement des données fiable est ici indispensable. Nous avons montré dans cet article comment un ESP32 peut envoyer des données de capteurs à Amazon Web Services grâce aux protocoles Secure-MQTT et TLS.

Données de capteurs open source

La plateforme Cloud abordée dans cet épisode poursuit un tout autre objectif. Les données de capteurs collectées et visualisées doivent être explicitement en accès public. Pour que les étudiants se passionnent pour les techniques de métrologie environnementale (ou plus généralement pour la recherche et la technique), l’institut de géoinformatique de l’université de Münster a élaboré, il y a quelques années, un kit matériel composé d’une carte Arduino et de différents capteurs. Entretemps, est apparue une variante grand public, la SenseBox avec laquelle toute personne intéressée peut collecter et diffuser des données de capteurs. openSenseMap est la plateforme Cloud développée à cet effet.
Une fois la connexion établie, les utilisateurs peuvent publier ici des données publiquement accessibles ; toutes les SenseBox sont cartographiées à l'aide du projet OpenStreetMap. Mais il n’est pas obligatoire d’utiliser la station Sense Box dédiée, on peut aussi envoyer sur l’internet des données saisies avec une autre carte. openSenseMap met à disposition une interface appelée REST qui permet de téléverser et télécharger des données. Pour publier des données de mesure, on les envoie au serveur au moyen du protocole HTTP. Le processus est conçu pour les débutants : à l’enregistrement d’une SenseBox, on reçoit un croquis permettant d'envoyer des données. Il n’y a plus qu’à le compléter pour l’acquisition de ses propres données de capteurs. Un bon mode d’emploi à l’usage des débutants se trouve sur https://edu.books.sensebox.de/en/ en anglais ou en allemand.

Toutefois, le protocole HTTP n’est pas la seule possibilité de publier des données sur openSenseMap. C’est également possible par MQTT, et vous vous doutez déjà que cette méthode a ma préférence. À la différence des plateformes Cloud que j’ai testées jusqu’ici, openSenseMap ne possède pas d’agent (broker) MQTT intégré, mais seulement un client MQTT. Celui-ci abonne les données de capteurs sous un sujet (topic) défini par l’utilisateur chez un agent publiquement accessible, que l’utilisateur doit choisir également lui-même.


Après l’enregistrement sur https://opensensemap.org/ et la déclaration d’un premier appareil (également appelé « SenseBox » dans mon cas), il m’a fallu indiquer les données sous la rubrique Edit -> MQTT.

Comme l’indique la capture d’écran, je me suis décidé pour un agent de test Mosquitto déjà utilisé assez souvent (test.mosquitto.org), avec le nom de sujet « / ElektorMyJourneyIoT / SenseBox / light ».



J’ai baptisé ma SenseBox « LIGHT ESP32 », choisi comme paramètre mesuré (du seul capteur utilisé) « Light » et comme unité « RAW ». Cette dernière parce que mon capteur de lumière n’est pas étalonné et que ce sont les données brutes d’un convertisseur analogique-numérique que j'envoie sur l'internet. 

Projet de démonstration

Le matériel est constitué d'une carte ESP32 Pico Kit avec sa LED RVB témoin de l’état de la communication et sa photorésistance branchée sur la broche 36. Le matériel et les principales fonctions du logiciel sont décrits dans l'épisode 23 de la série. Comme base de mon croquis Arduino-ESP32, j’ai repris le logiciel de l'épisode 25 (Amazon Web Services). Il m’a toutefois fallu apporter les modifications suivantes :
  1. A la place de TLS et Secure MQTT, j’ai utilisé les TCP et MQTT de base. Il a donc fallu remplacer les classes TCPClientSecure et MQTTClientSecure par TCPClient et MQTTClient.
  2. Pour la même raison, la connexion avec l’agent MQTT utilise le port 1883 au lieu du port 8883. L’adresse de l’agent doit être saisie par l’utilisateur sur le formulaire web (les épisodes 19 à 22 décrivent en détail le serveur web ESP32 et le formulaire web de configuration qu’il envoie). Comme Client-ID on utilise le Web-ID du formulaire web. Le Client-ID n’ayant sur la plateforme openSenseMap qu’une importance mineure, j’ai choisi ici « ElektorMyJourneyIoT ». Note : il ne faut pas confondre le Device-ID avec l’identifiant de la SenseBox complète (que je n’ai pas utilisé dans mon logiciel).
  3. La fonction void SendSensorDateToxxx(String SensorName, byte SensorDate)
    a été rebaptisée void PublishSensorDate(String SensorName, byte SensorDate).
    Elle associe le sujet (topic) de l’information MQTT servant à publier la valeur mesurée avec sa charge utile (payload). Comme chaque plateforme Cloud exige un format spécifique pour chacune de ces données, c’est ici que la plupart des modifications ont été effectuées.
Le choix du sujet étant libre chez openSenseMap, j’ai choisi, comme déjà mentionné « /ElektorMyJourneyIoT/SenseBox/light ». Pour la charge utile, il a toutefois fallu utiliser une syntaxe JSON particulière. Ici (et c’est le seul petit secret qui contribue à la sécurité), il faut mentionner le Sensor-ID fourni par openSenseMap lors de l’enregistrement de la SenseBox et du capteur. La charge utile est spécifiée selon le modèle suivant :
 
{“SENSORID“:“VALUE“}

VALUE est la valeur mesurée. S’il s’agit d’une valeur numérique pure, les doubles apostrophes ne sont pas nécessaires. Une valeur acceptable pourrait être, par exemple :
 
{“5bf000000000000000341“:30}

Les valeurs fournies par mon convertisseur analogique-numérique vont de 0 à 4095, ce que j’ai réduit à 0…63 par décalage à droite.



La capture d’écran montre le résultat de mes essais. Pour des raisons de sécurité, j’ai transféré la position de ma SensorBox de mon domicile à la gare de Cologne-Ehrenfeld. À proximité, est aussi indiquée la présence de la SenseBox d’une école, qui sert à acquérir des données météorologiques. La conception d’ensemble de la plateforme OpenSenseMap me plaît, car elle permet à des habitants de collecter des données environnementales pour d’autres. Même l’affichage sur des cartes est une réussite. Les données de mesure sont représentées sur un graphique. La fonction loupe permet d’examiner les parties particulièrement intéressantes des courbes de plus près (ici les conditions d’éclairement avec une couche nuageuse variable en cours d’après-midi)

À ce sujet, si vous voulez gérer vous-même une petite station météo qui publie ses mesures sur openSenseMap, Elektor peut vous aider. Dans son numéro de janvier/février 2019, le magazine Elektor présente le projet « Station météo avec ESP32 ». Notre boutique propose tous les composants d'une station météo (outre un pluviomètre et un anémomètre), ainsi qu'une carte contrôleur en kit basée sur l’ESP32. L'ensemble est conçu pour la publication de données sur openSenseMap.

Un logiciel flexible et universel

Cet article pourrait se terminer ici. Toutefois, il me déplaisait de devoir vous indiquer de télécharger le croquis, mais qu’ensuite il vous fallait l’adapter manuellement en insérant votre Sensor-ID. De plus, lors de la programmation d’un nouveau croquis, je voulais éviter d’avoir à chaque fois à utiliser une syntaxe propre à chaque plateforme Cloud dans la fonction qui combine le sujet (Topic) et la charge utile (payload) de l’information à publier (je suis toujours curieux d’en utiliser d’autres).

C’est pourquoi j’ai étendu le formulaire de configuration à un total de 7 entrées (en plus de celle qui permet de commander la LED rouge à des fins de test). Outre les paramètres connus (SSID, PASSWORD, BROKER ADDRESS et DEVICE ID), il y a désormais un paramètre supplémentaire SENSOR ID/TOKEN ainsi que les entrées TOPIC et PAYLOAD. Pour DEVICE ID, il faut saisir le Client-ID à utiliser lors de la connexion avec l’agent MQTT. Dans notre cas, c’est tout simplement « ElektorMyJourneyIoT ». Pour SENSOR ID, saisissez le Sensor-ID fourni par openSenseMap.

Le sujet et la charge utile de chaque information sont combinés pour chaque plateforme Cloud à partir des paramètres ci-dessus et de la valeur du capteur. Pour en généraliser la formulation, j’ai imaginé un petit système de codage. L’expression $D$ est remplacée par le Device/Client-ID saisi et $S$ par le Sensor-ID. $V$ est remplacé par la valeur mesurée, et $N$ par le nom du capteur (dans mon cas « light ») qui est transmis à la fonction  void PublishSensorDate(String SensorName, byte SensorDate). De plus, il faut remplacer les dièses (#) par des guillemets (").

Dans notre cas, il faut donc saisir pour PAYLOAD :
{#$S$#:$V$}
La fonction PublishSensorDate le transforme en une expression telle que :
{“5bf…341“:30}

Pour TOPIC, il est possible d'indiquer :
/$D$/SenseBox/$N$
dans le formulaire web pour obtenir « /ElektorMyJourneyIoT/SenseBox/light ».

Pour reproduire mes essais, procédez de la manière suivante :
  1. Construisez le matériel décrit dans l'épisode 23. L'ESP32 Pico Kit est disponible dans l'e-choppe Elektor.
  2. Téléchargez le logiciel mentionné en bas de page, compilez le croquis et transmettez-le à la carte.
  3. Connectez-vous sur le serveur embarqué de l’ESP32 et, sur votre navigateur, à l’adresse 192.168.4.1 (éventuellement sur votre smartphone). Saisissez le SSID et le mot de passe de votre point d’accès local, puis l’adresse de l’agent test.mosquitto.org et comme sujet (Topic) l’expression mentionnée plus haut. Après l’envoi, l’ESP32 devrait se connecter au serveur de test et envoyer des données, ce dont témoigne le clignotement de la LED RVB verte.
  4. Inscrivez-vous sur openSenseMap pour obtenir votre Sensor-ID. Configurez MQTT sur votre « SenseBOX » conformément à la capture d’écran représentée tout en haut. Maintenant connectez-vous de nouveau au formulaire web ESP32 et saisissez le Sensor-ID et la charge utile dans l’expression mentionnée plus haut.
  5. L’ESP32 enverra alors sur le réseau les données demandées et affichées par openSenseMap.org.
 
Je vous souhaite beaucoup de plaisir dans vos expérimentations avec openSenseMap !