[Raspberry Pi] Afficher la température CPU du Raspberry Pi
Pour les inquiets qui souhaitent avoir un œil sur la température du Raspberry Pi, il existe deux commandes permettant de récupérer une valeur de la part des capteurs de température.
La première commande qui renvoie un résultat sous la forme suivante : « temp=44.9’C » :
$ /opt/vc/bin/vcgencmd measure_temp
La seconde qui renvoie un nombre à 5 chiffre, ex: « 44912 » (il suffira alors de diviser le résultat par 1000 pour ne garder que deux chiffres) :
$ cat /sys/class/thermal/thermal_zone0/temp
SCRIPT
Pour aller plus loin, je vous propose le code ci-dessous qui est un script bash récupérant des valeurs toutes les 5 minutes et qui les inscrit dans un fichier, gardant ainsi un historique sur toute une journée. De la supervision en quelque sorte.
Dans certaines conditions, une surchauffe par exemple, le script est en mesure d’effectuer des actions comme envoyer une alerte mail ou encore d’ordonner au RPi de s’arrêter.
Le script est largement commenté mais je préfère expliquer d’abord ce qu’il fait :
Ce script récupère d’abord la température avec à la commande « cat /sys/class/thermal/thermal_zone0/temp » (plus facilement exploitable que l’autre commande) et teste ensuite la valeur dans plusieurs conditions « if ».
Entre-temps, il récupère la date et l’heure du jour au format XX-YY-ZZZZ et crée un répertoire ayant pour nom cette date. Il crée à l’intérieur de ce répertoire un fichier « temperature.html » qui contiendra toutes les valeurs de la journée avec la date et l’heure. La création du répertoire est optionnelle, personnellement je m’en sers pour stocker d’autres fichiers mais vous pouvez vous contenter d’appeler directement le fichier final « XX-YY-ZZZZ-temperature.html » par exemple. C’est surtout une question d’organisation.
Voici le type d’arborescence obtenu après plusieurs jours :
Et à l’intérieur de ces dossiers se trouve donc un fichier « temperature.html ».
Les valeurs sont enregistrées dans un fichier .html plutôt qu’un fichier .txt. L’avantage de l’HTML est qu’on peut y ajouter des couleurs (bleu, vert, orange, rouge, noir) en fonction de la température.
Conditions
Si la température est inférieure à 40°, alors on considère qu’elle est « OK ». La valeur est écrite en bleu dans le fichier « température.html » avec la date et l’heure.
Si elle est comprise entre 40° et 50°, alors on considère qu’elle est « Normale ». La valeur est écrite en vert dans le fichier « temperature.html » avec la date et l’heure.
Si elle est comprise entre 50° et 70°, alors on considère qu’il y a une légère chauffe. La valeur est écrite en orange dans le fichier « temperature.html ».
Si elle est comprise entre 70° et 75°, alors la valeur est écrite en rouge dans le fichier « temperature.html » et une alerte mail est envoyée pour signaler une surchauffe.
Si elle est supérieure à 75°, alors la valeur est écrite en noir dans le fichier « temperature.html », une alerte mail est envoyée pour signaler une température anormale. Enfin, la commande shutdown –h now (arrêt) est envoyée au RPi pour éviter tout dommage sur les composants.
Alors certes, il peut être exagéré de parler de surchauffe lorsque la température dépasse 70°C, sachant que le RPi peut résister à +80° (d’après certaines sources Internet). Cependant, mon RPi n’ayant que très rarement atteint +70°C, je considère que si ça devait arriver, alors il serait bon d’en être averti par mail.
Libre à vous d’adapter les conditions de ce script, d’en ajouter ou d’en supprimer.
Extrait du fichier « temperature.html » ouvert dans un navigateur :
Finalement, après plusieurs semaines « up » pendant l’été et enfermé dans son boîtier, mon RPi n’a jamais atteint de température au-delà de 75°C. Donc à priori, il y a peu de chances pour que j’ai un jour des valeurs en noir dans mon fichier.
Code
#!/bin/bash # Récupération de la température ; on obtient ici une valeur à 5 chiffres sans virgules (ex: 44123) : TEMP=$(cat /sys/class/thermal/thermal_zone0/temp) # On divise alors la valeur obtenue par 1000, pour obtenir un résultat avec deux chiffres seulement (ex: 44) : TEMP=$(($TEMP/1000)) # Récupération de la date et l'heure du jour ; on obtient ici une valeur telle que "mercredi 31 décembre 2014, 00:15:01" : DATE=`date +"%A %d %B %Y, %H:%M:%S"` # Récupération de la date et l'heure du jour sous un autre format ; on obtient ici un résultat sous la forme suivante : XX-YY-ZZZZ (ex: 31-12-2014) : DATE2=`date +"%d-%m-%Y"` # Répertoire cible (où seront stockées les valeurs). Ici je stocke mes valeurs sur mon NAS et dans un sous-répertoire portant la date du jour ($DATE2) : REP="/media/NAS/Captures/$DATE2" # Le fichier à créer dans ce répertoire est "temperature.html" FICHIER="${REP}/temperature.html" # Si le répertoire cible n'existe pas, on le crée if [ ! -d "$REP" ];then mkdir -p "$REP" fi # Si le fichier temperature.html n'existe pas, on le crée et on y injecte le code html minimum if [ ! -f "$FICHIER" ];then touch "$FICHIER" && echo "<!DOCTYPE html><html><head><meta charset='utf-8' /></head><body><center>" > "$FICHIER" fi # Test de la température relevée # Si la température relevée est inférieure à 40°C, on écrit la valeur en bleu dans le fichier : if [ "$TEMP" -lt "40" ]; then echo "<font face='Courier'>${DATE}<br><strong><font color='blue'>${TEMP}°C</font></font></strong><br><br>" >> "$FICHIER" # Si la température relevée est comprise entre +40 et 50°C, on écrit la valeur en vert dans le fichier : elif [ "$TEMP" -ge "40" ] && [ "$TEMP" -lt "50" ];then echo "<font face='Courier'>${DATE}<br><strong><font color='green'>${TEMP}°C</font></font></strong><br><br>" >> "$FICHIER" # Si la température relevée est comprise entre +50 et 70°C, on écrit la valeur en orange dans le fichier : elif [ "$TEMP" -ge "50" ] && [ "$TEMP" -lt "70" ];then echo "<font face='Courier'>${DATE}<br><strong><font color='orange'>${TEMP}°C</font></font></strong><br><br>" >> "$FICHIER" # Si la température relevée est comprise entre +70 et 75°C, on écrit la valeur en rouge dans le fichier et on envoie une alerte "surchauffe" par mail : elif [ "$TEMP" -ge "70" ] && [ "$TEMP" -lt "75" ];then echo "<font face='Courier'>${DATE}<br><strong><font color='red'>${TEMP}°C</font></font></strong><br><br>" >> "$FICHIER" echo "" | mutt -s "Alerte surchauffe, température = ${TEMP}°C" mon_email # Si la température relevée dépasse 75°, on écrit la valeur en noir dans le fichier, on envoie une alerte par mail et on ordonne l'arrêt du RPi : elif [ "$TEMP" -ge "75" ];then echo "<font face='Courier'>${DATE}<br><strong><font color='black'>${TEMP}°C</font></font></strong><br><br>" >> "$FICHIER" echo "" | mutt -s "Alerte température anormale, arrêt immédiat du pi, température = ${TEMP}°C" mon_email sudo shutdown -h now fi exit
Exécution auto
Pour que le script soit exécuté toutes les 5 minutes, il convient alors de rajouter une ligne dans la crontab :
crontab -e
*/5 * * * * /home/pi/scripts/script_temperature.sh
Bonjour, le tuto est plutot génial, je débute et je cherche seulement a allumer une led a partir d’une certaine temperature atteinte, pourriez vous m’aider?
Merci
Je ne saurais pas vous répondre là-dessus malheureusement ! Tout ce que je peux vous dire, c’est qu’il vous faudra très certainement utiliser les connecteurs GPIO du Raspberry Pi et que ça nécessite quelques connaissances en électronique 🙂
Bonjour! Merci pour votre réponse, pour la partie electronique le raspi est pret et pr le cide j’ai trouvé de quoi allumer des led et un buzzer en fonction de l’utilisation du cpu, ke bout du chemin n’est peut etre pas si loin 🙂
bonjour
merci pour ce script par contre il y a plusieurs erreurs (syntaxe ou copier/coller je ne sais pas)
comme je ne connais pas le python j’ai un peu tatoné pour trouver les erreurs en fait ce sont des petits détails de syntaxe
il manque l’espace après cat et le /sys/
subprocess.Popen(« cat/class/thermal/thermal_zone0/temp » => subprocess.Popen(« cat /sys/class/thermal/thermal_zone0/temp »
syntaxe date à modifier comme suit
date1 = os.popen(‘dateA %d %B %Y, %H:%M:%S »‘) => ate1 = os.popen(« date « +%A %d %B %Y, %H:%M:%S » »)
et il manque la fin de la ligne
date2 = datetime.date.today().strftime(‘%d-%m-%Y => date2 = datetime.date.today().strftime(‘%d-%m-%y’)
je crois que c’est tout ce que j’ai changé, mis à part ça, très bonne idée de script
merci
Bonjour,
Content que ça puisse servir 🙂 Je ne vois pas où sont ces erreurs de syntaxe, et avec un copier-coller du code, le script fonctionne sans erreurs (testé à l’instant).
Depuis le temps, je ne me sers plus vraiment de ce script pour vérifier la température, je visualise ça directement via RPI-Monitor sous forme de courbes, ce qui est bien plus sympa. Je le garde tout de même actif pour la partie « arrêt automatique en cas de pic de température » 🙂
MERCI, je voulais mettre en place tout ça, je ne trouve pas l’étape de création de fichier (ligne code).
Je suis novice dans le métier :-).
D’avance merci pour votre aide :-).
Freud
Bonjour,
Il s’agit des lignes suivantes :
# le fichier à créer dans ce répertoire est « temperature.html »
path_final = path + « /temperature.html »
# on test si le répertoire existe, sinon on le crée grâce à la variable ‘path’
if not os.path.exists(path):
os.mkdir(path)
assert os.path.isdir(path)
# si le fichier temperature.html n’existe pas, alors on le crée et on lui injecte un peu de code HTML
if not os.path.exists(path_final) :
fichier = open(path_final, « a »)
fichier.write(« »)
fichier.close()
🙂
Salut
Le script est an basch et la ligne que tu rajoute dans le crontab fait référence a un script ecrit en python.
MDR.
Faire un copier/coller du script et l enregistrer sous :
script_temperature.sh
(Ne pas oublier de changer le chemin sous le quel on veut que le fichier temperature.html s’enregistre)
autoriser en lecture et ecriture le dossier ou va se trouver le dossier ainsi créé .
sudo chmod 777 mon dossier
Rendre le script executable:
sudo chmod +x script_temperature.sh
Bon ceci dit le script fonctionne bien si on le lance en ligne de commande:
sh /home/pi/scripts/script_temperature.sh (et pas : python2.7 /home/pi/scripts/script_temperature.sh)
Ensuite reste plus qu’a ajouter dans le crontab la ligne :
*/5 * * * * root sh /home/pi/scripts/script_temppi.sh > /dev/null 2>&1
Pour editer le crontab:
sudo nano /etc/crontab -e
Effectivement, c’est parce que le script était à la base écrit en python. Je l’ai redéveloppé en bash et j’ai oublié de mettre à jour la ligne de la crontab dans le tuto…
C’est corrigé
Pratique ce petit script ! 🙂
Par contre, tu écrases le contenu de la variable d’environnement PATH. Du coup, le script plante au niveau du mkdir et du touch chez moi.
Je te suggère de donner un autre nom à cette variable
Et bien coïncidence, j’ai corrigé cet erreur il y a moins d’un heure chez moi. Les variables étaient en minuscules à la base et je les avais passé en majuscules à grand coup de rechercher-remplacer sans vraiment faire de test vu que ça marchais avant.
Bref merci pour la remarque, sans quoi j’aurais oublié de mettre à jour l’article !
la commande cat /sys/class/thermal/thermal_zone0/temp sous terminal fonctionne.
Par contre avec le batch, j’obtient l’erreur suivante
not found ripts/fichier.sh: 2: chemin du fichier sh
not found ripts/fichier.sh: 5: chemin du fichier sh
not found ripts/fichier.sh: 7: chemin du fichier sh
arithmetix express
/1000″expecting EOF: « 50464
Énorme, merci pour ton script qui fonctionne a merveille !
Petite question est-il possible d’inverser l’ordre? le plus récent en haut et les plus vieux en bas? ce qui éviterai de scroll chaque fois =)
Merci encore
Damien
Hmm oui ça doit être possible : https://superuser.com/a/246841
Merci! C’est top j’ai réussi en bidouillant, cela marche à merveille
Bonjour,
Je ne connais rien aux scripts, j’ai suivi la procédure mais quand je lance le script, je reçois en retour :
./script_temperature.sh: line 36: [: temp=50.5’C: integer expression expected
./script_temperature.sh: line 38: [: temp=50.5’C: integer expression expected
./script_temperature.sh: line 42: [: temp=50.5’C: integer expression expected
./script_temperature.sh: line 46: [: temp=50.5’C: integer expression expected
pour les lignes qui doivent afficher la température dans le fichier temperature.html
Comment résoudre ce problème ?
Merci
bonjour,
j’arrive un peu tard sur le sujet mais je ne sais pas du tout mais du tout comment ajouter mon script sur mon pi et où.
Je débute et je m’en sers comme NAS voila voila les infos à savoir 😛
Merci beaucoup à l’âme charitable qui me répondra.
Bonjour, vous pouvez le placer où vous le souhaitez
Bonjour,
Tout d’abord merci beaucoup pour ce tuto très clair et très utile.
Seulement, j’ai un petit problème lors de l’exécution du script, j’ai un message d’erreur : /scripts/script_temperature.sh: ligne 37: /temperature/16-06-2019/temperature.html: Permission non accordée
J’ai rajouté « sudo » devant toutes les commandes de type « echo » ou « touch » en me disant que cela venait de là, mais ça n’a rien changé. Pourriez-vous m’aider ?
Idem Avez vous trouver la provenance du pbm ?
Bonjour,
Simple et efficace, fonctionne très bien chez moi, merci !
Bonjour,
Super ! Merci du retour 🙂
Svp je veux ce code la en Python pas en html, c’est urgent si vouz pouvez m’aider ça sera un grang plaisir
Bonjour,
J’ai modifié la version originale suivant mes propres besoin. Elle requière l’installation de gawk et sysstat (sar).
Et merci à l’auteur du script initial, ça m’a permis de gagner du temps. 😀
Voici le script modifié :
#!/bin/bash
# Récupération de la température ; on obtient ici une valeur à 5 chiffres sans virgules (ex: 44123) :
TEMP=$(cat /sys/class/thermal/thermal_zone0/temp)
# On divise alors la valeur obtenue par 1000, pour obtenir un résultat avec deux chiffres seulement (ex: 44) :
TEMP=$(($TEMP/1000))
# Récupération de la date et l’heure du jour ; on obtient ici une valeur telle que « mercredi 31 décembre 2014, 00:15:01″ :
DATE=`date + »%A %d %B %Y, %H:%M:%S »`
# Récupération de la date et l’heure du jour sous un autre format ; on obtient ici un résultat sous la forme suivante : XX-YY-ZZZZ (ex: 31-12-2014) :
DATE2=`date + »%d-%m-%Y »`
# Répertoire cible (où seront stockées les valeurs). Ici je stocke mes valeurs sur mon NAS et dans un sous-répertoire portant la date du jour ($DATE2) :
REP= »/media/cputemp/$DATE2 »
# Le fichier à créer dans ce répertoire est « temperature.html »
FICHIER= »${REP}/temperature.html »
# Le fichier à créer dans ce répertoire est « temperature.csv »
CSV= »${REP}/temperature.csv »
#%idle
IDLE=`sar | tail -2 | head -1 | awk -F » » ‘{print $8}’`
#%iowait
IOWAIT=`sar | tail -2 | head -1 | awk -F » » ‘{print $6}’`
# Si le répertoire cible n’existe pas, on le crée
if [ ! -d « $REP » ];then
mkdir -p « $REP »
fi
# on crée le fichier temperature.html et on y injecte le code html minimum
touch « $FICHIER » &&
echo »
#customers {
font-family: Arial, Helvetica, sans-serif;
border-collapse: collapse;
width: 100%;
}
#customers td, #customers th {
border: 1px solid #ddd;
padding: 8px;
}
#customers tr:nth-child(even){background-color: #f2f2f2;}
#customers th {
padding-top: 12px;
padding-bottom: 12px;
text-align: left;
background-color: #ddd;
color: black;
}
» > « $FICHIER »
# Si le fichier temperature.csv n’existe pas, on le crée
if [ ! -f « $CSV » ];then
touch « $CSV »
fi
# Test de la température relevée
# Si la température relevée est inférieure à 40°C, on écrit la valeur en bleu dans le fichier :
if [ « $TEMP » -lt « 40 » ]; then
echo « ${TEMP};blue;${DATE};${IDLE};${IOWAIT} » >> ${CSV} 2>&1
# Si la température relevée est comprise entre +40 et 50°C, on écrit la valeur en vert dans le fichier :
elif [ « $TEMP » -ge « 40 » ] && [ « $TEMP » -lt « 50 » ];then
echo « ${TEMP};green;${DATE};${IDLE};${IOWAIT} » >> ${CSV} 2>&1
# Si la température relevée est comprise entre +50 et 70°C, on écrit la valeur en orange dans le fichier :
elif [ « $TEMP » -ge « 50 » ] && [ « $TEMP » -lt « 70 » ];then
echo « ${TEMP};orange;${DATE};${IDLE};${IOWAIT} » >> ${CSV} 2>&1
# Si la température relevée est comprise entre +70 et 75°C, on écrit la valeur en rouge dans le fichier et on envoie une alerte « surchauffe » par mail :
elif [ « $TEMP » -ge « 70 » ] && [ « $TEMP » -lt « 75 » ];then
echo « ${TEMP};red;${DATE};${IDLE};${IOWAIT} » >> ${CSV} 2>&1
echo « » | mutt -s « Alerte surchauffe, température = ${TEMP}°C » mon@mail.com
# Si la température relevée dépasse 75°, on écrit la valeur en noir dans le fichier, on envoie une alerte par mail et on ordonne l’arrêt du RPi :
elif [ « $TEMP » -ge « 75 » ];then
echo « ${TEMP};black;${DATE};${IDLE};${IOWAIT} » >> ${CSV} 2>&1
echo « » | mutt -s « Alerte température anormale, arrêt immédiat du pi, température = ${TEMP}°C » mon@mail.com
sudo shutdown -h now
fi
#on génère le fichier temperature.html
if [ -f « $CSV » ]
then
echo « Raspberry PI 4 CPU » >> ${FICHIER}
echo « » >> ${FICHIER}
echo « » >> ${FICHIER}
echo « » >> ${FICHIER}
echo « Date » >> ${FICHIER}
echo « °C » >> ${FICHIER}
echo « %idle » >> ${FICHIER}
echo « %iowait » >> ${FICHIER}
echo « » >> ${FICHIER}
echo « » >> ${FICHIER}
echo « » >> ${FICHIER}
OLDIFS=$IFS
IFS=’;’
while read cputemp color datecsv idle iowait
do
echo « » >> ${FICHIER}
echo « $datecsv » >> ${FICHIER}
echo « $cputemp » >> ${FICHIER}
echo « $idle » >> ${FICHIER}
echo « $iowait » >> ${FICHIER}
echo « » >> ${FICHIER}
#echo « $datecsv$cputemp°C » >> « $FICHIER »
done < ${CSV}
IFS=$OLDIFS
echo " » >> ${FICHIER}
echo « » >> ${FICHIER}
echo « » >> ${FICHIER}
fi
exit