Après le dernier article sur Mosquitto et Node-RED, on va compléter la chaîne d’information avec la création d’une base de données sur InfluxDB et la présentation de ces données sur Grafana. Le tout sur Raspberry et disponible sur votre réseau local ! C’est parti !
Table des matières
Rappel de l’architecture
Dans le dernier article concernant Mosquitto et Node-RED, je vous ai fait part de l’architecture que j’allais mettre en place pour mes futurs objets connectés. Voici un petit rappel de l’architecture :
Dans cette architecture, une base de données s’abonne à un ou plusieurs Topics du Broker MQTT (je vous invite à lire cet article, si vous ne voyez pas de quoi je parle). La base de données est Subscriber d’un ou plusieurs Topic. Donc, dès qu’une modification de ces Topics auront lieu, chacun de ces changements seront archivés en base de données.
InfluxDB et Grafana. Pourquoi ces choix ?
En effet, il existe tant de bases de données différentes et plusieurs manières différentes de représenter les données.
Pour la base de données, j’ai choisi de passer par InfluxDB. Pourquoi ce choix ? Pour plusieurs raisons que voici :
– C’est une base de données intégrant le temps (des timestamp) pour chacun de ses enregistrements. On appelle ce type de base de données des Time Series Databases.
– La base est Open Source.
– Serveur de base de données la plus performante du marché selon DB-Engines.com pour ce qui est des Time Series Databases.
– Possibilité d’archivage de données numériques ET alphanumériques (String).
– Langage de requêtes semblable au langage SQL qui est un standard que je connais.
– Possibilités de scripting en .Net, Java, JavaScript, Node.js, PHP, Python et j’en passe !
– Réplication des données possible sur plusieurs bases. Exemple : synchroniser la base de données locale avec une base de données dans le Cloud.
– Choix de la pérennité des données. On peut choisir les données que l’on veut garder et combien de temps. C’est un des points forts de InfluxDB, car cela permet de faire bien plus qu’il n’y paraît !
– Librairie Node-RED existante.
– Compatible Raspberry Pi et Raspbian.
Bien sûr, InfluxDB permet bien d’autre choses comme la gestion des droits, de différents utilisateurs… Je n’ai cité là que les caractéristiques dont je pourrais tirer avantage dans mes futurs projets.
Pour l’analyse et la mise en forme des données sous formes de compteur, graphiques, jauges… J’ai choisi Grafana ! Pourquoi ?
– C’est un projet Open Source que je suis depuis un petit bout de temps.
– Représentation des données dans une belle interface Web. Du coup, compatible Windows, Mac, Android, IOS… Toutes les architectures supportant une interface Web HTML5 quoi :-).
– Proposé en installation locale avec toutes les options ou en version Cloud limité sur leurs serveurs. Des versions payantes enlèvent ces limitations sur leurs serveurs.
– Compatible avec plusieurs types de base de données, dont InfluxDB.
– Flexibilité des requêtes à effectuer.
– Compatible Raspberry Pi et Raspbian.
– Et surtout le + important ! Leur interface a vraiment de la gueule.
Et détrompez-vous, ce dernier point est hyper important. Je rappelle qu’on cherche à analyser des données. Il nous faut donc une interface nous permettant de présenter un nombre important de données de manière lisible. De plus, les graphes se doivent de posséder un niveau de détail élevé en cohérence avec nos données. Et en prime, le système doit pouvoir se mettre à jour très régulièrement afin de coller au plus proche de la réalité. Grafana réuni tous ces points dans une interface sobre, flexible et puissante. Un petit exemple de ce que Grafana peut faire ici : Statistiques des serveurs de Grafana.
Allez, c’est parti pour l’installation !
Installation et paramétrage sur Raspberry Pi
Ma configuration est une Raspberry Pi 3 avec Raspbian Stretch à jour du 20/11/2017. J’ai préalablement configuré la Raspberry Pi en point d’accès Wifi pour y connecter mes objets connectés. D’autre part, la RPI est connectée en Ethernet à mon réseau local (Box Internet, PC, smartphone, etc…). J’ai également installé, configuré et mis à jour Mosquitto et Node-RED. Ces étapes ne sont pas indispensables à ce qui va suivre. Comme d’habitude, un sudo apt-get update && apt-get upgrade ne fait pas de mal ! 🙂
InfluxDB
Pour installer InfluxDB sur Raspberry Pi avec Rasbian Stretch / Debian 9, il y a besoin d’une source apt-get supplémentaire :
InfluxDB est maintenant installé. Pour une configuration très rapide, on va ouvrir /etc/influxdb/influxdb.conf et activer le port HTTP sans authentification :
Pour cela, il suffit de dé-commenter les lignes suivantes :
Ensuite, on redémarre le service InfluxDB :
Notre base de données est prête. 🙂
Intégration InfluxDB dans Node-RED
Si vous souhaitez connecter, tout comme moi, une base de données InfluxDB à un flux Node-RED, suivez ce qui suit. On va ajouter les librairies InfluxDB à Node-RED. Pour se faire, on va télécharger le paquet « npm » qui va nous permettre d’ajouter la librairie InfluxDB à Node-RED.
Note : npm devra toujours s’exécuter dans ~/.node-red.
Ensuite, redémarrez Node-RED :
La librairie InfluxDB dans Node-RED est installée ! 🙂
Grafana
Grafana a également besoin d’une soucre apt-get supplémentaire pour une installation sur Raspberry Pi sous Raspbian Stretch :
Une fois installé, on va configurer Grafana en activant le protocole http et le port à utiliser pour l’interface Web de Grafana. Pour se faire, on va modifier /etc/grafana/grafana.ini :
Les modifications à effectuer :
Après avoir effectué ces modifications, on redémarre le service Grafana :
Maintenant, l’interface web de Grafana est accessible à l’adresse <IP de votre Raspberry Pi>:3000. Par défaut, le nom d’utilisateur est : admin. Le mot de passe est : admin.
Pour plus d’informations quant à la configuration de Grafana, leur documentation est très complète.
Premiers tests et première mise en forme graphique
InfluxDB est une base de données optimisée sur les requêtes datées. La base de données InfluxDB contient des « Measurements » (comprendre Mesures) munis de plusieurs « DataPoints » (comprendre Données). Par exemple, la Mesure « temperature » peut contenir les points de mesure de deux capteurs distincts « sensor1 » et « sensor2« . Dans InfluxDB, chaque point de mesure possède un nom de Mesure (ici « temperature« ), une date (il s’agit du timestamp) et une valeur. Afin d’avoir des dates compréhensibles, il faut lancer influx avec la commande -precision rfc3339 (norme d’écriture des dates au format Année-Mois-Jour H:min:sec).
Maintenant, on va aller sur l’interface Web de Grafana pour afficher nos valeurs sur un graphique. La première chose à effectuer est d’ajouter une source de données. Ici on va ajouter les mesures « temperature » de la base de données iotdb de notre serveur local.
Prêtez attention à la valeur « Min time interval« . Par défaut, cette valeur est à une minute. Il s’agit de l’intervalle de synchronisation de Grafana avec la base de données pour cette Mesure. C’est cette valeur qui va limiter le taux de rafraîchissement de vos données. Les graphiques ont aussi leur « Min time interval » qui corresponds à l’intervalle de mise à jour de l’affichage du graphique. A ne pas confondre donc !
On va ajouter un nouveau « Dashboard« . Il s’agit d’une page où l’on peut placer des widgets comme des graphiques, des indicateurs, etc… Je place un graphique dans la première ligne du Dashboard.
Une fois dans le mode « Edition« , dans l’onglet « Metrics« , on peut paramétrer nos requêtes à la source de données. De nombreuses options de personnalisation sont disponibles dans les différents onglets.
Pour récupérer nos données et différencier nos capteurs, on peut faire des requêtes de la forme suivante :
– FROM temperature SELECT sensor1 GROUP BY time($_interval) fill(linear) FORMAT AS Time series
– FROM temperature SELECT sensor2 GROUP BY time($_interval) fill(linear) FORMAT AS Time series
Il n’y a pas à paniquer à ce niveau-là, Grafana vous propose les possibilités dans votre base de données pour chaque paramètre. Je pense que quelqu’un qui bidouille peut très bien s’en sortir même sans connaître le langage SQL. 🙂
Et voilà ! On peut maintenant enregistrer des données datées dans InfluxDB et les représenter grâce à Grafana. Et tout ça sur Raspberry Pi ! Et comme j’ai configuré Node-RED pour rediriger un message MQTT vers la base de données iotdb dans les mesures de « temperature« , je peux ajouter des données à la base via un publish sur le Topic Temp.
Maintenant que j’ai tout ce qu’il faut pour réaliser simplement des flux de données, je peux me relancer dans mon défi avec de nombreux objets connectés à venir ! Je vous donne RDV dans le prochain article qui concernera la partie 2 de l’anémomètre connecté ! En attendant, faites un petit tour sur la partie 1 !
Benoît Jellimann.
Tuto valable pour RPi 2 et 3 uniquement (ARM v7).
Pour un RPi 0 ou un RPi 1 (ARM v6) il faut changer le repository :
sudo apt-get install apt-transport-https curl
curl https://bintray.com/user/downloadSubjectPublicKey?username=bintray | sudo apt-key add –
echo « deb https://dl.bintray.com/fg2it/deb-rpi-1b stretch main » | sudo tee -a /etc/apt/sources.list.d/grafana.list
sudo apt-get update
sudo apt-get install grafana
Super tuto. J’arrive jusqu’à la fin sauf que je n’ai rien dans les graph sur grafana. Mon graph reste desesperement vide… newbie sur grafana
influxdb/unknown,now 1.8.3-1 armhf [installed]
grafana/stretch,now 5.1.4 armhf [installed]
pi3
Super tutoriel (merci!) que j’ai suivi avec soin. Seulement voilà après 1 an d’utilisation, même si je ne stocke pas beaucoup de données, influx ne veut plus démarrer. En effet le lancement d’influxd fini par un « fatal error: runtime: cannot allocate memory ». Alors que la base totale ne fait qu’un giga. J’ose espérer que toute la base n’est pas chargé en RAM quand même ? Même en activant « TSI1 » au lieu de « INMEM » le problème persiste.
J’imagine donc que pour un petit raspberry, le fichier de configuration doit être qq peu modifier non ? Des idées ?
J’utilise un HDD externe pour éviter que la SD ne finisse par rendre l’âme ça n’a rien changé. J’ai pu redémarrer influx après avoir supprimer un répertoire correspondant à une table mais le problème revient au bout d’un moment.