Marc Silanus

The Things Network et Node Red

Posted on 17 juillet 2018

Dans le précédent article, nous avons mis en œuvre un objet connecté au travers du réseau IOT The Things Network. Nous avons utilisé Cayenne my devices pour la construction du Front End. Je vous propose dans cet article de le construire à l'aide de Node Red. L'objet connecté sera le capteur de température et d'humidité construit autours d'une carte THE THINGS UNO et d'un DHT11 vu dans le précédent article.

Introduction

La communication entre un objet connecté (device) et le client final passe par plusieurs intermédiaires comme illustré dans le synoptique ci-dessus. Ce qui nous intéresse ici, c'est la liaison entre le serveur de The Things Network et le serveur d'application sur lequel tourne Node Red. Entre ces deux serveurs, les données sont échangées selon le protocole MQTT, nous allons donc simplement commencer par utiliser un node mqtt in de Node Red.

Dans les posts précédents consacrés à Node Red, j'avais utilisé une Raspberry Pi sur laquelle Node Red était déjà installé. Bien que cela soit tout à fait possible ici, je vais utiliser un PC classique sur lequel l'OS installé est Ubuntu.

Installation de Node Red

  • Mettre à jour la liste des paquets :
$ sudo apt-get update

  • Ajouter le  dépôts de la dernière version à liste des dépôts
$ curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -

L'installation se termine avec le message suivant :

## Run `sudo apt-get install -y nodejs` to install Node.js 10.x and npm

  • Installer nodejs et npm
$ sudo apt-get install -y nodejs
  • Installer Node Red
$ sudo npm install -g --unsafe-perm node-red
  • Exécuter Node Red
$ node-red

 Utilisation du node mqtt in

  • Saisir le flow suivant :

  • Configurer le node mqtt in : La consultation de la documentation de l'API de The Things Network permet de trouver les éléments suivants nécessaires à la configuration du node :
    • Host: <Region>.thethings.network, where <Region> is last part of the handler you registered your application to, e.g. eu.
    • Port: 1883
    • Username: Application ID
    • Password: Application Access Key
  • Topic: <AppID>/devices/<DevID>/up

Double-cliquer sur le node mqtt in pour faire apparaitre la boite de dialogue de configuration.

  • Configurer les paramètres du serveur conformément à la documentation de l'API de TTN puis cliquer sur Update

  • Configurer le Topic conformément à la documentation de l'API de TTN et cliquer sur Done

  • Déployer le flow et observer les traces Debug :

La charge utile du message reçu contient une chaine de caractères dans laquelle se trouvent les informations qui nous intéresse. Il n'y a plus qu'a les extraire et les mettre en forme comme on le souhaite, par exemple en utilisant les nodes Gauge ou Chart de la palette Dashboard. On pourra aussi tester les valeurs et envoyer des notifications en cas de dépassement de seuils, ....

Utilisation de nodes spécialisés ttn

L'utilisation direct de MQTT nous conduit à récupérer beaucoup d'informations dans lesquelles il va falloir extraire celle qui nous intéresse. L'utilisation des nodes node-red-contrib-ttn spécialisés va nous faciliter le travail.

Installation des nodes node-red-contrib-ttn

Il est normalement possible d'installer ces nodes directement à partir du gestionnaire de palette de Node Red :

On peut également l'installer à partir d'un terminal :

$ cd $HOME/.node-red
$ npm install node-red-contrib-ttn

L'installation terminée, on dispose de 3 nouveaux nodes dans la palette :

Premier flow

  • Saisir le flow ci-dessous :

  • Double cliquer sur le node ttn uplink pour le configurer :

  • Déployer le flow et observer les trace Debug :

On peut constater cette fois ci que la charge utile du message reçu est un objet qui contient comme attributs les mesures convoitées. C'est bien plus simple à exploiter !

Construction du Front End

Nous allons ici utiliser les nodes de la palette dashboard pour construire un front end qui prendra la forme d'une page web.

  • Saisir le flow ci-dessous :
  • Les fonctions getTemperature() et getHumidity() ont pour rôle de fournir un payload adapté au nodes du dashboard :
var temp = {}
temp.payload = msg.payload.temperature_1;
return temp;
getTemperature()
var hum = {}
hum.payload = msg.payload.relative_humidity_2;
return hum;
getHumidity()
  • Configurer les nodes Chart et Gauge et les propriétés du dashboard pour obtenir une page web comme ci-dessous :

  • Pour ceux qui sont pressés d'essayer, copiez le code ci-dessous puis dans le menu de Node Red, cliquez sur Import puis Clipboard et enfin collez le code
[{"id":"c43e8dc.73dcf7","type":"tab","label":"Flow 1","disabled":false,"info":""},{"id":"1e7da0e8.30369f","type":"ttn uplink","z":"c43e8dc.73dcf7","name":"","app":"95cde770.5f7138","dev_id":"temp-hum-sensor-1","field":"","x":348.5,"y":225,"wires":[["131246a.6c3af39","c39b0fb8.937f18","9aae08c4.7c7738"]]},{"id":"131246a.6c3af39","type":"function","z":"c43e8dc.73dcf7","name":"getTemperature","func":"var temp = {}\ntemp.payload = msg.payload.temperature_1;\nreturn temp;","outputs":1,"noerr":0,"x":634.5,"y":292,"wires":[["e86e93fa.69828","82bbc75b.ed42b"]]},{"id":"c39b0fb8.937f18","type":"function","z":"c43e8dc.73dcf7","name":"getHumidity","func":"var hum = {}\nhum.payload = msg.payload.relative_humidity_2;\nreturn hum;","outputs":1,"noerr":0,"x":625,"y":374,"wires":[["da233c52.06efa","ff10fccd.59c49"]]},{"id":"e86e93fa.69828","type":"ui_gauge","z":"c43e8dc.73dcf7","name":"","group":"5c730cd.42bd3f4","order":1,"width":"12","height":"6","gtype":"gage","title":"Température","label":"°C","format":"{{value}}","min":0,"max":"50","colors":["#00b5b5","#e6e600","#ca3838"],"seg1":"","seg2":"","x":850.5,"y":292,"wires":[]},{"id":"da233c52.06efa","type":"ui_gauge","z":"c43e8dc.73dcf7","name":"","group":"5c730cd.42bd3f4","order":2,"width":"12","height":"6","gtype":"gage","title":"Humidité Relative","label":"%","format":"{{value}}","min":0,"max":"100","colors":["#ebf01f","#11e600","#0c2e9e"],"seg1":"","seg2":"","x":872.5,"y":374,"wires":[]},{"id":"9aae08c4.7c7738","type":"debug","z":"c43e8dc.73dcf7","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":624.5,"y":224,"wires":[]},{"id":"ff10fccd.59c49","type":"ui_chart","z":"c43e8dc.73dcf7","name":"","group":"5c730cd.42bd3f4","order":4,"width":"12","height":"8","label":"Evolution de l'humidité relative (%)","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"Connexion en cours ...","dot":false,"ymin":"0","ymax":"100","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"3600","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":929.5,"y":442,"wires":[[],[]]},{"id":"82bbc75b.ed42b","type":"ui_chart","z":"c43e8dc.73dcf7","name":"","group":"5c730cd.42bd3f4","order":3,"width":"12","height":"8","label":"Evolution de la température (°C)","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"Connexion en cours ...","dot":false,"ymin":"0","ymax":"50","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"3600","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":919.5,"y":235,"wires":[[],[]]},{"id":"95cde770.5f7138","type":"ttn app","z":"","appId":"gestion-clim-lab-c12","accessKey":"ttn-account-v2.GzYy6dxbgfWGUqkef_7JZ6YQjjlNLdCejB4bGS58BZM","discovery":"discovery.thethingsnetwork.org:1900"},{"id":"5c730cd.42bd3f4","type":"ui_group","z":"","name":"Salle C12","tab":"4f029f82.2f8428","disp":true,"width":"24","collapse":false},{"id":"4f029f82.2f8428","type":"ui_tab","z":"","name":"Paramètres climatiques","icon":"dashboard"}]

 

Commentaires (0) Trackbacks (0)

Désolé, le formulaire de commentaire est fermé pour le moment

Trackbacks are disabled.