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:
(Update 04/2020 – Umbau auf mysqli)
<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 = mysqli_connect($mysql_host, $mysql_user, $mysql_pw, $mysql_db); $mysql_table = "analog_data"; if (!$connection) { echo "Fehler: konnte nicht mit MySQL verbinden." . PHP_EOL; echo "Debug-Fehlernummer: " . mysqli_connect_errno() . PHP_EOL; echo "Debug-Fehlermeldung: " . mysqli_connect_error() . PHP_EOL; exit; } /* Select queries return a resultset */ $result = $connection->query("SELECT DATE_FORMAT(datum, '%Y/%m/%d %H:%i:%s') AS date, datum, analog0, analog1 FROM ".$mysql_table); echo "["; while($row = mysqli_fetch_array($result)) { //$dcount = $dcount+1; // prepare Dygraph data, each row like this: [new Date("2016/03/31 20:01:57"),37,34], //echo "["."new Date(\"".$row['date']."\")".",".$row['analog0'].",".$row['analog1']."],"; $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 "]"; $_SESSION["dcount"] = $dcount; mysqli_close($connection); ?>, {rightGap: 20, connectSeparatedPoints: true, labels: [ "Datum", "A0", "A1" ] } // options ); </script> </div> </td> </tr> </table> <div style="text-align: center;"><span style="color: rgb(255, 255, 255);"> <?php echo "<br>".$_SESSION["dcount"]." Datensätze "; ?> </span> </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.
Veröffentlicht am 24. Mai 2014, in Arduino, MySQL, Tutorial. Setze ein Lesezeichen auf den Permalink. 34 Kommentare.
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:
Sorry, kann passieren.
gruß
Reinhard
Kein Problem, Fehler passieren. Hab es angepasst und es funktioniert tadellos!
Vielen Dank nochmmal!!
Gruß
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 "]";
Eigener Fehler, ich hatte die Mittelwertbildung eingeschaltet.
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
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
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
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();
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();
}
//}
}
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
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
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
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
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
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
grr irgendwie ist das was verschwunden …..
also nochmal
<meta charset=“utf-8″> ist die erste Zeile, dann der Rest der Anweisungen.
Irgendwie hat die Software die < und > (spitzen Klammern) geschluckt.
<meta charset=“utf-8″>
hinter der html entidy ein ; (Semikolon) dann versteht WP das richtig
also
<(Semikolon)meta charset=“utf-8″>(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
Vielen Dank Hain für diesen Vorschlag, muss ich mal ausprobieren
Gruß
Reinhard
Hallo, ich möchte gerne die csv Datei auf einen USB-Stick speichern um das schreiben auf der SD-Karte vom Raspberry zu minimieren. Dieses ist soweit auch kein Problem. Nur bekomme ich mit dygraph keine Daten angezeigt. Den Pfad habe ich angepasst. Auch die Rechte Einstellungen sollten passen. Ist dieses überhaupt möglich?
Gruß Fred
Hallo Fred,
leider kann ich diese Frage auch nicht beantworten. Wenn der Pfad korrekt ist und die Rechte für den user apache bzw die Gruppe www-data darauf zu schreiben und zu lesen korrekt sind, sollte es eigentlich funktionieren. Kontrollier mal den apache Log.
Gruß
Reinhard
Sehr guter Blog, es hat mir viel Zeit gespart.
Gruß Peter
Pingback: Daten in der Cloud – Visualisierung auf dem Bildschirm | Glaskugelsehen Blog