190 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			190 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
/****************************************************************/
 | 
						|
/*																*/
 | 
						|
/*need device ieeeAddress, property, startDate and endDate 	*/
 | 
						|
/*																*/
 | 
						|
/****************************************************************/
 | 
						|
require_once "config.php";
 | 
						|
require_once $mohaPath . "/utils.php";
 | 
						|
require_once "header.php";
 | 
						|
require_once $mohaPath . "/constants.php";
 | 
						|
require_once "class/db.class.php";
 | 
						|
//require_once $configPath . "properties2log.php";
 | 
						|
 | 
						|
$logLevel = INFO | NOTICE | WARNING | ERROR | ALERT;
 | 
						|
 | 
						|
function displayStats($ieeeAddress, $fn, $property, $startDate, $endDate)
 | 
						|
{
 | 
						|
	global $mohaDB;
 | 
						|
	//logger(INFO, "Function displayStats", __FILE__ . ":" . __LINE__);
 | 
						|
	if ( ($indexFriendlyNames = htmlGetFriendlyNames($ieeeAddress)) !== false)
 | 
						|
	{
 | 
						|
		//print_r($indexFriendlyNames);
 | 
						|
		//  Validation of the dates
 | 
						|
		if (validateDate($startDate) && validateDate($endDate))
 | 
						|
		{
 | 
						|
			if (!in_array($fn, $indexFriendlyNames))
 | 
						|
			{
 | 
						|
				print $fn . _(" not found: Verify the syntax");
 | 
						|
			}else
 | 
						|
			{
 | 
						|
				$query = "SELECT date, value FROM logs WHERE device='" . $ieeeAddress . "' AND property='" . $property . "' AND '" . $startDate  . " 00:00:00'<= date AND '" . $endDate . " 23:59:59' >= date ORDER BY date";
 | 
						|
				logger(DEBUG, _("query : ") . $query, __FILE__ . ":" . __LINE__);
 | 
						|
				if(!($mohaDB->result = $mohaDB->query($query)))
 | 
						|
				{
 | 
						|
					print _("mysql query error: ") . $mohaDB->error . __FILE__ . ":" . __LINE__;
 | 
						|
				}
 | 
						|
				$datas = $mohaDB->result->fetch_all(MYSQLI_ASSOC);
 | 
						|
				//print_r($mohaDB);
 | 
						|
				if ($mohaDB->affected_rows != 0)
 | 
						|
				{
 | 
						|
					$n = $mohaDB->affected_rows;
 | 
						|
					for($i=0;$i<$n;$i++)
 | 
						|
					{
 | 
						|
						//echo $i . "======>";
 | 
						|
						if (strtolower($datas[$i]["value"]) == "on" or strtolower($datas[$i]["value"]) == "true")
 | 
						|
						{
 | 
						|
							//echo "setting value to : 1 =>" . __FILE__ . ":" . __LINE__ . EOLH;
 | 
						|
							$datas[$i]["value"] = 1;
 | 
						|
						}elseif (strtolower($datas[$i]["value"]) == "off" or strtolower($datas[$i]["value"]) == "false")
 | 
						|
						{
 | 
						|
							//echo "setting value to : 0 =>" . __FILE__ . ":" . __LINE__ . EOLH;
 | 
						|
							$datas[$i]["value"] = 0;
 | 
						|
						}
 | 
						|
						/*else
 | 
						|
						{
 | 
						|
							//echo "strange value : " . $datas[$i]["value"] . " => " . __FILE__ . ":" . __LINE__ .EOLH;
 | 
						|
						}*/
 | 
						|
						//var_dump($datas);
 | 
						|
					}
 | 
						|
					print diagramDisplay($datas);
 | 
						|
				}else
 | 
						|
				{
 | 
						|
					print _("Sorry, no results");
 | 
						|
				}
 | 
						|
 | 
						|
			}
 | 
						|
		}else
 | 
						|
		{
 | 
						|
			print _("Dates need to be of the form: YYYY-MM-DD 00:00:00");
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
/************************************************************/
 | 
						|
/*  $datas => array of datas to display {date,value}		*/
 | 
						|
/*  $ndata => n datas to display 							*/
 | 
						|
/*	$min => minimal value to display						*/
 | 
						|
/*	$max => maximal value to dispaly						*/
 | 
						|
/************************************************************/
 | 
						|
 | 
						|
function diagramDisplay($datas)
 | 
						|
{
 | 
						|
	global $months;
 | 
						|
 | 
						|
	$ndata = count($datas);
 | 
						|
	$i = $ndata;
 | 
						|
	$min = min(array_column($datas, "value"));
 | 
						|
	$max = max(array_column($datas, "value"));
 | 
						|
	//print "min =>" . $min . "max =>" . $max . EOLH;
 | 
						|
	//Type mime de l'image
 | 
						|
	//Chemin vers le police à utiliser
 | 
						|
	$font_file = '/usr/share/fonts/TTF/dejavu/DejaVuSans.ttf';
 | 
						|
	//Adapter la largeur de l'image avec le nombre de donnée
 | 
						|
	$largeur = ($ndata + 1) * 30 + 90;
 | 
						|
	$hauteur = 400;
 | 
						|
	//Hauteur de l'abscisse par rapport au bas de l'image
 | 
						|
	$absis = 120;
 | 
						|
	//Création de l'image
 | 
						|
	$courbe = imagecreatetruecolor($largeur, $hauteur);
 | 
						|
	//Allouer les couleurs à utiliser
 | 
						|
	$bleu  = imagecolorallocate($courbe, 0, 0, 255);
 | 
						|
	$ligne = imagecolorallocate($courbe, 220, 220, 220);
 | 
						|
	$fond  = imagecolorallocate($courbe, 250, 250, 250);
 | 
						|
	$noir  = imagecolorallocate($courbe, 0, 0, 0);
 | 
						|
	$rouge = imagecolorallocate($courbe, 255, 0, 0);
 | 
						|
	//Colorier le fond
 | 
						|
	imagefilledrectangle($courbe,0 , 0, $largeur, $hauteur, $fond);
 | 
						|
	//Tracer l'axe des abscisses
 | 
						|
	imageline($courbe, 50, $hauteur - $absis, $largeur - 10, $hauteur - $absis, $noir);
 | 
						|
	//Tracer l'axe des ordonnées
 | 
						|
	imageline($courbe, 50, $hauteur - $absis, 50, 20, $noir);
 | 
						|
	//Decaler 10px vers le haut si le minimum est différent de 0
 | 
						|
	$a = 0;
 | 
						|
	if($min != 0)
 | 
						|
	{
 | 
						|
		$absis += 10;
 | 
						|
		$a = 10;
 | 
						|
	}
 | 
						|
	//Nombres des grides verticales
 | 
						|
	$nbOrdonne = 10;
 | 
						|
	//Calcul de l'echelle des abscisses
 | 
						|
	$echelleX = ($largeur - 130) / $ndata;
 | 
						|
	//Calcul de l'echelle des ordonnees
 | 
						|
	$echelleY = ($hauteur - $absis) / ($nbOrdonne + 1);
 | 
						|
	$i = $min;
 | 
						|
	//Calcul des ordonnees des grides
 | 
						|
	$py = ($max - $min) / $nbOrdonne;
 | 
						|
	$pasY = $absis;
 | 
						|
	while($i <= ($max - $min))
 | 
						|
	{
 | 
						|
		//Affiche la valeur de l'ordonnee
 | 
						|
		imagestring($courbe, 2, 10 , $hauteur - $pasY - 6, round($i, 0, PHP_ROUND_HALF_DOWN), $noir);
 | 
						|
		//Trace la gride
 | 
						|
		imageline($courbe, 50, $hauteur - $pasY, $largeur - 20, $hauteur - $pasY, $ligne);
 | 
						|
		//Decaller vers le haut pour la prochaine gride
 | 
						|
		$pasY += $echelleY;
 | 
						|
		//Valeur de l'ordonnee suivante
 | 
						|
		$i += $py;
 | 
						|
	}
 | 
						|
 | 
						|
	$j = -1;
 | 
						|
	$pasX = 50;
 | 
						|
	//Parcourir le tableau pour le traçage du diagramme.
 | 
						|
	foreach ($datas as $row)
 | 
						|
	{
 | 
						|
		$date = $row["date"];
 | 
						|
		$quantite = $row["value"];
 | 
						|
		//calculer la hauteur du point par rapport à sa valeur
 | 
						|
		$y = ($hauteur) - (($quantite - $min) * ($echelleY / $py)) - $absis;
 | 
						|
		//dessiner le point
 | 
						|
		imagefilledellipse($courbe, $pasX, $y, 6, 6, $rouge);
 | 
						|
		//Afficher le mois en français avec une inclinaison de 315°
 | 
						|
		//printf("pasx = %d hauteur = %d absis = %d noir= %d",  $pasX, $hauteur, $absis, $noir);
 | 
						|
		imagefttext($courbe, 10, 315, $pasX, $hauteur - $absis + 20, $noir, $font_file, $date);
 | 
						|
		//Tracer une ligne verticale de l'axe de l'abscisse vers le point
 | 
						|
		imageline($courbe, $pasX, $hauteur - $absis + $a, $pasX, $y, $noir);
 | 
						|
		if($j !== -1)
 | 
						|
		{
 | 
						|
			//liée le point actuel avec la précédente
 | 
						|
			imageline($courbe, ($pasX - $echelleX), $yprev, $pasX, $y, $noir);
 | 
						|
		}
 | 
						|
		//Afficher la valeur au dessus du point
 | 
						|
		imagestring($courbe, 2, $pasX - 15, $y - 14, $quantite, $bleu);
 | 
						|
		$j = $quantite;
 | 
						|
		//enregister la hauteur du point actuel pour la liaison avec la suivante
 | 
						|
		$yprev = $y;
 | 
						|
		//Decaler l'abscisse suivante par rapport à son echelle
 | 
						|
		$pasX += $echelleX;
 | 
						|
	}
 | 
						|
	//Envoyer le flux de l'image
 | 
						|
	$file = tempnam("./", "moha-");
 | 
						|
	imagepng($courbe,$file);
 | 
						|
	return '<img src="/moha/' . basename($file) . '">';
 | 
						|
	//Désallouer la mémoire utiliser par l'image
 | 
						|
	imagedestroy($courbe);
 | 
						|
}
 | 
						|
 | 
						|
$tmp = explode("|", $_GET["device"]);
 | 
						|
if (!empty($tmp[0]) && !empty($tmp[1]) && !empty($tmp[2]))
 | 
						|
{
 | 
						|
	displayStats($tmp[0], $tmp[1], $tmp[2], $_GET["startDate"], $_GET["endDate"]);
 | 
						|
}else
 | 
						|
{
 | 
						|
	logger(ERROR, "Your syntax is bad");
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
?>
 |