Projet

Général

Profil

Nicolas Schmauch

Présentation personnelle et projet de stage

Je suis Nicolas Schmauch
Je suis un étudiant en BTS CIEL IR (Cybersécurité, Informatique et réseaux, Électronique).
Je suis en stage du 21 Mai 2024 au 28 Juin 2024 avec comme coéquipier Noah Cazeaudumec.
Le projet que nous continuons.
Réécriture Thermo-Bibli
Notre page à Noah et moi pour expliquer par où on a commencé et où on s'est arrêté et expliqué aussi les améliorations avenir.
Tutoriel et les définitions.

Rapport

Jour 1: Mardi 21 mai 2024

  • Création de la page "Je Me Présente".
  • Regarder les wikis des personnes qui ont travaillé sur le projet + wiki du projet.
  • Rejoins le groupe sur fablab sur Element.
  • Visionnage de cette vidéo

Jour 2: Mercredi 22 Mai 2024

  • Clone du code + installation de l'extension PlatformIO IDE sur VSCode.
  • Pour que l'extension PlatformIO IDE fonctionne, il faut installer python3 solution.
    Installation Python3
    sudo apt-get install python3-venv
  • J'ai aussi installé comme extension "C/C++ Extension Pack" qui contient "C/C++", "C/C++ Themes" et "CMake Tools"
  • Liens utiles :
    • Documentation de langages informatiques.
    • Documentation et vidéo platformio cli.
    • RMT qui est un driver/module qui permet d'envoyer et de recevoir des informations depuis l'esp32
    • Documentation MQTT qui servira à "relier" l'esp32 et le RaspberryPi0.
    • Visionnage d'une vidéo sur la configuration d'un tableau de bord Grafana.

Jour 3: Jeudi 23 Mai 2024

  • On a branché le projet et on a testé le code pour voir s'il fonctionnait.
    • Il fonctionne toujours, mais il manque un capteur, car câble coupé.
  • On sait connecter en SSH au Raspberry pi.
    • Installation MQTT + InfluxDB + Python3 avec modules sur le Raspberry pi.
      Installation MQTT Installation InfluxDB Installation Python3
      sudo apt install mosquitto sudo apt install influxdb sudo apt install python3

Mais au final, on ne va pas utiliser le Raspberry pi, car on va se connecter en shh à la V.M.

  • Pour pouvoir se connecter en ssh sur la V.M. il nous fallait nos clés publiques.
    Commande
    ssh-keygen -t ed25519
  • Dans le code, on a modifié (voir dessous) pour pouvoir mettre à l'heure le système.
    Avant Après
    NTPClient TimeClient(NtpUDP, "europe.pool.ntp.org"); NTPClient TimeClient(NtpUDP, "192.168.23.254");
  • On a fait aussi la rencontre avec Margot pour avancer dans le projet et elle nous a montré sa réécriture du projet.

Jour 4: Vendredi 24 Mai 2024

  • Essaie de régler le problème de SSH sur le pc vers la V.M.
  • Analyse de comment configurer Grafana
  • Réparation de la grappe des capteurs du projet.
  • Apprentissage de vim site tutoriel + vidéo.
  • TEST EN LOCAL
    • Installation Grafana + InfluxDB + Mosquitto sur le poste pour des tests en attendant que la connexion ssh fonctionne.
      Installation Grafana Installation InfluxDB Installation Mosquitto
      sudo apt install mosquitto
  • influxdb :
    • id : admin
    • mdp : admin132
    • API token Admin : V23m3FViSyrXkZXPL5hvjdsgtqLKb2FjVG2WyUxyZV9ndC43159DhTMSQicaK9AuLEda2mpGI1gwgQ5lIefwgA==
    • API token Grafana : 6YaoAYZawqcqV3JG6TiW-h9vRg_NqH_O3VcKWg_qGaWeN7FIUlvVlxAZsoeb-ubTLhRftxxrByd1G-KTObEY2A==
  • Installation des modules python :
    • sudo apt install python3-aiohttp
    • sudo apt install python3-paho-mqtt
sudo systemctl start grafana-server
sudo systemctl start influxdb
sudo systemctl start mosquitto

Jour 5: Lundi 27 Mai 2024

  • Aujourd'hui, on ne pouvait toujours pas se connecter en SSH, donc on a fait un partage de connexion au pc pour y accéder.
  • On a discuté avec Alexender (ancien étudiant qui a travaillé sur le projet) pour nous débloquer sur certain point.
  • On a trouvé une incohérence dans le code et dans la conf de mosquitto car dans le fichier conf de mosquitto (/etc/mosquitto/passwd.conf), il y a le MdP avec un token, mais le MdP ne correspond pas à celui dans le code.
    Donc, on a mis dans le code le même MdP que celui du fichier conf, mais la connexion MQTT ne fonctionne toujours pas malgré nos tentatives.

Jour 6: Mardi 28 Mai 2024

  • La connexion SSH fonctionne sans passer par un partage de connexion.
  • Nous avons constaté que la connexion MQTT ne fonctionnait pas, donc nous avons essayé un partage de connexion pour vérifier si le problème venait du réseau. En utilisant le partage de connexion, nous avons rencontré un problème avec l'heure, car celle-ci était fournie par le réseau de l'IUT. Nous avons donc configuré l'heure en utilisant le site "europe.pool.ntp.org". Une fois cela fait, sur la VM, on reçoit bien les données des capteurs. Donc, nous avons ainsi conclu que le problème de connexion MQTT n'était pas lié à l'heure, mais aux ports qui ne sont pas ouverts sur le réseau.
Schéma
  • Conclusion de la journée :
    Les données des capteurs sont bien envoyées et reçus par la V.M.
    Mais il nous manque des infos sur la configuration de InfluxDB (on n'a pas l'accès root sur la V.M.)

Jour 7: Mercredi 29 Mai 2024

On a fini le programme pour que les données soient dans un fichier json. "pas utile car on fera la BdD avec InfluxDB"
On a réussi à envoyer et à stoker les données envoyer par les capteurs dans la VM.
Essaie de faire fonctionner le dashboard sur Grafana avec les données des capteurs sur InfluxDB.
On a commencé le tuto du projet.
Adaptation du code python (test).

Réussi à créer un token pour Grafana avec la commande :

influx auth create --org <organisation> --read-bucket <bucket_id> --write-bucket <bucket_id>

Pour savoir l'organisation, on a fait :

influx org list

Pour savoir le bucket id, on a fait :

influx bucket list --org <organisation>

Jour 8: Jeudi 30 Mai 2024

  • Modification du script python "mqtt-python" pour l'adapter avec Grafana (le token, l'organisation, le bucket, le topic et la grappe).
  • Paramétrage de la datasource dans Grafana (accès a la base de données InfluxDB).
    Configuration de Grafana pour visualiser les données sur un graphique (un graphique pour : l'humidité, température et batterie).
    Adaptation code flux dans Grafana pour qu'il affiche correctement les données dans les graphiques.
Graphiques Grafana
Code Flux

Le THB sur l'image, c'est en fonction du graphique (sur Grafana) que l'on fait, il faut mettre "humidite" soit "temperature" soit "batterie".

  • On a continué à faire le tuto pour refaire le projet.
  • Recherche pour demain de comment mettre en place une alerte sur Grafana pour les seuils à ne pas franchir et envoyer l'alerte par mail.
  • On a trouvé la commande pour afficher les tokens déjà existants :
    influx auth list --org <organisation>
    
  • Pour voir les données sur le bucket "Fablab" dans "grappe2" (là où le script python envoie les données) :
    influx query 'from(bucket: "Fablab") |> range(start: -1d) |> filter(fn: (r) => r["_measurement"] == "grappe2") |> filter(fn: (r) => r["_field"] == "humidite") |> limit(n: 10)'
    

Jour 9: Vendredi 31 Mai 2024

  • Test de connecté le projet sur le réseau wifi du fablab, mais cela ne marche pas, car le port 1883 ne le permet pas, donc on a fait une demande pour pouvoir autoriser le trafic du port 1883 en tcp.
  • Essaie de faire fonctionner le capteur avec les piles et ça a fonctionné.
  • Configuration des dashboard et des alertes dans Grafana (si un certain seuil a été dépassé, alors ça nous envoie un mail).
  • On a continué à faire le tuto.
  • Pour plus tard, on fera la réparation des câbles abimer.

Jour 10: Lundi 03 Juin 2024

  • Essaie de se connecter au MQTT avec le réseau Wifi du fablab, j'ai remarqué qu'il ne recevait pas les requêtes qu'on lui envoie, on a donc envoyé un mail pour qu'il se charge du problème qu'il y a sur le réseau du fablab (le problème était qu'il avait mis de l'UDP au lieu de TCP).
  • Essaie des alertes pour voir si elles fonctionnent (réception du mail).
  • Réussi à se connecter au MQTT avec le réseau du fablab, mais il reste un problème, il n'arrive pas à transmettre les données dans Grafana.
  • Continuation du tuto.

Jour 11: Mardi 04 Juin 2024

  • Essai d'envoyer les données sur Grafana avec la connexion du Fablab, mais il y a un problème, ils sont bien reçus, car le script python sur la V.M. fonctionne, mais Grafana n'affiche rien sur les graphiques.
  • Debug pour trouver le problème avec Grafana, mais on ne la toujours pour aujourd'hui.
  • Continuation du tuto.

Jour 12: Mercredi 05 Juin 2024

  • Coupure de réseau toute la matinée, donc on n'a pas pu avancer.
  • Quand l'ESP32 envoie des données avec la date en étant connecté au réseau du fablab, la date n'est pas correcte, bloquer le 7 février 2036 (en boucle) alors qu'avec un partage de connexion, la date est correcte.
  • Pour savoir si cela, venez du serveur NTP de l'IUT, on a fait la commande "ntpdig 192.168.23.254" et elle nous bien la bonne date donc ce n'est pas le serveur NTP qui a un problème.
  • Avec Julien, on en a donc déduit que cela pouvez provenir de la ligne de code dans le main.cpp suivante :
    NTPClient TimeClient(NtpUDP, "192.168.23.254");
    
  • Donc le problème, c'est quand on connecte l'ESP32 au réseau du fablab (avec le serveur NTP 192.168.23.254), cela a un impact sur l'envoi vers le lien MQTT qui le fait boucler sur la même date incorrecte (le 7 février 2036) au lieu de donner une date qui avance dans le temps, car là cette date si on attend une heure, la date n'aura pas avancé d'une heure, comme si elle était bloquée sur une date fixe.

Jour 13: Jeudi 06 Juin 2024

  • On a trouvé le problème, c'était juste une fonction qui mettait mal à jour la date de l'adresse IP fixe du serveur NTP.
    La fonction : TimeClient.forceUpdate();
  • On doit tous mettre à jour (code sur Git, tuto, etc)
  • Réparation de certain câble pour les capteurs, mais à continuer demain.

Jour 14: Vendredi 07 Juin 2024

  • Réparation de la grappe avec les capteurs (câbles).
  • Trie dans les capteurs (fonctionnel et non fonctionnel).
  • Continuer à faire le tutoriel

Jour 15: Lundi 10 Juin 2024

  • Continuation du tuto.
  • On a réussi à faire fonctionner l'envoie de mail quand le seuil est atteint (température et humidité).
  • Essaie de régler le problème de valeur de la batterie, car on a 5V alors que l'on veut le pourcentage (toujours pas réussi).

Jour 16: Mardi 11 Juin 2024

  • Pour que VSCode puisse avoir accès au port ttyUSB0 :
    sudo adduser username dialout
    
  • Débogage pour savoir d'où vient le problème de la batterie qui donne que 5V.
  • On a terminé le tutoriel.
  • Mise à jour du script python sur le Git.

Jour 17: Mercredi 12 Juin 2024

  • Création du deamon pour notre script python.
    • On a mis le script dans /scripts-faits-maison/forwarder-mqtt-influxdb/mqtt-fablab.py
    • Puis on a été dans /etc/systemd/system pour créer le fichier "mqtt-fablab.service".
    • On a mis ce code dans le fichier "mqtt-fablab.service" :
      [Unit]
      Description = MQTT to Influxdb forwarder
      After = network.target
      Conflicts = getty@tty1.service 
      Requires=influxd.service
      Requires=influxdb.service
      Requires=mosquitto.service
      
      [Service]
      Type = simple
      ExecStart = /usr/bin/python3 /root/scripts-faits-maison/forwarder-mqtt-influxdb/mqtt-fablab.py
      User = root
      Group = root
      Restart = always
      SyslogIdentifier = <Name of logs for the service>
      RestartSec = 5
      TimeoutStartSec = infinity
      StandardInput = tty-force 
      
      [Install]
      WantedBy = multi-user.target
      
  • Et on a fait ces commandes :

Recharger systemd pour prendre en compte le nouveau service :

sudo systemctl daemon-reload

Démarrer le service et l'activer au démarrage :

sudo systemctl start mqtt-fablab.service
sudo systemctl enable mqtt-fablab.service

Vérifier le statut du service :

sudo systemctl status mqtt-fablab.service

Résolution du problème avec les piles (c'étaient juste les piles qui ne fonctionnaient plus et non, avec les nouvelles piles, on est bloqué à 61% au lieu de 5%).

Jour 18: Jeudi 13 Juin 2024

  • Adaptation du code pour avoir le bon pourcentage des piles qui s'affiche sur Grafana (amélioration du tableau + changement du facteur de conversion).
  • On a refait le tableau % -> Volt et on a modifié cette valeur :
    #define CONV_FACTOR 1.78
    
  • Avant :
    void Pangodream_18650_CL::_initVoltsArray(){
        _vs[0] = 3.200; 
        _vs[1] = 3.250; _vs[2] = 3.300; _vs[3] = 3.350; _vs[4] = 3.400; _vs[5] = 3.450;
        _vs[6] = 3.500; _vs[7] = 3.550; _vs[8] = 3.600; _vs[9] = 3.650; _vs[10] = 3.700;
        _vs[11] = 3.703; _vs[12] = 3.706; _vs[13] = 3.710; _vs[14] = 3.713; _vs[15] = 3.716;
        _vs[16] = 3.719; _vs[17] = 3.723; _vs[18] = 3.726; _vs[19] = 3.729; _vs[20] = 3.732;
        _vs[21] = 3.735; _vs[22] = 3.739; _vs[23] = 3.742; _vs[24] = 3.745; _vs[25] = 3.748;
        _vs[26] = 3.752; _vs[27] = 3.755; _vs[28] = 3.758; _vs[29] = 3.761; _vs[30] = 3.765;
        _vs[31] = 3.768; _vs[32] = 3.771; _vs[33] = 3.774; _vs[34] = 3.777; _vs[35] = 3.781;
        _vs[36] = 3.784; _vs[37] = 3.787; _vs[38] = 3.790; _vs[39] = 3.794; _vs[40] = 3.797;
        _vs[41] = 3.800; _vs[42] = 3.805; _vs[43] = 3.811; _vs[44] = 3.816; _vs[45] = 3.821;
        _vs[46] = 3.826; _vs[47] = 3.832; _vs[48] = 3.837; _vs[49] = 3.842; _vs[50] = 3.847;
        _vs[51] = 3.853; _vs[52] = 3.858; _vs[53] = 3.863; _vs[54] = 3.868; _vs[55] = 3.874;
        _vs[56] = 3.879; _vs[57] = 3.884; _vs[58] = 3.889; _vs[59] = 3.895; _vs[60] = 3.900;
        _vs[61] = 3.906; _vs[62] = 3.911; _vs[63] = 3.917; _vs[64] = 3.922; _vs[65] = 3.928;
        _vs[66] = 3.933; _vs[67] = 3.939; _vs[68] = 3.944; _vs[69] = 3.950; _vs[70] = 3.956;
        _vs[71] = 3.961; _vs[72] = 3.967; _vs[73] = 3.972; _vs[74] = 3.978; _vs[75] = 3.983;
        _vs[76] = 3.989; _vs[77] = 3.994; _vs[78] = 4.000; _vs[79] = 4.008; _vs[80] = 4.015;
        _vs[81] = 4.023; _vs[82] = 4.031; _vs[83] = 4.038; _vs[84] = 4.046; _vs[85] = 4.054;
        _vs[86] = 4.062; _vs[87] = 4.069; _vs[88] = 4.077; _vs[89] = 4.085; _vs[90] = 4.092;
        _vs[91] = 4.100; _vs[92] = 4.111; _vs[93] = 4.122; _vs[94] = 4.133; _vs[95] = 4.144;
        _vs[96] = 4.156; _vs[97] = 4.167; _vs[98] = 4.178; _vs[99] = 4.189; _vs[100] = 4.200;
    }
    
  • Après :
    void Pangodream_18650_CL::_initVoltsArray(){
        _vs[0] = 3.300; 
        _vs[1] = 3.309; _vs[2] = 3.318; _vs[3] = 3.327; _vs[4] = 3.336; _vs[5] = 3.345;
        _vs[6] = 3.354; _vs[7] = 3.363; _vs[8] = 3.372; _vs[9] = 3.381; _vs[10] = 3.390;
        _vs[11] = 3.399; _vs[12] = 3.408; _vs[13] = 3.417; _vs[14] = 3.426; _vs[15] = 3.435;
        _vs[16] = 3.444; _vs[17] = 3.453; _vs[18] = 3.462; _vs[19] = 3.471; _vs[20] = 3.480;
        _vs[21] = 3.489; _vs[22] = 3.498; _vs[23] = 3.507; _vs[24] = 3.516; _vs[25] = 3.525;
        _vs[26] = 3.534; _vs[27] = 3.543; _vs[28] = 3.552; _vs[29] = 3.561; _vs[30] = 3.570;
        _vs[31] = 3.579; _vs[32] = 3.588; _vs[33] = 3.597; _vs[34] = 3.606; _vs[35] = 3.615;
        _vs[36] = 3.624; _vs[37] = 3.633; _vs[38] = 3.642; _vs[39] = 3.651; _vs[40] = 3.660;
        _vs[41] = 3.669; _vs[42] = 3.678; _vs[43] = 3.687; _vs[44] = 3.696; _vs[45] = 3.705;
        _vs[46] = 3.714; _vs[47] = 3.723; _vs[48] = 3.732; _vs[49] = 3.741; _vs[50] = 3.750;
        _vs[51] = 3.759; _vs[52] = 3.768; _vs[53] = 3.777; _vs[54] = 3.786; _vs[55] = 3.795;
        _vs[56] = 3.804; _vs[57] = 3.813; _vs[58] = 3.822; _vs[59] = 3.831; _vs[60] = 3.840;
        _vs[61] = 3.849; _vs[62] = 3.858; _vs[63] = 3.867; _vs[64] = 3.876; _vs[65] = 3.885;
        _vs[66] = 3.894; _vs[67] = 3.903; _vs[68] = 3.912; _vs[69] = 3.921; _vs[70] = 3.930;
        _vs[71] = 3.939; _vs[72] = 3.948; _vs[73] = 3.957; _vs[74] = 3.966; _vs[75] = 3.975;
        _vs[76] = 3.984; _vs[77] = 3.993; _vs[78] = 4.002; _vs[79] = 4.011; _vs[80] = 4.020;
        _vs[81] = 4.029; _vs[82] = 4.038; _vs[83] = 4.047; _vs[84] = 4.056; _vs[85] = 4.065;
        _vs[86] = 4.074; _vs[87] = 4.083; _vs[88] = 4.092; _vs[89] = 4.101; _vs[90] = 4.110;
        _vs[91] = 4.119; _vs[92] = 4.128; _vs[93] = 4.137; _vs[94] = 4.146; _vs[95] = 4.155;
        _vs[96] = 4.164; _vs[97] = 4.173; _vs[98] = 4.182; _vs[99] = 4.191; _vs[100] = 4.200;
    }
    
  • Amélioration de la prise d'information sur l'état de charge des piles (prend 10 mesures et fais la moyenne de ses mesures).

Jour 19: Vendredi 14 Juin 2024

  • Mise en place de l'enregistrement des données sur le micro-contrôleur.
  • code mis en place :
      //--------------------  Début de l'enregistrement des données  --------------------//
    
      preferences.begin("chargelvl-hum-temp", false);
      int chargelvl = preferences.getInt("chargelvl", 1);
    
      // Boucle pour récupérer les valeurs dans le tableau puis les enregistrer.
      for (int i = 0; i < 5; i++)
      {
    
        char Temp[5];
        char Hum[5];
        float newTemp = preferences.getFloat(Temp, temp[i]);
        float newHum = preferences.getFloat(Hum, hum[i]);
    
        preferences.putFloat("temp", newTemp);
        preferences.putFloat("hum", newHum);
    
        Serial.printf("temp: %0.2f\n", newTemp); // print pour vérifier si les valeurs enregistrées sont les bonnes.
        Serial.printf("hum: %0.2f\n", newHum);
      }
    
      chargelvl = (chargelvl1 + chargelvl2 + chargelvl3 + chargelvl4 + chargelvl5 + chargelvl6 + chargelvl7 + chargelvl8 + chargelvl9 + chargelvl10) / 10; // Calcul de la moyenne du niveau de charge de la batterie.
    
      Serial.printf("chargelvl: %d\n", chargelvl); // print pour vérifier si les valeurs enregistrées sont les bonnes.
      preferences.putInt("chargelvl", chargelvl);
      preferences.end();
    
      //--------------------  Fin de l'enregistrement des données sur le micro-controleur  --------------------//
    
  • Essaie de faire en sorte que quand on perd la connexion au MQTT ou au Wi-Fi, les données enregistrées en local sur le micro contrôleur s'envoient quand la connexion est rétablie.

Jour 20: Lundi 17 Juin 2024

  • Mise en place de l'enregistrement de l'heure dans le code
  • Recherche de comment faire pour enregistrer les infos quand il n'y a plus de connexion au MQTT et Wi-Fi et qu'il n'enregistre rien en local (flash memory) quand la connexion fonctionne.
  • Optimisation de code + documentation.

Jour 21: Mardi 18 Juin 2024

  • Essaie de faire le code qui envoie les données en local au MQTT puis vers Grafana (pas réussi, mais les données sont bien stockées en local et sont écrits en local uniquement quand la connexion au MQTT ou au Wi-Fi échoue et on arrive aussi a stocké l'heure pour savoir à qu’elle l'heure les renvoyer sur Grafana.)
  • Réparation de deux connecteurs du projet.

Jour 22: Mercredi 19 Juin 2024

  • On a corrigé une erreur que l'on avait faite au tout début qui nous a pénalisé aujourd'hui.
  • L'erreur était que l'on avait modifié le fichier de MdP de Mosquitto (MQTT) et quand aujourd'hui, on a voulu relancer le service, on ne pouvait plus si connecter, mais je m'en suis rappelé, donc on a pu vite régler le problème.
  • On a juste recréé le fichier de MdP avec cette commande et supprimer l'ancien :
    sudo mosquitto_passwd -c /etc/mosquitto/passwd capteurs
    
  • Réparation du dernier connecteur qui dysfonctionner.
  • Toujours sur le même problème d'envoyer des données stocker en local quand la connexion refonctionne.

Jour 23: Jeudi 20 Juin 2024

  • Debug du code + commentaires.
  • Création de la fonction "sendLocalData" (qui permet l'envoie des données qui sont enregistrées en local par "localsave").
  • On a réussi à envoyer les données enregistrées en local sur l'ESP32 sur Grafana, mais il y a un problème avec les valeurs envoyé qui reste les mêmes (valeurs des capteurs 1, 2, 3, 4 et 5 sont les mêmes, mais qu'à l'envoi).

Jour 24: Vendredi 21 Juin 2024

  • Debug du code + commentaire.
  • Réussi à stoker plusieurs données puis à les envoyer, mais les anciennes données ne se font pas remplacer par les nouvelles reçues.

Jour 25: Lundi 24 Juin 2024

  • On a essayé de régler le problème avec ce que nous a dit Pierre "log rotate" mais on n'a pas réussi.
  • Commencement du rapport de stage.

Jour 26: Mardi 25 Juin 2024

  • On a réussi à faire la sauvegarde de données en local quand la connexion au MQTT échoue et on arrive aussi à les renvoyer quand la connexion est rétablie (avec les fonctions "void LocalSave()", "void clearOldData(int index)" et "void SendLocalData()"
  • On a commencé la page d'explication aux futurs stagiaires pour qu'ils ne soient pas comme nous, perdu à lire tous les documents de tout le monde et aussi savoir les améliorations que nous avons pensées à faire.

Jour 27: Mercredi 26 Juin 2024

  • Continuation de la page d'explication + rapport de stage.
  • Amélioration du tutoriel pour ajouter ceci :
    • Créer une organisation :
      influx organization create --name <nom_organisation>
      
    • Créer un bucket dans une organisation :
      influx bucket create --name <nom_organisation> --org-id <id_organisation>
      
    • Créer un token avec permission lecture/écriture dans un bucket :
      influx auth create --org-id <id_organisation> --read-bucket <id_bucket> --write-bucket <id_bucket> --description <votre_description>
      
    • Afficher toutes les organisations :
      influx org list
      
    • Afficher les Buckets d'une organisation :
      influx bucket list --org <nom_organisation>
      
    • Afficher les Tokens d'une organisation :
      influx auth list --org <nom_organisation>
      

Jour 28: Jeudi 27 Juin 2024

  • Rapport de stage + Nettoyage de l'ordinateur.

Jour 29: Vendredi 28 Juin 2024

Tutoriel

  • Pour information, avant de commencer ce tuto, il commence à partir de là où il faut envoyer les données grâce au lien MQTT (Mosquitto) vers InfluxDB (Base de données) (voir le schéma ci-dessous).
Schéma

Installation VSCode + PlatformIO IDE

  • Une fois VSCode installer, allez dans les extensions puis chercher et installer "PlatformIO IDE".
Extension
PlatformIO IDE

Code sur Git vers VSCode

  • Allez sur le Git puis sur les trois points "..." et sur "Ouvrir avec VS Code".
Git
  • Une fois sur VSCode, il vous demande de choisir où enregistrer le code. Choisissez là où vous le voulez et faites "Select as Repository Destination" puis "Add to Workspace".
Add to Workspace

Configuration Wi-Fi + NTP

  • Une fois que vous avez appuyé sur "Add to Workspace", allez dans le fichier "secret.h" et changer les valeurs de "SSID" et "PWD" pour mettre un réseau Wi-Fi puis Ctrl + s pour sauvegarder.
Wi-Fi
  • Une fois que vous avez choisi le réseau Wi-Fi, si vous avez pris celui du Fablab, alors il faut mettre cette adresse IP "192.168.23.254" dans le main.cpp (dossier src sur la gauche) ligne 39.
    • Si vous avez choisi un partage de connexion, alors il faut mettre ceci "europe.pool.ntp.org".
NTP

Branchement

  • Après avoir fait cela, il faut brancher le projet comme sur l'image si dessous et brancher les deux câbles USB sur le pc.
  • ATTENTION à ne pas se tromper de sens dans les branchements (regardez bien l'image).
Branchement

Téléverser le code

  • Vous pouvez maintenant envoyer le code dans le projet. Pour cela, allez sur VSCode et appuyez sur le bouton 1 puis attendre qu'il marque SUCCESS (en vert) et après appuyer sur le bouton 2 (voir image si dessous).
Bouton 1 et 2
  • Normalement, vous devriez avoir un résultat similaire à cela :
    25.50 25.50 25.60 25.60 25.70|60.20 55.90 55.60 59.80 55.40|01717757755

VM + SSH

  • À présent, vous allez devoir vous connecter à la machine virtuelle (VM) en SSH.
    • Pour cela, vous allez avoir besoin d'un compte utilisateur sur la VM et de la clé publique de votre ordinateur (demander à Pierre de vous créer un compte et donner lui votre clé publique et pas la privée).
      • Pour avoir votre clé publique, faite cette commande dans un terminal :
        ssh-keygen -t ed25519
        
  • Si vous avez votre compte, alors vous allez devoir ouvrir un terminal sur votre ordinateur et faire cette commande :
    ssh votre_nom_utilisateur@cohabit-capteurs.aquilenet.fr -p 55555
    
  • Si tous, c'est bien passé, vous devriez avoir cela :
SSH

Script python

  • Une fois sur la VM, vous devez copier le script python sur le Git et le coller dans un fichier sur la VM que nous allons créer.
    • Pour créer le fichier sur la VM faite :
      sudo nano nom_fichier_script.py
      
    • Une fois dedans, coller le script puis il faut modifier quelque valeur avant :

  • Modifiez-le "influx_bucket", "influx_token" et "influx_org" par vos valeurs.
    **Ctrl + s pour enregistrer et Ctrl + x pour fermer le fichier.
  • Pour lancer le script, faite cette commande :
    sudo python3 nom_fichier_script.py
    
  • Normalement, vous devriez avoir ceci apparaitre :
    ScriptPython
  • Vous pouvez aussi créer un daemon pour que le script tourne en permanence sur la VM.

Configuration Grafana

  • Passons à la configuration de Grafana.
    • Tous d'abord il vous faut un compte en Administrateur (demander à Pierre ou à Jean-Baptiste)
    • Puis aller sur "Configuration" puis "Data Sources" et cliquer sur "Add data source".
      • Pour la data source, vous aurez besoin de faire des commandes pour créer Organisation, Bucket et Token si nécessaire.
Data source
  • Vous arrivez sur cette page ou il faut chercher et choisir InfluxDB.
    InfluxDB
  • Après avoir choisi InfluxDB, suivez l'image ci-dessous.
    Date source
  • 0 - Name
    • Donner le nom que vous souhaitez à votre data source.
  • 1 - Query Language
    • Dans le menu déroulant, choisissez "Flux".
  • 2 - HTTP
    • Dans "URL" mettre celle-ci "http://localhost/8086" et laissez par défaut les autres paramètres.
  • 3 - Auth
    • Vérifiez que tout soit désactivé.
  • 4 - Custom HTTP Headers
    • Appuyez sur "Add header" et dans "Header" mettre "Authorization" et dans "Value" mettre votre Token de cette manière, "Token Votre_Token ".
  • 5 - InfluxDB Details
    • Dans "Organization" mettre le nom de la base de donnée que vous utilisez.
    • Dans "Token" mettre le même Token que vous avez mis pour le 4 (juste le Token sans mettre "Token" devant).
    • Dans "Default Bucket" Mettre le nom du Bucket que vous utilisez.
    • Ne pas toucher aux autres paramètres.
  • ATTENTION, ne jamais mettre le token admin !
  • Enfin, cliquez sur "Save & Test" cela doit afficher un message en vert.
    Dans le cas où c'est un message en rouge alors c'est que vous avez mal fait les paramètres ou que le Token et le Bucket que vous avez renseigné sont incorrectes.
  • On va maintenant créer un dashboard sur Grafana.
    Dashboard
  • Une fois le dashboard créé, on va faire le graphique, suivez l'image ci-dessous.
    Graphique
  • 1 - Choisissez bien "Graph".
  • 2 - Donnez un titre à votre graphique.
  • 3 - Choisissez votre Data Sources (créé précédemment)
  • 4 - Écrire le code flux ou vous pouvez le copier ici et l'ajuster si besoins.
  • 5 - Vous pouvez créer une alerte dans le cas où vous voudriez être avertie quand la batterie est presque à plat, voir ici pour savoir comment créer une alarme.

Définition

VM

  • Machine Virtuelle : Virtual Machine : En gros, c'est un ordinateur virtuel dans un ordinateur physique.

SSH

  • protocole Secure Shell : C'est une méthode pour contrôler à distance un ordinateur par ligne de commande (via le réseau).

InfluxDB

Organisation

Remplacez "<nom_organisation>" par une organisation existante.

  • Commande pour savoir les organisation existant :
    influx org list
    
  • Créer une organisation :
    influx organization create --name <nom_organisation>
    

Bucket

Remplacez "<nom_organisation>" par une organisation existante et "<id_organisation>" par un identifiant d'une organisation.

  • Commande pour savoir les Buckets d'une organisation :
    influx bucket list --org <nom_organisation>
    
  • Créer un bucket dans une organisation :
    influx bucket create --name <nom_organisation> --org-id <id_organisation>
    

Token

Remplacez "<nom_organisation>" par une organisation existante, "<id_organisation>" par un identifiant d'une organisation, "<id_bucket>" par un identifiant d'un bucket et "<votre_description>" par une description.

  • Commande pour afficher les Tokens déjà existant d'une organisation :
    influx auth list --org <nom_organisation>
    
  • Créer un token avec permission lecture/écriture dans un bucket :
    influx auth create --org-id <id_organisation> --read-bucket <id_bucket> --write-bucket <id_bucket> --description <votre_description>
    

Code Flux

À ajuster selon vos besoins (le bucket, les capteurs et le numéro de la grappe).

  • Pour Humidité
    from(bucket: "Fablab")
      |> range(start: v.timeRangeStart)
      |> filter(fn: (r) => r["_measurement"] == "grappe3")
      |> filter(fn: (r) => r["_field"] == "humidite")
      |> filter(fn: (r) => r["numero_capteur"] == "capteur1" or r["numero_capteur"] == "capteur2" or r["numero_capteur"] == "capteur3" or r["numero_capteur"] == "capteur4"or r["numero_capteur"] == "capteur5")
      |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
      |> aggregateWindow(every: $__interval, fn: mean)
    
  • Pour Température
    from(bucket: "Fablab")
      |> range(start: v.timeRangeStart)
      |> filter(fn: (r) => r["_measurement"] == "grappe3")
      |> filter(fn: (r) => r["_field"] == "temperature")
      |> filter(fn: (r) => r["numero_capteur"] == "capteur1" or r["numero_capteur"] == "capteur2" or r["numero_capteur"] == "capteur3" or r["numero_capteur"] == "capteur4"or r["numero_capteur"] == "capteur5")
      |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
      |> aggregateWindow(every: $__interval, fn: mean)
    
  • Pour Batterie
    from(bucket: "Fablab")
      |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
      |> filter(fn: (r) => r["_measurement"] == "grappe3")
      |> filter(fn: (r) => r["_field"] == "batterie")
      |> filter(fn: (r) => r["numero_capteur"] == "capteur2")
      |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
      |> aggregateWindow(every: $__interval, fn: mean)
    

Daemon

  • Daemon c'est un type de programme informatique, un processus ou un ensemble de processus qui s'exécute en arrière-plan plutôt que sous le contrôle direct d'un utilisateur.
  • Pour faire un daemon du script, il faut mettre son script dans "/scripts-faits-maison/forwarder-mqtt-influxdb/votre_script.py"
    • Pour aller dedans, il faut se connecter à la VM et faire :
      sudo -i 
      
    • Puis faire :
      cd scripts-faits-maison/forwarder-mqtt-influxdb/
      
    • et copier votre script dedans.
  • Après cela, il faut créer un fichier .service dans "/etc/systemd/system"
    • Mais avant, il faut quitter le mode "sudo -i" donc, marquez juste "exit" puis faite :
      cd /etc/systemd/system
      
    • Pour créer le fichier "nom_de_votre_script.service".
      sudo nano nom_de_votre_script.service
      
    • Et mettre ce code dedans (faite attention de ne pas vous tromper dans "ExecStart" (le nom et le chemin du script))
      [Unit]
      Description = MQTT to Influxdb forwarder
      After = network.target
      Conflicts = getty@tty1.service 
      Requires=influxd.service
      Requires=influxdb.service
      Requires=mosquitto.service
      
      [Service]
      Type = simple
      ExecStart = /usr/bin/python3 /root/scripts-faits-maison/forwarder-mqtt-influxdb/votre_script.py
      User = root
      Group = root
      Restart = always
      SyslogIdentifier = <Name of logs for the service>
      RestartSec = 5
      TimeoutStartSec = infinity
      StandardInput = tty-force 
      
      [Install]
      WantedBy = multi-user.target
      

Maintenant, il faut le recharger pour prendre en compte le nouveau service :

sudo systemctl daemon-reload

Démarrer le service et l'activer au démarrage de l'ordinateur :

sudo systemctl start votre_service.service
sudo systemctl enable votre_service.service

Vérifier le statut du service :

sudo systemctl status votre_service.service