Un Raspberry Pi et une sonde DS18B20 remontent via SNMP des informations traitées par Centreon (logiciel de supervision). Cela permet d’assurer une surveillance de la température en continu dans des salles serveurs climatisées.
Je vous avais proposé il y a quelques années un article sur la mesure de températures avec le DS18B20 et un Raspberry Pi. Ce montage a fonctionné plusieurs années sans défaillance pour surveiller la climatisation dans une salle serveur.
Sur cette base, Pierre administrateur d’infrastructures de plusieurs établissements en Alsace a monté un système de surveillance utilisant SNMP et Centreon (logiciel de supervision) pour alerter en cas de défaut. Je lui laisse la parole pour vous expliquer comment il a procédé.
*Poller consiste à recueillir des informations dans une architecture de supervision distribuée.
Au sommaire :
Surveillance de température avec le DS18B20 et SNMP
Le contexte
Au sein du groupe nous avons rencontré plusieurs incidents liés à des pannes de climatisation en salle serveur. L’inertie entre la remontée d’alerte aux services techniques et l’intervention ont plusieurs fois provoqué des évènements indésirables graves (montée de température en salle à plus de 60 degrés).
Avec la mise en place de Centreon nous avons optimisé la prise en charge de tels incidents en mesurant la température d’air en entrée des IBM BladeCenter, les seuls équipements de notre parc à disposer de telles sondes.
Avec le retrait programmé des IBM BladeCenter nous sommes dans une problématique de retour en arrière sur ce type d’alerte, devenant à nouveau dépendants de l’inertie des services techniques.
Un devis avait été réalisé pour l’achat de capteurs environnementaux, mais ce dernier n’a pas été retenu en raison de contraintes budgétaires.
J’ai pris connaissance d’un lot de cartes de type Raspberry Pi 2 en stock chez notre client et moyennant quelques recherches ciblées j’ai pu réaliser cette procédure, qui va détailler les composants nécessaires et la configuration logicielle à réaliser pour fabriquer un capteur environnemental basique permettant de remonter par le protocole SNMP la température d’une salle serveur afin de monitorer cette dernière par un outil de supervision comme Centreon.
Le matériel nécessaire
- 1x carte mère RaspBerry Pi 2 ou 3
- 1x connecteur GPIO 26 ou 40 broches
- 1x sonde DS18B20
- 1x résistance 4.7 Kilohms
- Un fer à souder, de l’étain, du fil électrique, de la gaine thermorétractable.
Montage de la partie électronique
Voici une sonde DS18B20 (version simple ou conditionnée en boîtier étanche), ainsi que son schéma de connexion :
Dans la pratique
Installation du système d’exploitation.
Pour ce projet j’ai choisi le système d’exploitation Raspbian : https://www.raspbian.org/
J’ai utilisé Rufus sous Windows afin de préparer la carte micro SD à recevoir le système d’exploitation :
Une fois le système d’exploitation installé, démarrez votre Raspberry Pi et mettez à jour votre système :
apt-get update
apt-get upgrade
Profitez-en pour installer un éditeur user-friendly comme nano :
apt-get install nano
Ensuite, comme j’aime travailler en root, il faut activer le compte root sur Raspbian et l’autoriser pour SSH.
Depuis le compte pi :
sudo -i
nano /etc/ssh/sshd_config
Modifiez la ligne PermitRootLogin without-password en PermitRootLogin yes :
Enregistrez et quittez.
Redémarrez SSH :
/etc/init.d/ssh restart
Modifiez ensuite le mot de passe du compte root :
sudo -i
passwd root
Saisissez le nouveau mot de passe :
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Quittez votre session pi et reconnectez-vous en root.
Reconnaissance de la sonde DS18B20 et paramétrage de la partie SNMP.
Installer les drivers 1-wire
Installez les drivers pour la sonde DS18B20 sur votre système :
modprobe w1-gpio
modprobe w1-therm
Vérifiez que la sonde est bien reconnue :
cd /sys/bus/w1/devices/
ls
28-00000b471676 w1_bus_master1
cd 28-00000b471676
cat w1_slave
7c 01 4b 46 7f ff 04 10 09 : crc=09 YES
7c 01 4b 46 7f ff 04 10 09 t=23750
Si ça ne fonctionne pas, pas de panique, appliquez le correctif suivant :
Dans le fichier /etc/modules ajoutez les lignes w1-therm et w1-gpio pullup=1
nano /etc/modules
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with « # » are ignored.
i2c-dev
w1-therm
w1-gpio pullup=1
Enregistrez et quittez.
Modification de config.txt
Editez le fichier /boot/config.txt :
nano /boot/config.txt
Et ajoutez à la fin la ligne :
dtoverlay=w1-gpio
Enregistrez et quittez.
Redémarrer le Raspberry Pi.
Recommencez les tests, à ce stade c’est normalement OK.
Installez SNMP sur votre Raspberry Pi :
apt-get install snmpd snmp-mibs-downloader
Ensuite éditez le fichier /etc/default/snmpd :
nano /etc/default/snmpd
Puis ajoutez extend après -I :
# snmpd options (use syslog, close stdin/out/err).
SNMPDOPTS=’-Lsd -Lf /dev/null -u Debian-snmp -g Debian-snmp -I extend -smux,mteTrigger,mteTriggerConf -p /run/snmpd.pid’
Enregistrez et fermez.
Installation des scripts
Vous devez ensuite récupérer chez NovergianCreations les scripts nécessaires pour afficher la température de la sondes DS18B20 en SNMP :
cd /opt/
git clone -b 1-0-release https://github.com/NorwegianCreations/snmpmoni.git
cd snmpmoni/
cp config/snmpd.conf.example /etc/snmp/snmpd.conf
Vous devez ensuite configurer le fichier snmpd.conf pour autoriser une adresse ou un range d’adresses à effectuer des requêtes SNMP :
nano /etc/snmp/snmpd.conf
Autorisez la boucle locale ainsi que le range IP de destination du RaspBerry Pi :
rocommunity public 127.0.0.1 #Allow only one computer
rocommunity public 10.0.0.0/8 #Allow all in a network subnet
Enregistrez le fichier.
Nous devons ensuite créer le mapping entre l’ID de la sonde DS18B20 et SNMP.
Nous allons pour cela lister la/les sondes(s) de température reconnues par le système :
ls -l /sys/bus/w1/devices/28-*
Nous sommes intéressés par ce qui commence par “28-000004”.
Pour notre cas, l’ID unique de la sonde est 28-00000b471676
Nous allons éditer le fichier iso.3.6.1.4.1.50083.100.4.1.1.1.7.1 dans le dossier opt/snmpmoni/mapping/ :
cd /opt/snmpmoni/mapping/
nano iso.3.6.1.4.1.50083.100.4.1.1.1.7.1
Vous remplacez le contenu du fichier par l’ID de la sonde DS18B20 précédemment obtenu.
La configuration permet de récupérer jusqu’à 8 sondes de température référencées sous les OID suivants :
iso.3.6.1.4.1.50083.100.4.1.1.1.7.1
iso.3.6.1.4.1.50083.100.4.1.1.1.7.2
iso.3.6.1.4.1.50083.100.4.1.1.1.7.3
iso.3.6.1.4.1.50083.100.4.1.1.1.7.4
iso.3.6.1.4.1.50083.100.4.1.1.1.7.5
iso.3.6.1.4.1.50083.100.4.1.1.1.7.6
iso.3.6.1.4.1.50083.100.4.1.1.1.7.7
iso.3.6.1.4.1.50083.100.4.1.1.1.7.8
Tous ces numéros OID sont sous le contrôle de Norwegian Creations, qui ont enregistré leurs propres OID SNMP dans l’espace «entreprise privée» attribué par IANA (Internet Assigned Numbers Authority).
Donc, en utilisant ces OID, vous ne rencontrerez aucun conflit d’OID sur votre système.
Redémarrez le service SNMP :
/etc/init.d/snmpd restart
Vérification du fonctionnement
Vous pouvez maintenant vérifier le bon fonctionnement de la remontée de la température de la sonde DS18B20 par SNMP :
snmpwalk -v 1 -c public <IP ADDRESS>
iso.3.6.1.4.1.50083.100.4.1.1.1.7.1
root@raspberrypi:~# snmpwalk -v 1 -c public 127.0.0.1 iso.3.6.1.4.1.50083.100.4.1.1.1.7.1
iso.3.6.1.4.1.50083.100.4.1.1.1.7.1.1.0 = INTEGER: 1
iso.3.6.1.4.1.50083.100.4.1.1.1.7.1.2.1.2.5.116.104.101.114.109 = STRING: « /bin/bash »
iso.3.6.1.4.1.50083.100.4.1.1.1.7.1.2.1.3.5.116.104.101.114.109 = STRING: « /opt/snmpmoni/bin/ds18b20.sh -g iso.3.6.1.4.1.50083.100.4.1.1.1.7.1 »
iso.3.6.1.4.1.50083.100.4.1.1.1.7.1.2.1.4.5.116.104.101.114.109 = « »
iso.3.6.1.4.1.50083.100.4.1.1.1.7.1.2.1.5.5.116.104.101.114.109 = INTEGER: 5
iso.3.6.1.4.1.50083.100.4.1.1.1.7.1.2.1.6.5.116.104.101.114.109 = INTEGER: 1
iso.3.6.1.4.1.50083.100.4.1.1.1.7.1.2.1.7.5.116.104.101.114.109 = INTEGER: 1
iso.3.6.1.4.1.50083.100.4.1.1.1.7.1.2.1.20.5.116.104.101.114.109 = INTEGER: 4
iso.3.6.1.4.1.50083.100.4.1.1.1.7.1.2.1.21.5.116.104.101.114.109 = INTEGER: 1
iso.3.6.1.4.1.50083.100.4.1.1.1.7.1.3.1.1.5.116.104.101.114.109 = STRING: « 24.125 »
iso.3.6.1.4.1.50083.100.4.1.1.1.7.1.3.1.2.5.116.104.101.114.109 = STRING: « 24.125 »
iso.3.6.1.4.1.50083.100.4.1.1.1.7.1.3.1.3.5.116.104.101.114.109 = INTEGER: 1
iso.3.6.1.4.1.50083.100.4.1.1.1.7.1.3.1.4.5.116.104.101.114.109 = INTEGER: 0
iso.3.6.1.4.1.50083.100.4.1.1.1.7.1.4.1.2.5.116.104.101.114.109.1 = STRING: « 24.125 »
root@raspberrypi:~#
Vous avez réussi, nous mesurons dans notre exemple une température de 24.125 degrés Celsius.
Conclusion
Une nouvelle fois le Raspberry Pi se montre à la hauteur d’applications professionnelles. C’est bien pour cela que le tiers des Raspberry Pi vendus part en direction des entreprises et de l’industrie…
Merci à Pierre d’avoir pris le temps de partager cette réalisation avec les lecteurs de framboise314. Si cet article vous a intéressé(e) ou s’il vous a inspiré une mise en oeuvre en supervision, n’hésitez pas à faire un retour d’expérience dans les commentaires ci-dessous.
Super description, pratique avec du SNMP mais j’aurais perso plus été enclin à utiliser des Wemos D1 flashés avec ESP Easy.
Pourquoi ? Eh bien le coût ridicule d’un D1, dans les 3 EUR, disons grand max 8 EUR avec une sonde de température dessus. Ensuite, les capacités d’ESP EAsy, qui permettent d’échanger en MQTT, en http, voir en simple trame UDP. On peut ainsi envisager un Raspberry Pi en serveur MQTT, et des tas de Wemos D1 en capteur de température, chaque Wemos transmettant /salle1/rang1/serveur XX par exemple.
La supervision devient alors encore plus performantes, plus simple, et surtout bien plus économique s’il faut déployer la sonde de température sur un grand nombre de serveurs. On trouve en outre sur google des exemples de programmations Lua + Raspi pour servir de serveur SNMP, là encore on s’en sort très bien sur les coûts.
Le coût n’est malheureusement pas toujours le seul paramètre à prendre en compte. La communication via Wi-Fi n’est pas toujours une option possible, aussi si il faut ajouter un ethernet à l’esp… Je passe à autre chaise de suite. Maintenant, pour la maison, oui un esp32 c’est top !
Bonjour,
J’ai suivi ce tuto avec satisfaction et réussi à faire fonctionner tout cela, puis intégrer les données SNMP, via telegraf, dans une base InfluxDb pour les afficher au final sur Grafana : tout cela fonctionne très bien. Au moment d’intégrer une seconde sonde pour la température extérieure, je suis tombé qur un bug qui semble lié au script snmpmoni : si la température est inférieure à 10°C alors le script ne fait pas la division par 1000 de la valeur du capteur.
Par exemple :
# cat /sys/bus/w1/devices/28-01193a0ce335/w1_slave
83 00 4b 46 7f ff 0c 10 9f : crc=9f YES
83 00 4b 46 7f ff 0c 10 9f t=8187
-> la valeur brut est 8187 c’est à dire 8.187°C
root@thermopi:/opt/snmpmoni/bin# ./ds18b20.sh -g iso.3.6.1.4.1.50083.100.4.1.1.1.7.2
8187
-> la valeur renvoyée par le script n’est pas divisée par 1000
root@thermopi:/opt/snmpmoni/bin# ./ds18b20.sh -g iso.3.6.1.4.1.50083.100.4.1.1.1.7.1
20.625
-> pour la sonde intérieure on a bien une valeur en °C
En décortiquant un peu la source du problème est certainement cette ligne de code dans le script ds18b20.sh :
/bin/cat /sys/bus/w1/devices/$deviceid/w1_slave|grep « t= »|/usr/bin/awk ‘{print $10}’|/bin/sed ‘s/t=//g’|/bin/sed ‘s/\(..\)\(…\)/\1.\2/’
Mais la j’avoue que ça dépasse mes connaissances des expressions régulières et de la commande sed ! Une idée, peut-être ?
Stéphane
Re !
Je reviens avec la solution à mon problème, trouvée sur le site de l’auteur du script :
https://www.norwegiancreations.com/2017/06/do-it-yourself-snmp-temperature-monitoring-system/
Il faut donc remplacer l’expression précédente par :
/bin/cat /sys/bus/w1/devices/$deviceid/w1_slave|grep « t= »|/bin/sed -n ‘s/^.*\(t=[^ ]*\).*/\1/p’|/bin/sed ‘s/t=//’|/usr/bin/awk ‘{x=$1}END{print(x/1000)}’
et je confirme que ça marche (testé entre -5°C et +12°C)