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.

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

Laisser un commentaire

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