2022-03-28 00:40:34 +02:00
< ? php
/****************************************************************/
/* */
2022-04-23 02:00:52 +02:00
/*need device ieeeAddress, property, startDate and endDate */
2022-03-28 00:40:34 +02:00
/* */
/****************************************************************/
2022-04-23 02:00:52 +02:00
require_once " config.php " ;
2022-05-05 21:28:26 +02:00
require_once $mohaPath . " /utils.php " ;
2022-04-23 02:00:52 +02:00
require_once " header.php " ;
2022-05-05 21:28:26 +02:00
require_once $mohaPath . " /constants.php " ;
require_once " class/db.class.php " ;
//require_once $configPath . "properties2log.php";
2022-04-23 02:00:52 +02:00
2022-05-05 21:28:26 +02:00
$logLevel = INFO | NOTICE | WARNING | ERROR | ALERT ;
2022-04-23 02:00:52 +02:00
function displayStats ( $ieeeAddress , $fn , $property , $startDate , $endDate )
2022-03-28 00:40:34 +02:00
{
2022-05-05 21:28:26 +02:00
global $mohaDB ;
2022-04-23 02:00:52 +02:00
//logger(INFO, "Function displayStats", __FILE__ . ":" . __LINE__);
2022-05-05 21:28:26 +02:00
if ( ( $indexFriendlyNames = htmlGetFriendlyNames ( $ieeeAddress )) !== false )
2022-03-28 00:40:34 +02:00
{
2022-05-05 21:28:26 +02:00
//print_r($indexFriendlyNames);
// Validation of the dates
if ( validateDate ( $startDate ) && validateDate ( $endDate ))
2022-04-07 01:44:17 +02:00
{
2022-05-05 21:28:26 +02:00
if ( ! in_array ( $fn , $indexFriendlyNames ))
{
print $fn . _ ( " not found: Verify the syntax " );
} else
2022-04-07 01:44:17 +02:00
{
2022-05-05 21:28:26 +02:00
$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 )
{
2022-06-21 09:01:58 +02:00
$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);
}
2022-05-05 21:28:26 +02:00
print diagramDisplay ( $datas );
} else
{
print _ ( " Sorry, no results " );
}
2022-04-07 01:44:17 +02:00
}
2022-05-05 21:28:26 +02:00
} else
{
print _ ( " Dates need to be of the form: YYYY-MM-DD 00:00:00 " );
2022-03-28 00:40:34 +02: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 );
2022-04-07 01:44:17 +02:00
$i = $ndata ;
2022-05-05 21:28:26 +02:00
$min = min ( array_column ( $datas , " value " ));
$max = max ( array_column ( $datas , " value " ));
//print "min =>" . $min . "max =>" . $max . EOLH;
2022-03-28 00:40:34 +02:00
//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
2022-05-05 21:28:26 +02:00
$largeur = ( $ndata + 1 ) * 30 + 90 ;
2022-03-28 00:40:34 +02:00
$hauteur = 400 ;
//Hauteur de l'abscisse par rapport au bas de l'image
2022-05-05 21:28:26 +02:00
$absis = 120 ;
2022-03-28 00:40:34 +02:00
//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 );
2022-05-05 21:28:26 +02:00
//Decaler 10px vers le haut si le minimum est différent de 0
2022-04-07 01:44:17 +02:00
$a = 0 ;
2022-03-28 00:40:34 +02:00
if ( $min != 0 )
{
$absis += 10 ;
$a = 10 ;
}
//Nombres des grides verticales
$nbOrdonne = 10 ;
//Calcul de l'echelle des abscisses
2022-05-05 21:28:26 +02:00
$echelleX = ( $largeur - 130 ) / $ndata ;
2022-03-28 00:40:34 +02:00
//Calcul de l'echelle des ordonnees
2022-05-05 21:28:26 +02:00
$echelleY = ( $hauteur - $absis ) / ( $nbOrdonne + 1 );
2022-03-28 00:40:34 +02:00
$i = $min ;
//Calcul des ordonnees des grides
$py = ( $max - $min ) / $nbOrdonne ;
$pasY = $absis ;
2022-05-05 21:28:26 +02:00
while ( $i <= ( $max - $min ))
2022-03-28 00:40:34 +02:00
{
//Affiche la valeur de l'ordonnee
2022-05-05 21:28:26 +02:00
imagestring ( $courbe , 2 , 10 , $hauteur - $pasY - 6 , round ( $i , 0 , PHP_ROUND_HALF_DOWN ), $noir );
2022-03-28 00:40:34 +02:00
//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 ;
2022-05-05 21:28:26 +02:00
$pasX = 50 ;
//Parcourir le tableau pour le traçage du diagramme.
2022-04-07 01:44:17 +02:00
foreach ( $datas as $row )
2022-03-28 00:40:34 +02:00
{
2022-04-07 01:44:17 +02:00
$date = $row [ " date " ];
$quantite = $row [ " value " ];
2022-05-05 21:28:26 +02:00
//calculer la hauteur du point par rapport à sa valeur
2022-03-28 00:40:34 +02:00
$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°
2022-05-05 21:28:26 +02:00
//printf("pasx = %d hauteur = %d absis = %d noir= %d", $pasX, $hauteur, $absis, $noir);
2022-04-07 01:44:17 +02:00
imagefttext ( $courbe , 10 , 315 , $pasX , $hauteur - $absis + 20 , $noir , $font_file , $date );
2022-05-05 21:28:26 +02:00
//Tracer une ligne verticale de l'axe de l'abscisse vers le point
2022-03-28 00:40:34 +02:00
imageline ( $courbe , $pasX , $hauteur - $absis + $a , $pasX , $y , $noir );
2022-05-05 21:28:26 +02:00
if ( $j !== - 1 )
2022-03-28 00:40:34 +02:00
{
//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 ;
2022-05-05 21:28:26 +02:00
//Decaler l'abscisse suivante par rapport à son echelle
$pasX += $echelleX ;
2022-03-28 00:40:34 +02:00
}
//Envoyer le flux de l'image
2022-05-05 21:28:26 +02:00
$file = tempnam ( " ./ " , " moha- " );
2022-04-07 01:44:17 +02:00
imagepng ( $courbe , $file );
2022-05-05 21:28:26 +02:00
return '<img src="/moha/' . basename ( $file ) . '">' ;
//Désallouer la mémoire utiliser par l'image
2022-03-28 00:40:34 +02:00
imagedestroy ( $courbe );
}
2022-04-23 02:00:52 +02:00
$tmp = explode ( " | " , $_GET [ " device " ]);
2022-07-07 22:46:05 +02:00
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 " );
}
2022-04-23 02:00:52 +02:00
2022-03-28 00:40:34 +02:00
?>