Tutorial: Speicherung von Arduino Messdaten auf Webserver und deren Darstellung – Teil 5

Teil 5 – CSV und MySQL Daten grafisch präsentieren

Bei der Recherche, wie MySQL Daten einfach und dennoch wirkungsvoll grafisch zu präsentieren sind, habe ich mir viele Möglichkeiten angesehen. Letztendlich habe ich mich dann für dygraphs entschieden, weil diese JavaScript Library viele Möglichkeiten bietet und die Dokumentation und das Tutorial gut verständlich sind.

Um die Library einzusetzen muss zunächst der File dygraph-combined.js von der dygraphs Download-Seite geladen werden und im Basisverzeichnis des Webspaces abgelegt werden. Um die Funktionsweise der Library kennenzulernen, möchte ich  zunächst zeigen, wie die Daten aus dem csv-File aus dem 3. Teil des Tutorials dargestellt werden können. Dazu erstellen wir auf dem Webspace eine html-Seite, die im Wesentlichen dem Beispiel auf den Dygraphs Seite für csv-Dateien entspricht. Der Name dieser Datei könnte z.B. graphcsv.html sein.

<html>
<head>
<script type="text/javascript"
src="dygraph-combined.js"></script>
</head>
<body>
<div id="graphdiv2"
style="width:500px; height:300px;"></div>
<script type="text/javascript">
g2 = new Dygraph(
document.getElementById("graphdiv2"),
"test.csv", // path to CSV file
{} // Options
);
</script>
</body>
</html>

Wer jetzt schon einige Daten in seiner csv-Datei hat, sollte nach Aufruf dieser html-Seite jetzt die typische Dygraphs Grafik sehen. Dabei fällt allerdings auf, dass Dygraphs den Unix Timestamp nicht als Datum und Zeit interpretiert. Um das zu ändern, muss entweder die Speicherung der Daten geändert werden oder dem dygraphs-Aufruf eine optionale Funktion mitgegeben werden. Die Option wird in den geschweiften Klammern übergeben, hier der gesamte Funktionsaufruf. Zusätzlich habe ich noch Labels ergänzt.


g2 = new Dygraph(
document.getElementById("graphdiv2"),
"test.csv", // path to CSV file
{ xValueFormatter: Dygraph.dateString_,
xValueParser: function(x) { return 1000*parseInt(x);},
xTicker: Dygraph.dateTicker,
labels: [ "Datum", "A0", "A1" ]
} // Options
);

Die Darstellung des Datums in der Grafik finde ich aber sehr ungünstig, habe mich aber nicht weiter damit beschäftigt, das zu verändern. Sinnvoller finde ich, die csv-Daten direkt mit einem interpretierbaren Datumsformat zu erzeugen. (Sorry, dass das nicht schon in Teil 3 berücksichtigt wurde). Hier die Änderung der php-Seite zur Ablage der Daten als csv-Datei, im Aufruf der Dygraph Funktion müssen jetzt natürlich die Optionen wieder entfernt werden.

<?php
isset($_GET['A0']) ? $a0=$_GET['A0'] : $a0='';
isset($_GET['A1']) ? $a1=$_GET['A1'] : $a1='';
$jetzt = time();
$delimiter = ",";
$enclosure = " ";
$handle = fopen("./test.csv", 'a');
fputcsv($handle, array(date("Y/m/d H:i:s",$jetzt),$a0,$a1),$delimiter,$enclosure);
fclose($handle);
?>

Doch nun zur Darstellung der Daten aus der MySQL Datenbank. Ich habe lange rumprobiert, wie man die Daten aus MySQL in den JavaScript Aufruf einbauen kann. Als Lösung habe ich die Daten innerhalb des JavaScript Aufrufs per php aus der Datenbank gelesen und als Array an die dygraphs Funktion übergeben. Die Daten müssen in genau dieser Form

[
[ new Date("2009/07/12"),100, 200 ],
[ new Date("2009/07/19"), 150, 220 ]
]

an dygraphs übergeben werden, deshalb sieht die Formatierung der Daten innerhalb der php-Funktion etwas chaotisch aus (siehe hier).

Folgende php-Seite sollte unter dem Namen graph.php auf dem Webspace erzeugt werden. Natürlich müssen wieder die Zugangsdaten der Datenbank eingetragen werden:

<html>
<head>
<body style="color: rgb(0, 0, 0); background-color: rgb(77, 77, 77)" alink="#ee0000" link="#0000ee" vlink="#551a8b">
<div style="text-align: center;"><span style="color: rgb(255, 255, 255);">Daten aus MySQL<br></span>
<br>
<script type="text/javascript"
src="dygraph-combined.js"></script>
</head>
<body>
<table style="margin:0px auto" border="0" width="500" align="center">
<tr>
<td style="background-color: #FFFFFF">
<div id="graphdiv2"
style="width:500px; height:300px;"></div>
<script type="text/javascript">

g2 = new Dygraph(document.getElementById("graphdiv2"),
<?php
$mysql_host = "<hier Name des Server/Host eintragen>";
$mysql_db = "<hier Datenbanknamen eintragen>";
$mysql_user = "<hier MySQL User eintragen>";
$mysql_pw = "<hier MySQL Passwort eintragen>";
$connection = mysql_connect($mysql_host, $mysql_user, $mysql_pw) or die("Verbindung zur Datenbank fehlgeschlagen.");
mysql_select_db($mysql_db, $connection) or die("Datenbank konnte nicht ausgewaehlt werden.");
$abfrage = "SELECT DATE_FORMAT(datum, '%Y/%m/%d %H:%i:%s') AS date, datum, analog0, analog1 FROM analog_data";       //   2009/07/12 12:34:56
$ergebnis = mysql_query($abfrage);
echo "[";                                  // start of the 2 dimensional array
while($row = mysql_fetch_array($ergebnis))
{
$utime = strtotime($row[datum]);
$diffutime = $utime - $lastutime;
if ($diffutime > 600) {
echo "["."new Date(\"".$row[date]."\")".",NaN,NaN],";
}
else {
echo "["."new Date(\"".$row[date]."\")".",".$row[analog0].",".$row[analog1]."],";
}
$lastutime = strtotime($row[datum]);
}
echo "]";
?> ,
{ rightGap: 20,
connectSeparatedPoints: true,
labels: [ "Datum", "A0", "A1" ] }          // options
);
</script>
</div>
</td>
</tr>
</table>
</body>
</html>

In der Übergabe des Arrays an die dygraph-Funktion habe ich eine Abfrage eingebaut, die dafür sorgt, dass (zeitliche) Lücken in der Datenreihe nicht als verbundene Punkte dargestellt werden.

Ich hoffe, diese Tutorial hat euch geholfen eure Daten zu speichern und grafisch zu präsentieren. Ich bin gespannt auf euer Feedback und eure Ergebnisse.

Advertisements

Veröffentlicht am 24. Mai 2014, in Arduino, MySQL, Tutorial. Setze ein Lesezeichen auf den Permalink. 31 Kommentare.

  1. Hey! Hab es gerade ausprobiert und bei mir funktioniert alles bis auf die graph.php. Bekomme einfach keine Daten angezeigt aber die graphcsv.html funktioniert.

    Gruß Scherheinz

    • Hallo Scherheinz,
      ich hab nochmal alles kontrolliert.
      Es fehlte 1 Zeile in der Datenbankabfrage, habe das oben geändert, hier die Änderung, die mittlere Zeile fehlte:

      $mysql_pw = "<hier MySQL Passwort eintragen>";
      $connection = mysql_connect($mysql_host, $mysql_user, $mysql_pw) or die("Verbindung zur Datenbank fehlgeschlagen.");
      mysql_select_db($mysql_db, $connection) or die("Datenbank konnte nicht ausgewaehlt werden.");
      

      Sorry, kann passieren.
      gruß
      Reinhard

      • Kein Problem, Fehler passieren. Hab es angepasst und es funktioniert tadellos!
        Vielen Dank nochmmal!!
        Gruß

  2. Hallo,
    habe die Datenbank um mehrere Werte erweitert, leider liest er irgendwie falsche Werte in den Array ein, z.B. gibt er Zahlen mit zwei Nachkommastellen an und die Zahlen haben sogar falsche Werte.

    Hier der Code

    $connection = mysql_connect($mysql_host, $mysql_user, $mysql_pw) or die(„Verbindung zur Datenbank fehlgeschlagen.“);
    mysql_select_db($mysql_db, $connection) or die(„Datenbank konnte nicht ausgewaehlt werden.“);
    $abfrage = „SELECT DATE_FORMAT(datum, ‚%Y/%m/%d %H:%i:%s‘) AS date, datum, sensor0, sensor1, sensor2, sensor3, sensor4, sensor5, sensor6, sensor7 FROM sensor_sensor“; // 2009/07/12 12:34:56
    $ergebnis = mysql_query($abfrage);
    echo „[„; // start of the 2 dimensional array
    while($row = mysql_fetch_array($ergebnis))
    {
    $utime = strtotime($row[datum]);
    $diffutime = $utime – $lastutime;
    if ($diffutime < 0) {
    echo "["."new Date(\"".$row[date]."\")".",NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN],";
    }
    else {
    echo "["."new Date(\"".$row[date]."\")".",".$row[sensor0].",".$row[sensor1].",".$row[sensor2].",".$row[sensor3].",".$row[sensor4].",".$row[sensor5].",".$row[sensor6].",".$row[sensor7]."],";
    }
    $lastutime = strtotime($row[datum]);
    }
    echo "]";

  3. Hallo glaskugelsehen,

    habe dein Tutorial innerhalb weniger Minuten durchprobiert und bin begeistert. -fast…

    Es funktioniert alles bis auf die graphische Darstellung. Da versucht mein Browser vergeblich irgendwas zu laden.

    Was kann denn da faul sein?

    Viele Grüße

    • Hallo Sebastian,
      das ist aus der Ferne schwer zu sagen. Eventuell kannst du einen anderen Browser mal ausprobieren. Nützlich ist auch die Entwickler Funktionen z.B. des Firefox mal zu nutzen.
      Ich tippe aber eher auf einen Tipp- oder Kopierfehler. Vergeliche nochmal alle Zeilen ganz genau.
      Gruß
      Reinhard

  4. Hallo Reinhard!
    Ich meld mich mal wieder. Läuft bei mir schon eine zeitlang ohne Probleme aber ich hätte noch eine Frage.
    Ist es möglich die Werte aus der CSV Datei auch wieder mit einem Arduino zurückzulesen?
    Da sich der Arduino nicht in meinem Wohnort befindet würde ich gern die Daten zurücklesen und über ein LCD ausgeben. Wäre das ein großer Aufwand?

    Gruß Scherheinz

    • Hallo Scherheinz,

      zunächst ein paar Fragen:
      Wo liegt die csv Datei? Auf einem Webserver im Internet oder lokal?
      So ganz versteh‘ ich den Sinn noch nicht. Du kannst die Datei doch mit einem Browser unter /test.csv runterladen. Ok, aber sei’s drum….
      Zunächst müßte der Arduino natürlich Zugriff auf den Webspace haben. Die Anzeige von sehr vielen Datensätzen, die dann möglicherweise durch das LCD durchrauschen, macht nicht viel Sinn. Es wäre denkbar eine php Seite zu bauen, die dir in Abhängigkeit des Übergabeparameters eine definierte Anzahl Datensätze liefert. Das lesen dieser php-Seite ist dann wie jeder im Ethernet Beispiel Webclient.

      Ich hoffe, das hilft dir weiter.
      Gruß Reinhard

  5. Hab mich auch etwas unglücklich ausgedrückt. Ja die Datei liegt auf dem Kilu Server und wird Daten einer Wetterstation + ein paar Extras aufnehmen. Auf dem LCD anzeigen will ich nur den letzten Eintrag von der Datei. So müsste ich für die aktuellen Daten nicht den PC hochfahren sondern nur wenn ich mir den Verlauf anschauen will.

    Gruß

    • Hallo Scherheinz,

      erzeuge auf deinem Webspace eine Datei mit Namen csvread.php und folgendem Inhalt:
      (irgendwie schaff es nicht hier code zu posten – wird immer wieder gelöscht, deshalb code ohne php header und footer)

      $lines = file ('test.csv');
      $letzte_zeile = $lines[count($lines)-1];
      echo $letzte_zeile;

      Wenn du diese im Browser aufrufst bekommst du die letzte Zeile der Datei angezeigt. Diese Adresse musst du mit dem Arduino als Webclient abrufen und dann auf dem LCD anzeigen. Ist nicht die schnellste Methode dauert umso länger, je größer die Datei ist.

      Gruß
      Reinhard

      • Hallo Reinhard!
        Danke für die Hilfe! Im Browser funktioniert das auch soweit aber mit dem Arduino will es einfach nicht klappen. Als Rückmeldung bekomme ich immer „Zugriff verweigert“ aber mit dem Browser funktioniert es immernoch. Hast du vielleicht noch eine Idee?

        Gruß
        Scherheinz

  6. Hallo

    ich habe ein Problem, dass nicht alle Messwerte auf dem Web Server gespeichert werden (mysqli)

    DHT.temperature wir gespeichert
    jedoch p0 (Luftdruck) nicht
    auf dem LCD Display und via Serial werden die Werte korrekt angezeigt

    Wenn ich anstatt p0 einen Wert „123“ eingebe wird dieser korrekt in der Datenbank gespeichert

    Was mach ich falsch ?

    Besten Dank für die Antwort
    Markus

    / this method makes a HTTP connection to the server:
    void httpRequest() {
    // if there’s a successful connection:
    Serial.println(„try connecting…“);
    if (client.connect(server, 80)) {
    Serial.println(„connecting…“);
    // send the HTTP PUT request:
    client.print(„GET /data2mysql.php?A0=“);
    client.print(DHT.temperature);
    client.print(„&A1=“);
    client.print(p0);
    client.print(„&A2=“);
    client.print(lux);
    client.print(„&A3=“);
    client.print(DHT.humidity);
    client.println(“ HTTP/1.1″);
    client.print(„Host: „);
    client.println(server);
    client.println(„Connection: close“);
    client.println();

  7. Hallo Markus,
    probiere es zunächst mal aus der Browserzeile. Werden alle Werte korrekt an die DB übergeben?
    Welchen Typ hat p0?
    Wird lux gespeichert oder bricht das php-script mit einem Fehler bei p0 ab.
    Fehler ist schwer zu isolieren, wenn ich nicht das gesamte Programm, die DB Struktur und das php Script bewerten kann.
    Gruß
    Reinhard

    • Hallo Danke für die schnelle Antwort

      anbei mein Arduino Code ….noch etwas chaotisch….. bin noch ein Blutiger Anfänger…….
      Die Datenbank ist nach deiner Anleitung aufgebaut

      Anbei die Ausgabe via serial Monitor
      04.10.2015 19:19:42
      Temp = 25.1 *C Feuchte = 40.7%
      Taupunkt10.80
      heatIndex : 25.49
      relative (sea-level) pressure: 1017.09 hPa
      Light: 6 lx

      Gruss Markus

      #include
      #include
      #include
      #include
      #include
      #include
      #include
      #include
      #include

      int p = 0; //Taupunkt
      int p0 = 0; //Baro
      int lux = 0; //luxmeter
      int HI=0 ; //Heatindex

      // assign a MAC address for the ethernet controller.
      // fill in your address here:
      byte mac[] = {
      0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
      // fill in an available IP address on your network here,
      // for manual configuration:
      IPAddress ip(192,168,1,99); // <- hier die IP des Ethernet Shield eintragen

      // initialize the library instance:
      EthernetClient client;

      char server[] = "maba.esy.es"; // http://forum.arduino.cc/index.php/topic,125510.0.html

      //Heatindex
      // Heat Index Function
      // http://en.wikipedia.org/wiki/Heat_index
      double heatIndex(double Temperature, double Humidity)
      {
      double c1 = -42.38, c2 = 2.049, c3 = 10.14, c4 = -0.2248, c5 = -6.838e-3, c6 = -5.482e-2, c7 = 1.228e-3, c8 = 8.528e-4, c9 = -1.99e-6 ;
      double T = Temperature;// Your outside Temp sensor reading
      double R = Humidity;// Your Outside Humidity sensor reading
      double T2 = T * T;
      double R2 = R * R;
      double TR = T * R;
      double rv = c1 + c2 * T + c3 * R + c4 * T * R + c5 * T2 + c6 * R2 + c7 * T * TR + c8 * TR * R + c9 * T2 * R2;
      return rv;
      }
      //Heatindex

      DS3231 clock;
      RTCDateTime dt;

      // You will need to create an SFE_BMP180 object, here called „pressure“:

      SFE_BMP180 pressure;

      #define ALTITUDE 435.0 // Altitude of SparkFun’s HQ in Boulder, CO. in meters

      LiquidCrystal_I2C lcd(0x27, 16, 2);

      //const int chipSelect = 4;

      BH1750 lightMeter;

      //DHT
      dht DHT;
      #define DHT22_PIN 2

      // Generally, you should use „unsigned long“ for variables that hold time
      // The value will quickly become too large for an int to store
      //unsigned long previousMillis = 0; // will store last time LED was updated

      // constants won’t change :
      //const long interval = 900000; // interval at which to blink (milliseconds)
      //const long interval1 = 1000; // interval at which

      //to blink (milliseconds)

      void setup()
      {
      Serial.begin(9600);
      Serial.println(„REBOOT“);
      lcd.init();

      //Initialize DS3231

      clock.begin();

      // start serial port:
      Serial.begin(9600);
      // give the ethernet module time to boot up:
      delay(2000);
      // start the Ethernet connection using a fixed IP address and DNS server:
      Ethernet.begin(mac, ip);
      // print the Ethernet board/shield’s IP address:
      Serial.print(„My IP address: „);
      Serial.println(Ethernet.localIP());

      lightMeter.begin();

      // Set sketch compiling time
      //clock.setDateTime(__DATE__, __TIME__);
      // Manual (YYYY, MM, DD, HH, II, SS
      //clock.setDateTime(2015, 9,22, 21, 13, 00);

      if (pressure.begin())
      Serial.println(„BMP180 init success“);
      else
      {
      // Oops, something went wrong, this is usually a connection problem,
      // see the comments at the top of this sketch for the proper connections.

      Serial.println(„BMP180 init fail\n\n“);
      while (1); // Pause forever.
      }
      }

      void loop()
      {
      char status;
      double T, P, p0, a;

      // You must first get a temperature measurement to perform a pressure reading.

      // Start a temperature measurement:
      // If request is successful, the number of ms to wait is returned.
      // If request is unsuccessful, 0 is returned.

      status = pressure.startTemperature();
      if (status != 0)
      {
      // Wait for the measurement to complete:
      delay(status);

      // Retrieve the completed temperature measurement:
      // Note that the measurement is stored in the variable T.
      // Function returns 1 if successful, 0 if failure.

      status = pressure.getTemperature(T);
      if (status != 0)
      {

      status = pressure.startPressure(3);
      if (status != 0)
      // Wait for the measurement to complete:
      delay(status);

      // Retrieve the completed pressure measurement:
      // Note that the measurement is stored in the variable P.
      // Note also that the function requires the previous temperature measurement (T).
      // (If temperature is stable, you can do one temperature measurement for a number of pressure measurements.)
      // Function returns 1 if successful, 0 if failure.

      status = pressure.getPressure(P, T);
      if (status != 0)

      p0 = pressure.sealevel(P, ALTITUDE); // we’re at 1655 meters (Boulder, CO)
      Serial.print(„relative (sea-level) pressure: „);
      Serial.print(p0, 2);
      Serial.println(“ hPa“);

      }
      else Serial.println(„error \n“);
      }
      uint16_t lux = lightMeter.readLightLevel();
      Serial.print(„Light: „);
      Serial.print(lux);
      Serial.println(“ lx“);
      Serial.println();

      //
      dt = clock.getDateTime();

      if (dt.day < 10)
      {
      Serial.print("0");
      }
      Serial.print(dt.day);
      Serial.print('.');
      if (dt.month < 10)
      {
      Serial.print("0");
      }
      Serial.print(dt.month);
      Serial.print('.');
      Serial.print(dt.year);
      Serial.print(' ');
      if (dt.hour < 10)
      {
      Serial.print("0");
      }
      Serial.print(dt.hour);
      Serial.print(':');
      if (dt.minute < 10)
      {
      Serial.print("0");
      }
      Serial.print(dt.minute);
      Serial.print(':');
      if (dt.second < 10)
      {
      Serial.print("0");
      }
      Serial.print(dt.second);
      //Serial.println();

      Serial.println();

      int chk = DHT.read22(DHT22_PIN);

      Serial.print("Temp = ");
      Serial.print(DHT.temperature, 1);
      Serial.print(" *C");
      Serial.print(" ");
      Serial.print("Feuchte = ");
      Serial.print(DHT.humidity, 1);
      Serial.println("%");

      //Taupunkt
      float t = DHT.temperature; // Die Temperatur wird vom DHT22 ausgelesen, Wert in "t" schreiben
      float r = DHT.humidity; // Die Luftfeuchte wird vom DHT22 ausgelesen, Wert in "r" schreiben
      float d = 17.271;
      float b = 237.7;
      float taupunktTemp = (d * t) / (b + t) + log(r / 100);
      float p = (b * taupunktTemp) / (d – taupunktTemp);
      Serial.print("Taupunkt");
      Serial.println(p);
      //Taupunkt

      //heatindex
      // put your main code here, to run repeatedly:
      float Humidity = (DHT.humidity); //Read the DHT humidity sensor
      //float Temperature = (DHT.temperature);
      float Temperature = (DHT.temperature * 9.0 / 5.0 + 32.0); //Read the DHT Temp sensor (OutSide)convert deg C to deg F
      float HI = (heatIndex(Temperature, Humidity));
      //HI = ((HI – 32) / 1.800)
      Serial.print("heatIndex : ");
      Serial.println((HI – 32) / 1.800);

      //heatindex

      //LCD DISPLAY

      lcd.backlight();
      lcd.setCursor(0, 0); //Go to first line of the LCD Screen
      //lcd.begin(16, 2); // Set the display to 16 columns and 2 rows
      if (dt.hour < 10)
      {
      lcd.print("0");
      }
      lcd.print(dt.hour);
      lcd.print(":");
      if (dt.minute lastConnectionTime + postingInterval)) {
      httpRequest();
      }
      // store the state of the connection for next time through
      // the loop:
      lastConnected = client.connected();
      }

      // this method makes a HTTP connection to the server:
      void httpRequest() {
      // if there’s a successful connection:
      Serial.println(„try connecting…“);
      if (client.connect(server, 80)) {
      Serial.println(„connecting…“);
      // send the HTTP PUT request:
      client.print(„GET /data2mysql.php?A0=“);
      client.print(DHT.temperature);
      client.print(„&A1=“);
      client.print(p0);
      client.print(„&A2=“);
      client.print(lux);
      client.print(„&A3=“);
      client.print(DHT.humidity);
      client.println(“ HTTP/1.1″);
      client.print(„Host: „);
      client.println(server);
      client.println(„Connection: close“);
      client.println();

      // note the time that the connection was made:
      lastConnectionTime = millis();
      }
      else {
      // if you couldn’t make a connection:
      Serial.println(„connection failed“);
      Serial.println(„disconnecting.“);
      client.stop();
      }

      //}
      }

  8. Hallo Reinhard
    Soweit funktioniert es nun
    Vielen Dank für Deine gute Anleitung !!!!
    mach weiter so !!!

    Ich habe noch eine kl. Problem

    die Zeit wird auf dem mysql server in der “ normal“ Zeit gespeichert welche um 2 h vor unserer Zeit liegt somit sind auch die Zeiten auf den Auswertungen nicht korrekt
    Gibt es eine Möglichkeit dies bei den abfragen anzupassen ?
    oder kann ich auch die Zeit von meinem arduino (DS3231) entsprechend formatieren ( (dt.year)) und auf der DB ablegen?

    Gruss Markus

  9. Hallo Markus,
    schön, dass es geklappt hat, natürlich werde ich weitermachen …

    Die Zeit wird als UDT in der Datenbank abgelegt.
    Ohne jetzt getestet zu haben: schau dir mal die mySQL Funktion convert_tz an. Damit solltest du die Zeitformate in die lokale Zeitzone convertieren können. Einbauen kannst du das in die Zeile
    $abfrage = „SELECT DATE_FORMAT(datum, ‚%Y/%m/%d %H:%i:%s‘) AS date, datum, analog0, analog1 FROM analog_data“; // 2009/07/12 12:34:56

    Viel Erfolg
    Reinhard

    • Hallo Reinhard
      Besten Dank für Deine Antwort

      Leider bin ich nicht weitergekommen

      markus

      • Hallo Markus,
        am einfachsten wäre es sicherlich Timezone direkt in der DB zu ändern. Wenn du darauf keinen Zugriff hast, müsste die o.g. Zeile folgendermaßen lauten:

        $abfrage = „SELECT DATE_FORMAT(CONVERT_TZ(datum,’+00:00′,’+04:00′), ‚%Y/%m/%d %H:%i:%s‘) AS date, datum, analog0, analog1 FROM analog_data“;

        Hier mit einer Korrektur von +4 Stunden, damit es deutlich wird.
        Am besten zuerst mit einer textbasierten Ausgabe probieren, z.B.

        <?php
        require ($_SERVER['DOCUMENT_ROOT']."/config.php"); // <- hier deine Adresse eintragen
        $mysqli_table = "analog_data";
        // $abfrage = "SELECT datum, analog0, analog1 FROM ".$mysqli_table." ORDER BY datum DESC LIMIT 20";
        // $abfrage = "SELECT CONVERT_TZ(datum,'+00:00','+04:00') as dat, analog0, analog1 FROM ".$mysqli_table;
        $abfrage = "SELECT DATE_FORMAT(CONVERT_TZ(datum,'+00:00','+04:00'), '%Y/%m/%d %H:%i:%s') AS date, datum, analog0, analog1 FROM analog_data"; // 2009/07/12 12:34:56
        $ergebnis = mysql_query($abfrage);
        while($row = mysql_fetch_array($ergebnis))
        {
        echo $row[date].",".$row[analog0].",".$row[analog1]."
        „;
        }
        ?>

        Viel Erfolg

  10. Hi
    Hat alles super funktioniert.
    Speichere meine daten bei hostinger.de.
    Ein Problem hab ich die graph.php zeigt keine daten an.
    Die graph.csv funtioniert tadellos.
    Evtl kann ja noch einer helfen dabei.
    Mfg

  11. Hi
    Funktioniert alles soweit. Außer die Graph PHP die zeigt nichts an.
    Die Graph csv funktioniert.
    Wäre nett wenn jemand helfen könnte.
    Mfg

    • Hallo Thorsten,
      geht es um die grafische Darstellung der csv-Daten oder von MySQL Daten?
      Der Link sieht mir eher nach MySQL aus. Wenn es um csv geht,
      kannst du mal posten
      a) der Code, der die csv-Datei erstellt
      b) ein paar Zeilen aus der csv-Datei als Beispiel
      c) der php-Code, der die Grafik erzeugen soll
      Ich habe zwar nicht viel Zeit, Fehlersuche zu betreiben, aber ich kann ja mal drüber schaun und dir Tips geben, wie du selber weiter kommst.
      Gruß
      Reinhard

      • Hi
        Um die Darstellung der mysql.
        Die csv Daten werden problemlos graphisch dargestellt.

        Die graph.php aus deinem tutorial zeigt nichts an.
        Am php Code habe ich nichts geändert außer meiner mysql db daten.

        Hab free space mit 2 Datenbanken bei hostinger.de

        Mfg

  12. Hallo,

    ist hier noch jemand tätig?

    Ich habe das gleiche Problem wie Thorsten, doch der hat Eintrag, offenbar erfolglos, schon am 18. Juni 2016 gemacht.

    Bei mir ist es auch so, dass ich die Graphen auf einer CSV-Datei ohne Probleme darstellen kann, nur aus der MySQL-DB wird nichts angezeigt. Die Daten lassen sich aber ohne Probleme als Liste abrufen.

    Bei mit läuft das Ganze unter XAMPP.

    Viele Grüße, Hain

    • Hallo Hain,
      schwierig für mich, hier Support zu leisten.
      Meistens liegt der Fehler in der Syntax, speziell in dem Teil, wo die Daten an DyGraph übergeben werden. Kontrolliere hier mal ganz akribisch, ob alles korrekt kopiert wurde.
      Eine Hilfe kann auch sein, die Entwicklerwerkzeuge des Browsers zu nutzen.
      Ich hoffe, du kommst damit weiter.
      Gruß
      Reinhard

  13. Das Problem das der Graph nicht angezeigt wird liegt in der nicht deklarierten Sprachkodierung. Einfach mal vor
    folgendes eintagen:
    – dies ist also die erste zeile, dann folgt der Rest der Anweisung
    Mal versuchen – bei mir war das der „Fehler“

    Ulrich

  14. grr irgendwie ist das was verschwunden …..

    also nochmal

    &ltmeta charset=“utf-8″&gt ist die erste Zeile, dann der Rest der Anweisungen.

    Irgendwie hat die Software die &lt und &gt (spitzen Klammern) geschluckt.

    • <meta charset=“utf-8″>

      hinter der html entidy ein ; (Semikolon) dann versteht WP das richtig
      also

      &lt(Semikolon)meta charset=“utf-8″&gt(Semikolon)

      • Ich hatte die Sache dann etwas anders gelöst.
        In das DyGraph-Script habe ich ein PHP-Sript laufen lassen, dass die Daten aus der MySQ-DB ausliest und damit ein Array ($results) in folgender Art ausgibt. Sieht schon mal nett aus, wird von DyGraph so aber nicht gefressen.

        Array“2017-01-01 00:00:00,0\n+2017-01-01 00:01:00,4\n+2017-01-01 00:02:00,10\n+2017-01-01 00:03:00,2\n+2017-01-01 00:04:00,1″

        Damit DyGraph das Array nun annimmt, habe ich es wie folgt konvertiert und ein weiteres \n hinzugefügt:

        print_r(json_encode(implode(„\n+“,$results)));
        unset($results);

        Gruß, Hain

  15. Vielen Dank Hain für diesen Vorschlag, muss ich mal ausprobieren
    Gruß
    Reinhard

  1. Pingback: Daten in der Cloud – Visualisierung auf dem Bildschirm | Glaskugelsehen Blog

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: