Projet

Général

Profil

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