Catégories
Clients Linux

Graphiques DHT22/AM2302 avec Zabbix

Cette bidouille (ainsi que la v2!) a pour but d’interconnecter des sondes AM2302 (qui sont des sondes DHT22 pré-câblées) avec un Raspberry Pi et Zabbix. Il sera ainsi possible de visualiser les courbes de température et d’humidité pour une ou plusieurs sondes, mais aussi de recevoir des alertes liées soit à la température, soit à l’humidité. L’astuce ici réside dans le code utilisé, la traditionnelle classe AdaFruit donnant souvent de mauvais résultats (le fameux Failed to get reading. Try again!).

Hardware

Dans tous les cas, il vaut mieux privilégier les sondes avec résistance et condensateur intégrés pour éviter les défauts de communication (4,7kΩ et 100nF):
https://www.az-delivery.com/products/dht22-temperatursensor-modul?_pos=3
Les mêmes, sur Amazon:
https://www.amazon.fr/gp/product/B07L4WCFPZ/ref=ppx_yo_dt_b_asin_title_o03_s00?ie=UTF8&psc=1

Il faut aussi veiller à utiliser des câbles de bonne qualité, les interférences liées au courant fort pouvant très facilement fausser les résultats. Les câbles réseau de type « SF/FTP » sont les meilleurs car blindés. Mais comme ils sont aussi chers et surdimensionnés, cette référence fonctionne aussi super bien: LIYCY 3×0,25 TGL (équivalent blindage S/UTP).

Au sujet de l’alimentation: pour les sondes les plus proches du Raspberry Pi, 3.3V en VCC suffiront en général. Pour les plus éloignées, 5V seront peut-être nécessaires.
Le mieux est de toujours tester d’abord en 3V puis en 5V, selon la distance des sondes, la qualité du câble utilisé, les sources de perturbations magnétiques, etc. Il est possible de relier la tresse de blindage du câble à une des masses du Raspberry Pi pour améliorer la communication si cela est nécessaire.

Ensuite, il est possible de commencer le montage sur les GPIO du Raspberry Pi (PIN 22, 23, 24, etc). Attention malgré tout:
/!\ Le meilleur conseil est de toujours câbler alors que le Raspberry Pi est éteint /!\
Si par malheur le 3.3V touche le 5V, le Raspberry Pi ne sera plus qu’un bon presse-papier de geek, à moins d’être motivé à ressouder un nouveau et minuscule contrôleur d’alimentation PMIC MxL7704. C’est du vécu…

Software côté Pi 1/2: Python

Dans /opt/dht22/, on dépose la très utile et indispensable classe DHT22.py: http://abyz.me.uk/rpi/pigpio/examples.html#Python_DHT22_py

Ce code a pour particularité d’utiliser pigpiod et non pas le traditionnel système proposé par AdaFruit (https://github.com/adafruit/Adafruit_Python_DHT/).

Il faudra donc vérifier la présence du paquet pigpio sous Raspbian, et l’activer au boot avec systemctl enable pigpiod.service.
Ensuite, on peut passer au code Python qui sera lancé par l’agent Zabbix toutes les X minutes ou secondes.

Toujours dans /opt/dht22/, on créé un fichier par GPIO (ici, GPIO 22, 23, 24 et 25). 4 sondes AM2302 nécessitent donc 4 fichiers Python:
– dht22_pin22.py
– dht22_pin23.py
– dht22_pin24.py
– dht22_pin25.py

Exemple avec le GPIO n°22, soit /opt/dht22/dht22_pin22.py :

#!/usr/bin/env python
import sys
import pigpio
import DHT22
from time import sleep

invalid_input = True
def retrieve() :
        pi = pigpio.pi()
        s = DHT22.sensor(pi,22)
        s.trigger()
        sleep(1)
        humidity = '{:3.1f}'.format(s.humidity() / 1.)
        temperature = '{:3.1f}'.format(s.temperature() / 1.)
        if temperature != "-999.0" or humidity != "-999.0":
                print("Temp=" + temperature + "* Humidity=" + humidity + "%")
                s.cancel()
                pi.stop()
                invalid_input = True
                sys.exit(1)
        else:
                s.cancel()
                pi.stop()
                invalid_input = False

while invalid_input :
        retrieve()

Pour chaque fichier, il faudra juste modifier la ligne 10 avec le numéro du GPIO: s = DHT22.sensor(pi,22).

On peut ensuite tester le code pour le PIN 22 avec la commande suivante: python3 /opt/dht22/dht22_pin22.py :

root@raspberrypi:/opt/dht22# python3 dht22_pin22.py
 Temp=31.6* Humidity=28.2%
 Error in atexit._run_exitfuncs:
 Traceback (most recent call last):
   File "/usr/lib/python3/dist-packages/pigpio.py", line 993, in _pigpio_command
     sl.s.send(struct.pack('IIII', cmd, p1, p2, 0))
 AttributeError: 'NoneType' object has no attribute 'send'
 root@raspberrypi:/opt/dht22#

Pas d’inquiétude quant aux erreurs, c’est lié au paquet pigpio, et c’est non-bloquant! On les supprimera ensuite avec un 2> /dev/null.
Un court et bon article sur le sujet: http://lanterne-rouge.over-blog.org/article-que-signifie-dev-null-2-1-70233357.html

Software côté Pi 2/2: Zabbix-agent

Pour que ce code Python soit exécuté par le zabbix-agent installé sur le Raspberry Pi, on va créer un fichier dans /etc/zabbix/zabbix_agentd.d/userparameter_dht22.conf :

# pin 22 Backbone
UserParameter=dht22.read[*],python3 /opt/dht22/dht22_pin22.py 2> /dev/null | awk -F[=*%] '{print '$'"$1"}'
# pin 23 Terrarium
UserParameter=dht23.read[*],python3 /opt/dht22/dht22_pin23.py 2> /dev/null | awk -F[=*%] '{print '$'"$1"}'
# pin 24 Indoor
UserParameter=dht24.read[*],python3 /opt/dht22/dht22_pin24.py 2> /dev/null | awk -F[=*%] '{print '$'"$1"}'
# pin 25 Outdoor
UserParameter=dht25.read[*],python3 /opt/dht22/dht22_pin25.py 2> /dev/null | awk -F[=*%] '{print '$'"$1"}'

Il faut ensuite donner l’autorisation à l’utilisateur zabbix d’exécuter le code Python. Dans /etc/sudoers, on ajoute ces 4 lignes:

zabbix  ALL=(ALL) NOPASSWD:/usr/bin/python3 /opt/dht22/dht22_pin22.py
zabbix  ALL=(ALL) NOPASSWD:/usr/bin/python3 /opt/dht22/dht22_pin23.py
zabbix  ALL=(ALL) NOPASSWD:/usr/bin/python3 /opt/dht22/dht22_pin24.py
zabbix  ALL=(ALL) NOPASSWD:/usr/bin/python3 /opt/dht22/dht22_pin25.py

Une fois le service zabbix-agent redémarré sur le Raspberry Pi, il est possible de tester directement sur le serveur Zabbix le bon fonctionnement de tout ça, avec la commande zabbix_get:

Température du PIN 22:

bash-5.0$ zabbix_get -s <@IP du Raspberry Pi> -k dht22.read[2]
31.6

Humidité du PIN 22:

bash-5.0$ zabbix_get -s <@IP du Raspberry Pi> -k dht22.read[4]
28.3

Même exemple avec le PIN 24:

bash-5.0$ zabbix_get -s <@IP du Raspberry Pi> -k dht24.read[2]
20.9
bash-5.0$ zabbix_get -s <@IP du Raspberry Pi> -k dht24.read[4]
47.4

Software côté Zabbix Server: le Template

Une fois que tout fonctionne côté client, il faut intégrer le template sur le serveur Zabbix, et l’appliquer à l’objet Raspberry Pi.

Dans le cas présent, il y a 4 sondes nommées Backbone (22), Terrarium (23), Indoor (24) et Outdoor (25).

Pour chaque sondes, il y a 2 « items ». Exemple avec la sonde 25 « Outdoor »:
– l’item « Temperature » sera dht25.read[2]
– l’item « Humidity » sera dht25.read[4]

Des triggers (seuils d’alerte) liés à la température ont été définis pour 2 des quatre sondes (Backbone et Terrarium). Et les graphiques liés à tous ces items ont été créés.

L’intervalle d’interrogation est de 30 secondes.

Tout ça est bien évidement personnalisable dans la console d’administration de Zabbix, ou avant l’importation du XML, en fonction du nombre de sondes et de leur emplacement.

Zabbix Template AM2302 Modules v1 au format XML zippé

Accès à la version 2 < (s’ouvre dans un nouvel onglet)">> Accès à la version 2 <

Sources:
https://www.rototron.info/dht22-tutorial-for-raspberry-pi/
http://abyz.me.uk/rpi/pigpio/examples.html#Python%20code
http://lanterne-rouge.over-blog.org/article-que-signifie-dev-null-2-1-70233357.html
https://github.com/adafruit/Adafruit_Python_DHT

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.