Suivre la qualité de l'air en intérieur sur RPI 0

## Le matériel.

Une sonde de mesure de VOC voir la définition [ici](https://fr.wikipedia.org/wiki/Compos%C3%A9_organique_volatil) dans notre cas BME680 | sgp30 et un raspberry Pi ici un Zero mais pour tous les RPI les connecteurs GPIO sont identiques.


+ BME680
[Fiche technique du capteur](https://doc.riot-os.org/group__drivers__bme680.html)

![Bme680](images/bme680.jpg)

+ SGP30
[Fiche technique du capteur](pdf/Sensirion_SGP30.pdf)

![sgp30](images/sgp30.jpg)

+ Le rpi0

[Les caractéristiques du Pi 0](https://www.raspberrypi.org/documentation/usage/gpio/)

![piZero](images/Pi-Zero-W-1_400x.jpg)


Et des cables entre les deux suivant ce schéma. Le cablage est identique pour les deux capteurs.

|   BME680	|  Description 	| GPIO PI0  	|
|---	|:---:	|---:	|
|  **VCC**	|   3.3 V	|   P1	|
|  **GND** 	|  Ground	|   P9	|
|  **SCL**	| I2C SCL	|   P5	|
|  **SDA**	| I2C SDA	|   P3	|

**A noter**
Les deux capteurs sont basés sur des technologies identiques. **Mox Gas Sensor** par contre les résultats fournis sont très différents

* bme680 retourne un indice de 100 à 0
* sgp30 retourne une valeur E-co2 en ppm et Tvoc ppb.

## Les logiciels

### les installations

Les éléments logiciels à installer sont :

+ **les packages**
  + pip (apt install python-pip)
  + mosquitto-clients ( apt install mosquitto-clients )
  + i2c-tools ( apt install i2c-tools )
+ **python**
  +  paho-mqtt (pip install paho-mqtt)
  +  [bme680](https://pypi.org/project/bme680/) (pip install bme680)
  +  [spg30](https://pypi.org/project/pimoroni-sgp30/) (pip install pimoroni-sgp30)


### la configuration

Il s'agit de l'activation du protocole I2C sur le raspberry PI Zero.
Pour cela on utilise raspi-config option
+  3 Interface Options
![config](images/i2c-config.png)

Et aprés le branchement du capteur bme280 ou sgp30 et un reboot on peut vérifier si i2c est vu par le systeme.

Vérification par les deux commandes

+ dmesg | grep i2c
+ lsmod | grep i2c

puis on lance la commande suivante pour trouver le parametre à utiliser dans le code Python:

>i2cdetect -y 1   
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f   
00:          -- -- -- -- -- -- -- -- -- -- -- -- --   
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --   
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --   
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --   
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --   
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --   
70: -- -- -- -- -- -- **76** --   

Cette valeur est l'adresse du capteur sur le bus I2C cette adresse est différente pour le capteur Sensirion SGP30 : **58**

**Nota!!!** pour utiliser le device i2c à partir d'un utilisateur il faut ajouter cet utilisateur au groupe i2c.

> adduser username i2c

### Les codes Python.

Celui du bme680 est assez proche de celui du capteur bme280

Celui-ci lit les valeurs sur la sonde puis transmets le tout au broker mqtt.

Celui du sgp30 est assez différents, mon code s'inspire du github [suivant](https://github.com/rendzina/SGP30).

Qui utilise la librairie PiMoroni et crée une classe héritée dans le Python, ajoutant une nouvelle fonction pour retourner les données brutes.

 ```python
# Create inherited SPG30 class allowing access to raw values
class SGP30_Raw(SGP30):
 def get_air_quality_raw(self):
       eco2, tvoc = self.command('measure_air_quality')
       return (eco2, tvoc)
##
```

Le reste du code étant semblable.

**NOTA** Je mettrai à jour un repository github avec les différents codes début 2022 ;-)

## La mise en place d'un service

Ayant maintenant 5 capteurs j'ai mis en place sur chaque systeme un service qui automatise les démarrages.

### Le systemd service file.

creation d'un fichier descriptif bme680.service
```bash
[Unit]
Description=C° VOC Humidité Service
After=multi-user.target

[Service]
Type=idle
ExecStart=/usr/bin/python /home/pi/src/bme680/mqttbme680.py
WorkingDirectory=/home/pi/src/bme680
Restart=always
RestartSec=10
User=pi

[Install]
WantedBy=multi-user.target

```

### Activation
```bash

sudo cp bme680.service /lib/systemd/system

sudo systemctl enable bme680.service
sudo systemctl start bme680.service

sudo systemctl status bme680.service

 ● bme680.service - C° PA Humidité Service
     Loaded: loaded (/lib/systemd/system/bme680.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2021-12-06 19:19:36 CET; 6 days ago
   Main PID: 15772 (python)
      Tasks: 2 (limit: 529)
        CPU: 2h 52min 51.411s
     CGroup: /system.slice/bme680.service
             └─15772 /usr/bin/python /home/pi/src/bme680/mqttbme680.py

Dec 13 18:17:09 pi0bme680 python[15772]: Gas: 201979.80 Ohms,humidity: 33.70 %RH,air quali>
Dec 13 18:17:09 pi0bme680 python[15772]: Gas: 203041.08 Ohms,humidity: 33.67 %RH,air quali>
Dec 13 18:17:09 pi0bme680 python[15772]: Gas: 202214.68 Ohms,humidity: 33.66 %RH,air quali>
Dec 13 18:17:09 pi0bme680 python[15772]: Gas: 204113.57 Ohms,humidity: 33.65 %RH,air quali>
Dec 13 18:17:09 pi0bme680 python[15772]: Gas: 205318.59 Ohms,humidity: 33.63 %RH,air quali>
Dec 13 18:17:09 pi0bme680 python[15772]: Gas: 202568.02 Ohms,humidity: 33.62 %RH,air quali>
Dec 13 18:17:09 pi0bme680 python[15772]: Gas: 204353.44 Ohms,humidity: 33.65 %RH,air quali>
Dec 13 18:17:09 pi0bme680 python[15772]: Gas: 203278.43 Ohms,humidity: 33.67 %RH,air quali>
Dec 13 18:17:09 pi0bme680 python[15772]: Gas: 201862.56 Ohms,humidity: 33.70 %RH,air quali>
Dec 13 18:17:09 pi0bme680 python[15772]: Gas: 202097.17 Ohms,humidity: 33.75 %RH,air quali>
pi@pi0bme680:~/src/bme680 $
```
## Le suivi des résultats.
Le suivi ce fait avec grafana  / influxdb / mqtt et telegraf.

Le résultat bme680 suivi dans deux piéces différentes.
![indice](images/iaq1.png)

E-co2 avec sgp30 dans une piéce avec un espace cuisine

![e-co2](images/iaq2.png)