Utiliser Redis pour stocker les données d’un objet connecté et Grafana pour les visualiser

5
(2)

Redis est un Système de Gestion de Base de Données (SGBD) open-source très hautes performances, qui stocke les données en mémoire sous forme de clé-valeur.

Dans ce tutoriel nous allons développer un client Redis sur une carte ESP32 Wroom de uPesy (fabriquée en France !). Cette carte intègre un microcontrôleur ESP32, idéal pour un projet d’objet connecté (IoT) utilisant le WiFi ou le Bluetooth. Nous utiliserons le service Redis Cloud (version limitée gratuite) pour stocker les données et Grafana cloud (version limitée gratuite) pour les visualiser. Mais vous pouvez bien entendu installer très facilement le serveur Redis et Grafana sur un PC ou un Raspberry Pi si vous le préférez.

Pour programmer l’ESP32 nous utiliserons l’éditeur Visual Studio Code et la plateforme PlatformIO. Cet IDE est bien plus avancé que l’IDE Arduino et je vous recommande vivement son utilisation. J’ai également utilisé l’éditeur Visual Studio Code et la plateforme PlatformIO dans un autre tutoriel pour programmer le Raspberry Pi Pico.

Installer Visual Studio code et l’extension PlatformIO

Installez Visual Studio Code et ajoutez l’extension PlatformIO IDE.

Installation de l’extension PlatformIO IDE

Configuration du service Redis

Vous devez vous créer un compte sur le service Redis Cloud. Un compte gratuit est limité mais suffisant pour tester le service. Si vous le souhaitez vous pouvez bien entendu installer un serveur Redis sur votre ordinateur ou sur un Raspberry Pi, c’est un projet open-source.

Une fois votre compte créé, il faut ajouter une souscription et une base de données. Notez le Public endpoint et le Default user password, ils seront nécessaire dans votre projet sur l’ESP32 pour vous connecter au service Redis Cloud.

Le Public endpoint de votre base de données
Le mot de passe de l’utilisateur par défaut

Création du projet ESP32 sous Visual Studio Code

Il faut ensuite créer le projet pour l’ESP32 dans Visual Studio Code. Créez un nouveau projet en sélectionnant la carte uPesy ESP32 Wroom DevKit et le Framework Arduino :

Une fois le projet crée, il faut ajuster la vitesse du moniteur série afin de pouvoir afficher quelques traces sur le terminal de Visual Studio Code.

Pour cela, ajouter la ligne suivante dans le fichier platformio.ini :

monitor_speed = 115200

Vous trouvez ci-dessous le code d’un projet qui connecte l’ESP32 à une station Wifi et qui stocke la puissance du signal reçu (RSSI) dans votre service Redis Cloud sous forme d’un TimeSeries. Utiliser un TimeSeries permet de pouvoir visualiser sous Grafana la variation de la valeur du RSSI dans le temps sous forme de courbe.

// Client Redis sur une carte ESP32 Wroom
// https://tutoduino.fr/
// Copyleft 2023
#include <WiFi.h>
#define WIFI_SSID "MonSSID"
#define WIFI_PWD "MonMotDePasse"
// Redis client
#define REDIS_ADDR "MonAdresseRedisCloud"
#define REDIS_PORT MonPortRedisCloud
const char REDIS_PASSWORD[] = "MonMdpRedisCloud";
WiFiClient redisConn;
void wifi_setup()
{
    WiFi.mode(WIFI_STA);
    WiFi.begin(WIFI_SSID, WIFI_PWD);
    Serial.println("\nConnecting");
    while (WiFi.status() != WL_CONNECTED)
    {
        Serial.print(".");
        delay(100);
    }
    Serial.println("\nConnected to the WiFi network");
    Serial.print("Local ESP32 IP: ");
    Serial.println(WiFi.localIP());
}
void redis_setup()
{
    if (!redisConn.connect(REDIS_ADDR, REDIS_PORT))
    {
        Serial.println("Failed to connect to the Redis server!");
        return;
    }
    // Envoie la commande AUTH au service Redis Cloud avec le mot de passe
    redisConn.printf("*2\r\n$4\r\nAUTH\r\n$%d\r\n%s\r\n", strlen(REDIS_PASSWORD), REDIS_PASSWORD);
    while (!redisConn.available())
    {
        delay(10);
    }
    String st = redisConn.readStringUntil('\n');
    if (st == "+OK\r")
    {
        Serial.println("Connected to the Redis server!");
    }
    else
    {
        Serial.printf("Failed to authenticate to the Redis server! Errno: %s\n", st.c_str());
    }
}
void setup()
{
    Serial.begin(115200);
    delay(1000);
    wifi_setup();
    redis_setup();
}
void loop()
{
    // Recupere la puissance du signal Wifi reçu (RSSI)
    Serial.printf("RSSI=%d\n", WiFi.RSSI());
    String rssi(WiFi.RSSI());
    // On souhaite stocker le RSSI dans un TimeSeries afin de pouvoir afficher sa variation dans le temps
    // Envoie la commande TS.ADD avec la cle RSSI et sa valeur
    redisConn.printf("*4\r\n$6\r\nTS.ADD\r\n$4\r\nRSSI\r\n$1\r\n*\r\n$%d\r\n%s\r\n", rssi.length(), rssi.c_str());
    delay(1000);
}

Il faut remplacer dans ce code “MonAdresseRedisCloud” par le Public endpoint de votre service Redis Cloud dont on aura supprimé le “:” et le numéro de port (nombre à la fin). Il faut remplacer MonPortRedisCloud par ce numéro du port.

Exemple si le Public endpoint est : redis-14378.c923.us-central-6-4.ec6.cloud.redislabs.com:14378 votre code devra ressembler à ceci :

#define REDIS_ADDR "redis-14378.c923.us-central-6-4.ec6.cloud.redislabs.com"
#define REDIS_PORT 14378

MonMdpRedisCloud” doit être remplacé par le Default user password de votre service Redis Cloud.

Le protocole utilisé par Redis est RESP3. Les commandes doivent être envoyées sous forme de liste de blob string. Par exemple, pour s’authentifier auprès serveur Redis, il faut envoyer la commande AUTH suivie du mot de passe. Supposons que le mot de passe soit “MonMotDePasse” qui fait 13 caractères, il faut donc envoyer la chaîne de caractères : *2\r\n$4\r\nAUTH\r\n$13\r\nMonMotDePasse\r\n” où *2 indique le nombre d’éléments dans la liste, $4 la longueur de la commande AUTH et $13 la longueur du mot de passe.

Téléverser le projet sur l’ESP32

Connectez votre carte ESP32 Wroom sur un port USB de votre PC et cliquez sur Upload and Monitor pour que le projet soit téléversé et exécuté sur l’ESP32.

Téléversement du projet sur l’ESP32

Dès que le projet est téléversé, il démarre et vous pouvez observer les valeurs du RSSI dans le terminal de Visual Studio Code.

Visualisation des données sous Grafana

Grafana permet de construire très simplement des tableaux de bord et de pouvoir les visualiser sur un navigateur.

Vous devez vous créer un compte limité mais gratuit sur le site Grafana. Une fois le service Grafana démarré, il faut installer le plugin Redis.

Une fois le plugin installé, il faut ensuite ajouter une nouvelle connection de type Data sources Redis :

Ajout d’une source Redis

Configurer la source de données Redis en indiquant l’adresse de votre service Redis Cloud qui est redis:// suivi de votre Public endpoint et le mot de passe de votre utilisateur par défaut.

Il faut ensuite créer un nouveau dashboard et une nouvelle Query sur la Data source Redis de type RedisTimeSeries. Sélectionnez la commande TS.RANGE avec la clé RSSI dont on souhaite visualiser la valeur sous forme de courbe. Cliquer sur RUN doit permettre de visualiser la courbe si la configuration est correcte.

Voilà, vous pouvez maintenant visualiser votre dashboard depuis un navigateur web.

Example de dashboard Grafana permettant de visualiser les données générées par un ESP32 et stockées sur un serveur Redis

Ce tuto est terminé, n’hésitez pas à donner votre avis et à laisser un commentaire, cela m’aidera à l’améliorer.

Merci à Gotronic et uPesy pour la fourniture de la carte ESP32 Wroom qui a été utilisée pour réaliser ce tutoriel !

Votre avis compte !

Note moyenne : 5 / 5. Nombre de votes : 2

Pas encore de vote pour ce tutoriel

Désolé si cet article ne vous a pas intéressé

Merci de commenter afin que je puisse l’améliorer.

Dites-moi comment améliorer cette page.