tableau sql et graphique

Bonsoir,

Bien que cela ne concerne pas du tout un problème d'Arduino je pose quand meme ma question ici car c'est suite à la réalisation d'un projet Arduino que j'en suis à ce stade.

Ma question est que je souhaite réaliser un voir plusieurs graphiques avec les données récupérée par mon arduino et versées dans une base SQL qui a la forme du tableau que j'ai mis en pièce jointe.

Comment je peux faire pour mettre en forme ces données à l'aide d'un graphique?

Je voudrais mettre en abscisse le temps et en ordonnée les valeurs des températures mesurées et que ça se mette à jour en temps réel dès que j'affiche la page en question.

Savez vous comment je peux faire tout ça?

Tu peux programmer le tracé du graphique en PHP et l'afficher dans la page internet.

bonjour,
pour du temps réel, pas 36 solutions.
ajax ou javascript
jète un oeil du coté de jquery, il doit bien y avoir ce que tu cherche

Ok merci les gars, je vais jeter un oeil à tout ça mais ça m'a l'air de loin assez compliqué à mettre en oeuvre d'après ce que j'ai pu voir.
Je n'y connais pas grand chose dans tout ça.

:wink:

autre solution assez barbare.
tu sais quand tes données son envoyées.
un meta refresh dans ton html toutes les X secondes :wink:
c'est pas du live, mais quand on connait pas jquery, ca peut aider.
après c'est juste de la prog php sql pour les moyennes, max, mini
pour les graph, utilises gd ou gd2 d'apache

Aurais-tu un petit exemple très simple sous la main?

Je regaarde aussi du coté d"un pluggin compatible avec mon site internet développé sous Joomla et j'ai trouvé un pluggin qui a l'air sympa. Il arrive à créer un graphique à partir d'un fichier CSV par exemple.
Si j'arrive à combiner tout ça je peux peut-être arrivé à quelque chose.

A voir car il faut du temps pour regarder toutes ces infos et tester.

john_lenfr:
Aurais-tu un petit exemple très simple sous la main?

Je regaarde aussi du coté d"un pluggin compatible avec mon site internet développé sous Joomla et j'ai trouvé un pluggin qui a l'air sympa. Il arrive à créer un graphique à partir d'un fichier CSV par exemple.
Si j'arrive à combiner tout ça je peux peut-être arrivé à quelque chose.

A voir car il faut du temps pour regarder toutes ces infos et tester.

si tu as déjà un plugin joomla (bon courage pour se taper le codage) il suffit d'appeler en début de ce script un autre qui va appeler la bdd et créer un csv :wink:
creer csv php sur google, tu en as des tonnes

Voilà où je me suis arrêté pour l'instant:
johnlenfr.1s.fr

Par contre c'est un peu illisible , il faut que je vois pour prendre un échantillon des mesures.

Highcharts est intéressant, tu devrais y jeter un oeil http://www.highcharts.com/

Merci pour le lien fdufnews, je mets ça de côté pour quand j'aurais un peu de temps.

En attendant j'ai terminé mes créations de fichiers xml avec les données "Dernière heure", "Dernières 24h", "Dernier mois", et "tout".

Le résultat ici:
johnlenfr.1s.fr

Je pense peut-être rajouté un graph pour une semaine, à voir...

Sinon tu as les outils associés à un compte Google qui sont très intuitifs à utiliser pour produire des graphiques depuis une feuille de calcul, qu'on peut alimenter directement en ligne avec des données.

Merci Christian, j'avais vu aussi mais je préfère garder une solution locale :wink:

perso, les solutions google me tapent sur les nerfs.
on est assez fliqué comme ca avec le moteur de recherche, chrome, etc... pour en plus utiliser leur code dont on ne sait pas grand chose et pourquoi pas emmagasiner d'autres infos sur leurs servers à notre insue :wink:
il est préférable d'utiliser des solutions sur son server ou hébergement en local, mais ce n'est que mon avis.

Bof, là pour le cas présent j'aurais pas eu de problème à mettre sur leur serveurs, je vois pas trop ce qu'ils feraient de valeurs de températures.
Mais c'est surtout que leurs solutions ne sont pas pérennes. Ils changent tout le temps de code par défaut, etc...

Sinon je suis bloqué sur un truc peut-être que qeulqu'un ici pourra m'aider, c'est pour du php+mysql.

Voilà le code que j'ai réalisé par exemple pour récupérer les données de ma table sql mais il ne me satisfait pas:

<?php
//////////////////////////////////////////////////////
//      Création du fichier xml               //
//////////////////////////////////////////////////////

//tout d'abord on se connecte à la base de donnée
$database="arduino";
$connect = mysql_connect("XXX.XXX.XXX.XXX","AAAAA","BBBBB");
mysql_select_db($database, $connect);

//Ensuite on envoie une requete SQL pour sélectionner une table dont on veux les informations
$query_table = "SELECT * FROM temp2 " ;
echo $query_table;
//On fait la requête et nous recevons les informations
$result_table= mysql_query($query_table, $connect) or die(mysql_error());
//Là on transforme les informations recu sous forme de tableau
$num_table = mysql_num_rows($result_table);

if ($num_table != 0) {
        //On créer un fichier texte que l'on nomme et dont on indique l'emplacement
   $file= fopen("D:\\sitejoomla15\\flashxml\\chartsfx\\temp_all2.xml", "w");

   // CREATING TEXT
   //tout d'abord l'en-tête
   $_xml ="<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n";
   // charts
   $_xml .="<chart>\r\n";
   // title
   $_xml .="<title><![CDATA[<head>Temperatures
</head><body>All</body>]]></title>\r\n";
   // rows definition
   $_xml .="<rows min=\"-10\" max=\"50\" step=\"5\"/>\r\n";
   // columns names = dates
   $_xml .="<columns names=\"";
   
   // on fait une boucle while permettant de prendre les informations de la première colonne qui va former l'axe des abscisses
   $num_rows = mysql_num_rows($result_table);
   for ($i=0; $i <= $num_rows; $i++) {
      $row = mysql_fetch_array($result_table);
      $_xml .="$row[heure],";
   }
   $_xml .="\">\r\n";
   
   $_xml .="<row legend=\"Internal temp\" pieLegend=\"\" color=\"0xff2346\" gradientColor=\"0xff5603\" pieColors=\"0xff2346,0x3ae29d,0xd0ff48\" pieGradentColors=\"0xff5603, 0x01a42a, 0x75ff03\" data=\"";
   
   
   
   // Cette fois ci on refait une boucle while permettant de prendre les informations ligne par ligne
   // pour prendre la température interieure
   $result_table= mysql_query($query_table, $connect) or die(mysql_error());
   //$num_table = mysql_num_rows($result_table);
   while ($row = mysql_fetch_array($result_table)) {
      $_xml .="$row[temp_int],";
	  
   } 
   $_xml .="\"/>\r\n"; // fermeture balise row
   
   
   $_xml .="<row legend=\"External temp\" pieLegend=\"\"  color=\"0xe1e176\" gradientColor=\"0xb5b522\" pieColors=\"0x00BDFF,0xF90000,0x78E32B\" pieGradentColors=\"0x0040FF, 0x940000, 0x78AF2B\"  data=\"";
   // Cette fois ci on refait une boucle while permettant de prendre les informations ligne par ligne
   // pour prendre la température interieure
   $result_table= mysql_query($query_table, $connect) or die(mysql_error());
   //$num_table = mysql_num_rows($result_table);
   while ($row = mysql_fetch_array($result_table)) {
      $_xml .="$row[temp_ext],";
	  
   } 
   $_xml .="\"/>\r\n"; // fermeture balise row
   
   
   // fermeture des balises ouvertes
   $_xml .="</columns>\r\n";
   $_xml .="</chart>\r\n";
   
   
   
        //Maintenant que nous avons créer le contenu du fichier XML, on écrit sur le fichier
   fwrite($file, $_xml);
        //puis nous le fermons ce qui a pour effet d'enregistrer les données inscrites dedans.
   fclose($file);
} 

//Message d'erreur si il n'y a pas d'informations dans la BDD
else {
   echo "No Records found";
}
?>

ça me génère un fichier du type:

<?xml version="1.0" encoding="UTF-8" ?> <![CDATA[Temperatures All]]>

Ce que je voudais c'est prendre un échantillon de ma table par exemple toutes les XXX valeurs.
Donc j'ai essayé de faire : $row += 100; dans la boucle while mais cela ne fontionne pas car $row contient un "array".

Pensez-vous qu'il soit faisable de parcourir la table et d'enregistrer les valeurs mais en mettant un pas, par exemple je prélève les valeurs de 100 en 100 à la place de 1 par une?
Comment je peux faire ça?

Par ailleurs, dans mon code, je lance plusieurs fois

$result_table= mysql_query($query_table, $connect) or die(mysql_error());

car je dois faire plusieurs boucle de remplissage pour prélever chaque données et correspondre à mon fichier type .xml mais je pense que c'est pas la bonne solution.

Quelqu'un aurait des idées?

Bonjour,

je ne connais pas php, beaucoup mieux sql d'ou ma remarque :
Dans ton code tu lis la table temp2 en entier à chaque fois, il est tout à fait possible de ne lire que n élements. Sans savoir comment est structuré ta base je ne peux que donner des pistes.
Si tu as un champ Identifiant numérique (ID) tu peux faire :

$Cherche_ID=25;
$query_table = "SELECT * FROM temp2  where ID>=".$Cherche_ID." and ID<". $Cherche_ID+100;

Si tu as un champ horodatage (HH) tu peux faire :

$From="2014-01-01";
$To="2014-01-05";
$query_table = "SELECT * FROM temp2  where HH between '$From' AND '$To'";

Serge

Ok, merci pour cette piste.

Pour l'instant je garde l'ensemble de la table et je la parcours avec une boucle FOR à la place du WHILE mais en mettant un pas qui n'est pas de 1 mais par exemple 100 ou 1000.

Je me suis rendu compte aussi que je faisais $row = mysql_fetch_array($result_table); à l'intérieur du FOR, je suis donc passé d'une execution de 47ms à 16ms!

J'essaye d'optimiser encore et surtout maintenant que j'ai mon pas je vais pouvoir prendre des échantillons de ma table sans problème.

Car en fait je prélève les températures toutes les 15secondes, mais pour un graphique sur 1 semaine par exemple, la précision de 15s ne correspond plus à grand chose et le script est très ralenti, ainsi que l'affichage des données car la création du graphique en flash prend trop de temps sinon.

Donc là je vais prendre un échantillon avec un écart grandissant au fur et à mesure du graphique voulu, par exemple:
Pour la dernière heure: je garde tout
Pour la semaine: je garde un échantillon toute les 240 pas soit environ toutes les heures
Pour le mois: je garde un échantillon toute les 5760 pas soit environ 24h (1jour)
etc...

Après effectivement avec ta piste sur la requête je pourrais être encore plus performant en ne faisant la requête que sur ce dont j'ai besoin, je serais encore plus rapide...

Bon finalement ça marche pas mon histoire :frowning:

En fait j'incrémente bien ma boucle de 10 en 10 par exemple, mais ça ne va pas prendre les valeurs correspondant à la ligne en cours mais simplement les lignes les unes à la suite des autres.

Pour l'instant je prends les données toujours de l'id n°1 à l'id n°x par pas de 1.
Je n'arrive pas à faire de saut dans la table, par exemple de prendre la valeur à l'id n°1, puis ensuite à l'id n°240, puis à l'id n°480 etc...

Je ne sais pas comment incrémenter le prélèvement ?

EDIT: J'ai bidouillé avec le modulo et un test IF.

tu construis une chaine de caracteres contenant les id que tu veux, séparé par "," pour fabriquer la requete SQL finale

$mes_id="2,56,45,32";
$query_table = "SELECT * FROM temp2  where ID %in% ("$mes_id")";

Rq: code php à la louche
Serge

manque un truc dans cette requete :wink: et un gros

$query_table = "SELECT * FROM temp2  where ID %in% LIKE '$mes_id' ";
$query = mysql_query($query_table);