29 mars 2013

Afficher la température d'un Raspberry Pi sur une page web

Tout est dans le titre ! Magnifique ! Plus qu'à coller le code. Plus sérieusement, il y a quelques mois je me suis procuré un Raspberry Pi. C'est un petit ordinateur basse consommation à base de processeur ARM tournant sous Linux. J'en reparlerais.

Le Raspberry Pi de moi pas branché. 
Depuis l'annonce de la fermeture de Google Reader par Google je me suis enfin décidé à m'en occuper : coller un serveur web dessus et mettre un agrégateur de flux RSS en ligne dessus et quelques autres services auto-hébergés. Je ferais un article sur la configuration du serveur web (Nginx) si je trouve la motivation.

Ce qui nous intéresse ici c'est afficher la température du Pi sur la page une page web en presque temps réel (toutes les 5 secondes). Pour ma part c'est affiché sur une page ou j'ai listé les différentes applications web d'installées (Leed et rien d'autre pour l'instant). Rien de sorcier, un peu de PHP dégueulasse, un peu de JavaScript pompé et adapté et zou !

Avant de coder, voici le résultat :
Ça bouge toutes les 5 secondes.
Ça faisait tellement longtemps que je n'avait pas fait de gif animé... 
/!\ Attention, code certifié dégueulasse et pas optimisé. Je ne suis pas développeur. Merde. /!\

Pour commencer deux commandes permettent de récupérer la température du SoC (System on Chip, littéralement Système sur Puce qui désigne une puce embarquant tout un système : CPU, GPU, RAM... ) :
  1. /opt/vc/bin/vcgencmd measure_temp
  2. cat /sys/class/thermal/thermal_zone0/temp
La première va retourner temp=48.7'C et la seconde 46885 (en milligrades donc). Sauf que la première commande, même avec un grep ne me retourne rien en PHP (ou alors je ne suis pas doué, c'est possible). On va donc utiliser la deuxième et convertir le résultat en grades.

Le but est d'avoir un affichage de la température qui s'actualise automatiquement. J'ai donc utilisé jQuery, parce que je suis en merde en JavaScript, pour actualiser automatiquement un div.

Notez que la coloration syntaxique a été faite avec amour à la main, l'éditeur de texte de Blogger étant ce qu'il est : de la merde. Et il m'a pété l'indentation du code.

On commence par temp.php ou seront placé la fonction pi_temp() et l'affichage : 

<?php
//On exécute la commande de récupérage (si si) de température
$temp = exec('cat /sys/class/thermal/thermal_zone0/temp');
//On divise par 1000 pour convertir
$tempconv  =  $temp / 1000;
//Un chiffre après la virgule ça suffit
$temppi = round($tempconv,1);
//On définit les variables d'affichage dans la condition suivante en y affichant la température
$ok = '<span class="temp_ok">'. $temppi .'</span>°C';
$wrong = '<span class="temp_wrong">'. $temppi .'</span>°C';
//Si la température < 65°C alors on affiche en vert, sinon en rouge
if ($temppi < 65.0)
echo $ok;
else
echo $wrong;

?>

Ensuite la page ou sera affiché la température actualisée toutes les 5 secondes :

<!DOCTYPE html>
<html lang="fr-fr">
<head>
<meta charset="UTF-8" />
<title>Raspberry Pi</title>
<style type="text/css">
/* Couleurs des tempratures */
.temp_ok {
color: green;
}

.temp_wrong {
color: red;
}
</style>
<!-- On appelle jQuery -->
<script src="jquery.js" type="text/javascript"></script>
<script>
//On va actualiser le div #temp_pi avec le contenu de la page temp.php et on répête le script toute les 5 secondes. Je cache pas que j'ai pompé et adapté le code. Merci. Au revoir.
$(document).ready(function() {
$("#temp_pi").load("temp.php");
var refreshId = setInterval(function() {
$("#temp_pi").load("temp.php");
}, 5000);
$.ajaxSetup({ cache: false })

});
</script>
</head>
<body>
<p>
Température du CPU :

<!-- Div qui sera actualisée par le JavaScript -->
<div id="temp_pi"></div>
</p>
</body>
</html>


Je pense que les explications données dans les commentaires du code suffisent. Ça ne doit pas être la façon la plus simple de faire ça mais l'essentiel c'est que ça fonctionne et que ça suffit à mon usage. En élaguant un peu on doit pouvoir faire plus léger. Ce script permet aussi d'afficher l'uptime ou ce genre de petites frivolités. 

Port DSi, logo, trou et SoC.
Sources : 

5 commentaires:

  1. Psa mal, mais j'attends des versions plus pêchues pour m'en prendre un.

    En tout cas je te piquerai sûrement ça :P

    RépondreSupprimer
    Réponses
    1. Ça doit être faisable sur n'importe quoi qui tourne sous Linux, y'a forcément une commande pour choper la température.

      Supprimer
  2. et bein , un tutoriel ici pour raspcontrol http://nobru54.blogspot.fr/2013/05/tutoriel-raspberry-pi-parametres.html

    RépondreSupprimer
  3. Ce commentaire a été supprimé par son auteur.

    RépondreSupprimer
  4. Du code, de la simplicité, de l'humour un peu crade et une poignée d'amour. Témoignage de passage sur cet article qui m'inspire dans les stats (in)utiles et donc (in)dispensables !

    Merci ;-)

    PS : chez moi, c'est mon système d'import de stats Piwik qui a complètement claqué depuis la dernière mise à jour... en plus ça ressemble à un bug. Aaah bravo !

    RépondreSupprimer