Bonjour,
Je tente de réaliser un graphique "highcharts" qui affiche la consommation de plusieurs compteurs d'eau sur le même graphique.
J'ai réussi pour un seul compteur, mais dans ce cas avec plusieurs je dois récupérer non pas une série mais autant qu'il y a de compteurs dans la table. Le code de mon graphique appelle les données vers un PHP qui fait les requêtes et formate les données en JSON :
Formatage attendu pour un graphique avec une série :
[{"name":Compteur1,"data":[[date1, valeur1],[date2, valeur2],[date3, valeur3]}]
Ce que j'arrive à faire avec le code suivant ou l'ID est récupéré dans l'URL :
Pour plusieurs compteur, il faut empiler les autres séries et le formatage doit être celui-ci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 <?php //Récupérer le numéro d'id dans l'url pour lancer la requête sur ce device $id = isset($_GET['id']) ? $_GET['id'] : NULL; // Inclure la page de connexion à la base de données include_once 'database.php'; // Connect to MySQL database $pdo = pdo_connect_mysql(); // IMPORTANT : Pour la requête qui va suivre , il est nécessaire de créer la VIEW mySQL : /* CREATE or REPLACE VIEW V_CONSO_DAY as (SELECT meter_devlog_id as V_CONSO_meter_devlog_id , max(meter_value) as V_CONSO_meter_value , date(meter_logdate) as V_CONSO_meter_logdate FROM `meter` GROUP BY meter_devlog_id , date(meter_logdate) ORDER BY meter_devlog_id , date(meter_logdate) ) ; */ // REQUETE pour la consommation par heure des 7 derniers jours, résultat de la différence entre chaque index max du jour J - index max de J-1 // UNIX_TIMESTAMP car Highcharts nécessite la date au format UNIX, *1000 pour être en millisecondes, CONVERT_TZ(ma_variable_datetime, '+00:00', @@session.time_zone) pour que la réponse reste dans le bon fuseau horaire. // Prepare the SQL statement : $stmt = $pdo->prepare(" SELECT D0.V_CONSO_meter_devlog_id as 'meter_devlog_id', UNIX_TIMESTAMP(CONVERT_TZ(D0.V_CONSO_meter_logdate, '+00:00', @@session.time_zone)) * 1000 as 'meter_unix_logdate', D0.V_CONSO_meter_value as 'Index_AD', D1.Index_PD as 'Index_PD', D0.V_CONSO_meter_value - D1.Index_PD as 'conso_day' FROM V_CONSO_DAY D0 LEFT JOIN (SELECT V_CONSO_meter_devlog_id, V_CONSO_meter_logdate, V_CONSO_meter_value as Index_PD FROM V_CONSO_DAY ) D1 ON D1.V_CONSO_meter_devlog_id = D0.V_CONSO_meter_devlog_id AND D1.V_CONSO_meter_logdate = ( SELECT max(D2.V_CONSO_meter_logdate) FROM V_CONSO_DAY D2 WHERE D2.V_CONSO_meter_devlog_id = D0.V_CONSO_meter_devlog_id AND D2.V_CONSO_meter_logdate < D0.V_CONSO_meter_logdate ) WHERE D0.V_CONSO_meter_devlog_id = '{$id}' AND D0.V_CONSO_meter_logdate > (NOW() - INTERVAL 7 DAY) "); $stmt->execute(); $json = []; while($row=$stmt->fetch(PDO::FETCH_ASSOC)){ extract($row); $json[]= [$meter_unix_logdate, (int)$conso_day]; } echo json_encode($json, JSON_NUMERIC_CHECK); ?>
[{"name":Compteur1,"data":[[date1, valeur11],[date2, valeur12],[date3, valeur13]},{"name":Compteur2,"data":[[date1, valeur21],[date2, valeur22],[date3, valeur23]},{"name":Compteur3,"data":[[date1, valeur31],[date2, valeur32],[date3, valeur33]}]
Je n'ai pas réussi à le faire, n'étant pas du tout programmeur, je me débrouille en lisant et en essayant, mais là, je bloc, j'en suis ici :
Le résultat n'est pas comme il faut, les "Wagons" sont rangés par Type
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 <?php include_once 'database.php'; $pdo = pdo_connect_mysql(); //$json = array(); $datas = array(); $names = array(); $series = array(); //Retrieve the list of used devices. $request_used_devices = $pdo->prepare("SELECT * FROM devicestatus WHERE dev_used = 1 ORDER BY dev_id"); $request_used_devices->execute(); $used_devices = $request_used_devices->fetchAll(PDO::FETCH_ASSOC); foreach ($used_devices as $used_device): $stmt = $pdo->prepare(" SELECT devicestatus.dev_id, devicestatus.dev_name, UNIX_TIMESTAMP(CONVERT_TZ(D0.V_CONSO_meter_logdate, '+00:00', @@session.time_zone)) * 1000 as 'meter_unix_logdate', D0.V_CONSO_meter_value - D1.Index_PD as 'conso_day' FROM `devicestatus` LEFT JOIN V_CONSO_DAY D0 ON D0.V_CONSO_meter_devlog_id = devicestatus.dev_id LEFT JOIN (SELECT V_CONSO_meter_devlog_id, V_CONSO_meter_logdate, V_CONSO_meter_value as Index_PD FROM V_CONSO_DAY ) D1 ON D1.V_CONSO_meter_devlog_id = D0.V_CONSO_meter_devlog_id AND D1.V_CONSO_meter_logdate = ( SELECT max(D2.V_CONSO_meter_logdate) FROM V_CONSO_DAY D2 WHERE D2.V_CONSO_meter_devlog_id = D0.V_CONSO_meter_devlog_id AND D2.V_CONSO_meter_logdate < D0.V_CONSO_meter_logdate ) WHERE D0.V_CONSO_meter_devlog_id = '{$used_device['dev_id']}' AND D0.V_CONSO_meter_logdate > (NOW() - INTERVAL 7 DAY) "); $stmt->execute(); $names[] = $used_device['dev_id']; while($row=$stmt->fetch(PDO::FETCH_ASSOC)){ extract($row); $datas[]= [$meter_unix_logdate, (int)$conso_day]; } $series['name'] = $names; $series['data'] = $datas; endforeach ; echo json_encode($series, JSON_NUMERIC_CHECK); ?>
[{"name":[Compteur1,Compteur2,Compteur2],"data":[[date1, valeur11],[date2, valeur12],[date3, valeur13],[date1, valeur21],[date2, valeur22],[date3, valeur23],[date1, valeur31],[date2, valeur32],[date3, valeur33]]}]
Je ne sait pas si j'ai le droit de poster ce lien :
https://stackoverflow.com/questions/...sql-highcharts
C'est le seul endroit avec un problème similaire, mais je ne comprends pas le code pour l'appliquer à mon utilisation...
Ma base de données 'database' est composé d'une table 'devicestatus' qui contient les informations propre aux compteurs 'dev_id', 'dev_name', ... et une seconde table 'meter' qui contient les relevés des compteurs ('meter_devlog_id' qui est la clé commune avec le dev_id, meter_logdate, meter_value).
Espérant être clair, si une âme charitable veux bien me guider...
Merci.
Partager