Ankündigung

Einklappen
Keine Ankündigung bisher.

Grafischen Chart erstellen mit Highcharts // Daten aus mySQL via PHP in Chart bringen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Grafischen Chart erstellen mit Highcharts // Daten aus mySQL via PHP in Chart bringen

    Hallo und Guten Abend,

    ich verzweifle derzeit ein wenig, da ich meine Visualisierung des Windmessers nicht zum laufen bekomme. Ich hoffe hier kann mir einer helfen bzw. Denk-/Umsetzungsanstöße geben.
    Vorne weg als "Einweisung".

    Ich besitze einen Windmesser TX20 welche Windgeschwindigkeit und Windrichtung misst.
    Diese Werte werden von einem Wemos D1 mini alle 10 Sekunden (der dann derzeitige IST-Wert) abgegriffen und per WLAN an ein PHP-Script übergeben welches die Werte "umrechnet" und in eine MySQL-Datenbank Schreibt.
    Das alles funktioniert jetzt seit knapp 5 Wochen Anstandslos (ich habe ~320.000 Datensätze).

    Die Werte die in der Datenbank ankommen sind:
    • Zeit [Format: JJJJ-MM-DD hh:mm:ss]
    • ms [Format: Numerisch von 0.0 - 51.1]
    • kmh [Format: Numerisch 0.00 - 183.96]
    • namewindrichtung [Format: 1-3 Buchstaben z.B. S,SW,SSW)

    Nun möchte ich zur Visualisierung die "Wind rose" von Highcharts verwenden.
    Doch leider sind in der "Beispieldatei" nur fixe Werte eingetragen und kein Beispiel wie man es aus SQL rausbekommt...

    ich hatte mit jemandem Kontakt der davon Ahnung hatte, derjenige hat mir seine Konfig geschickt, welche ich angepasst habe, aber irgendwie nicht richtig, es funktioniert ja nicht...

    im Prinzip möchte ich in der Chart die Werte "ms" = Meter die Sekunde und "namewindrichtung" = Windrichtung sehen.

    datamysql.php - in rose.php (s.u.) per include eingebunden
    Code:
    <?php
    // ################################################################## 
    // MYSQL
    // ##################################################################
    
    //connection information
    //address of the server where db is installed
    $servername = "localhost";
    //username to connect to the db
    //the default value is root
    $username = "NameDesBenutzers";
    //password to connect to the db
    //this is the value you specified during installation of WAMP stack
    $password = "Passwort";
    //name of the db under which the table is created
    $dbName = "tx20";
    //name of the port where we have sqldb
    $port = 3306;
    //establishing the connection to the db.
    $conn = new mysqli($servername, $username, $password, $dbName, $port);
    //checking if there were any error during the last connection attempt
    if ($conn->connect_error) {
      die("Connection failed: " . $conn->connect_error);
    }
    
    
    // ################################################################## 
    // alle messungen
    // ##################################################################
    $sql = "SELECT COUNT(*) as count from windsensor WHERE (rec_date =  curdate())  ";
    $result = $conn->query($sql);
    if ($result->num_rows>0){
    while($row=$result->fetch_assoc()){      
    $countalle = $row["count"];      
      }      
    }
    
    $array = array("  N","NNO"," NO","ONO","  O","OSO"," SO","SSO","  S","SSW"," SW","WSW","  W","WNW"," NW","NNW");
    
    
    foreach($array AS $richtung) 
    { 
    
    
    
    
    
    if ($richtung == "NNO" or $richtung == "ONO" or $richtung == "WNW" or $richtung == "NNW" or $richtung == "WSW"or $richtung == "OSO"or $richtung == "SSO"  or $richtung == "SSW" ) {
    echo "<tr nowrap bgcolor=\"#DDDDDD\">\n";
    }
    
    else {
    echo "<tr nowrap>\n";
    }
    
     echo "<td class=\"dir\">",str_replace(' ','',$richtung),"</td>\n";
    
    
    // ################################################################## 
    // count  < 2km
    // ##################################################################
    $sql = "SELECT COUNT(*) as count from windsensor WHERE (rec_date =  curdate()) and (namewindrichtung = '$richtung') and (ms  < '2') ";
    $result = $conn->query($sql);
    if ($result->num_rows>0){
    while($row=$result->fetch_assoc()){      
    $count = $row["count"];      
      }      
    
    
    
    $percent = sprintf("%4.2f", (($count/$countalle)*100));
    echo "<td class=\"data\">",$percent,"</td> \n";
    
    }
    
    // ################################################################## 
    // count  >2km <5km  
    // ##################################################################
    $sql = "SELECT COUNT(*) as count from windsensor WHERE (rec_date =  curdate()) and (namewindrichtung = '$richtung') and (ms  >= '2')and (ms  < '5')"   ;
    $result = $conn->query($sql);
    if ($result->num_rows>0){
    while($row=$result->fetch_assoc()){      
    $count = $row["count"];      
      }      
    
    $percent = sprintf("%4.2f", (($count/$countalle)*100));
    echo "<td class=\"data\">",$percent,"</td> \n";
    
    }
    
    // ################################################################## 
    // count  >5km <10km  
    // ##################################################################
    $sql = "SELECT COUNT(*) as count from windsensor WHERE (rec_date =  curdate()) and (namewindrichtung = '$richtung') and (ms  >= '5')and (ms  < '10')"   ;
    $result = $conn->query($sql);
    if ($result->num_rows>0){
    while($row=$result->fetch_assoc()){      
    $count = $row["count"];      
      }      
    $percent = sprintf("%4.2f", (($count/$countalle)*100));
    echo "<td class=\"data\">",$percent,"</td> \n";
    }
    
    // ################################################################## 
    // count >10km <15km  
    // ##################################################################
    $sql = "SELECT COUNT(*) as count from windsensor WHERE (rec_date =  curdate()) and (namewindrichtung = '$richtung') and (ms  >= '10')and (ms  < '15')"   ;
    $result = $conn->query($sql);
    if ($result->num_rows>0){
    while($row=$result->fetch_assoc()){      
    $count = $row["count"];      
      }      
    }
    
    $percent = sprintf("%4.2f", (($count/$countalle)*100));
    echo "<td class=\"data\">",$percent,"</td> \n";
    
    // ################################################################## 
    // count  >15km <20km  
    // ##################################################################
    $sql = "SELECT COUNT(*) as count from windsensor WHERE (rec_date =  curdate()) and (namewindrichtung = '$richtung') and (ms  >= '15')and (ms  < '20')"   ;
    $result = $conn->query($sql);
    if ($result->num_rows>0){
    while($row=$result->fetch_assoc()){      
    $count = $row["count"];      
      }      
    }
    
    $percent = sprintf("%4.2f", (($count/$countalle)*100));
    echo "<td class=\"data\">",$percent,"</td> \n";
    
    // ################################################################## 
    // count  >20km <30km  
    // ##################################################################
    $sql = "SELECT COUNT(*) as count from windsensor WHERE (rec_date =  curdate()) and (namewindrichtung = '$richtung') and (ms  >= '20')and (ms  < '30')"   ;
    $result = $conn->query($sql);
    if ($result->num_rows>0){
    while($row=$result->fetch_assoc()){      
    $count = $row["count"];      
      }      
    }
    
    $percent = sprintf("%4.2f", (($count/$countalle)*100));
    echo "<td class=\"data\">",$percent,"</td> \n";
    
    // ################################################################## 
    // count  >30km  
    // ##################################################################
    $sql = "SELECT COUNT(*) as count from windsensor WHERE (rec_date =  curdate()) and (namewindrichtung = '$richtung') and (ms  >= '30')"   ;
    $result = $conn->query($sql);
    if ($result->num_rows>0){
    while($row=$result->fetch_assoc()){      
    $count = $row["count"];      
      }      
    }
    
    $percent = sprintf("%4.2f", (($count/$countalle)*100));
    
    echo "<td class=\"data\">",$percent,"</td> \n";
    
    
    // ################################################################## 
    // count alle messungen der richtung
    // ##################################################################
    $sql = "SELECT COUNT(*) as count from windsensor WHERE (rec_date =  curdate()) and (namewindrichtung = '$richtung' )";
    $result = $conn->query($sql);
    if ($result->num_rows>0){
    while($row=$result->fetch_assoc()){      
    $count = $row["count"];      
      }      
    
    
    $percent = sprintf("%4.2f", (($count/$countalle)*100));
    echo "<td class=\"data\">",$percent,"</td> \n";
    echo "</tr>\n";
    
    } 
    
    }
    
    
    ?>
    rose.php - welche im Prinzip aufgerufen wird

    Code:
    <!DOCTYPE HTML>
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
            <meta name="viewport" content="width=device-width, initial-scale=1">
            <title>Wind Rose</title>
    
            <style type="text/css">
    
            </style>
        </head>
        <body>
    <script src="/code/highcharts.js"></script>
    <script src="/code/highcharts-more.js"></script>
    <script src="/code/modules/data.js"></script>
    <script src="/code/modules/exporting.js"></script>
    <!--
    <div id="container" style="min-width: 420px; max-width: 600px; height: 400px; margin: 0 auto"></div>
    -->
    
    <div id="container" style="min-width: 520px; max-width: 800px; height: 500px; margin: 0 auto"></div>
    
    
    
    
    <div style="display:none">
        <!-- Source: http://or.water.usgs.gov/cgi-bin/grapher/graph_windrose.pl -->
        <table id="freq" border="0" cellspacing="0" cellpadding="0">
            <tr nowrap bgcolor="#CCCCFF">
                <th colspan="9" class="hdr">Tabelle der Windhäufigkeiten in %</th>
            </tr>
             <tr nowrap bgcolor="#CCCCFF">
                <th class="freq">Direction</th>
                <th class="freq">&lt; 0.5 m/s</th>
                <th class="freq">0.5-2 m/s</th>
                <th class="freq">2-4 m/s</th>
                <th class="freq">4-6 m/s</th>
                <th class="freq">6-8 m/s</th>
                <th class="freq">8-10 m/s</th>
                <th class="freq">&gt; 10 m/s</th>
                <th class="freq">Total</th>
            </tr>
    
    
    <?php include ("datamysql.php"); ?>
    
    
    
    
            <tr nowrap>
                <td class="totals">Total</td>
                <td class="totals">25.53</td>
                <td class="totals">44.54</td>
                <td class="totals">15.07</td>
                <td class="totals">8.52</td>
                <td class="totals">4.31</td>
                <td class="totals">1.81</td>
                <td class="totals">0.23</td>
                <td class="totals">&nbsp;</td>
            </tr>
    
    
    
        </table>
    </div>
    
    
    
    
            <script type="text/javascript">
    
    
    // Parse the data from an inline table using the Highcharts Data plugin
    Highcharts.chart('container', {
        data: {
            table: 'freq',
            startRow: 1,
            endRow: 17,
            endColumn: 7
        },
    
    
    
    chart: {
                        polar: true,
                        type: 'column',
                        renderTo: 'rose',
                        reflow: false
                    },
    
                    title: {
                        text: 'Windanalyse der Wetterstation Berlin Alt-Glienicke'
                    },
    
                    subtitle: {
                        text: 'heutige Daten ab 0h'
                    },
    
                    pane: {
                        size: '85%'
                    },
    
                    loading: {
                        labelStyle: {top: '25%'}
                    },
    
                    legend: {
                        reversed: true,
                        align: 'right',
                        verticalAlign: 'top',
                        y: 100,
                        layout: 'vertical'
                    },
    
    
    
    
        yAxis: {
           // min: 0,
            endOnTick: true,
            showLastLabel: true,
            title: {
                text: 'Häufigkeit (%)'
            },
            labels: {
                formatter: function () {
                    return this.value + '%';
                }
            },
            reversedStacks: false
        },
    
                    yAxis: {
                        min: -3,
                        minRange: 20,
                        endOnTick: false,
                        startOnTick: false,
                        showLastLabel: true,
                        showFirstLabel: true,
                        title: {
                            text: 'Häufigkeit (%)'
                        },
                        labels: {
                            formatter: function () {
                                return this.value + '%';
                            },
                            distance: 0
                        },
                        plotBands: {
                            from: -99,
                            to: 0,
                            color: '#FCFFC5',
                            zIndex: 3
                        }
                    },
    
                    tooltip: {
    
                    positioner: function () {
                                    return { x: 620, y: 300 };
                                                },
    
    
    
    
                        useHTML: true,
                        headerFormat: '{point.key}<table>',
                        pointFormat: '<tr><td style="background: #fff"><span style="color:{series.color}">\u25CF</span>{series.name}:</td>' +
                                     '<td style="text-align: right; background: #fff"><b>{point.y}%</b></td></tr>',
    
    
    
    
    
    
    
                        footerFormat: '</table>',
                        shared: true,
                        valueDecimals: 0
                    },
    
                    plotOptions: {
                        series: {
                            stacking: 'normal',
                            shadow: false,
                            groupPadding: 0,
                            pointPlacement: 'on',
                            borderWidth: 0
                        }
                    }
                });
    
    
    
            </script>
        </body>
    </html>
    Kann mir jemand helfen und sagen warum keine Werte rauspurzeln?

    kurzer Auszug aus den Fehlern:

    Code:
    Trying to get property 'num_rows' of non-object in C:\xampp\htdocs\TX20\datamysql.php   on line 32 
    
    Undefined variable: count in C:\xampp\htdocs\TX20\datamysql.php on line 115
    
    Undefined variable: countalle in C:\xampp\htdocs\TX20\datamysql.php on line 115
    Division by zero in C:\xampp\htdocs\TX20\datamysql.php on line 115
    Vielen Dank und einen schönen Abend!

  • #2
    Dein SQL Query scheint fehl zu schlagen, da du kein Objekt zurück bekommst (also entweder True oder False, da aber True bei einem Select Statement nicht zurückkommen kann muss es false sein).
    Lass dir die letzte MySQL Fehlermeldung ausgeben: http://php.net/manual/de/mysqli.error.php

    Die weiteren Fehler sind Folgefehler.
    "Software is like Sex, it's best if it's free." - Linus Torvalds

    Kommentar


    • #3
      Hallo, danke für die Antwort!

      Sorry, bin relativer Anfänger und verstehe daher die Documentation bzw. was ich machen soll bzw. rauskommen soll nicht, geschweige den welches Objekt nicht richtig zurück kommt :-\

      geht es einfacher zu erklären?

      Kommentar


      • #4
        Ausgehend von der Fehlermeldung, füg nach Zeile 31 ein:
        Code:
        print_r($conn->error());
        Dann solltest du die SQL-Fehlermeldung gezeigt bekommen.
        "Software is like Sex, it's best if it's free." - Linus Torvalds

        Kommentar


        • #5
          Bitte an das EVA-Prinzip halten. Datenbankabfragen haben inmitten der HTML-Ausgabe nichts verloren und machen den Code sehr sehr unübersichtlich.

          Kommentar


          • #6
            Zitat von JaMa Beitrag anzeigen
            Ausgehend von der Fehlermeldung, füg nach Zeile 31 ein:
            Code:
            print_r($conn->error());
            Dann solltest du die SQL-Fehlermeldung gezeigt bekommen.

            habe es in Zeile 32 eingetragen, bekomme den Fehler:

            Code:
            Fatal error: Uncaught Error: Call to undefined method mysqli::error() in C:\xampp\htdocs\TX20\datamysql.php:32 Stack trace: #0 {main} thrown in C:\xampp\htdocs\TX20\datamysql.php on line 32

            EDIT: in Zeile 22 / 23 ist doch die Fehlerabfrage schon enthalten...?


            Zitat von hellbringer Beitrag anzeigen
            Bitte an das EVA-Prinzip halten. Datenbankabfragen haben inmitten der HTML-Ausgabe nichts verloren und machen den Code sehr sehr unübersichtlich.
            EVA entspricht ja Eingabe Verarbeitung Ausgabe?
            im Prinzip (so wie ich es verstehe) wurde es doch eingehalten, ausser das der include halt mitten drin geschieht?
            So wie ich die Basis verstehe ist ja die komplette mySQL-Abfrage in die datamysql.php ausgelagert und die rose.php nur fürs visuelle, sprich HTML...?


            EDIT, ich habe schon einen Fehler gefunden, ich habe in z.B. Zeile 30
            Code:
            $sql = "SELECT COUNT(*) as count from weather WHERE (rec_date =  curdate())  ";
            anscheinend vergessen durch meinen Spaltennamen zu ersetzen:
            Code:
            $sql = "SELECT COUNT(*) as count from windsensor WHERE (Zeit =  curdate())  ";
            Jetzt gibts schonmal weniger Fehler, diese wären:

            Code:
            N 
            Warning: Division by zero in C:\xampp\htdocs\TX20\datamysql.php on line 72
            NaN 
            Warning: Division by zero in C:\xampp\htdocs\TX20\datamysql.php on line 87
            NaN 
            Warning: Division by zero in C:\xampp\htdocs\TX20\datamysql.php on line 101
            NaN 
            Warning: Division by zero in C:\xampp\htdocs\TX20\datamysql.php on line 116
            NaN 
            Warning: Division by zero in C:\xampp\htdocs\TX20\datamysql.php on line 130
            NaN 
            Warning: Division by zero in C:\xampp\htdocs\TX20\datamysql.php on line 144
            NaN 
            Warning: Division by zero in C:\xampp\htdocs\TX20\datamysql.php on line 158
            NaN 
            Warning: Division by zero in C:\xampp\htdocs\TX20\datamysql.php on line 174
            [...]

            Kommentar


            • #7
              Zitat von desidia Beitrag anzeigen
              EVA entspricht ja Eingabe Verarbeitung Ausgabe?
              im Prinzip (so wie ich es verstehe) wurde es doch eingehalten
              Nein, überhaupt nicht. Am besten du machst zwei komplett getrennte Code-Blöcke. Einer mit den Datenbankabfragen und einen mit der HTML-Ausgabe. Bitte nicht beides zusammen.

              echo hat bei Datenbankabfragen nichts verloren.

              Kommentar


              • #8
                Warning: Division by zero in C:\xampp\htdocs\TX20\datamysql.php on line 72
                Die Variable $countalle ist 0, es kommen demnach in der ersten Abfrage keine Daten vor.

                siehe auch
                https://php-de.github.io/jumpto/leitfaden/
                und
                https://php-de.github.io/jumpto/eva-prinzip/

                Kommentar


                • #9
                  Zitat von protestix Beitrag anzeigen
                  Die Variable $countalle ist 0, es kommen demnach in der ersten Abfrage keine Daten vor.
                  Hallo, danke!
                  wie kriege ich das den korrigiert?
                  Ich habe wie im eingangspost geschrieben das Script von jemanden bekommen und meine mySQL Daten angepasst (Server, Login Tabellen etc.)

                  $countalle ist ja nichts was aus meiner Datenbankstruktur kommt sondern irgendwie aus $count und $row gebildet wird....? (so verstehe ich das).
                  Wie kann es also bei demjenigen funktionieren und bei mir kommt kein Wert rein?

                  Muss ja heißen das er bei mir irgendwie nichts zählt (count) und somit nichts in $countalle Schreibt...? Aber warum? :-\

                  Danke!

                  Kommentar


                  • #10
                    Das gilt es herauszufinden du bist der Programmierer, es sind deine Daten die in der Datenbank stehen, die wir zudem auch gar nicht kennen.
                    Nimm HeidiSQL oder PHPmyAdmin und teste es.

                    Das ist der Abfragestring um den es geht
                    Code:
                     
                     SELECT COUNT(*) as count from windsensor WHERE (rec_date =  curdate()) and (namewindrichtung = '$richtung') and (ms  >= '2')and (ms  < '5')"   ;
                    Curdate findest du im Handbuch erklärt.
                    Ausserdem musst du natürlich für den Fall das dir COUNT(*) den Wert 0 zurück gibt noch Vorsorge im Script treffen, damit du diesen Fall abfängst und das Script nicht immer in einen Fehler rein läuft.

                    Kommentar


                    • #11
                      Hallo, danke für den Tipp mit PHPmyAdmin, damit konnte ich jetzt rausfiltern das irgendetwas mit "(Zeit = curdate())" nicht stimmt, anscheinend das Format oder so, muss man sich später mal anschauen. Jedenfalls hat die einzelne Test-Bedingung
                      SELECT COUNT(*) as count from windsensor WHERE (Zeit = curdate()) nur ein Ergenis ausgeworfen, dann kamen noch die anderen Filter dazu und dann kam natürlich "0" raus...

                      ich habe die Bedingung geändert auf:
                      Code:
                      $sql = "SELECT COUNT(*) as count from windsensor WHERE (namewindrichtung = '$richtung') and (kmh  >= '2') and (kmh  < '5')"   ;
                      (ich habe auch vergessen die Werte nach der Umrechnung von kmh auf m/s anzupassen, sodass eigentlich alle "Ermittelbaren Werte" in der ersten Abfrage schon abgeriffen waren und es garkein Werte mehr gab in den späteren Abfragen und daher kam da schon nur 0 raus)


                      Jetzt kam aber ein neuer Fehler:

                      Code:
                      <b>Notice</b>:  Trying to get property 'num_rows' of non-object in <b>C:\xampp\htdocs\TX20\datamysql.php</b> on line <b>65</b><br />
                      ich weiß damit nichts anzufangen, aber ich sehe jetzt im Quelltext zur SQL Abfrage das pro Windrichtung und Einstufung Daten geladen wurden!
                      Nur zeigt er auf der Seite garnichts an, ich denke das liegt noch am Fehler weiter oben?

                      Kommentar


                      • #12
                        Du versuchst die Methode num_rows() bei einer Variable aufzurufen, die kein Objekt ist. Steht aber eh da in der Fehlermeldung. wenn man lesen kann.

                        Kommentar


                        • #13
                          danke für die Info, aber ich verstehe es einfach nicht.. ich weiß nicht wonach ich suchen muss... :-\

                          Kommentar

                          Lädt...
                          X