1
0
moha/webserver/display_stats.php
2022-04-23 02:00:52 +02:00

158 lines
5.3 KiB
PHP

<?php
/****************************************************************/
/* */
/*need device ieeeAddress, property, startDate and endDate */
/* */
/****************************************************************/
require_once "config.php";
require_once "utils.php";
require_once "header.php";
function displayStats($ieeeAddress, $fn, $property, $startDate, $endDate)
{
global $indexFriendlyNames, $mohaDB;
//logger(INFO, "Function displayStats", __FILE__ . ":" . __LINE__);
// Validation of the dates
if (validateDate($argList["startDate"]) && validateDate($argList["finalDate"]))
{
if (!array_key_exists($argList["fn"], $indexFriendlyNames))
{
htmlSend($socket, $argList["fn"] . _(" not found: Verify the syntax"));
}elseif(!array_key_exists($argList["property"], $indexFriendlyNames[$argList["fn"]]->properties))
{
htmlSend($socket, $argList["property"] . _(" not found : Verify the syntax"));
}else
{
$query = "SELECT date, value FROM logs WHERE device='" . $indexFriendlyNames[$argList["fn"]]->ieeeAddress . "' AND property='" . $argList["property"] . "' AND '" . $argList["startDate"] . "'>= date AND '" . $argList["finalDate"] . "' <= date ORDER BY date";
//logger(DEBUG, _("query : ") . $query, __FILE__ . ":" . __LINE__);
if(!($mohaDB->result = $mohaDB->query($query)))
{
//logger(ERROR, _("mysql query error: ") . $mohaDB->error, __FILE__ . ":" . __LINE__);
}
$datas = $mohaDB->result->fetch_all(MYSQLI_ASSOC);
htmlSend($socket, diagramDisplay($datas));
}
}else
{
htmlSend($socket, _("Dates are not 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;
$tmp = min($datas);
$min = $tmp["value"];
$tmp = max($datas);
$max = $tmp["value"];
//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 = $i * 50 + 90;
$hauteur = 400;
//Hauteur de l'abscisse par rapport au bas de l'image
$absis = 80;
//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 le 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 - 100) / $i;
//Calcul de l'echelle des ordonnees
$echelleY = ($hauteur - $absis - 20) / $nbOrdonne;
$i = $min;
//Calcul des ordonnees des grides
$py = ($max - $min) / $nbOrdonne;
$pasY = $absis;
while( $pasY < ($hauteur - 19))
{
//Affiche la valeur de l'ordonnee
imagestring($courbe, 2, 10 , $hauteur - $pasY - 6, round($i), $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 = 90;
//Parcourir le tableau pour le traçage de la diagramme
foreach ($datas as $row)
{
$date = $row["date"];
$quantite = $row["value"];
//calculer la hateur 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);
//Tacer une ligne veticale 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;
//Decaller l'abscisse suivante par rapport à son echelle
$pasX +=$echelleX;
}
//Envoyer le flux de l'image
//header('Content-Type: image/png');
$file = tempnam("php://temp", "moha-");
imagepng($courbe,$file);
return '<img src="/' . basename($file) . '">';
//Desallouer la mémoire utiliser par l'image
imagedestroy($courbe);
}
$tmp = explode("|", $_GET["device"]);
displayStats($tmp[0], $tmp[1], $tmp[2]);
?>