![]() |
MQTT MOSQUITTO NODE-RED INFLUXDB |
novembre 2019 |
J'ai installé il y a quelques temps une citerne qui récupère l'eau de pluie de mon toit, j'aimerais savoir à tout moment la quantité d'eau en réserve.
J'ai lu qu'il était possible d'utiliser un capteur d'ultrasons SR-04 pour mesurer la distance entre l'eau et le haut de la cuve alors je vais tester...
Le montage sera basé sur un Esp-8266 qui permettra d'envoyer les données vers un serveur.
Je vais profiter de ce petit montage pour redécouvrir MQTT qui est normalisé et permet de regrouper des données sur un serveur domotique.
Je ne détaillerais pas ici l'installation des différentes applications sur le raspberry ce qui est fait sur de nombreux sites mais je vais tracer la mise en oeuvre
minimale de ceux-ci afin de vous donner envie de les utiliser si ceci n'est pas déjà fait !
Nous allons donc découvrir :
MOSQUITTO qui va nous permettre d'envoyer les données collectées par l'Esp-8266 vers le raspberry par un protocole efficace, rapide et normalisé.
NODE-RED qui va permettre à l'aide d'une interface graphique de cheminer les données vers différentes cibles.
INFLUXDB qui est une base de données directement interfacable avec NODE-RED.
Dans un autre projet nous découvrirons GRAFANA qui permet de réaliser des graphiques à partir des données collectées...
Je profite de cet article pour dire un grand BRAVO aux développeurs de ces applications magnifiques et utiles qui sont misent dans le domaine public pour notre plus grand plaisir !
Le montage est simple, il est ici en test, on retrouve l'Esp-8266-12 qui est monté sur un suport bien pratique.
Le capteur d'ultrasons SR-04. Un petit écran OLED en I2C et une interface USB/TTL pour la programmation de l'ESP. Le schéma est classique et le
programme pour le test vous est donné en bas d'article.
Une fois fonctionnel le montage est transféré sur une plaque à trous pour des tests plus faciles. Le SR-04 donne des résultats de mesure
plus fiable avec une alimentation en 5 volts plutôt qu'en 3v3 comme celle de l'ESP, j'utilise donc ici une petite carte ESP alimenté par une micro-USB
c'est bien pratique car le pas des broches est en 2.54 et la conversion du 5v en 3.3 est déjà réalisée. Il y a même un petit bouton de reset, bien pratique !
Le petit LCD affiche au démarrage un logo castoo puis une barre de chargement le temps de la connexion puis des tops départ pour l'envoie des données. Le programme
que je vous livre est expérimental, à vous de le transformer en un programme de course...
Une fois que vous aurez installé MOSQUITTO sur votre RASPBERRY vous pouvez vérifier que le processus est bien lancé (voir photo) puis lancer la reception du flux
avec une commande : mosquitto_sub -h localhost -t "#" -v (visualisation de tous les flux entrants) les données doivent apparaitre.
Si problèmes, vérifier la cohérence des données de parametrage dans le programme de l'esp. Vous pouvez également vérifier l'activité
au niveau du réseau en pistant dans le fichier de log de mosquitto les adresses de la forme 10.3.141.xxx
sudo cat /var/log/syslog | grep 10.3.141
Une fois les données bien receptionnées sur mosquitto vous devez installer NODE-RED sur le RASPBERRY et lancer le programme avec
la commande : sudo node-red-start il faut être attentif aux commentaires affichés par cette commande. Vous allez pouvoir utiliser l'adresse IP des commentaires
pour vous connecter à l'interface graphique de NODE-RED. Pour cela utilisez un "Chrome" ou un "Firefox" sur votre micro ou encore "SAFARY" sur votre IPad.
Une fois l'adresse IP recherchée une magnifique interface graphique apparait ! Chapeau bas les développeurs !
Dans la partie gauche les entrées sorties possible, au centre une zone d'édition des contraintes que vous allez pouvoir créer et à droite une zone de commentaire
qui peux également servir de zone d'affichage pour la mise au point de scenario.
Nous allons donc récupérer dans la partie gauche un pavé mqtt (flux de données) et un pavé debug (pour affichage). On voit sur la partie droite
apparaitre nos données, mais pour cela il faut paramètrer l'entrée mqtt ce qui est décrit dans l'écran suivant...
Les parametres sont très simple il suffit de mentionner "localhost" (l'adresse de la carte du raspberry mosquitto) et le nom du flux, dans notre cas "ReserveEau".
Pour le pavé debug il n'y a rien à paramètrer par contre vous devez relier les deux pavés par une ligne de jonction à l'aide de la souris.
C'est pas cool node-red ! Bon voir les données s'afficher dans un coin de l'écran c'est bien mais on a maintenant envie d'aller un peu plus loin...
Un petit arrêt sur image permet de voir que toutes les données qui arrivent sur mosquitto dans la fenêtre du Raspberry sont immédiatement disponible sur la fenêtre
debug de node-red.
Voyons maintenant le programme INFLUXDB que vous aurez chargé précédemment. Celui-ci va nous permettre de créer notre base de données. Au lancement
de l'interface SQL il est necéssaire de préciser le rfc3339 afin d'avoir des dates propres ! Le mode SQL est repérable au prompt qui devient le signe ">".
Les commandes utilisables ici sont donc des commandes du langage SQL : CREATE, ALTER, DROP, SELECT, SHOW, USE...
Voir les commandes de l'exemple sur l'image, il est possible de créer une base de donnée beaucoup plus évoluée que sur l'exemple qui permettra entre autre de limiter
l'enregistrement aux X derniers jours ou mois... voir doc de l'application.
Pour disposer du pavé influxdb dans node-red vous devez ajouter la librairie à l'aide du menu en haut à droite de node-red (voir doc node-red).
Une fois ceci fait nous allons diriger le flux mqtt vers cette entrée influxdb afin de mémoriser les infos dans la base de données que nous venons de créer.
Pour paramétrer ce pavé influxdb il faut préciser l'adresse du serveur (le même que mosquitto dans mon exemple) avec le port IP et le nom de la base de donnée.
Il faut également donner l'accès à la base de données avec le login et le mot de passe que vous avez créé.
Node-Red permet également d'afficher très facilement des graphiques... On en reparle...
Le code de base qui doit vous permettre de démarrer pour vos propres projets...
// Mesure de profondeur de la cuve d'eau de pluie
// Avril 2019
// Castoo
#include "ESP8266WiFi.h"
#include "PubSubClient.h"
#include "Wire.h"
#include "SSD1306Wire.h"
#include "logo_castoo.h"
// l'adresse I2C (ici 0x3C) peut être différente en fonction du module utilisé
SSD1306Wire display(0x3c, 4, 5);
const char* box = "raspi-mqtt"; // Nom du ssid du serveur raspberry Mosquitto
const char* m_passe = "xxxxxxxxxxxxxxxx"; // Passe WiFi
const char* mqtt_server = "10.3.141.1"; // Adr de serveur mosquitto
const char* mqtt_user = "admin"; // login sur serveur mosquitto
const char* mqtt_password = "xxxxxxxxxxx"; // Passe sur serveur mosquitto
int counter = 1;
int trigPin = 14;
int echoPin = 12;
char msg_envoye[50];
char str_mesure[15];
WiFiClient espClient; // déclaration Objet wifi
PubSubClient client(espClient); // déclaration objet mosquitto
// ---------------- Affiche barre de progression sur le lcd ---------------
void drawProgressBarDemo() {
int progress = (counter / 5) % 100;
display.drawProgressBar(0, 32, 120, 10, progress);
display.setTextAlignment(TEXT_ALIGN_CENTER);
display.drawString(64, 15, String(progress) + "%");
}
// ---------------------- Affiche le logo sur le lcd -----------------------
void drawImageLogo() {
display.drawXbm(1, 1, logo_castoo_width, logo_castoo_height, logo_castoo);
}
// ------------------- Cnx au serveur Raspberry Mosquitto ------------------
void setup_wifi() {
delay(10);
WiFi.begin(box, m_passe);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
randomSeed(micros());
}
// ----------------------------- Cnx à mosquitto ------------------------
void reconnect() {
while (!client.connected()) {
String clientId = "ESP8266CuveEau-"; // Creatation d'un ID aléatoire (identification ESP sur mosquitto)
clientId += String(random(0xffff), HEX);
if (!client.connect(clientId.c_str(), mqtt_user, mqtt_password)) { delay(5000); }
}
}
// -------------------------- Mesure de la distance ----------------------
float distanceM(){
digitalWrite(trigPin, LOW);
delayMicroseconds(3);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
float tUs = pulseIn(echoPin, HIGH);
return tUs / 58.8235;
}
// ---------------- Calcul de la moyenne des mesures --------------------
float moyenneTableau(float tableau[], float tailleTableau){
float somme=0;
for(int i=0; i < tailleTableau; i++){
somme=somme+tableau[i];
}
somme = somme / (tailleTableau);
return somme;
}
void setup(){
pinMode(trigPin, OUTPUT); // Broche triger en sortie
pinMode(echoPin, INPUT); // Broche echo en entree
// initialisation de l'ecran (voir la documentation de la librairie)
display.init();
display.flipScreenVertically();
display.setFont(ArialMT_Plain_24);
display.setTextAlignment(TEXT_ALIGN_CENTER);
display.clear();
drawImageLogo();
display.display();
delay(2000);
setup_wifi(); // cnx wifi
client.setServer(mqtt_server, 1883); // cnx mosquitto
delay(2000);
display.clear();
counter = 1;
while(counter < 500){
drawProgressBarDemo();
counter = counter+1;
display.display();
delay(10);
}
}
void loop(){
display.clear();
float mesure[10];
float resultat = 0;
for(int cpt = 0; cpt < 10; cpt++){
mesure[cpt] = distanceM();
delay(10);
}
resultat = moyenneTableau(mesure, 10);
snprintf (str_mesure, 50, "P : %d cm", int(resultat));
display.drawString(64, 22, str_mesure);
display.display();
if (!client.connected()) { reconnect(); }
client.loop();
snprintf (msg_envoye, 50, "Profondeur %d cm", int(resultat));
client.publish("ReserveEau", msg_envoye);
delay(100000);
}
Voilà un petit projet que je devrais pouvoir mettre en oeuvre l'été prochain pour arroser mon jardin en toute quiétude. Dans la version définitive je n'aurai plus besoin
de l'écran et l'alimentation se fera par pile rechargée par des petits capteurs solaire (comme sur mon anémomètre). Pour maitriser l'alimentation par pile
les données ne seront plus émises qu'une fois toutes les deux heures et le montage s'endormira comme le rends possible l'alimentation maitrisée voir Alim. TPL 5110...
J'espère que si vous ne connaissiez pas MQTT vous aurez l'envie d'en savoir plus, pour cela le mieux est de se rendre sur le site des concepteurs
de ces magnifiques applications...