## <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

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

Ensuite on va créé un utilisateur Grafana qui va recupérer les informations de la base de données

Ensuite on ajoute dans Grafana


On fait `Save and Test` pour valider

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`

Puis `Ajouter une visualisation`

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

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.