## <span style="color:red"> SAE204 Projet Intégratif - Partie InfluxDB/Grafana ### <span style="color:red"> Création de la base de donnée InfluxDB Suite la partie réseau ou on a installé et lancé les services Grafana et InfluxDB il faut maintenant configuré la base de données InfluxDB. On commence pas se connecter a InfluxCLI depuis la VM ![image](https://hackmd.io/_uploads/Hyi88bP40.png) L'interface de commandes est similaire a celle de MySQL Ensuite on va créer la base de donnée `iot` qui stockera les trois informations (Humidité en %, la pression en hectopascal et la luminosité en lux), et également indiqué si le technicien est présent ou pas ![image](https://hackmd.io/_uploads/BkqJOWw4R.png) Ensuite on va créé un utilisateur Grafana qui va recupérer les informations de la base de données ![image](https://hackmd.io/_uploads/SyXy3ZDEC.png) Ensuite on ajoute dans Grafana ![image](https://hackmd.io/_uploads/SJSmnWDVC.png) ![image](https://hackmd.io/_uploads/BJDzhWPEA.png) On fait `Save and Test` pour valider ![image](https://hackmd.io/_uploads/r1uP3ZwV0.png) Grafana est connecté a InfluxDB ### <span style="color:red"> Mise en Place de l'envoit des données dans InfluxDB Maintenant que la base de donnée a été créé on va pouvoir envoyé les données convertis dans la base de données, pour cela on modifie le programme python `recomposition.py` qui sera en version V3 ``` import serial import struct import requests # Fonction pour calculer le CRC def calculate_crc(data): crc = 0xFFFF for byte in data: crc ^= byte for _ in range(8): if crc & 0x0001: crc = (crc >> 1) ^ 0xA001 else: crc >>= 1 return crc # Fonction pour lire les données depuis le port série et les envoyer à InfluxDB def read_and_send_data(port, influxdb_url): ser = serial.Serial(port, 9600, timeout=1) while True: if ser.read(2) == b'Te': data = ser.read(11) crc_received = struct.unpack('<H', ser.read(2))[0] ser.read(2) if calculate_crc(data) == crc_received: humidity = struct.unpack('f', data[:4])[0] pressure = struct.unpack('f', data[4:8])[0] luminosity = struct.unpack('<H', data[8:10])[0] cable_state = data[10] print(f'Humidité: {humidity:.2f} %') print(f'Pression: {pressure:.2f} hPa') print(f'Luminosité: {luminosity} lux') print(f'Présence du technicien : {"Oui" if cable_state else "Non"}') print(f'CRC: {crc_received:04X}') # Envoi des données à InfluxDB data_to_send = f"iot,location=iut humidity={humidity},pressure={pressure},luminosity={luminosity},cable_state={'true' if cable_state else 'false'}" response = requests.post(influxdb_url, data=data_to_send) if response.status_code == 204: print("Données envoyées avec succès à InfluxDB") else: print(f"Erreur lors de l'envoi des données à InfluxDB : {response.status_code}") else: print('Le contrôle de somme n\'est pas valide !') if __name__ == "__main__": serial_port = '/dev/serial0' influxdb_url = 'http://10.12.0.25:8086/write?db=iot' read_and_send_data(serial_port, influxdb_url) ``` On utilise les modules `struct` et `requests`, pour le transfert de données on utilise l'IP publique de influxDB soit `10.12.0.25:8086`, on s'intéresse a la ligne data_to_send `data_to_send = f"iot,location=iut humidity={humidity},pressure={pressure},luminosity={luminosity},cable_state={'true' if cable_state else 'false'}"` On utilise une f string, ce qui nous permet de mettre des variables dans une chaine de caractères. On va analyser par parties iot -> indique la base de données dans influxDB location=iut -> Indique l'emplacement des capteurs, on indique IUT par exemple humidity={humidity},pressure={pressure},luminosity={luminosity} -> On associe chaque variable a une cable_state={'true' if cable_state else 'false'} -> La présence du technicien est envoyé comme un booléen Pour vérifié que les données sont bien envoyé, depuis la raspberry pi on utilise curl pour regardé `curl -G 'http://10.12.0.25:8086/query?db=iot' --data-urlencode 'q=SELECT * FROM "iot" WHERE time > now() - 5s'` On fait ici une selection dans la base de donnée iot avec la condition que ça soit dans les 5 dernières secondes, cela devrait retourner une seul entrée. On obtient cela `{"results":[{"statement_id":0,"series":[{"name":"iot","columns":["time","cable_state","humidity","location","luminosity","pressure"],"values":[["2024-06-11T08:45:11.635859103Z",true,40.57745361328125,"iut",2511,101187.9453125]]}]}]}` On voit bien une entrée avec le temps et toute les autres valeurs ### <span style="color:red"> Création des dashboard dans Grafana avec les requêtes InfluxQL Maintenant on va crée le tableau de bord Grafana et les 4 panneaux Déja il faut choisir les requetes SELECT a mettre en place Luminosité : `SELECT mean("luminosity") AS "luminosity" FROM "iot" WHERE $timeFilter GROUP BY time($__interval)` Pression : `SELECT mean("pressure") AS "pressure" FROM "iot" WHERE $timeFilter GROUP BY time($__interval)` Humidité : `SELECT mean("humidity") AS "humidity" FROM "iot" WHERE $timeFilter GROUP BY time($__interval)` Présence du technicien : `SELECT "cable_state" FROM "iot" WHERE $timeFilter` On va ensuite crée le dashboard dans le menu `Tableaux de bord` ![new-dash](https://hackmd.io/_uploads/H19VbcHrC.png) Puis `Ajouter une visualisation` ![datasource](https://hackmd.io/_uploads/HkAK-qrS0.png) Ensuite on va créer 4 panel avec les 4 requêtes SELECT, puis on fait des ajustements sur l'apparence des panel en ajoutant notaments les unités (lux, % et hPa). Pour finir on enregistre le tableau de bord et on le met en page d'accueil ![image](https://hackmd.io/_uploads/SyMeO2prR.png) Pour tester le bon fonctionnement on a par exemple mis notre main au dessus du capteurs -> l'humidité augmente, la luminosité descend. Quand on met le flash du téléphone on une grande augmentation de la luminosité. On fait varié le levier sur la carte Arduino pour indiqué la présence du technicien. Cela est également fonctionnel.