Projet

Général

Profil

Alexander Dales

  • Stage de 16 semaines débuté en avril-juin 2021
  • Diplômé du BTS SNIR et LPRO ADSILLH

Bénévole au Fablab pour toute la partie infra/réseau du serveur et VM (aussi connu pour tout casser quand je suis présent).

P'tit site sympathique pour apprendre quelques raccourcis et commandes linux: https://agreugr.eu

"Fidget Toy Cube" : https://www.thingiverse.com/thing:2595224

TUTO A NE PAS SUIVRE CAR NON VALIDé

1- Installation de grafana (fait)
Suivre procédure d'installation chapitre apt : https://grafana.com/docs/grafana/latest/setup-grafana/installation/debian/

install-grafana

Si vous n'utilisez pas de reverse proxy cette partie là est faites pour vous (si vous ne savez pas ce qu'est un reverse proxy c'est surement aussi fait pour vous :) ) : https://grafana.com/docs/grafana/latest/setup-grafana/installation/debian/#serving-grafana-on-a-port--1024

port-inferieur-1024-grafana

Lors de la première connexion le login et mot de passe sont "admin", il est TRES FORTEMENT ++ conseillé de changer de mot de passe.

Et voilà Grafana d'installé bravo.

Nous configurerons plus en détail grafana(dont l'ajout de source de données qui sera influx) après avoir installé influxdb.

2- Installation et configuration d'INFLUXDB (la base de donnée qui enregistre les valeurs)

(pour le test de la doc faire un "su -" avant de commencer et ensuite lire à minima une fois le fichier de note avec la commande "cat lefichier" (ou flèche du haut pour retrouver la commande)

Tout d'abord aller sur cette page et sélectionner la version correspondante : https://portal.influxdata.com/downloads/

Dans notre exemple ça sera

Commande installation influx2

INFLUX CLI (ligne de commande) (cette méthode est beaucoup plus simple en réalité malgré que ça ne soit que par terminal)

Ensuite il faut faire la commande en "root": influx setup

Et remplir les différents champs

influx-setup

Une fois cela fait, il faut sauvegarder les information admin dont le token (cette jolie suite de chiffre/lettre/caractère spéciaux qui fini par ==).

Puis créer un token limité en lecture sur la nouvelle base créé (pour grafana) (si jamais pour que ça soit plus simple pour le test de la doc vous pouvez utiliser partout le token du compte admin ça fonctionnera tout autant :) ):

creation-token-readonly-influx

Ne pas hésiter à créer un nouveau token pour le script passerelle MQTT->influx. https://docs.influxdata.com/influxdb/cloud/security/tokens/create-token/#create-a-token-using-the-influx-cli

Et voilà. (en cas d'oublis de note des tokens il y a la commande: "influx auth list"

INFLUX GRAPHIQUE (non fini et trop compliqué pour le test et inutile si la vers "CLI" a été utilisé)

Se connecter à l'interface web Influxd, rentrez les informations demandés (nom utilisateur, mot de passe, nom d'orga etc ...)
Ensuite il faut bien stocker la clef/token API de côté et SURTOUT NE PAS LA PARTAGER

Exemple sur l'image ci-dessous :
influx-token-api

Ensuite cliquez sur l'icône encadrée en violet puis sur "API TOKENS"

Puis générer un token pour grafana (histoire de ne pas lui donner le token administrateur)

Ne pas hésiter à créer un nouveau token pour le script passerelle MQTT->influx. https://docs.influxdata.com/influxdb/cloud/security/tokens/create-token/#create-a-token-using-the-influx-cli

Configuration DATASOURCE grafana.

Maintenant qu'INFLUX a été installé et configuré, il est temps d'ajouter le lien vers influxdb.

Il faut aller dans administration puis data sources, puis add datasource -> selectionner InfluxDB

grafana-menu-admin

Indiquer dans le champ "URL": "http://localhost:8086", enfin ajouter les informations restante qui correspondent aux champs.

influx-datasource-conf

Si lorsque vous appuyez sur "save & test" normalement tout ce passe bien un message vert apparaît avec comme indication soit "1 bucket found" si vous avez créé un token spécial pour grafana ou "3 bucket found" si vous avez utilisé le token admin.

token-influx-ok-on-grafana

3- Mosquitto (MQTT) (c'est le serveur/application d'écoute qui réceptionne les données du capteurs)

Installer Mosquitto: sudo apt install mosquitto

Ajouter à la fin du fichier dans /etc/mosquitto/mosquitto.conf (pour se faire il y a la commande nano pour modifier le fichier facilement, pour sortir il suffit de faire la touche "ctrl" et la touche "x" puis valider si vous voulez enregistrer ou non):

password_file /etc/mosquitto/passwd.conf
allow_anonymous false

listener 1883

(le mot de passe à indiquer sera "test")
Pour créer le mot de passe: mosquitto_passwd -c /etc/mosquitto/passwd.conf test

faire ensuite

-4 SCRIPT PYTHON relai MQTT (il permet de faire la liaison entre la base de donnée influx et la réception des données)

(Pour le test de la doc sauter tout cette partie qui est déjà fait)

Pour cette partie il faut tout d'abord installer les dépendances du script:

pip3 install aiohttp
pip3 install paho.mqtt
#!/usr/bin/python3

#lib pour faire le timestamp
#from datetime import datetime

#lib pour ecoute mqtt 
import paho.mqtt.client as mqttClient
import time
import sys

#http request lib
import requests
from aiohttp import ClientSession

##################################################################################################

#var mqtt
TOPIC = "test" 
broker_address= "localhost"  
port = 1883                        
nom_client = "serveur-test" 

#var influx
influx_bucket = "thermo-bibli" #database
influx_token = "CkhY3kMW8OSexsLO9wA4QZZrIptZRzhONzmdr-NZtAl3TaWu3RzAxpM-bjYXirZ2SlLN7_Xppog33q9S6jg26A==" #token thermo-bibli
influx_org="thermo-bibli" 
influx_url=f"http://localhost:8086/api/v2/write?org={influx_org}&bucket={influx_bucket}&precision=s" 

#########################################################################################################

#http
async def get(session: object, url: object) -> object:
    async with session.get(url) as response:
        return await response.text()

#enregistre dans un fichier pour debug
def log(time):
    f = open("/var/log/mqtt-influxdb/date.txt", "a")
    f.write(time + "\n")
    f.close()

def dump_log(text):
    f = open("/var/log/mqtt-influxdb/dumped_message_thermo-bibli_prod", "a")
    f.write(text + "\n")
    f.close()

#envois les donnees a influx via l'apiv2
def addData(time, numero_grappe, numero_capteur, temp, hum, batterie): # ajoute donnée à base de donnée influxDB
    Headers = {"Authorization": f"Token {influx_token}"}

    #data envoye a l'api
    Data=f"{numero_grappe},numero_capteur={numero_capteur} temperature={temp},humidite={hum},batterie={batterie} {time}" 
    response = requests.post(influx_url, headers=Headers, data=Data)

    #debug api, fonctionne correctement malgres le code retour 204, quand il y a un code 204 le json response fait une erreur
    #print("Status Code", response.status_code)
    #print("JSON Response ", response.json())

def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))
    client.subscribe(TOPIC, 2)

def on_message(client, userdata, message):
    message = (message.payload).decode("utf-8")  # convertit type bytes en string
    print("Message reçu")
    tab = message.split("|")
    temp = tab[2].split()
    hum = tab[3].split()
    batterie = tab[4]
    L = len(temp)
    time=tab[0]

    #envois la valeur temps reçu pour le debug
   #log(time + " reçu")
    for i in range(L):
        addData(time, tab[1], "capteur" + str(i+1), temp[i], hum[i], batterie)
    #log("---------")

    #dump_log(message)

client = mqttClient.Client(nom_client, False)
client.username_pw_set(username="test",password="test")
client.on_connect= on_connect                      #callback
client.on_message= on_message                      #callback
client.connect(broker_address, port, 65535)          
client.loop_start()       

try:
    while True:
        time.sleep(0.1)

except KeyboardInterrupt:
    print ("exiting")
    client.disconnect()
    client.loop_stop()

Il faut ensuite exécuter le script. Pour se faire il y a plusieurs choix. Soit exécuté à la main dans un "tmux" ou un "screen", soit faire un cron ou service. Pour faire juste un test il est aussi possible de juste exécuté le script dans un terminal tout simplement.

FINI

Vérification de la configuration

Enfin pour tester tout cela on peut simuler la réception d'un message en installant le paquet "mosquitto-clients" avec la commande: "sudo apt install mosquitto-clients".

Ensuite il faut utiliser la commande: mosquitto_pub -h localhost -u test -P test -t test -m "1687910400|grappe1|30.70 30.00 35.80 35.40 33.01|30.60 30.40 30.20 30.20 30.10|30"

Pour faire une courbe faire ensuite la commande: mosquitto_pub -h localhost -u test -P test -t test -m "1688073926|grappe1|18.70 17.00 15.80 15.40 13.01|20.60 20.40 20.20 20.20 20.10|80"

pour les visualiser il suffit de sélectionner "last 7 days" dans grafana.

Si vous voyez une courbe apparaître c'est que vous avez réussit et que vous êtes au moins aussi doué que des stagiaires de BTS INFORMATIQUE en 1 jour donc un grand bravo à vous :D

Si vous voulez vous amusez à créer des valeurs, la première suite de chiffre donne la date (nombre de seconde depuis le 1er janvier 1970 aussi appeler timestamp), ensuite il ne faut pas modifier "grappe1", les valeurs suivantes sont la température des 5 capteurs, puis l'humidité, et enfin la dernière valeur est la batterie qui gère la grappe. (la grappe est le rassemblement de tout les capteurs).

Le lien du projet: https://projets.cohabit.fr/redmine/projects/thermo-bibli/wiki
La réserve de livre en question: https://projets.cohabit.fr/redmine/projects/thermo-bibli/wiki/Carreire