Raspberry Pi et capteurs de température

J’ai récemment configuré un Raspberry Pi afin d’obtenir des lectures de température et d’humidité.  Il existe de nombreux articles sur le Net pour y parvenir, mais je vous propose ma méthode de fonctionnement.

Mon objectif était d’utiliser un Raspberry Pi version 1 ou 2 et d’utiliser le capteur de température et d’humidité que j’avais sous la main avec le minimum d’éléments.  Le capteur est un DHT11. Les données de lecture doivent être accessibles par protocole SNMP afin d’être utilisé facilement avec un outils de monitoring.  Dans mon exemple, j’utilise PRTG.

http://osepp.com/products/sensors-arduino-compatible/humidity-temperature-sensor/

clip_image001

 

Pour cette installation, j’ai utilisé la dernière version de Raspbian en date du mois de février 2016. La version Jessie Lite suffit pour nos besoins. Vous pouvez bien sûr utiliser NOOBS qui contient tout ce qu’il faut pour installer Raspbian ou une autre distribution de votre choix, mais je n’ai effectué aucun test avec une autre distribution.

https://www.raspberrypi.org/downloads/raspbian/

Je vous décris rapidement ma méthode d’installation du système d’exploitation. En cas de problème, vous trouverez facilement d’autres procédures plus détaillées sur Internet.

Pour créer ma carte SD, j’utilise Win32 Disk Imager.

clip_image002
clip_image004

Une fois que vous avez démarré Raspbian sur votre RPi, vous devez étendre la partition pour utiliser toutes l’espace disponible sur votre carte SD.

sudo raspi-config

Choisissez l’option “Expand Filesystem”, puis redémarrer.

Mettre à jour le système :

sudo apt-get update
sudo apt-get upgrade

 

Branchement du capteur :

image

Le Raspberry Pi 2 contient plus de pins, mais les mêmes sont utilisés pour ce montage, peu importe le modèle.

Un script en Python sera utilisé pour obtenir les lectures de température et d’humidité du capteur DHT11.  L’information est disponible sur le site web Adafruit :

https://learn.adafruit.com/dht-humidity-sensing-on-raspberry-pi-with-gdocs-logging/software-install-updated

sudo apt-get install build-essential python-dev python-openssl
sudo apt-get install git
git clone https://github.com/adafruit/Adafruit_Python_DHT.git
cd Adafruit_Python_DHT
sudo python setup.py install
cd examples

Pour accéder aux données du capteur, le programme doit obligatoirement être exécuté en tant que ROOT.

sudo python AdafruitDHT.py 11 4

Le programme en Python prend en paramètre le modèle du DHT (11 dans ce cas-ci) et le numéro de la pin utilisée pour les données (4).

Le programme devrait afficher la température et l’humidité sur une ligne.

clip_image002[4]

 

Si tout est bien branché, nous pouvons passer à l’étape suivante qui consiste à rendre les données accessibles par SNMP.

On modifie d’abord le programme AdafruitDHT.py pour obtenir d’un programme distinct permettant d’obtenir indépendamment la valeur de la température et celle de l’humidité. Vous pouvez placer les programmes où vous désirez.  Dans mon exemple, je place tout dans \root, car de toute façon, nos scripts et programmes doivent s’exécuter en root.

Voici les deux fichiers à créer :

sudo nano /root/temperature.py

import sys
import Adafruit_DHT

sensor_args = { '11': Adafruit_DHT.DHT11,'22': Adafruit_DHT.DHT22,'2302': Adafruit_DHT.AM2302 }

if len(sys.argv) == 3 and sys.argv[1] in sensor_args:
    sensor = sensor_args[sys.argv[1]]
    pin = sys.argv[2]
else:
    print 'usage: sudo ./Adafruit_DHT.py [11|22|2302] GPIOpin#'
    print 'example: sudo ./Adafruit_DHT.py 2302 4 - Read from an AM2302 connected to GPIO #4'
    sys.exit(1)

humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)

if humidity is not None and temperature is not None:
    print '{0:0.1f}'.format(temperature)
else:
    print 'Failed to get reading. Try again!'
    sys.exit(1)

 

sudo nano /root/humidity.py

import sys
import Adafruit_DHT

sensor_args = { '11': Adafruit_DHT.DHT11,'22': Adafruit_DHT.DHT22,'2302': Adafruit_DHT.AM2302 }

if len(sys.argv) == 3 and sys.argv[1] in sensor_args:
    sensor = sensor_args[sys.argv[1]]
    pin = sys.argv[2]
else:
    print 'usage: sudo ./Adafruit_DHT.py [11|22|2302] GPIOpin#'
    print 'example: sudo ./Adafruit_DHT.py 2302 4 - Read from an AM2302 connected to GPIO #4'
    sys.exit(1)

humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)

if humidity is not None and temperature is not None:
    print '{0:0.1f}'.format(humidity)
else:
    print 'Failed to get reading. Try again!'
    sys.exit(1)

 

Si on teste les deux programmes, on devrait obtenir ceci :

root@raspberrypi:~# python temperature.py 11 4

23.0

root@raspberrypi:~# python humidity.py 11 4

33.0

 

Nous obtenons donc une simple valeur.  Il nous reste à créer un petit script pour simplifier l’utilisation en SNMP par la suite :

sudo nano /root/dhtsensor.sh

#!/bin/bash

if [ "$1" = "-t" ]
then
echo .1.3.6.1.4.1.333.1
echo gauge
python /root/temperature.py 11 4
fi

if [ "$1" = "-h" ]
then
echo .1.3.6.1.4.1.333.2
echo gauge
python /root/humidity.py 11 4
fi

exit 0

Ce qui donne comme résultat :

root@raspberrypi:~# sh dhtsensor.sh -t

.1.3.6.1.4.1.333.1

gauge

23.0

root@raspberrypi:~# sh dhtsensor.sh -h

.1.3.6.1.4.1.333.2

gauge

33.0

 

Il nous reste à intégrer le tout dans notre serveur SNMP.

On procède à l’installation du client et serveur SNMP :

sudo apt-get install snmpd snmp

Vous pouvez modifier la configuration du serveur SNMP ou simplement remplacer le fichier de configuration par celui que je vous propose :

sudo mv /etc/snmp/snmpd.conf /etc/snmp/snmpd.conf.bak
sudo nano /etc/snmp/snmpd.conf

agentAddress 161
view systemonly included .1.3.6.1.2.1.1
view systemonly included .1.3.6.1.2.1.25.1
rocommunity public default -V systemonly
rocommunity6 public default -V systemonly
rouser authOnlyUser
sysLocation Sitting on the Dock of the Bay
sysContact Me <me@example.org>
sysServices 72
proc mountd
proc ntalkd 4
proc sendmail 10 1
disk / 10000
disk /var 5%
includeAllDisks 10%
load 12 10 5
trapsink localhost public
iquerySecName internalUser
rouser internalUser
defaultMonitors yes
linkUpDownNotifications yes
master agentx
pass .1.3.6.1.4.1.333.1 /bin/sh /root/dhtsensor.sh -t
pass .1.3.6.1.4.1.333.2 /bin/sh /root/dhtsensor.sh –h

 

Il reste une modification à effectuer au niveau des droits du service SNMP.  En effet, par défaut, le service utilise l’usager “snmp”.  Celui n’a toutefois pas les droits nécessaires pour récupérer des valeurs du capteur.  Il est nécessaire d’exécuter le service en root.

Notez qu’il existe certainement une façon plus sécurité d’obtenir le même résultat, mais pour mon usage actuel, cela convient.

Pour ce faire, il faut modifier le fichier suivant :

sudo nano /etc/default/snmpd

Remplacer “–u snmp –g snmp” par “-u root –g root”.

On redémarre finalement le service SNMP :

sudo /etc/init.d/snmpd restart

 

On croise les doigts et on teste notre serveur SNMP :

root@raspberrypi:~# snmpwalk -Os -c public -v 1 localhost .1.3.6.1.4.1.333.1

iso.3.6.1.4.1.333.1 = Gauge32: 23

Error: OID not increasing: iso.3.6.1.4.1.333.1 >= iso.3.6.1.4.1.333.1

root@raspberrypi:~# snmpwalk -Os -c public -v 1 localhost .1.3.6.1.4.1.333.2

iso.3.6.1.4.1.333.2 = Gauge32: 33

Error: OID not increasing: iso.3.6.1.4.1.333.2 >= iso.3.6.1.4.1.333.2

 

 

Ne reste plus qu’à utiliser ces nouvelles données dans votre système de monitoring.  Personnellement, j’utilise PRTG :

Ajoutez un nouvel équipement (notre Raspberry Pi) :

image

Ajoutez un capteur SNMP (personnalisé) permettant de surveiller une valeur numérique.

image

Entrez le chemin OID et autres paramètres du capteur :

image

Répétez les mêmes étapes pour ajouter un capteur pour l’humidité.

Si tout fonctionne bien, vous aurez deux nouveaux capteurs dans votre interface :

image

 

Voici un graphique de la température à la sortie d’un climatiseur d’une salle informatique :

image