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/¶
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
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
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
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 ):
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 :
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
Indiquer dans le champ "URL": "http://localhost:8086", enfin ajouter les informations restante qui correspondent aux champs.
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.
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
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