L'objectif de ce tutoriel est de récupérer les mesures des capteurs gérés par la plateforme CampusIoT afin de les archiver et de les visualiser en temps réel au moyen de la stack NodeRED, InfluxDB, Grafana.
NodeRED est un canevas de traitement de flots de données. Il permet la programmation visuelle des chaines de traitement de données. Il est très populaire pour le prototypage d'applications IoT.
Si ce tutoriel vous est utile, pensez à donner une étoile ⭐ en haut à droit.
Installez Docker CE et Docker Compose sur votre machine
Lancez NodeRed avec Docker (sur votre machine)
docker run -it -p 1880:1880 --name campusiot-nodered nodered/node-red-dockerOuvrez l’interface de NodeRed dans un navigateur Web http://127.0.0.1:1880
open http://127.0.0.1:1880Créez le “flot” en important le JSON suivant au moyen du (Menu > Import)
[{"id":"a223aefb.78f27","type":"mqtt in","z":"c98c469c.7db958","name":"campusiot app rx","topic":"application/+/device/+/rx","qos":"2","broker":"e78a78ee.6dbae8","x":320,"y":140,"wires":[["2b6278fc.60352","f7b805a.4fa4178"]]},{"id":"e78a78ee.6dbae8","type":"mqtt-broker","z":"","name":"campusiot","broker":"lora.campusiot.imag.fr","port":"8883","tls":"ffa7a071.2d7b7","clientid":"","usetls":true,"compatmode":true,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""},{"id":"ffa7a071.2d7b7","type":"tls-config","z":"","name":"","cert":"","key":"","ca":"","certname":"","keyname":"","caname":"ca.crt","servername":"","verifyservercert":false}]Editez le noeud mqtt-in campusiot pour changer le topic, le ca.crt pour la configuration SSL, le username et password MQTT avec les credentials MQTT qui vous ont été fournis.
Le certificat se récupère au moyen de
wget https://raw.githubusercontent.com/CampusIoT/campusiot-certs/master/mqtt/ca.crtAffichez le journal des messages avec
docker exec -it campusiot-nodered tailf /usr/src/node-red/msg.logRemarque : Vous pouvez monter un volume local pour rendre persistant le journal dans votre répertoire courant en ajoutant -v $PWD/msg.log:/usr/src/node-red/msg.log à la commande docker précédente
touch $PWD/msg.log
docker run -it -p 1880:1880 -v $PWD/msg.log:/usr/src/node-red/msg.log --name campusiot-nodered nodered/node-red-dockerAfficher le flot de messages écrits dans le journal msg.log
tail -f $PWD/msg.logEn fin d'expérimentation, vous pouvez utiliser la commande suivante pour arrêter et supprimer le container campusiot-nodered :
docker rm -f campusiot-noderedgit clone https://github.com/CampusIoT/tutorial.git
cd tutorial/nodered/tuto-nodered
docker-compose up -d
docker-compose ps
docker-compose logs -fEntrez le username et mot de passe MQTT en éditant un des noeuds MQTT In comme à l'étape précédente.
Ouvrez les pages suivantes:
- http://localhost:1880 avec
adminMY_SUPER_ADMIN_SECRET - http://localhost:1880/ui avec
userMY_SUPER_USER_SECRET - http://localhost:1880/worldmap avec
userMY_SUPER_USER_SECRET
Le flot (flow.json) par défaut est dans le répertoire nodered/tuto-nodered/configuration/nodered/.
Vous pourrez personnaliser ce flot en fonction des devices que vous avez enregistrez dans votre organisation.
Pour changer les 2 mots de passe avec les lignes suivantes:
docker-compose stop nodered
docker-compose exec nodered /data/set_password.sh MY_SUPER_ADMIN_SECRET MY_SUPER_USER_SECRET
sleep 10
docker-compose start noderedChangez les mots de passe:
docker-compose exec nodered /data/set_password.sh MY_SUPER_ADMIN_SECRET MY_SUPER_USER_SECRET
docker-compose stop nodered
docker-compose start noderedAjoutez dans la composition docker-compose.yml le service influxdb qui étend influxdb.yml et ajouter un lien vers influxdb dans le service nodered.
Arrêtez et redémarrez la composition docker-compose.yml avec :
docker-compose stop
docker-compose startAjoutez dans la composition docker-compose.yml le service chronograf qui étend chronograf.yml.
Démarrez le service dans la composition docker-compose.yml avec :
docker-compose start chronografOuvrez la page suivante http://localhost:8888
Ajoutez la connection http://influxdb:8086 dans Configuration > Connection > + Add Connection.
Explorez la base de données lorawan en ajoutant une requête suivante pour afficher le graphe du nombre de messages LoRa reçus et émis par les stations de base :
SELECT sum("rxPacketsReceived") AS "sum_rxPacketsReceived", sum("txPacketsReceived") AS "sum_txPacketsReceived", sum("rxPacketsReceivedOK") AS "sum_rxPacketsReceivedOK", sum("txPacketsEmitted") AS "sum_txPacketsEmitted" FROM "lorawan"."three_days"."stat" WHERE time > :dashboardTime: GROUP BY time(1m) FILL(null)Ajoutez d'autres graphes.
Grafana est un outil très populaires pour la visualisation de séries temporelles.
Ajoutez dans la composition docker-compose.yml le service grafana qui étend grafana.yml.
Démarrez le service dans la composition docker-compose.yml avec :
docker-compose start grafanaOuvrez la page suivante http://localhost:3000 et loggez vous avec admin __SUPER_SECRET_TO_CHANGE__
Ajoutez la source de données (url=http://influxdb:8086, database=lorawan) dans Configuration > Data Sources > InfluxDB > Settings en suivant la page http://localhost:3000/datasources/edit/1?gettingstarted
Pour la source InfluxDB, le username est
campusiotet le mot de passe est__SUPER_SECRET_TO_CHANGE__
Ajoutez un nouveau tableau de bord avec Create > New Dashboard en suivant la page http://localhost:3000/dashboard/new
Ajoutez un panel de type Graph et ajoutez les requêtes suivantes pour afficher le graphe du nombre de messages LoRa reçus et émis par les stations de base via l'aide d'édition des requêtes :
SELECT sum("rxPacketsReceived") FROM "stat" WHERE $timeFilter GROUP BY time($__interval) fill(null)
SELECT sum("rxPacketsReceivedOK") FROM "stat" WHERE $timeFilter GROUP BY time($__interval) fill(null)
SELECT sum("txPacketsEmitted") FROM "stat" WHERE $timeFilter GROUP BY time($__interval) fill(null)
SELECT sum("txPacketsReceived") FROM "stat" WHERE $timeFilter GROUP BY time($__interval) fill(null)Sauvegardez le tableau de bord et ajoutez d'autres panneaux.
Ajoutez un panel de type Graph et ajoutez la requête suivante pour afficher le graphe des nombres de messages LoRa reçus, groupés par la propriété mac des stations de base via l'aide d'édition des requêtes :
SELECT sum("rxPacketsReceivedOK") FROM "stat" WHERE $timeFilter GROUP BY time($__interval), "mac" fill(null)Modifiez les valeurs de l'onglet Display pour obtenir le graphe suivant.
Ajoutez un panel de type Graph et ajoutez la requête suivante pour afficher le graphe des nombres de messages LoRaWAN reçus, groupés par operateur LoRaWAN via l'aide d'édition des requêtes :
SELECT count("size") FROM "rx" WHERE ("operator" != 'undefined' AND "frametype" = 'dtup') AND $timeFilter GROUP BY time($__interval), "operator" fill(null)Ajoutez un panel de type Heatmap et ajoutez la requête précédente pour afficher la heatmap des nombres de messages LoRaWAN reçus, groupés par operateur LoRaWAN.
La communauté Grafana propose de nombreux plugins (greffons en français) dont la liste complete est https://grafana.com/plugins .
Pour ajouter un plugin au serveur Grafana (par exemple https://grafana.com/plugins/citilogics-geoloop-panel), il faut exécuter dans le conteneur des commandes en ligne de grafana-cli puis rédémarrer le conteneur.
docker exec -it tuto-nodered_grafana_1 grafana-cli plugins list-remote
docker exec -it tuto-nodered_grafana_1 grafana-cli plugins list-remote | grep geoloop
docker exec -it tuto-nodered_grafana_1 grafana-cli plugins install citilogics-geoloop-panel
docker-compose stop grafana
docker-compose start grafanaAjoutez dans la composition docker-compose.yml le service kapacitor qui étend kapacitor.yml et les service alerta et postgresdb qui étendent alerta.yml.
Démarrez le service dans la composition docker-compose.yml avec :
docker-compose start postgresdb
docker-compose start alerta
docker-compose start kapacitorOuvrez la page suivante http://localhost:8080










