- lots of debugging
- beginning to add graphical stats - beginning to add device by type - added a dashboard "etage" - begining to add notification to multiple recipients in freemobile hook
This commit is contained in:
125
webserver/display_stats.php
Normal file
125
webserver/display_stats.php
Normal file
@@ -0,0 +1,125 @@
|
||||
<?php
|
||||
|
||||
/****************************************************************/
|
||||
/* */
|
||||
/*need device ieeeAddress, property, startDate and finalDate */
|
||||
/* */
|
||||
/****************************************************************/
|
||||
|
||||
function displayStats($socket, $argList)
|
||||
{
|
||||
global $indexFriendlyNames;
|
||||
|
||||
// Validation of the dates
|
||||
if (validateDate($argList["startDate"]) && validateDate($argList["finalDate"]))
|
||||
{
|
||||
$query = "SELECT date, value FROM logs WHERE device='" . indexFriendlyNames[$argList->device] . "' AND property='" . $$argList["property"] . "' AND '" . $argList["startDate"] . ">= date AND '" . $argList["finalDate"] . "' <= date";
|
||||
if(!$this->result = $this->query($query))
|
||||
{
|
||||
logger(ERROR, _("mysql query errror: ") . $this->error, __FILE__ . ":" . __LINE__);
|
||||
}
|
||||
$datas = $this->result->fetch_all(MYSQLI_ASSOC);
|
||||
diagramDisplay($datas);
|
||||
}else
|
||||
{
|
||||
htmlSend($socket, _("Dates are not of the form: YYYY-MM-DD"));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/************************************************************/
|
||||
/* $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);
|
||||
$min = min($datas);
|
||||
$max = max($datas);
|
||||
//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
|
||||
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 $mois => $quantite)
|
||||
{
|
||||
//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°
|
||||
imagefttext($courbe, 10, 315, $pasX, $hauteur - $absis + 20, $noir, $font_file, $months[$mois-1]);
|
||||
//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
|
||||
imagepng($courbe);
|
||||
//Desallouer le memoire utiliser par l'image
|
||||
imagedestroy($courbe);
|
||||
}
|
||||
?>
|
||||
Reference in New Issue
Block a user