Visualisez vos données IOT avec influxdb, grafana, etc.

Introduction :

Nous allons voir dans cet article comment visualiser très facilement de manière graphique vos données IOT (Internet des objets) que vous collectez avec vos Arduinos, vos ESP8266, vos Raspberry PI, etc. à l’aide de tableaux de bord comme celui que l’on peut voir ci-dessous par exemple :

pm_tdb_grafana

Dans cet article nous utiliserons principalement :

  • Matériel :
    • Un Raspberry PI,
    • Un capteur BME280 (pression, température, hygrométrie),
  • Logiciels :
    • InfluxDB (stockage des données),
    • Grafana (Tableaux de bord).

Nous allons commencer par voir comment utiliser un BME280 sur un Raspberry PI.

Nous verrons ensuite comment installer et utiliser la stack (pile logicielle) TICK et Grafana sur notre Raspberry PI pour la mesure, le stockage, et la restitution des données.

Puis pour finir, nous verrons comment utiliser le cloud pour pouvoir visualiser nos données depuis n’importe quel PC connecté à internet et enfin Docker pour faciliter les installations et les déploiements.

C’est parti !!!

Utiliser un BME280 sur un RPI

Introduction :

Le BME280 est un capteur permettant de mesurer la température, la pression et le taux d’humidité avec une bonne précision.

Nous allons voir dans cet article comment le mettre en oeuvre avec un Raspberry pi.

Pour une mise en oeuvre sur un Arduino, vous pouvez vous reporter à l’article suivant .

Pour connecter le capteur BME280 à la RPI nous utiliserons une liaison série de type I2C dont le détail des branchements à réaliser est précisé dans le chapitre suivant.

Connexions :

RPI :

pm_rpi bme connexions

Branchements à réaliser entre le RPI et le BME280 :

pm_rpi bme connexions_1.JPG

Une fois les branchements effectués, nous allons effectuer quelques tests pour vérifier que la connexion I2C est bien opérationnelle.

Verifications I2C :

Utilisez la commande “lsmod” pour voir les modules actifs et vérifier la présence des modules I2C :

pm_rpi bme connexions_verif

Installations :

I2ctools n’est pas un outil indispensable mais il est très pratique car il permet de vérifier la facilement présence du capteur BME280 en ligne de commande.

Pour l’installer entrez la commande :

sudo apt-get install i2c-tools

Pour tester la présence du BME280 sur le port I2C entrez la commande :

sudo i2cdetect -y 1

Ci-dessous on voit que le capteur BME280 est bien présent sur le port I2C 76 :

pm_rpi bme connexions_verif_1

Pour ceux qui souhaitent éviter d’utiliser les outils I2C tools en tant que root, il faut ajouter l’utilisateur “pi”’ au groupe I2C avec la commande  sudo adduser pi i2c

 

Nous allons maintenant pouvoir créer notre premier script python pour effectuer les mesures.

Code :

Installer le module Python RPi.bm (source : https://github.com/rm-hull/bme280) avec la commande : sudo pip install RPi.bme280

pm_erreur python bme

Ensuite créer le script Python suivant :

# Script de test du BME280 avec un RPI 2
# Pour la mesure de la temperature, de la pression atmospherique et du taux d'humidite
# Nom script : phmo_bme.py
# Date : 24 11 2017
# Source : https://github.com/rm-hull/bme280

#Initialisations
import smbus2
import bme280 

port = 1
address = 0x76
bus = smbus2.SMBus(port)

bme280.load_calibration_params(bus, address)

# Lecture des mesures
mesures = bme280.sample(bus, address)

# Affichage des mesures
print "Temps : ", (mesures.timestamp)
print "Temperature : ", (mesures.temperature), " Degre C"
print "Pression : ", (mesures.pressure), " hPa"
print "Humidite : ", (mesures.humidity), "%"

Le script est disponible sous Github à l’adresse : https://github.com/phmarduino/rpi/blob/main/IOT/code/phmo_bme.py

Tests :

Lancer le script Python pour vérifier le bon affichage des données.

La stack TICK

Présentation :

La stack TICK est constituée des outils Open Source Telegraph, InfluxDB, Chronograf et Kapacitor diffusés par Influxdata.

Il permettent de collecter, stocker puis restituer / traiter des données par exemple pour :

  • L’internet des objets (IOT),
  • Le suivi de :
    • De serveurs informatiques,
    • D’applications WEB.

Ces différents outils de la stack offrent les fonctionnalités indiquées dans le schéma ci-dessous :

pm_stack-tick

Source : https://portal.influxdata.com/downloads

D’autres produits sont disponibles comme par exemple :

  • Pour la gestion des données : Graphite, Prometheus, OpenTSDB, Riak, DalmatinerDB, Etc.
  • Pour la visualisation des données : Graphite, Grafana, Kibana, Etc.

Installation :

Avant d’installer ces différents produits nous allons procéder aux actions suivantes sur notre RPI :

  • Mise à jour OS Raspbian :

sudo apt-get update
sudo apt-get upgrade

  • Installations préalables des outils ci-dessous :

sudo apt-get install apt-transport-https (pour qu’APT puisse contacter les dépôt via HTTPS)
sudo apt-get install curl

  • Ajout du dépôt influxdb (pour l’installation des outils de la pile) :

curl -sL https://repos.influxdata.com/influxdb.key | sudo apt-key add –

 

puis :

 

  • Prise en compte ajout depot :

sudo apt-get update

Pour plus d’informations, la documentation officielle est disponible ici : https://docs.influxdata.com/chronograf/v1.3/introduction/getting-started/

 

Une autre méthode consiste à récupérer directement les packages Debian sur le site de Influxdata avec la commande “wget” puis à les installer avec la commande “dpkg -i “comme dans l’exemple ci-dessous pour InfluxDB :

  • Pour installer le package : sudo dpkg -i influxdb_1.2.0_armhf.deb

Il est important de prendre la version de package contenant dans son nom “armhf” pour une bonne installation sur RPI.

 

InfluxDB

Présentation :

InfluxDB est une base de données de type TSDB (Time Series Data Base) à savoir une base orientée “séries temporelles” développée en GO par InfluxData.

Ce type de base :

  • Est bien adapté au stockage de métriques liées au temps  avec des volumes de données très importants,
  • Est très utilisé pour le monitoring de serveurs, applications, etc. ainsi que pour l’internet des objets.

Les données sont stockées dans des MEASUREMENT (par exemple cpu pour stocker les données relatives à des cpu comme la charge en focntion du temps) qui peuvent être comparés à tes tables relationnelles. Le stockage interne est effectué sous forme de couple clé-valeur.

La clé primaire est toujours le temps. Des clés complémentaires peuvent être définies au travers de TAGS comme la localisation d’un capteur par exemple. Les données (par exemple la température) sont stockées dans des FIELD.

Trois types d’interface sont proposées pour interagir avec Influxdb :

  • CLI : type ligne de commande (lancement avec la commande influx),
  • WEB UI : interface WEB avec l’installation complémentaire de l’outil Cronograf (dans la version 1.3, l’interface WEB qui était disponible sur le port 8083 n’existe plus),
  • API : en mode REST avec des requêtes curl sur le port 8086.

Il est très important de bien comprendre tous ces concepts spécifiques TSDB pour bien utiliser InfluxDB.

Pour illustration de ces concepts, se reporter au chapitre sur Telegraf.

La documentation officielle est disponible ici : https://docs.influxdata.com/influxdb/v1.3/

Installation :

Pour installer influxdb sur le RPI, entrer la commande sudo apt-get install influxdb.

Configuration :

Pour modifier le fichier de configuration influxdb, taper la commande “sudo vi /etc/influxdb/influxdb.conf” :

Modifier ensuite le fichier de configuration InfluxDB en dé-commentant les lignes comme indiqué ci-dessous :

pm_config_influxdb.JPG

Pour prendre en compte les modifications, redémarrer influxdb avec la commande “sudo service influxdb restart

Tests :

Introduction :

Pour vérifier le bon fonctionnement, on peut utiliser la commande suivante qui permet de retourner la liste des bases existantes via une commande curl (curl « http://localhost:8086/query?q=show+databases ») sollicitant l’API InfluxDB via le port 8083 :

pm_query_curl_influx.JPG

Il est à noter que dans les dernières versions d’InfluxDB (ici la 1.3), la  page WEB d‘administration d’InfluxDB qui était appelable via le port 8086 n’est plus disponible. Celle-ci a été remplacée par l’outil Chronograf qui demande une installation supplémentaire (voir plus loin).

Nous allons maintenant interagir avec InfluxDB directement en mode CLI avec le shell.

Lancer le shell influxdb avec la commande  “influx -precision rfc3339” :

pm_influx_cli.JPG

Données :

Manipulation des données :

Création d’une nouvelle base de données avec la commande “create database phmodb” puis affichage de la liste des databases avec la commande “show databases” :

pm_databases

Sélectionner la database phmodb avec la commande “use phmodb” pour pouvoir l’utiliser par la suite :

pm_phmodb

Insertion/consultation de données dans la base sélectionnée avec par exemple  les commandes :

  • Pour insérer des données : insert temperature chambre=17,salon=28,cuisine=32

Pour restituer les données : select * from temperature

pm_temp.JPG

Durée de rétention des données :

Il est possible de créer une retention policy pour déterminer la durée de conservation des données dans la base avec les exemples de commandes suivantes :

  • Pour garder les données un an dans la base phmodb : influx -execute ‘CREATE RETENTION POLICY « one_year » ON « phmodb » DURATION 365d’
  • Pour garder les données un an dans la base telegraf : CREATE RETENTION POLICY auto_delete ON telegraf DURATION 45d REPLICATION 1 DEFAULT

On peut aussi paramétrer la durée de rétention via l’interface d’administration avec Chronograf comme on le verra plus tard.

Utilisateurs :

Pour créer un utilisateur, utiliser les exemple de commandes ci-dessous :

  • CREATE USER phmo WITH PASSWORD ‘phmo‘ puis GRANT ALL ON phmodb TO phmo

 

  • CREATE USER phmo WITH PASSWORD ‘phmo’ WITH ALL PRIVILEGES

 

Telegraf

Présentation :

Telegraf est un outil de collecte de métriques (données).

Il fonctionne avec des Plugins :

  • D’entrée spécialisés par type de données à collecter (par exemple pour la collecte de données machine comme les utilisations cpu, RAM, disque, etc.)
  • De sortie spécialisés par type de restitution (stockage dans InfluxDb par exemple)

Après installation, on dispose dans influxDB :

  • D’une nouvelle base de données appelée telegraf :

pm_telegraf.JPG

  • Des Measurements (cf table en relationnel) suivants (cpu, etc.) :

pm_tables_telegraf

  • Des KEYS et des FIELDS suivants pour la table cpu par exemple :

pm_telegraf_keys.JPG

  • Les series suivantes sont créées :

pm_telegraf_series.JPG

  • Les premiers points de mesure suivants enregistrés automatiquement dans la table system par exemple :

pm_telegraf_poits

Attention : lorsque l’on fait un select il faut renseigner le nombre de lignes maximum souhaités avec le paramètre limit car une série peut contenir des millions de lignes si on ne veut pas grever drastiquement le temps de réponse pour la requête.

 

Installation :

Pour installer Telegraf il suffit de lancer la commande sudo apt-get install telegraf.

Ensuite pour lancer le service, entres les commandes suivantes :

sudo systemctl enable telegraf

sudo systemctl start telegraf

Configuration :

Comme on a commencé à le voir dans le chapitre Présentation, dans la configuration par défaut de telegraf, les plugins d’entrée suivants sont activés et collectent des métriques systèmes sur la machine sur laquelle Telegraf tourne, ici notre RPI :

  • cpu
  • disk
  • diskio
  • kernel
  • mem
  • processes
  • swap
  • system

Le fichier de configuration est éditable avec par exemple la commande “vi /etc/telegraf/telegraf.conf

Par défaut on y retrouve le paramétrage des entrées suivant :

pm_telegraf_points_entree

Par défaut on y retrouve le paramétrage des sorties (base de données telegraf dans influxdb) suivant :

pm_telegraf_sorti.JPG

Tests :

Pour vérifier le bon fonctionnement lancer la commande suivante qui permet d’interroger la base de données telegraf dans InfluxDB :

curl « http://192.168.1.13:8086/query?q=select+*+from+telegraf..cpu »

Ou ici 192.168.1.13 est l’adresse IP locale de mon RPI à remplacer par la votre.

Vous devriez voir de nombreuses données au format JSON :

pm_telegraf_json

On peut aussi interroger la base de données InfluxDB telegraph avec le shell InfluxDB en utilisant par exemple la commande  “select time,host,usage_guest,usage_idle from cpu limit 5” :

pm_telegraf_select.JPG

 

Chronograf

Présentation :

Chronograf est l’interface utilisateur WEB de notre pile TICK.

Installation :

Pour installer Chronograf il suffit de lancer la commande sudo apt-get install chronograf.

Ensuite pour lancer le service, entres les commandes suivantes :

sudo systemctl enable chronograf

sudo systemctl start chronograf

Configuration :

L’interface d’administration est disponible à l’adresse http://localhost:8888/

pm_chronograf_ui.JPG

Renseigner les paramètres suivants puis cliquez sur “Save Changes” :

pm_chronograf_save

 

Tests « Tableau de bords » :

TDB par défaut :

Un premier tableau de bord est déjà disponible par défaut dans “host list” (cliquer sur le nom Host de votre RPI ici dans mon cas raspberrypi-fmeu) :

pm_chronograf_tdb.JPG

Les résultats sont les suivants :

pm_chronograf_tdb_visu

TDB Personnalisé :

Nous allons voir comment créer un tableau de bord personnalisé.

Nous allons commencer par ajouter une vue (Graph) pour suivre le processeur.

Pour cela, cliquez sur “Create dashboard” :

pm_chronograf_tdb_create.JPG

Cliquez sur rename pour changer le nom puis sur “Add graph” :

pm_chronograf_tdb_rename.JPG

Cliquer sur “Add a query” :

pm_chronograf_tdb_add query.JPG

Sélectionner les paramètres comme ci-dessous par exemple:

pm_chronograf_tdb_param

Ensuite de la même façon ajouter un “graph” pour la mémoire puis un autre pour les processus.

le résultat final est le suivant :

pm_chronograf_tdb_1.JPG

Administration :

L’interface d’administration permet par exemple de gérer les durées de rétention des données en base :

Kapacitor

Présentation :

Kapacitor permet de traiter les données et d’envoyer des alertes par email par exemple.

Installation :

Pour installer, lancer la commande : sudo apt-get install kapacitor

Pour démarrer, lancer la commande : sudo systemctl start kapacitor

Pour vérifier la bonne installation lancer la commande “kapacitor list tasks”, le résultat doit être le suivant :

pm_kapacitor install.JPG

Configuration :

Sous chronograf, aller sur le menu alerte (triangle) puis “Configure Kapacitor” :

pm_chronograf kapacitor.JPG

Cliquer sur connect :

pm_chronograf kapacitor config.JPG

On va désormais configurer trois alertes pour suivre le dépassement de seuils de température dans la cuisine, le salon et la chambre :

pm_kapacitor rules.JPG

Détail d’une alerte :

pm_kapacitor alerte.JPG

pm_kapacitor alerte1

pm_kapacitor alerte2.JPG

Tests :

On injecte des données manuellement avec l’interface de commande InfluxdDB :

pm_kapacitor injection.JPG

pm_kapacitor resultat.JPG

On voit ci-dessous que le fichier alerts.log présent dans le dossier /tmp est bien alimenté avec les alertes :

pm_kapacitor resultat1.JPG

Grafana

Présentation :

En lieu et place de chronograf, on peut utiliser Grafana qui est aussi un outil de restitution graphique.

Nous allons voir comment l’utiliser pour visualiser les données stockées dans notre base InfluxDB.

Installation :

Récupération des sources :

Il n’y a pas de source officielle de grafana pour processeur de type debian ARM utilisable sur RPI.

Je me suis donc rabattu sur les sources disponibles sur la page suivante :

https://github.com/fg2it/grafana-on-raspberry/releases

pm_grafana1.JPG

 

Pour cet article j’ai choisi d’utiliser la version 4.1.1, pour récupérer les sources lancer la commande suivante :

wget https://github.com/fg2it/grafana-on-raspberry/releases/download/v4.1.1/grafana_4.1.1-1484347088_armhf.deb

Ensuite pour lancer l’installation, entrez la commande ci-dessous  

sudo dpkg -i grafana_4.1.1-1484347088_armhf.deb

Démarrer le service grafana :

sudo service grafana-server start

Pour vérifier le bon lancement :

systemctl is-active grafana-server.service

Enfin ajouter le démarrage automatique de grafana au boot pour les redémarrage ultérieurs :

sudo systemctl enable grafana-server.service

Pour plus d’informations sur la gestion des services sous Linux :

https://www.linuxtricks.fr/wiki/systemd-les-commandes-essentielles

Configuration :

Lancer l’interface WEB disponible sur le port 3000 à l’aide du navigateur sur le RPI :

Se connecter avec le user/password par défaut admin/admin, puis ajouter une data source comme indiqué ci-dessous :

Renseigner le nom de la datasource, le type et l’adresse :

pm_grafana3.JPG

Ensuite renseigner le nom de la database InfluxDB, le user et le mot de passe pour accéder à la database, puis cliquez sur “Add” :

pm_grafana4.JPG

On constate que la nouvelle data source est bien ajoutée :

pm_grafana5.JPG

On peut ensuite créer des tableaux de bord personnalisables via le menu dashboard avec divers types de restitution (des graphiques temporels avec Graph, des jauges avec Singlestat, des tableaux de mesures avec Table, etc.) :

pm_grafana6.JPG

Exemple 1 :

pm_grafana7.JPG

Exemple 2 :

pm_grafana8.JPG

Zoom sur le paramétrage Singlestat avec en particulier les trois seuils renseignés ici pour le suivi de l’utilisation de l’espace disque sur le RPI :

pm_grafana9

Avec un autre paramétrage pour afficher une jauge :

pm_grafana10.JPG

Chaîne IOT complète

Présentation :

Nous allons maintenant utiliser tout ce que nous avons vu précédemment pour mettre en place une chaîne IOT complète avec :

  • Prise de mesures à l’aide de notre capteur BME280 connecté à notre RPI une liaison série I2C (température, l’humidité et pression atmosphérique),
  • Enregistrement de ces données à l’aide d’un script python dans une base InfluxDB,
  • Visualisation des données avec Grafana.

Dans un premier temps nous utiliserons InfluxDB et Grafana installés sur le RPI.

Ensuite nous utiliserons le cloud pour le stockage et la visualisation des données afin de pouvoir les consulter depuis n’importe quel PC connecté à internet.

Enfin pour finir nous veroons comment utiliser Docker pour faciliter les installations des outils.

Installation :

Afin de pouvoir utiliser un script python pour l’enregistrement des données dans une base InfluxDB, il nous faut au orélable installer le module InfluxDB pour Python avec la commande “sudo apt-get install python-influxdb”.

Code :

Le code Python est le suivant :

# Script : rpipme_one.py
# Description : Mesure temperature, humidite et pression avec un
#               BME280 sur un RPI avec stockage des mesures dans
#               InfluxDB pour visualiation ave Grafana
# Date        : 01/12/2017
# Auteur      : PHMO
# Sources     : Inspire de https://github.com/rm-hull/bme280

import time
from influxdb import InfluxDBClient
import smbus2
import bme280

port = 1
address = 0x76
bus = smbus2.SMBus(port)

bme280.load_calibration_params(bus, address)

# Parametres InfluxDB
host = "localhost"
port = 8086
user = "root"
password = "root"
dbname = "rpibme"

# Initialisation du client InfluxDB
client = InfluxDBClient(host, port, user, password, dbname)

# Prise de mesures
data = bme280.sample(bus, address)
# Affichage des mesures du bme280

# Enregistrement des mesures dans InfluxDB
json_body = [
{
    "measurement": "phm_mesures",
    "tags": {
        "lieu": "MLV",
        "capteur": "RPI-BME280"
    },
    "fields": {
        "temp": round(data.temperature,2),
        "humi": round (data.humidity,2),
        "press": round (data.pressure,2)
    }
}
]

client.write_points(json_body)


Le script est disponible sous Github à l’adresse suivante : https://github.com/phmarduino/rpi/blob/main/IOT/code/rpipme_one.py

Tests :

Erreur au lancement :

En cas de problème comme celui que j’ai rencontré ci-dessous :

pm_chaine1.JPG

Entrez la commande  “pip install –upgrade influxdb” puis relancer le script Python.

Résultats dans la console :

Le nombre de points de mesure peut être obtenu à l’a de la commande “select count(*) from phm_mesures” :

pm_chaine2.JPG

Les résultats obtenus dans la console influxdb avec la commande “select * from phm_mesures where time > now() – 20m limit 20” sont les suivants :

pm_chaine3.JPG

Résultats dans Grafana :

Tableau de bord 1 :

pm_chaine4.JPG

Tableau de bord 2 :

pm_chaine5.JPG

Résultats dans Chronograph :

pm_chaine6.JPG

Automatisation :

Pour automatiser la prise de mesures nous allons utiliser le “cron” Linux.

Dans une console Linux, entrez la commande “sudo crontab -e”

pm_chaine7.JPG

Insérer par exemple la nouvelle ligne suivante qui permet de lancer le script de mesure python toutes les minutes :

*/1 * * * * python /home/pi/rpibme_one.py

pm_chaine8.JPG

On voit dans un tableau de bord sous Grafana avec une panel de type “table” qu’une mesure est bien prise et enregistrée dans InfluxDb toutes les minutes :

pm_chaine9

 

 

 

Laisser un commentaire