Graphique de températures 1-wire avec pChart2

Il y’a quelques temps, j’ai abordé le sujet de la réalisation de graphiques de températures pour munin.
La base étant  l’exploitation des sondes 1-Wire sur une machine Debian et l’utilisation en PHP.
J’ai également parlé de la mise en base de données MySQL des valeurs du bus OneWire.

Un des buts de la mise en place des valeurs dans une base, est de pouvoir générer des graphiques personnalisés sur une durée et/ou une sonde spécifique.

Jusqu’à présent, j’avais une préférence pour les librairies Artichow, mais le projet a été arrêté.
Je me suis tourné vers pChart v2 : http://www.pchart.net

Ce que j’apprécie particulièrement, c’est la sandbox, sa documentation complète,ainsi que ses nombreuses possibilités !

Sandbox pChart

Sandbox pChart

En partant de mes derniers articles, j’ai repris un code généré en sandbox et adapté pour 24h de données 1-wire :
Script encore une fois, à adapter, je n’ai pas fait appel à mes includes pour mieux comprendre le principe du script.

<?php
ini_set('display_errors','Off');

// Préfixe de toutes les tables du site
$MYSQLHOST = "localhost";
$MYSQLLOGIN = "root";
$MYSQLPWD = "toto";
$MYSQLBASE = "1wire";
// Conection avec la base de données mysql
$db = mysql_connect($MYSQLHOST, $MYSQLLOGIN, $MYSQLPWD);
$mysql=mysql_select_db($MYSQLBASE,$db);

function OWSensorList($type=null) {
 $OWSensorList = array();
 $cpt = 0;
 if ($type == 'temperature') $req_owlist = "SELECT * FROM 1wire_sensor WHERE 1wire_sensor_type='temperature' ORDER BY 1wire_sensor_id ASC";
 else $req_owlist = "SELECT * FROM 1wire_sensor WHERE 1 ORDER BY 1wire_sensor_id ASC";
 $qur_owlist = mysql_query($req_owlist) or die(mysql_error());
 while($dat_owlist = mysql_fetch_array($qur_owlist)) {
 $OWSensorList[$cpt]['sensor_id'] = $dat_owlist['1wire_sensor_id'];
 $OWSensorList[$cpt]['sensor_enable'] = $dat_owlist['1wire_sensor_enable'];
 $OWSensorList[$cpt]['sensor_type'] = $dat_owlist['1wire_sensor_type'];
 $OWSensorList[$cpt]['sensor_family'] = $dat_owlist['1wire_sensor_family'];
 $OWSensorList[$cpt]['sensor_idaddress'] = $dat_owlist['1wire_sensor_idaddress'];
 $OWSensorList[$cpt]['sensor_comment'] = $dat_owlist['1wire_sensor_comment'];
 $cpt++;
 }
 return $OWSensorList;
}

// Retourne juste l'heure ou les minutes de YYYY-MM-DD H:i:s
function SplitTime($datemysql,$type) {
 list($date, $time) = explode(" ", $datemysql);
 list($year, $month, $day) = explode("-", $date);
 list($hour, $min, $sec) = explode(":", $time);
 if($type == 'min') return $min;
 if($type == 'hour') return $hour;
}

function OWFetch24HData($sensor_id) {
 $OWFetch24HData = array();
 $cpt = 0;
 $req_owlist = "SELECT * FROM 1wire_data WHERE 1wire_data_sensor_id = ".$sensor_id." AND 1wire_data_timestamp BETWEEN DATE_ADD( NOW( ) , INTERVAL -1 DAY ) AND NOW( ) ORDER BY 1wire_data_id ASC";
 $qur_owlist = mysql_query($req_owlist) or die(mysql_error());
 while($dat_owlist = mysql_fetch_array($qur_owlist)) {
 $fetch_timestamp = $dat_owlist['1wire_data_timestamp'];
 $fetch_minute = SplitTime($fetch_timestamp,'min');
 if($fetch_minute != '00') $OWFetch24HData['data_timestamp'][$cpt] = '';
 elseif($fetch_minute == '00') $OWFetch24HData['data_timestamp'][$cpt] = SplitTime($fetch_timestamp,'hour')."h";
 $OWFetch24HData['data_value'][$cpt] = $dat_owlist['1wire_data_value'];
 $cpt++;
 }
 return $OWFetch24HData;
}

include("lib/pChart2.1.3/class/pData.class.php");
include("lib/pChart2.1.3/class/pDraw.class.php");
include("lib/pChart2.1.3/class/pImage.class.php");

$myData = new pData();

$OWSensorList = OWSensorList('temperature');
for ($i = 0; $i < sizeof($OWSensorList); $i++) {
 if($OWSensorList[$i]['sensor_enable']) {
 $OWFetch24HData = OWFetch24HData($OWSensorList[$i]['sensor_id']);
 $myData->addPoints($OWFetch24HData['data_value'],$OWSensorList[$i]['sensor_id']);
 $myData->setSerieDescription($OWSensorList[$i]['sensor_id'],$OWSensorList[$i]['sensor_comment']);
 $myData->setSerieOnAxis($OWSensorList[$i]['sensor_id'],0);
 }
}

$myData->addPoints($OWFetch24HData['data_timestamp'],"Absissa");
$myData->setAbscissa("Absissa");

$myData->setAxisPosition(0,AXIS_POSITION_LEFT);
$myData->setAxisName(0,"Temp&eacute;ratures");
$myData->setAxisUnit(0,"°C");

$myPicture = new pImage(1000,400,$myData);
$myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>50,"G"=>50,"B"=>50,"Alpha"=>20));

$myPicture->setFontProperties(array("FontName"=>"fonts/Forgotte.ttf","FontSize"=>18));
$TextSettings = array("Align"=>TEXT_ALIGN_MIDDLEMIDDLE
, "R"=>0, "G"=>0, "B"=>0);
$myPicture->drawText(500,25,"Températures",$TextSettings);

$myPicture->setShadow(FALSE);
$myPicture->setGraphArea(75,50,975,360);
$myPicture->setFontProperties(array("R"=>0,"G"=>0,"B"=>0,"FontName"=>"fonts/Bedizen.ttf","FontSize"=>10));

$Settings = array("Pos"=>SCALE_POS_LEFTRIGHT
, "Mode"=>SCALE_MODE_FLOATING
, "LabelingMethod"=>LABELING_ALL
, "GridR"=>255, "GridG"=>255, "GridB"=>255, "GridAlpha"=>50, "TickR"=>0, "TickG"=>0, "TickB"=>0, "TickAlpha"=>50, "LabelRotation"=>0, "CycleBackground"=>1, "DrawXLines"=>1, "DrawSubTicks"=>1, "SubTickR"=>255, "SubTickG"=>0, "SubTickB"=>0, "SubTickAlpha"=>50, "DrawYLines"=>ALL);
$myPicture->drawScale($Settings);

$myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>50,"G"=>50,"B"=>50,"Alpha"=>10));

$Config = "";
$myPicture->drawSplineChart($Config);

$Config = array("FontR"=>0, "FontG"=>0, "FontB"=>0, "FontName"=>"fonts/Forgotte.ttf", "FontSize"=>12, "Margin"=>6, "Alpha"=>30, "BoxSize"=>5, "Style"=>LEGEND_NOBORDER
, "Mode"=>LEGEND_HORIZONTAL
, "Family"=>LEGEND_FAMILY_LINE
);
$myPicture->drawLegend(837,16,$Config);

$myPicture->stroke();
?>

Il faut au moins 1h de données, résultat :

Graphique 1-wire avec librairie pChart

Graphique 1-wire avec librairie pChart

Comme d’habitude, il est nécessaire d’adapter, inclure, configurer, à chacun comme bon lui semble. Ça reste un exemple, ou une base de travail.

En tout cas, parmi les différentes libraries PHP pour génerer des graphiques, pChart2 est mon coup de coeur, même si le projet n’a pas bougé depuis septembre 2011, il est suffisament abouti.

Ce billet est posté dans 1-wire, php, Web. Mettre en favoris le permalien.

3 réponses à Graphique de températures 1-wire avec pChart2

  1. Beecher says:

    Bonsoir ! Vos tutos sont tres interessants et j’ai mis en oeuvre mon systeme de relevé de température grace à vous ! J’ai un souci sur le graphe au bout d’environ 24h, je fais le relevé de 5 sondes en tout, avez vous remarqué un problème d’affichage de graphe au bout d’un certains temps ? merci par avance pour votre réponse.
    (je voudrais adapter les données avec Highcharts mais je galère pour le moment…)
    MP.

    • Lionel says:

      Bonjour,

      Désolé pour la réponse tardive.
      Pour l’instant je n’ai pas constaté de problème d’affichage au bout d’un certain temps.
      Je re-essayerais ces script d’ici quelques mois, en situation réele.

  2. laurent says:

    Bonjour et merci pour tous ces fabuleux tutaux !

    je souhaiterai effectuer des graphs à partir de ma base sql (celle créé dans l’article précédent) identique à celui créé ici mais sur une période de 1 semaine, 1 mois, voir 1 année mais je n’y arrive pas.

    Avez vous également les script pour ceux-ci ?

    Merci d’avance.

    Laurent

Laisser un commentaire

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

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre prompt="" escaped="">