[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.thermal_raspberrypi

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 :

arbo

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 :

rapport_temp

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"`

# définition du chemin du répertoire à créer :
REP="/media/NAS/Captures/$DATE2"

# le fichier à créer dans ce répertoire est "temperature.html"
FICHIER="${REP}/temperature.html"

# Si le répertoire n'existe pas on le crée
if [ ! -d "$REP" ];then
 mkdir "$REP"
fi

# Si le fichier 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


# Tests des températures

# pour les températures inférieures à 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"

# pour les températures comprises 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"

# pour les températures comprises 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"

# pour les températures comprises entre +70 et 75°C, on écrit la valeur en rouge dans le fichier ; on envoi 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

# pour les températures dépassant 75°, on écrit la valeur en noir dans le fichier ; on envoi une alerte "température anormale" 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 0

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

Vous aimerez aussi...

13 réponses

  1. gregouille dit :

    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

    • admin dit :

      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 🙂

      • Gregouille dit :

        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 🙂

  2. moi dit :

    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

    • admin dit :

      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 » 🙂

      • freud dit :

        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

        • admin dit :

          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()

          🙂

  3. jf dit :

    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

    • admin dit :

      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é

  4. cromod dit :

    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

    • admin dit :

      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 !

  5. MOunir dit :

    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

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

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

%d blogueurs aiment cette page :