Forum Programmation.php accélérer l'affichage de graphe dans Navigateur

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
27
mar.
2015

Bonsoir ,avec une sonde branché sur mon raspberry , je récupère les valeurs de température toute les 5 minutes dans un fichier ,avec ces valeurs je fais un graph en php .

Mon probleme , je voudrais trouvé une solution pour accélérer l'affichage de ce graphe , il faut environ 1 minute pour qu'il apparaissent dans le navigateur , c'est vraiment trop long .
Voila le code php de mon graphe qui est certainement a optimisé .

  • # Une DB ?

    Posté par  . Évalué à 2. Dernière modification le 27 mars 2015 à 21:11.

    Peut-être faudrait-il songer à utiliser des outils prévu pour ce genre de cas:
    RRDTool
    (Voir aussi InfluxDB, et autres logiciels de monitoring)

    Ou tout simplement une base de données ? Visiblement tu utilises un fichier pour stocker tes valeurs, à partir d'un certain volume ça peut devenir plus un problème qu'une solution.

    Une autre piste: cacher les calculs ne concernant que d'anciennes valeurs ?

    • [^] # Re: Une DB ?

      Posté par  . Évalué à 1.

      Bonjour , j'ai trouvé ce tuto qui utilise SQLite database.

      https://github.com/talltom/PiThermServer

      d’après vous est ce que je vais gagné en rapidité d'affichage ?

      • [^] # Re: Une DB ?

        Posté par  . Évalué à 1.

        d’après vous est ce que je vais gagné en rapidité d'affichage ?

        Je dirais oui. Surtout parce que la génération du graph est déléguée au navigateur (dans cette page html -> temperature_plot.htm). C'est l'idée du commentaire en-dessous ([1]).

        • [^] # Re: Une DB ?

          Posté par  . Évalué à 1.

          Pour vérifier si c'est la taille de tes fichiers et tes calculs qui ralentissent le traitement ou bien juste le traitement de l'image, tu pourrais commenter ta fonction draw_graph et laisser scale et get_data.

      • [^] # Re: Une DB ?

        Posté par  . Évalué à 1. Dernière modification le 28 mars 2015 à 15:57.

        Ah je suis vraiment embarrasser car j'ai aussi trouver un tuto avec RRDTool https://howonpi.wordpress.com/
        Lequel choisir ? lequel est le mieux entre les 2 tuto ?
        Sur howonpi il parle du serveur Web nginx , mon raspberry est déjà équipé du serveur Web apache est ce compatible ?

        • [^] # Re: Une DB ?

          Posté par  . Évalué à 1.

          Ce deuxième à l'air pas mal. J'aime bien l'idée de travailler en ram.

          Il fait aussi calculer le graph dans le navigateur. Donc sur ce point là ça ne doit pas être trop différent.

          Pour nginx et apache, ce sont deux logiciels qui font la même choses et qui ne peuvent pas travailler en même temps. Il faudra que tu empêches apache de se lancer au démarrage, ou que tu l'enlève complètement.

          Sinon quand on voit ton code php on a l'impression que tu es un peu programmeur, mais c'est quoi ton niveau en fait ? Tu sais programmer ? Je sais pas trop quel niveau d'explication on peut te donner.

          • [^] # Re: Une DB ?

            Posté par  . Évalué à 1.

            Mon niveau !!! très très bas , Ce code n'est pas de moi c'est un ami qui me l'a fait il y a 2 ans quand j’ai commencé un projet de domotique sur un raspberry toute la partie électronique est de moi, et la partie programmation c’était lui.
            Actuellement, il est très fatigué, et ne peux plus m’aider. Je me retrouve donc dans l’impasse. Et mon projet n’est hélas pas fini. j'essaye donc de me débrouillé seul avec mes faibles connaissance en programmation !

            mon raspberry est équipé d' apache. pas trop envie de changer pour pour nginx

            • [^] # Re: Une DB ?

              Posté par  . Évalué à 1.

              mon raspberry est équipé d' apache. pas trop envie de changer pour pour nginx

              Comme ça, a vue de nez, je dirais que tu peux essayer de faire l'installation avec apache. Tu évites juste d'installer nginx, et puis tu adaptes les path dans lesquels tu vois un nginx apparaître.

              • [^] # Re: Une DB ?

                Posté par  . Évalué à 1.

                J'ai fait l'installation de howonpi .tout c'est bien passé par contre rien quand je tape IP/tempChart.html j'ai bien la page avec un menu mais aucun graph. j'ai l'impression qu'il y a un probleme de lien Quand j'ai fait l'installation tout a été se mettre dans Root

                • [^] # Re: Une DB ?

                  Posté par  . Évalué à 1.

                  Bonjour voila une copie d’écran de ce que j'ai ,
                  DLFPle graph n'apparait pas . Dans mon précédent message je disais que tout les path avait été s'installer dans Root. j'ai déplacé le fichier tempChart.html dans home/www Faut'il déplacer les autres fichiers ?

                  • [^] # Re: Une DB ?

                    Posté par  . Évalué à 1.

                    Tu as mis où ton répertoire www/ ? Il y a quoi dedans ? Et dans /webdata/, il y a quoi ?

                    Par défaut, avec apache, www/ est dans /var. Ca donne /var/www
                    Je pense qu'à la fin tu devrais trouver au moins ça dans ce répertoire:
                    charts/
                    webdata
                    tempChart.html

                    Si tu fais une recherche sur "/webdata/" dans le code source de tempChart.html, tu peux voir que le script accède à des fichiers de ce répertoire. Est-ce que ces fichiers existent? Est ce que tu les vois dans /var/www/webdata et dans /webdata ?

                    • [^] # Re: Une DB ?

                      Posté par  . Évalué à 1.

                      Avec ton message, j'ai l'impression que ton répertoire www/ est dans home. Mes questions sont toujours valables.

                      Il y a quoi dans /home/www/ ?
                      Qu'est-ce que tu vois quand tu fais : ls /home/www/webdata
                      etc.

                      • [^] # Re: Une DB ?

                        Posté par  . Évalué à 1.

                        Bon ben gros probleme !! j'ai tout cassé . Mon raspberry fonctionne mais je ne peux plus l’atteindre avec putty .
                        Et ça depuis l'installation de la tache Cron

                        sudo crontab -e
                        */5 * * * * /home/pi/readTemp.py

                        Comment supprimer cette Cron ? sans avoir accés au raspberry ? Si je branche ma carte SD sur un NAs Peux t’ont retrouver ou elle se cache ?

                        Pour répondre a ta question :Il y a quoi dans /home/www/ ? il y a tout mes fichier www et PHP.

                        • [^] # Re: Une DB ?

                          Posté par  . Évalué à 2.

                          Comment supprimer cette Cron

                          Dans le cas le plus simple, le cron lis le fichier /etc/crontab
                          Mais il est important, c'est lui qui récupère les température toutes les 5 minutes (c'est plus clair en lisant /etc/crontab).

                          le fichier /home/pi/readTemp.py existe-t-il bien ? Tu as mis les bons droits dessus ?

                          Pour répondre a ta question :Il y a quoi dans /home/www/ ? il y a tout mes fichier www et PHP.

                          Et il y a aussi les 3 éléments qui ont dû être ajoutés par la procédure. J'ai donné les noms plus haut.

                          Et dans le dossier /home/www/webdata ? Il y a des trucs ? Sinon, c'est que tu as merdé sur la création du lien. Tu as peut-être aussi merdé sur la création du dossier /webdata.

                          • [^] # Re: Une DB ?

                            Posté par  . Évalué à 1. Dernière modification le 29 mars 2015 à 15:22.

                            Bon je suis reparti depuis le debut avec une copie de ma carte SD

                            Dans home/www j'ai effectivement un dossier charts , un dossier webdata et un fichier tempChart.html.

                            Les 5 autres fichiers
                            createDS18B20database.py ,DS18B20Config.py ,readTemp.py, data_DS18B20.rrd ,DS18B20Config.pyc
                            sont dans home/www/py.

                            Dans le dossier dossier /home/www/webdata il n'y a rien

                            Si tu veux on peux en parler sur http://webchat.freenode.net/
                            Canal rfsniff

                            • [^] # Re: Une DB ?

                              Posté par  . Évalué à 1.

                              sont dans home/www/py

                              Le gars s'appelle pi. /home/pi, c'est son répertoire personnel. D'ailleurs quand il fait

                              $ cd ~

                              Ca le déplace dans ce répertoire. C'est peut-être ça que tu as loupé.

                              D'ailleurs est-ce que tu as un fichier DS18B20.conf ?

                              Dans le dossier dossier /home/www/webdata il n'y a rien

                              Ce dossier doit contenir la même chose que dans /webdata car tu en as fait un lien vers ce dossier.

                              Et le dossier /webdata doit contenir tous les fichiers qui sont référencés dans le code source en html. Tu dois regarder le code source et chercher du texte qui commence par /webdata.

                              Sur ce, je crois que je commence à me lasser. Je te souhaite bonne chance. Peut-être que quelqu'un d'autre pourra t'aider pour la suite.

                            • [^] # Re: Une DB ?

                              Posté par  . Évalué à 2.

                              faudrait voir comment est codé la page tempChart.html,

                              mais à mon avis, tu as rangé les fichiers à ta sauce, et le tempChart.html ne les trouve pas.

                              à mon avis, il vaut mieux creer un dossier temperature
                              et decompressé le contenu du tempChart dedans,

                              avec un peu de chance ca donne l'arborescence suivante :

                              /home/www/temperature
                              /home/www/temperature/tempChart.html
                              /home/www/temperature/webdata
                              /home/www/temperature/charts
                              /home/www/temperature/createDS18B20database.py
                              /home/www/temperature/readTemp.py
                              /home/www/temperature/data_DS18B20.rrd
                              /home/www/temperature/DS18B20Config.pyc

                              le generateur de graphe sera alors visible avec ton navigateur à l'adresse http://ip-du-raspberry/temperature/tempChart.html

                              • [^] # Re: Une DB ?

                                Posté par  . Évalué à 1.

                                Merci NeoX pour toutes ces explications que j'ai appliqué a la lettre sauf le nom du dossier que j'ai changé ( temperature = Graph).
                                Mais rien a changé .

                                Le générateur de graphe est bien visible dans mon navigateur à l'adresse http://192.168.1.19/Graph/tempChart.html , comme ce matin mais aucunes valeurs aucun graph !

                                • [^] # Re: Une DB ?

                                  Posté par  . Évalué à 2.

                                  comme je l'évoquais dans l'autre sujet,
                                  howonpi parle d'un capteur de temperature DS18B20,
                                  si tu n'as pas ce capteur, il est probable que le script qui remplit la base de donnée ne trouve rien, et donc s'il n'y a rien, il n'y a pas de graphe.

                                  • [^] # Re: Une DB ?

                                    Posté par  . Évalué à 1. Dernière modification le 29 mars 2015 à 17:37.

                                    Si justement j'ai 3 capteurs

                                    28-000004d330cb,Sonde T° Eau chaudière (Retour)
                                    28-000004d3bf43,Sonde T° Eau chaudière (Aller)
                                    28-0000023,9592,Sonde T° Intérieure

                                    par contre j'ai un doute avec webdata

                                    sudo ln -s /webdata webdata

                                    • [^] # Re: Une DB ?

                                      Posté par  . Évalué à 2.

                                      par contre j'ai un doute avec webdata
                                      sudo ln -s /webdata webdata

                                      dans le tuto il cree un /webdata qui est un dossier tmpfs (en RAM)
                                      puis il fait un lien (sudo ln -s /webdata webdata) du dossier /webdata vers /var/www/charts/webdata

                                      je ne sais pas si le generateur de la base cherche à ecrire dans /webdata ou s'il cherche autrement

                                      • [^] # Re: Une DB ?

                                        Posté par  . Évalué à 1.

                                        Ça doit être ça qui déconne . chez moi c'est un simple fichier de 8 o dans root !

                                        • [^] # Re: Une DB ?

                                          Posté par  . Évalué à 2.

                                          ca doit etre un dossier
                                          et pour respecter le mode d'emploi sans passer par un tmpfs (dossier en RAM), il faut faire comme ca :

                                          rm -rf /webdata
                                          mkdir /webdata
                                          ln -s /webdata /home/www/charts/webdata
                                          • [^] # Re: Une DB ?

                                            Posté par  . Évalué à 1.

                                            J'y comprend plus rien . Ce que je sais par contre c'est que le raspberry va bientôt apprendre a voler !! ou je vais peux être le forcer a se suicider !!

                                            J'ai fait un dossier tmpfs l'étape 4 du tuto il s'appelle webdata.

                                            Quand je tape tes commandes évidement ça ne fonctionne pas !
                                            root@PiHome:/home/www/Graph# rm -rf /webdata
                                            root@PiHome:/home/www/Graph# mkdir /webdata
                                            root@PiHome:/home/www/Graph# ln -s /webdata
                                            ln: impossible de créer le lien symbolique « ./webdata »: Le fichier existe
                                            ```

                                            • [^] # Re: Une DB ?

                                              Posté par  . Évalué à 2.

                                              parce qu'il te manque un morceau dans la commande ln -s

                                              tu as deja fait l'etape 4 tmpfs dans le tuto, tres bien.

                                              il faut donc active cette partition => mount /webdata
                                              puis faire un lien de /webdata vers le dossier Graph : ln -s /webdata /home/www/Graph/webdata

                                              evidemment il faut que /home/www/Graph/webdata n'existe pas avant de faire le ln -s

                                              • [^] # Re: Une DB ?

                                                Posté par  . Évalué à 1. Dernière modification le 29 mars 2015 à 20:39.

                                                Merci Néox , mais je laisse tomber , je suis dégouté de linux . j'ai passé toute ma journée depuis 8 heures ce matin .trop compliqué pour moi . j'ai lu et relu au moins 80 fois ce tuto et en plus de l'aide du forum je n'y arrive pas .

                                                • [^] # Re: Une DB ?

                                                  Posté par  . Évalué à 2.

                                                  laisse pas tomber pour si peu, reposes toi, reviens sur le projet dans quelques jours

                                                  tu as un produit genial, qui a bien avancé, et qui peut etre completé par d'autres idées.

                                                  faut juste prendre le temps et comprendre ce que tu fais pour savoir le refaire, et surtout, savoir l'adapter à ta machine/config.

                                                  car souvent le tuto, sauf à etre fait sur une machine strictement identique à la tienne, sera fait sur la machine specifique à l'utilisateur qui a redigé le tuto (ex dans le cas qui nous interesse, la personne a un ngnix , installe ses fichiers dans /var/www )

                                                  • [^] # Re: Une DB ?

                                                    Posté par  . Évalué à 1.

                                                    Tu n'as pas un peu de temps pour te connecter avec moi avec team viewver pour voir exactement ce que j'ai fait .

                              • [^] # Re: Une DB ?

                                Posté par  . Évalué à 1. Dernière modification le 04 avril 2015 à 14:31.

                                Bonjour , Après vérification ,et nombreuses tentatives je suis toujours dans l'impasse avec aucune valeur affiché sur ma page http://192.168.1.19/Graph/tempChart.html.
                                Quand je lance la commande /home/www/Graph# python readTemp.py dans putty ca fonctionne bien ,

                                DLFP

                                Le dossier Webdata ,et le fichier base de donnée data_DS18B20.rrd se rempli bien .Est ce que mon probleme ne viens pas de tempChart.html ?

                                <!DOCTYPE html>
                                <html lang="en">
                                  <head>
                                    <meta content="text/html; charset=utf-8" http-equiv="content-type" />
                                    <title>Temperature history</title>
                                
                                    <!-- Le styles -->
                                    <link href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/2.2.2/css/bootstrap.min.css" rel="stylesheet">
                                    <style type="text/css">
                                      body {
                                        padding-top: 60px;
                                        padding-bottom: 40px;
                                      }
                                    </style>
                                    <link href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/2.2.2/css/bootstrap-responsive.min.css" rel="stylesheet">
                                    <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
                                    <!--[if lt IE 9]>
                                      <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
                                    <![endif]-->
                                
                                    <!-- Le fav and touch icons -->
                                    <link rel="shortcut icon" href="ico/favicon.ico">
                                  </head>
                                
                                  <body>
                                    <script type="text/javascript">
                                         // read sensors labels from DS18B20Status.txt file
                                    function GetLabels(){
                                      var request = new XMLHttpRequest();
                                      request.open("Get","/webdata/DS18B20Status.txt",false);
                                      request.send(null);
                                      var AllText = request.responseText;
                                      var K=  AllText.split(/\r\n|\n/);
                                      var Item=[]
                                      for( i in K) {
                                         if(K[i].length==0) continue;
                                       var L = K[i].split(/,/);
                                       Item.push([L[0],L[2]]);
                                      }
                                      return Item;
                                    }
                                       // return everything after the question mark
                                       function GetUrlParameter() {
                                         idx = window.location.href.indexOf("?");
                                         if( idx < 0 ) return "";
                                        return window.location.href.substring(idx+1);
                                        }
                                          urlParameter = GetUrlParameter();
                                     </script>
                                    <div class="navbar navbar-inverse navbar-fixed-top">
                                         <div class="navbar-inner">
                                           <div class="container-fluid">
                                
                                             <a class="brand" href="/index.html">Temperature</a>
                                             <div class="nav-collapse collapse">
                                               <ul class="nav">
                                                 <li class="active"><a href="/index.html">Home</a></li>
                                               </ul>
                                             </div><!--/.nav-collapse -->
                                           </div>
                                         </div>
                                       </div>
                                
                                       <div class="container-fluid">
                                         <div class="row-fluid">
                                           <div class="span2">
                                             <div class="well sidebar-nav">
                                               <ul class="nav nav-list">
                                                 <li class="nav-header">Temperature</li>
                                                  <script tyep="text/javascript">
                                                   var qparser = document.createElement('a');
                                                   qparser.href = window.location.href;
                                                   var frame1url = qparser.protocol + "//" + qparser.host + qparser.pathname;
                                
                                                  document.write('<li><a href="' + frame1url + '?3h">Last 3h</a></li>');
                                                  document.write('<li><a href="' + frame1url + '?24h">Last 24h</a></li>');
                                                  document.write('<li><a href="' + frame1url + '?48h">Last 48h</a></li>');
                                                  document.write('<li><a href="' + frame1url + '?1w">Last week</a></li>');
                                                  document.write('<li><a href="' + frame1url + '?1m">Last month</a></li>');
                                                  document.write('<li><a href="' + frame1url + '?3m">Last 3 month</a></li>');
                                                  document.write('<li><a href="' + frame1url + '?1y">Last year</a></li>');
                                                 </script>
                                               </ul>
                                             </div><!--/.well -->
                                           </div><!--/span-->
                                           <div class="span10">
                                             <div id="content">
                                
                                               </div>
                                           </div><!--/span-->
                                         </div><!--/row-->
                                
                                         <hr>
                                
                                       </div><!--/.fluid-container-->
                                
                                    <!-- Le javascript ================================================== -->
                                    <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jquery/1.9.0/jquery.min.js" charset="UTF-8"></script>
                                <!-- <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/highcharts/2.3.1/highcharts.js" charset="UTF-8"></script> -->
                                    <script type="text/javascript" src="/charts/js/highcharts.js" charset="UTF-8"></script>
                                    <script type="text/javascript">
                                      var Labels = GetLabels();
                                
                                      var all;
                                function computeSunrise(e, t) {
                                    var n = 13.408056;
                                    var r = 52.518611;
                                    var i = 90.83333333333333;
                                    var s = Math.PI / 180;
                                    var o = 180 / Math.PI;
                                    var u = n / 15;
                                    var a;
                                    if (t) {
                                        a = e + (6 - u) / 24
                                    } else {
                                        a = e + (18 - u) / 24
                                    }
                                    M = .9856 * a - 3.289;
                                    L = M + 1.916 * Math.sin(M * s) + .02 * Math.sin(2 * M * s) + 282.634;
                                    if (L > 360) {
                                        L = L - 360
                                    } else if (L < 0) {
                                        L = L + 360
                                    }
                                    RA = o * Math.atan(.91764 * Math.tan(L * s));
                                    if (RA > 360) {
                                        RA = RA - 360
                                    } else if (RA < 0) {
                                        RA = RA + 360
                                    }
                                    Lquadrant = Math.floor(L / 90) * 90;
                                    RAquadrant = Math.floor(RA / 90) * 90;
                                    RA = RA + (Lquadrant - RAquadrant);
                                    RA = RA / 15;
                                    sinDec = .39782 * Math.sin(L * s);
                                    cosDec = Math.cos(Math.asin(sinDec));
                                    cosH = (Math.cos(i * s) - sinDec * Math.sin(r * s)) / (cosDec * Math.cos(r * s));
                                    var f;
                                    if (t) {
                                        f = 360 - o * Math.acos(cosH)
                                    } else {
                                        f = o * Math.acos(cosH)
                                    }
                                    f = f / 15;
                                    T = f + RA - .06571 * a - 6.622;
                                    UT = T - u;
                                    if (UT > 24) {
                                        UT = UT - 24
                                    } else if (UT < 0) {
                                        UT = UT + 24
                                    }
                                    localT = UT + 1;
                                    return localT * 3600 * 1e3
                                }
                                function dayOfYear() {
                                    var e = Math.floor((new Date).setFullYear((new Date).getFullYear(), 0, 1) / 864e5);
                                    var t = Math.ceil((new Date).getTime() / 864e5);
                                    var n = t - e;
                                    return n
                                }
                                Highcharts.setOptions({
                                    global: {
                                        useUTC: false
                                    }
                                });
                                
                                options = {
                                    chart: {
                                        renderTo: "content",
                                        type: "spline"
                                    },
                                
                                    title: {
                                        text: "Temperatures of the last 24h"
                                    },
                                
                                    subtitle: {
                                        text: ""
                                    },
                                
                                    xAxis: {
                                        type: "datetime",
                                        dateTimeLabelFormats: {
                                            hour: "%H. %M"
                                        }
                                    },
                                
                                    yAxis: [{
                                        title: {
                                            text: "T (°C)"
                                        }
                                    },
                                    {
                                        title: {
                                            text: "Humidity (%)"
                                        },
                                             opposite: true
                                    }],
                                      tooltip: {
                                                formatter: function() {
                                
                                                        if(this.series.name == '#1-Humidity')
                                                         {
                                                          return "<b>" + this.series.name + "</b><br/>" + Highcharts.dateFormat("%H:%M", this.x) + ": " + this.y.toFixed(1) + "%"
                                                 }
                                                        else if(this.series.name == '#2-Humidity')
                                                         {
                                                          return "<b>" + this.series.name + "</b><br/>" + Highcharts.dateFormat("%H:%M", this.x) + ": " + this.y.toFixed(1) + "%"
                                                 }
                                                        else
                                                         {                        
                                                          return "<b>" + this.series.name + "</b><br/>" + Highcharts.dateFormat("%H:%M", this.x) + ": " + this.y.toFixed(1) + "°C"
                                                         }
                                                }
                                        },  
                                    plotOptions: {
                                        series: {
                                            marker: {
                                                radius: 2
                                            }
                                        }
                                    },
                                
                                    lineWidth: 1,
                                    series: []
                                }
                                
                                
                                       //   multiple parameters  decoder
                                      function gup( name ){
                                    name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");  
                                    var regexS = "[\\?&]"+name+"=([^&#]*)";  
                                    var regex = new RegExp( regexS );  
                                    var results = regex.exec( window.location.href ); 
                                    if( results == null )    return "";  
                                    else    return results[1];}
                                
                                
                                        // return everything after the question mark
                                       function GetUrlParameters() {
                                         idx = window.location.href.indexOf("?");
                                         if( idx < 0 ) return "";
                                        return window.location.href.substring(idx+1);
                                        }
                                
                                
                                
                                      function GetChartXml() {
                                        switch(urlParameter)
                                        {
                                          case "3h":
                                          case "48h":
                                          case "1w":
                                          case "1m":
                                          case "3m":
                                          case "1y":
                                                     return "webdata/temperature" + urlParameter + ".xml";
                                         }
                                         return "webdata/temperature24h.xml";
                                      }
                                
                                
                                      function GetSerieYAxis(sName)
                                      {
                                
                                // only one axis for DS18B20       
                                //        switch(sName)
                                //        {
                                //          case "hm2_dht22": return 1;
                                //          case "hm_dht22": return 1;
                                //        }
                                
                                        return 0;
                                
                                      }
                                      function GetSerieName(sName)
                                      {
                                
                                        for(i in Labels) {
                                         if(sName == Labels[i][0]) return Labels[i][1];
                                        }
                                        // didn't found it just put the internal Id
                                        return sName;
                                      }
                                      function GetChartTitle()
                                      {
                                
                                        switch(urlParameter)
                                        {
                                          case "3h":
                                                return "Last 3 hours temperature";
                                          case "48h":
                                                return "Last 48 hours temperature";
                                          case "1w":
                                                return "Last week temperature";
                                          case "1m":
                                                return "Last month temperature";
                                          case "3m":
                                                return "Last 3 months temperature";
                                          case "1y":
                                                return "Last year temperature";
                                          }
                                                return "Last 24 hours temperature";
                                      }
                                     function GetNumberOfDays()
                                     {
                                        switch(urlParameter)
                                        {
                                          case "3h":
                                                return 1;
                                          case "48h":
                                                return 2;
                                          case "1w":
                                                return 7;
                                          case "1m":
                                                return 31;
                                          case "3m":
                                                return 0;
                                          case "1y":
                                                return 0;
                                          }
                                                return 1;
                                     }      
                                
                                      $(document).ready(function() {
                                        $.ajax({
                                          type: "GET",
                                          url: GetChartXml(),
                                          dataType: "xml",
                                          success: function(xml) {
                                            var series = []
                                    //define series
                                    $(xml).find("entry").each(function() {
                                       var seriesOptions;
                                
                                      seriesOptions = {
                                        name: GetSerieName($(this).text()),
                                        yAxis: GetSerieYAxis($(this).text()),
                                data: []
                                        }
                                      options.series.push(seriesOptions);
                                     });
                                     //populate with data
                                    $(xml).find("row").each(function() {
                                      var t = parseInt($(this).find("t").text()) * 1000
                                       $(this).find("v").each(function(index) {
                                        var v = parseFloat($(this).text())
                                        v = v || null
                                        if (v != null) {
                                          options.series[index].data.push([t, v])
                                        };
                                      });
                                    });
                                     options.title.text = GetChartTitle();
                                    $.each(series, function(index) {
                                      options.series.push(series[index]);
                                    });
                                     //add sunrise and sunset
                                    options.xAxis.plotBands = []
                                     var nday= GetNumberOfDays();
                                
                                            for (var i = nday; i >= 0; i--) {
                                              var d = new Date();
                                              d.setHours(0,0,0,0);
                                              d.setDate(d.getDate()-i);
                                              var sunrise = d.getTime()+computeSunrise(dayOfYear(), true);
                                              var sunset = d.getTime()+computeSunrise(dayOfYear(), false);
                                              options.xAxis.plotBands.push({
                                                from: sunrise,
                                                to: sunset,
                                                color: '#FCFFC5'  
                                              });  
                                            };
                                            chart = new Highcharts.Chart(options);
                                          }
                                        });
                                      });
                                    </script> 
                                </body>
                                </html>
                                
                                • [^] # Re: Une DB ?

                                  Posté par  . Évalué à 3.

                                  le grapheur cherche les données dans un fichier /webdata/DS18B20Status.txt

                                  request.open("Get","/webdata/DS18B20Status.txt",false);

                                  lors de l'installation tu disais avoir installé le grapheur dans /home/www/Graph et avoir fait un dossier webdata dedans.

                                  le ficheir html tel qu'il est ecrit va chercher les datas : (au choix, je ne suis pas assez calé en javascript) :
                                  - /webdata/DS18B20Status.txt qui serait la racine de ton systeme sur le PI, la procedure sur HWONPI dit d'ailleurs de faire un ln -s de l'emplacement reel webdata vers un autre emplacement, celui du serveur web)

                                  • /webdata/DS18B20Status.txt qui serait la racine du serveur web, dans ton cas /home/www

                                  le fichier html ne semble pas codé pour aller chercher directement le fichier data_DS18B20.rrd
                                  donc attention, si tu as renommé les fichiers pour ta convenance, il faut adapter les scripts pour refleter ce changement.

                                  • [^] # Re: Une DB ?

                                    Posté par  . Évalué à 1.

                                    Mon dossier ramdisk webdata est a la racine du PI et le lien que j'ai fais avec ln -s est dans home/www/Graph/webdata .

                                    Dans mon dossier Graph j'ai:
                                    createDS18B20database.py
                                    data_DS18B20.rrd
                                    DS18B20.conf
                                    DS18B20.py
                                    DS18B20.pyc
                                    DS18B20Config.py
                                    DS18B20Config.pyc
                                    readTemp.py
                                    tempChart.html
                                    /charts
                                    /webdata

                                    C'est le fichier readTemp.py qui va remplir data_DS1820.rdd mais rien ne le lit

                                    • [^] # Re: Une DB ?

                                      Posté par  . Évalué à 1.

                                      Ça y est enfin !! ça fonctionne !!c’était le dossier /charts qui n’était pas au bon endroit ,il fallait le mettre dans www .

                                      Maintenant mon autre probleme c'est la tache cron qui ne fonctionne pas .çà doit normalement lire les sondes toutes les 5 minutes .

                                      J'ai donc créer Graph avec dedans
                                      */5 * * * * root python /home/www/Graph/readTemp.py

                                      Toutes mes taches cron sont dans etc/cron.d

                                      DLFP

                                      • [^] # Re: Une DB ?

                                        Posté par  . Évalué à 2. Dernière modification le 04 avril 2015 à 16:28.

                                        J'ai donc créer Graph avec dedans
                                        */5 * * * * root python /home/www/Graph/readTemp.py

                                        Essaye en utilisant le path complet de python. Quelque chose comme /usr/bin/python

                                        Par exemple:
                                        */5 * * * * root /usr/bin/python /home/www/Graph/readTemp.py

                                        J'ai déjà eu des problèmes de variables d'environnements dans des scripts. Ici ca serait ta variable PATH qui n'est pas settée dans l'environnement d'exécution de cron. Donc il faut faire sans.

                                        • [^] # Re: Une DB ?

                                          Posté par  . Évalué à 1.

                                          je viens de tester la tache cron comme cela

                                          */5 * * * * root /usr/bin/python /home/www/Graph/readTemp.py

                                          ça ne passe pas aucun démarrage de readTemp.py

                                          un truc que je ne comprend pas encore dans la console si je tape
                                          root@PiHome:/# python /home/www/Graph/readTemp.py

                                          voila la réponse. Unable to read 'DS18B20.conf'

                                          et si je fais
                                          root@PiHome:/home/www/Graph# python readTemp.py
                                          TDS1:23.875
                                          TDS2:20.812
                                          TDS3:19.812

                                          • [^] # Re: Une DB ?

                                            Posté par  . Évalué à 2. Dernière modification le 04 avril 2015 à 20:54.

                                            C'est une bonne observation.

                                            Je pense qu'il va falloir que tu te mettes un peu au python si tu veux t'en sortir. Par exemple ce message d'erreur vient de ton code source readTemp.py:

                                                try:
                                                  fileH = open("DS18B20.conf")
                                                  text = fileH.read()
                                                  fileH.close()
                                                  sensorInfo= [ s.strip().split(',') for s in text.splitlines()]
                                                except:
                                                  print("Unable to read 'DS18B20.conf'")
                                                  quit()

                                            on essaie d'ouvrir le fichier DS18B20.conf, et ça ne marche pas donc on a sauté jusqu'au except puis on a fait print, puis quit. Je pense que c'est parce qu'il regarde dans le répertoire courant. Essaies d'ajouter /home/www/Graph/ devant DS18B20.conf

                                            Mais même là ça ne suffira sans doute pas car j'ai vu qu'il y avait d'autres problèmes dans ce genre, avec des fichiers. Par exemple, il y a aussi la ligne suivante:

                                            fileRrdTool = "/home/pi/data_DS18B20.rrd"

                                            Il faudrait régler tous les path à problème de ton fichier source.

                                            • [^] # Re: Une DB ?

                                              Posté par  . Évalué à 1.

                                              fileRrdTool = "/home/pi/data_DS18B20.rrd"

                                              Ca je l'avais modifié sinon la BD ne se remplirais pas
                                              par contre j'ai bien ajouter /home/www/Graph/ devant DS18B20.conf .

                                              Maintenant python /home/www/Graph/readTemp.py marche dans putty , mais la tache cron ne démarre toujours pas .

                                              */5 * * * * root /usr/bin/python /home/www/Graph/readTemp.py

                                            • [^] # Re: Une DB ?

                                              Posté par  . Évalué à 3.

                                              ca peut aussi se regler en mettant dans le cron

                                              cd /home/www/Graph && /usr/bin/python /home/www/Graph/readTemp.py

                                              mais comme dit j_m tout ca vient de la maniere dont readTemp.py est codé,
                                              et visiblement il est codé "avec les pieds"

                                              dans le sens ou on ne doit jamais mettre un chemin en dur dans un programme,
                                              car sinon l'utilisateur n'a pas d'autre choix que de ranger les choses dans les memes dossiers ou de retoucher le code.

                                              dans ton cas, le plus facile est peut-etre de chercher toutes les ouvertures de fichier pour les changer pour aller sur /home/www/Graph

                                              • [^] # Re: Une DB ?

                                                Posté par  . Évalué à 1.

                                                Bonjour, j'ai testé en ligne de commande cd /home/www/Graph && /usr/bin/python /home/www/Graph/readTemp.py , ca fonctionne ,par contre toujours impossible avec la tache cron,Est ce que je ne me plante pas quand je crées ma tache cron .

                                                Comment voir les taches cron qui tourne ?

                                                • [^] # Re: Une DB ?

                                                  Posté par  . Évalué à 2. Dernière modification le 05 avril 2015 à 11:30.

                                                  Bonjour, j'ai testé en ligne de commande cd /home/www/Graph && /usr/bin/python /home/www/Graph/readTemp.py , ca fonctionne ,par contre toujours impossible avec la tache cron,Est ce que je ne me plante pas quand je crées ma tache cron .

                                                  Mettre en place un cron peut dépendre de ta distribution et je ne connais pas trop celle qui est utilisée par le pi. Mais tu as l'air de dire que tu as ajouté un fichier à la main dans un répertoire cron, alors que dans la doc officielle on parle d'utiliser la commande suivante:

                                                  crontab -e

                                                  Qui va ouvrir le fichier de configuration et dans lequel tu devras mettre ta ligne qui commence par */5 * * *, si elle n'y est pas déjà. Pour en savoir plus : http://www.raspberrypi.org/documentation/linux/usage/cron.md

                                                  Comment voir les taches cron qui tourne ?

                                                  Par default beaucoup de log se retrouvent dans le dossier

                                                  /var/log/

                                                  Tu peux regarder si tu trouves quelque chose qui contient "cron", "anacron", etc. Il y a aussi le fichier

                                                  /var/log/syslog

                                                  qui, quand il existe, agglomère les logs de plusieurs logiciels.

                                                  • [^] # Re: Une DB ?

                                                    Posté par  . Évalué à 1.

                                                    Dans crontab -e je n'ai aucune tache cron , toute les taches cron que mon ami a fait sur le Pi sont dans etc/cron.d (31 fichiers) . J'ai utiliser ce tuto http://www.devils-heaven.com/raspberry-pi-cron-jobs/ pour crée mon fichier Graph qui est dans cron.d

                                                    Dans le dossier /var/log/ j'ai un fichier cron.log
                                                    avec beaucoup d'info.
                                                    Ces 2 lignes reviennent souvent

                                                    Apr 5 06:26:01 PiHome /usr/sbin/cron[2002]: (*system*Graph) INSECURE MODE (group/other writable) (/etc/cron.d/Graph)

                                                    Apr 5 06:26:01 PiHome /usr/sbin/cron[2002]: (root) INSECURE MODE (mode 0600 expected) (crontabs/root)

                                                    • [^] # Re: Une DB ?

                                                      Posté par  . Évalué à 2. Dernière modification le 05 avril 2015 à 12:41.

                                                      je devais avoir un probleme de droit , maintenant je retrouve ça dans les log

                                                      Apr 5 12:30:01 PiHome /USR/SBIN/CRON[3971]: (root) CMD (python /home/www/Graph/readTemp.py)

                                                      Je crois que enfin ça fonctionne !!

                                                      • [^] # Re: Une DB ?

                                                        Posté par  . Évalué à 2.

                                                        je devais avoir un probleme de droit , maintenant je retrouve ça dans les log

                                                        Apr 5 12:30:01 PiHome /USR/SBIN/CRON[3971]: (root) CMD (python /home/www/Graph/readTemp.py)

                                                        Je crois que enfin ça fonctionne !!

                                                        Cool.

                                                        C'était pas un problème facile. Il a fallu ouvrir les scripts pour voir les fichiers qui étaient manipulés et comment on y accède. Il a aussi fallu checker des logs pour le cron.

                                                        Quand tu es prêt à faire ça, peu d'installations peuvent te résister, même pour des logiciels qui ne sont pas écrits pour être partagé, comme ici.

                                                      • [^] # Re: Une DB ?

                                                        Posté par  . Évalué à 2. Dernière modification le 05 avril 2015 à 15:21.

                                                        Je remercie j_m et Néox qui ont eu de la patience avec moi . Enfin ça fonctionne . juste une chose qui m'intrigue sur le graph on as pas le nom des sondes mais DTS1 DTS2 DTS3 normalement je devrais avoir le nom des sondes avec le fichier DS18B20.conf .

  • # Génération d'image

    Posté par  . Évalué à 5.

    En dehors de la quantité de données à gérer, générer des images sur un pi ça va pas être top niveau perf car même un simple redimensionnement d'une image prend déjà du temps sur ce genre de petits processeurs.
    Le mieux serait de déléguer le rendu de tes graphs au navigateur en utilisant une bibliothèque javascript comme Chart.js pour faire le rendu.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.