1. Introduction
Les objets connectés ou l’Internet des Objets ( IoT : Internet of Things ) sont des termes très utilisés de nos jours même si bien des personnes ont encore du mal les définir.
Au sens large, un objet connecté est un objet communicant. Ils sont à la fois des émetteurs, des capteurs d’informations qui émettent, mais également qui peuvent interagir avec d’autres machines (M2M) comme des serveurs ou d’autres objets connectés. Les données générées par ces objets sont capitalisées dans des centres de données (data centers) et de nouveaux usages de cette donnée apparaissent autour de la santé, du sport, des produits financiers par exemple.
Les objets connectés connaissent une croissance exponentielle. Des estimations indiquent qu’ils seraient près de 15 milliards en circulation dans le monde actuel. Ils pourraient être plus de 50 milliards d’ici 2020.
Pour connecter les objets, les technologies actuelles peuvent être utilisées (RFID
, Wi-Fi
, GSM
, Bluetooth
, Z-Wave
, ZigBee
, …) mais de nouveaux réseaux se développent au niveau mondial. Ils doivent permettre d’envoyer (mais aussi recevoir dans certains cas) des très petits messages sur des longues portées sans passer par des systèmes coûteux de réseaux mobile et en consommant peu d’énergie.
Au cours de ce TP, vous allez mettre en oeuvre node-red, pour acquérir les données d’un objet connecté au travers du réseau The Things Network
, via le protocole MQTT
, et réaliser un serveur d’application dont le front-end
consistera en un site web appelé dashboard
.
2. Objectif de l’activité
-
Installer node-red.
-
Connecter node-red aux serveurs
The Things Network
viaMQTT
. -
Réaliser un
dashboard
pour présenter les données à l’utilisateur final. -
Enregitrer les données dans une base de données.
3. Node-red
Node-red est un outil puissant pour construire des applications de l'Internet des Objets en mettant l’accent sur la simplification de la programmation qui se fait grâce à des blocs de code prédéfinis, appelés nodes
pour effectuer des tâches. Il utilise une approche de programmation visuelle qui permet aux développeurs de connecter les blocs de code ensemble.
Les noeuds connectés, généralement une combinaison de noeuds d’entrée, de noeuds de traitement et de noeuds de sortie, lorsqu’ils sont câblés ensemble, constituent un flow
.
Node-red est construit sur Node.js
, tirant pleinement parti de son modèle non bloquant piloté par les événements. Cela le rend idéal pour fonctionner en périphérie du réseau sur un serveur d’application qui peut être un matériel à faible coût tel que le Raspberry Pi
ou un serveur dans le cloud
.
3.1. Installation
Consultez le guide de démarrage de node-red pour procéder à l’installation qui correspond à votre cas.
Nous utiliserons ici node-red localement sur notre ordinateur. L’installation consiste donc à installer préalablement node.js
:
3.2. démarrage et arrêt
-
Pour démarrer node-red, utilisez la commande
node-red
dans un terminal.
-
Pour arrêter node-red, utlisez la combinaison de touche kbd:[Ctrl] + kbd:[C]
4. interface
On accède à l’interface de développement par un navigateur en utlisant l’URL : http://127.0.0.1:1880 comme l’indique node-red dans le terminal :
On y accède également depuis n’importe quel poste du réseau pour peu que le pare-feu soit correctement configuré.
4.1. Ajout d’une catégorie de nodes à la palette
La palette de nodes
d’origine est déjà bien fournie mais il manque au moins une catégorie essentielle qui va permettre de réaliser l’interface web. Elle se nomme Dashboard
.
Dans le menu, cliquez sur Manage Palette
puis recherchez la catégorie de nodes à installer. Une nouvelle catégorie est ensuite disponible :
4.2. Principe de la programmation
-
La programmation consiste à glisser-déplacer les
nodes
sur leflow
et à les relier entre eux. Les données échangées sont des objetsJSON
et doivent posséder la propriétépayload
(charge utile). -
Le
payload
peut être un nombre, une chaine de caractères ou un objetJSON
. -
Certains nodes peuvent avoir plusieurs sorties. Dans ce cas, le node retourne un tableau d’objets
JSON
dont le premier élément sort par la première sortie, le deuxième par le seconde, …
Commençons par réaliser un flow
très simple composé de :
-
un
Slider
-
une
Gauge
.
Pour modifier la configuration par défaut des nodes
, il suffit de double-cliquer dessus.
Pour que ces composants soient bien disposés sur la page web, il faut les mettre dans un Tab
, puis dans un Groupe
:
-
Dans la boite de sélection du
groupe
, cliquez surAdd new ui_group
, -
Créer un
groupe
(ici : "Le groupe") et faite de même pour leTab
(ici : "Test"). -
Cliquez ensuite sur le bouton
Done
, puis déployer leflow
en cliquant sur le boutonDeploy
. -
On accède au site web généré par l’url : http://127.0.0.1:1880/ui
-
Actionnez le
Slider
et constatez l’action sur la jauge (Gauge
). -
Modifiez le
flow
en ajoutant un nodeNumeric
, déployez et constatez le résultat :
-
Pour conserver un historique des valeurs affichées, on peut utiliser un
node Chart
:
Si la propriété |
Nous allons maintenant rajouter une information textuelle en bas du groupe
. Cette information contiendra par exemple la valeur du slider
, la date et l’heure de modification.
-
Ajoutez un
node Text
qui permet d’ajouter unlabel
et le contenu d’un message (value
).
Si on se contente de connecter la sortie du node slider à l’entrée du node Text, on pourra écrire :
Ce n’est pas suffisant dans notre cas ! Nous devrons ajouter une fonction pour fabriquer notre message. |
-
Intercalez un
node Function
pour insérer la date dans le message à afficher. -
Modifiez la propriété
label
dunode Text
: "Valeur le
"
Le |
date()
var now = new Date();
var year = now.getFullYear();
var month = now.getMonth()+1;
var day = now.getDate();
var hour = now.getHours();
var minute = now.getMinutes();
var second = now.getSeconds();
msg.payload = day+"/"+
month+"/"+
year+" à "+
hour+":"+
second+" => "+
msg.payload;
return msg;
-
Déployez observez le résultat.
A noter : Les messages transmis dans les flux d’entrée et de sortie des nodes sont des objets. C’est l’attribut |
5. Réalisation de l’applications
Nous avons un objet connecté qui transmet à interval régulier la température et l’humidité relative qu’il mesure aux serveurs de The Things Network
. Ces derniers diffusent ces données via le protocole MQTT
aux applications qui y souscrivent. Nous allons donc réaliser un flow
qui connecte ces serveurs afin d’obtenir les mesures et les afficher dans un dashboard
.
5.1. souscription MQTT
-
Saisissez le
flow
suivant : -
Configurez 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 :
|
-
Double-cliquez sur le node
mqtt in
pour faire apparaitre la boite de dialogue de configuration.
-
Configurez les paramètres du serveur conformément à la documentation de l’API de
TTN
puis cliquer surUpdate
-
Configurez le
Topic
conformément à la documentation de l’API deTTN
et cliquer surDone
Il est normalement possible de sélectionner les informations souscrites via le topic. Par exemple, pour ne recevoir que la température, on peut souscrire au topic :
Cependant, TTN met en garde quand l’utilisation des filtres vers les champs de données : Warning: not every cluster publishes uplink fields to individual topics. See status.thethings.network for details. Figure 16. TTN status page
|
-
Déployez et observez les traces
debug
.
5.2. Extraction des informations
Le |
-
Ajouter un` node Function` avec le code :
msg.payload = JSON.parse(msg.payload);
return msg;
Remarque : Le |
-
Déployez et observez les traces
debug
.
-
Créez les fonctions nécessaires pour accéder à :
-
la température :
getTemp()
-
l’humidité relative :
getHum()
-
l’horodatage de la mesure :
getTime()
-
var temp = msg.payload.payload_fields.temperature_1;
msg.payload = temp
return msg;
var hum = msg.payload.payload_fields.relative_humidity_2;
msg.payload = hum
return msg;
var time = msg.payload.metadata.time;
var date = time.split("T")[0];
var heure = time.split("T")[1].split(".")[0];
var msg1 = {};
var msg2 = {};
var out = {"date" : date, "heure" : heure};
msg1.payload = out;
msg2.payload = "Le "+ out.date + " à " + out.heure;
return [msg1, msg2];
La fonction |
5.3. Production du Dashboard
Pour le dashboard, nous allons utiliser deux jauges (nodes gauges
) et deux nodes chart
pour tracer l’évolution des grandeurs mesurées. Nous utiliserons également un node text pour afficher la date et l’heure et de la mesure.
6. Enregistrement des données
Il est possible d’enregistrer les données dans un fichier texte ou dans une base de données. Il suffit d’utiliser le node approprié.
6.1. Fichier csv
Le node csv
permet de formater une string
en csv
à partir d’un objet JSON
:
-
Glissez le
node csv
sur leflow
et connectez le à la sortie 1 de la fonctiongetTime()
.
-
Configurez le
node csv
comme suit :
Remarque : Les nom des colonnes sont les noms des propriétés de l’objet entrant que l’on désire ajouter au csv. |
-
Déployez et observez les traces
debug
.
-
Ajoutez maintenant un
node file
pour enregistrer les lignescsv
dans un fichier.
-
Configurez le
node file
:
-
A vous de jouer. A partir de la sortie du
node toJSON
, traitez les données pour ne fournir aunode csv
que l’horodatage, la température et l’humidité relative et les enregistrer dans un fichier csv.
6.2. Base de données MySQL
Un node de gestion du classique SGBD MySQL
est disponible.
-
Commençons par installer le
node mysql
:
-
Glissez le
node mysql
sur leflow
et configurez le pour se connecter à la base de données
Cela sous-entend que nous ayons MySQL installé et démarré avec une base de données accessible. ou plus rapide et plus simple (mais pas sécurisé) : XAMPP |
La requête sql est injectée au |
-
Ajoutez une fonction entre le
node getTemp
et lenode mysql
. Saisissez le code ci-dessous qui sous-entend qu’il existe une tabledht11_1
et le champtemp
dans ma base de données.
var query = "INSERT INTO `dht11_1` (`temp`) VALUES ('"+msg.payload+"');";
msg.topic = query;
return msg;
-
Observez dans MySQL l’insertion des données (dans le terminal ou avec phpmyadmin).
6.3. Base de données InfluxDB
InfluxDB est une base de données de séries chronologiques. Elle est optimisée pour le stockage et la récupération rapide et à haute disponibilité de données de séries temporelles dans des domaines comme les capteurs de l’Internet des Objets. InfluxDB doit être installé sur l’ordinateur ou le serveur. |
-
Téléchargez et installer InfluxDB : https://portal.influxdata.com/downloads/
-
Dans node-red, installez les
nodes node-red-contrib-influxdb
.
InfluxDB utilise le port En local, on indiquera donc :
|
-
Glissez un
node influxdb
sur leflow
et configurez le. -
Ecrivez une fonction
toInfluxDB()
qui fournira en sortie un objetjson
contenant les noms des champs et les valeurs à enregistrer :
msg.payload = [{
"humidity" : msg.payload
}];
return msg;
-
Déployez et observez dans la console de InfluxDB l’insertion des données.
InfluxDB est souvent accompagné de Telegraph et Grafana. Ce trio forme une solution technique très efficace et open-source pour monitorer un système d’informations Figure 33. Solution de monitoring Telegraf, InfluxDB et Grafana
|
7. Allez plus loin…
S’il vous reste du temps vous pouvez essayer de mettre en oeuvre une notification automatique à partir de node-red….
Utilisez par exemple les nodes node-red-node-email
(https://flows.nodered.org/node/node-red-node-email), mais il en en existe plein d’autres. A vous de chercher un peu ….
Remarque : Si vous utlisez votre compte google, il doit être configuré pour accorder l’accès aux applications moins sécurisées https://myaccount.google.com/lesssecureapps |