Mit HighCharts Werte aus einer Datenbank visualisieren

In letzter Zeit wurde ich mehrmals gefragt, wie ich die Temperaturwerte aus einer MySQL-Datenbank als Chart mit der HighCharts-Library ausgebe so wie man das in dem Beitrag Temperatur-Sensoren über Webserver auslesen sehen kann. Das will ich zum Anlass nehmen in diesem Beitrag darauf einzugehen. Hier können Sie das komplette Projekt herunterladen Chart.zip

Charts

Was man zu allererst einmal benötigt ist die HighCharts Library die man auf www.highcharts.de downloaden kann. Auf dieser Seite und in der Zip-Datei die man dort downloaden kann gibt es eine Menge an Beispielen und Hilfen, weshalb ich in diesem Beitrag nicht auf die Highcharts Library sondern vielmehr darauf eingehen will, wie man die Werte aus einer MySQL-Datenbank visualisiert.

Erstellen Sie am besten einen neuen Ordner für das neue Webprojekt. Legen Sie in diesem Ordner die Unterordner es_includes, es_scripts und es_styles an. Laden Sie die HighCharts Library herunter und entpacken Sie diese auf dem Desktop. Da ich, wie gesagt, nur Daten aus einer MySQL-Datenbank in dem Chart ausgeben will, benötige ich nicht die ganze Library. Es reicht eine Datei. Gehen Sie also in das Unterverzeichnis js des HighCharts Library Ordners und kopieren Sie die Datei highcharts.js in den zuvor erstellten Ordner es_scripts.

Anlegen der MySQL-Datenbank

Damit das Ganze funktioniert benötigen wir natürlich erst einmal eine Datenbank. Legen Sie also eine neue MySQL-Datenbank an und importieren Sie folgenden Code. Füllen Sie die Datenbank mit Daten. Am einfachsten ist das wenn Sie dies, wie in diesem Beitrag beschrieben, durch den Arduino machen lassen.

CREATE TABLE `arduino_messpunkte` (
  `messpunktid` bigint(11) NOT NULL AUTO_INCREMENT,
  `mpcharttype` tinyint(1) NOT NULL DEFAULT '1',
  `mplinetype` int(11) NOT NULL DEFAULT '1',
  `mpname` varchar(255) COLLATE utf8_bin NOT NULL DEFAULT 'Sensor',
  `mpdescription` varchar(255) COLLATE utf8_bin NOT NULL DEFAULT 'Beschreibung',
  `mplinecolor` varchar(6) COLLATE utf8_bin NOT NULL DEFAULT '000000',
  `mpvisibility` tinyint(1) NOT NULL DEFAULT '1',
  PRIMARY KEY (`messpunktid`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Werte für Charts';

CREATE TABLE `arduino_sensorwerte` (
  `id` bigint(11) NOT NULL AUTO_INCREMENT,
  `sensorid` bigint(11) NOT NULL,
  `datumzeit` datetime NOT NULL,
  `sensorwert` int(3) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `sensorid` (`sensorid`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;

Temperatursensor-WerteTemperaturmesswerte in der Datenbank

Zugriff auf die Datenbank und Definition einiger Variablen.

Legen Sie im Verzeichnis es_includes eine neue php-Datei mit dem Namen common.inc.php an und kopieren Sie folgenden Code in diese Datei. Passen Sie anschließend die Datenbankzugangsdaten an.

<?php
define('DB_SERVER',"localhost");
define('DB_NAME',"Datenbank-Name");
define('DB_USER',"Datenbank-Username");
define('DB_PASSWORD',"Datenbank-Passwort");

$conn = mysql_connect(DB_SERVER, DB_USER, DB_PASSWORD);
if(is_resource($conn))
{
  mysql_select_db(DB_NAME, $conn);
  mysql_query("SET NAMES 'utf8'", $conn);
  mysql_query("SET CHARACTER SET 'utf8'", $conn);
}

define("listViewTempPeriod", 24); // Anzeige der Stunden die ausgegeben werden sollen
define("NUMSENSORS", 2);          // Anzahl der Sensoren deren Werte in der Datenbank stehen
?>

Anlegen einiger Funktionen

Um uns die Arbeit zu erleichtern und redundanten Code zu vermeiden, legen wir nun drei Funktionen an. So können wir den Code an mehreren Stellen verwenden ohne alles doppelt und dreifach schreiben zu müssen. Erstellen Sie zunächst eine neue php-Datei im Verzeichnis es_includes und nennen Sie diese functions.inc.php. Kopieren Sie folgenden Code in diese Datei.

Funktion 1 (delLastChar) tut nichts weiter als das letzte Zeichen eines Strings zu entfernen. Dies ist eine Hilfsfunktion die von der Funktion getChartValues genutzt wird.
Funktion 2 (getChartValues) Gibt ein Array mit den Temperaturwerten und den Stunden der Speicherung dieser Temperaturwerte zurück.
Funktion 3 (getSensorSettings) Ließt die zu jedem Sensor gespeicherten Settings wie ChartTyp, Linientyp, Linienfarbe etc,  aus der Datenbank aus.

<?php
/************************************************
Letztes Zeichen hinter einem String entfernen	*
************************************************/
function delLastChar($string="")
{
  $t = substr($string, 0, -1);
  return($t);
}

/*************************************************
  Temperaturwerte, Datum, Zeit und Stundenzahl   *
  der Speicherung dieser Werte für jeden Sensor  *
  ermitteln und in Array packen		         *
*************************************************/
function getChartValues($sensorID=0, $timePeriodInHours=24)
{
  $q_data  = mysql_query("SELECT DATE_FORMAT(datumzeit,'%H') AS STUNDE, sensorwert 
    	                  FROM arduino_sensorwerte 
    	                  WHERE sensorid = ".$sensorID." AND datumzeit >= date_sub(now(), interval ".$timePeriodInHours." hour) and datumzeit <= now() 
    	                  GROUP BY DATE_FORMAT(datumzeit, '%Y-%m-%d %H') 
                          ORDER BY datumzeit DESC") or die(mysql_error()); 
  $n_data = mysql_num_rows($q_data);
  if($n_data > 0)
  {
    $chartValues   = '';
    $stundenValues = '';

    while($r_data = mysql_fetch_array($q_data))
    {
      $chartValues   .= $r_data['sensorwert'].',';  // Einzelne Werte durch Komma trennen
      $stundenValues .= $r_data['STUNDE'].',';      // Einzelne Werte durch Komma trennen
    }

    $chartValues   = delLastChar($chartValues);     // Komma hinter dem letzten Temperaturwert entfernen
    $stundenValues = delLastChar($stundenValues);   // Komma hinter letzter Stunde entfernen

    return array($chartValues, $stundenValues);
  }
}

/***********************************************************
  Namen, Beschreibung, ChartType und Linienfarbe im Chart  *
  eines Sensors-Messpunktes aus Datenbank auslesen 	   *
***********************************************************/
function getSensorSettings($sensorID=0)
{
  $q_data  = mysql_query("SELECT mpcharttype, mplinetype, mpname, mpdescription, mplinecolor 
                          FROM arduino_messpunkte 
                          WHERE messpunktid = ".mysql_real_escape_string($sensorID)) or die(mysql_error()); 
  $n_data = mysql_num_rows($q_data);
  if($n_data > 0)
  {
    $r_data = mysql_fetch_array($q_data);

    switch ($r_data['mpcharttype']) 
    {
      case 1:
        $mpChartType = 'spline';
      break;
      case 2:
        $mpChartType = 'line';
      break;
      case 3:
        $mpChartType = 'areaspline';
      break;
      case 4:
        $mpChartType = 'area';
      break;
      case 5:
        $mpChartType = 'column';
      break;    
      case 6:
        $mpChartType = 'bar';
      break;    
    }

    switch ($r_data['mplinetype']) 
    {
      case 1:
        $mpLineType = 'solid';
      break;
      case 2:
        $mpLineType = 'ShortDash';
      break;
      case 3:
        $mpLineType = 'ShortDot';
      break;
      case 4:
        $mpLineType = 'ShortDashDot';
      break;
      case 5:
        $mpLineType = 'ShortDashDotDot';
      break;    
      case 6:
        $mpLineType = 'Dot';
      break;
      case 7:
        $mpLineType = 'Dash';
      break;
      case 8:
        $mpLineType = 'LongDash';
      break;
      case 9:
        $mpLineType = 'DashDot';
      break;
      case 10:
        $mpLineType = 'LongDashDot';
      break;
      case 11:
        $mpLineType = 'LongDashDotDot';
      break;              
    }

    $mpName = $r_data['mpname'];
    $mpDescription = $r_data['mpdescription'];
    $mpLineColor = $r_data['mplinecolor'];

    return array($mpChartType, $mpLineType, $mpName, $mpDescription, $mpLineColor);
  }
}
?>

 

Jetzt geht’s ans Eingemachte. Wir haben die Datenbank angelegt und diese hoffentlich mit Daten gefüllt. Wir haben die Datei common.inc.php angelegt die die Verbindung zur Datenbank herstellt und in der ein paar Variablen definiert werden. Außerdem haben wir die Datei functions.inc.php erzeugt in der ein paar Funktionen zur Ausgabe des Chart enthalten sind. Jetzt erstellen wir eine neue php-Datei und benennen diese charts.php. Diese Datei gibt die Temperaturwerte der letzten 24 Stunden jedes Sensors aus der Datenbank aus und stellt diese in einem Chart dar.

Ausgabe des Charts

 

<?php
/************************************************************************
  Übersicht aller Sensorwerte der letzten 24 Stunden in einem Chart     *
  Darunter eine Anzeige der zuletzt gespeicherten Werte aller Sensoren  *
  Die Chart-Linien werden als Spline dargestellt.                       *
************************************************************************/

include_once("es_includes/common.inc.php");
include_once("es_includes/functions.inc.php");

if(!isset($_GET['timePeriodInHours'])) $_GET['timePeriodInHours'] = 24; else $_GET['timePeriodInHours'] = $_GET['timePeriodInHours'];
if(!isset($_GET['chartStyle'])) $_GET['chartStyle'] = 1; else $_GET['chartStyle'] = $_GET['chartStyle'];

$colors = array('#89A54E','#80699B','#3D96AE','#DB843D','#92A8CD','#A47D7C','#B5CA92');

for($i=0;$i<NUMSENSORS;$i++)
{
  list($chartValues[], $stundenValues[]) = getChartValues($i+1, $_GET['timePeriodInHours'], 1);
}

$stundenValues = $stundenValues[0];
?>
<!DOCTYPE html>
<html>
  <head>
    <title>Sensoren &Uuml;bersicht</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta http-equiv="refresh" content="300">
    <meta name="Keywords" content="Heizungsanlage,Heizungssteuerung,Arduino,Temperatursensor,DS18s20">
    <meta name="Description" content="Visualisierung der Temperaturdaten einer Heizungsanlage">
    <meta name="Robots" content="index,follow">
    <link rel="stylesheet" type="text/css" href="es_styles/default.css">
    <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>

<script type="text/javascript">
$(function () 
{
  var chart;

  $(document).ready(function() 
  {        
    chart = new Highcharts.Chart(
    {
      chart: 
      {
        renderTo: 'container'
      },
      title: 
      {
        text: 'Temperaturwerte der letzten <?php echo $_GET['timePeriodInHours'];?> Stunden'
      },
      subtitle: 
      {
        text: 'Alle Messstellen'
      },
      xAxis: 
      {
        title:
        {
          text: ''
        },
        categories: [<?php echo $stundenValues;?>]
      },      
      yAxis:
      {   
        title: 
        {
          text: ''          
        },      
        labels: 
        {
          formatter: function() 
          {
            return this.value +'°C'
          }
        }
      },
      tooltip: 
      {
        crosshairs: true,
        shared: true
      },
      tooltip: 
      {
        formatter: function() 
        {
          return '<b>'+ this.series.name +'</b><br/>'+this.x +' Uhr:  '+ this.y +'°C';
        }
      },  
      legend: 
      {
        enabled: true
      },
      credits:
      {
        enabled: false
      },
      series:
      [
<?php 
      for($i=0;$i<=NUMSENSORS;$i++)
      {
        if(!empty($chartValues[$i]))
        {
          list($mpChartType, $mpLineType, $mpName, $mpDescription, $mpLineColor) = getSensorSettings($i+1);
?>        {
            type: '<?php echo $mpChartType;?>',
            dashStyle: '<?php echo $mpLineType;?>',
            name: '<?php echo $mpName;?>', 
            color: '#<?php echo $mpLineColor;?>', 
            data: [<?php echo $chartValues[$i];?>],
            marker: 
            {
              symbol: 'square',
              enabled: false,
              states: 
              {
                hover: 
                {
                  symbol: 'square',
                  enabled: true,
                  radius: 8
                }
              }
            }    
          },
<?php  
        }
      } //for 
?>
      ] //series      
    });
  });  
});
</script>

  </head>
<body>

<div id="wrapper">
  <script src="es_scripts/highcharts.js"></script>
  <div id="container"></div>
</div>

</body>
</html>

 

Charts Charts Charts Charts

Über Enrico S.

Programmierer, Webdesigner, Grafiker, Blogger, Screencaster, Arduino- und eMobility Enthusiast. nefilim3006 ist auch bei Google+ vertreten

41 Kommentare zu “Mit HighCharts Werte aus einer Datenbank visualisieren

  1. Hallo Enrico,

    ich lasse schon mal vorab ein dickes Danke für Deine Mühe hier, sobald ich Zeit habe werde ich mich daran versuchen. Daumen hoch, Dein Blog ist klasse, mach weiter so.

    Gruß Matthias ;)

  2. Pingback: Arduino, MySQL - Temperatur-Sensoren über Webserver auslesen

  3. Ok ich checks nicht…^^
    Also erst mal danke, genau sowas brauche ich noch.

    Teil eins (also vom Arduino die Daten in die DB schreiben und html-table-formatiert ausgeben lassen funktioniert seit drei Wochen problemlos.

    So, aber irgendwie ist das ganze nicht kompatibel mit „arduino_temperaturen“ aus der anderen Anleitung…
    Da gibts nämlich keine Sensorid, und bei jedem Schreiben in die Datenbank werden immer alle Sensorwerte geschrieben.
    Bei der function „getChartValues“ wird ja aber auf SensorIDs zugegriffen.
    Kann ich das auch mit „arduino_temperaturen“ und dem Sensornamen machen?
    Da bräuchte ich jetzt aber Hilfe, was ich wo und wie ändern muss….
    Sprich in einer Zeile stehen bei mir 5 Temperarturen unter einer ID…

  4. Hi,

    die Datenbank und das Diagramm sind soweit eingerichtet, aber natürlich nur für das Beispiel. Mein zweiter Arduino/Ethernet Shield und ein paar DS18S20 sind auf dem Postweg, ich bin gespannt inwieweit ich das hinbekomme, ich schätze ich werde wohl die gleichen Probleme bekommen wie Andi.
    Im Prinzip muss ja das Arduino Sketch angepasst werden, damit die SensorID mit in die Tabelle arduino_sensorwerte geschrieben werden. Je nach SensorID wird dann über die Definition nach der Tabelle arduino_messpunkte (messpunktid) die entsprechende Linie gezeichnet.

    Ich hab händisch mal ein paar Werte in die Tabellen eingetragen, leider ist die x-Achse (Uhrzeit ) falsch herum, normalerweise sollte die Zeit von links nach rechts angezeigt werden, ich hab schon mit dem reversed Befehl der Highcharts API rumgebastelt, aber klappt irgendwie nicht so recht, geht wohl nur bei der y-Achse?

    http://jsfiddle.net/gh/get/jquery/1.7.2/highslide-software/highcharts.com/tree/master/samples/highcharts/yaxis/reversed/

    Grüße Matthias

    • Hey Matthias, mach es Dir doch nicht so kompliziert.
      Du hast doch in der URL der vom Arduino an das PHP Script zum speichern der Werte gesendet wird, die Temperaturwerte aller Sensoren. Du könntest das Script zum speichern der Temperaturwerte in die Datenbank anpassen. Das wäre das einfachste. Einfach die URL parsen, also alle Temperaturen auslesen und in ein Array packen mit der Nr des Sensors. Also Temp1 = Sensor1, Temp2 = Sensor 2 und dazu die jeweilige Temperatur dazu. Dann kannst Du die Datenbank hier im Script verwenden.

      So würde ich es machen oder besser gesagt, so habe ich es gemacht.

    • Hi Enrico, da hast Du recht, das wäre die einfachere Möglichkeit :)

      Gibt es denn eine Möglichkeit die x-Achse umzudrehen? Die Zeitachse von links nach rechts wäre irgendwie einfacher abzulesen?

  5. Hallo Enrico,

    hiermit möchte ich Dir erst mal ein ganz großes Lob aussprechen. Im Internet gibt es mittlerweile tausende von Arduino-Sketche, aber die wenigsten sind so gut aufbereitet bzw. kommentiert wie deine! Vielen Dank.
    Das Projekt „Arduino, MySQL – Temperatur-Sensoren über Webserver auslesen“ konnte ich gut „nachbauen“ und alles hat auch auf anhieb funktioniert. Nur bei der Umsetzung des Projekts „Mit HighCharts Werte aus einer Datenbank visualisieren“ hapert es ein wenig. Wie einer meiner Vorredner schon erkannt hat, matched das Projekt nicht so ganz mit dem alten Arduino-Sketch zusammen. Kannst du nicht noch einen passenden Beispiel-Sketch veröffentlichen?

    Weiter so und Viele Grüße
    Martin

    • Die beiden Beiträge sind für sich eigenständige Beiträge und haben miteinander nichts zu tun.
      In einem erkläre ich wie man Daten per Arduino an eine MySQL-Datenbank überträgt und in dem zweiten zeige ich wie man Daten aus einer MySQL-Datenbank auslesen und per HighChart visualisieren kann.
      Man muss lediglich die Datenbankabfragen anpassen um die Daten aus dem einen Beitrag per HighChart auszugeben.

    • Tja, genau das ist das Problem. Das Anpassen der Datenbankabfragen sprengt schon den Rahmen meiner Grundkenntnisse…

  6. Hi Enrico, am Freitag hab ich mal den Hardware Teil aufgebaut und soeben in der Mittagspause die „SaveTempToMySQL.php“ abgeändert. Ich lasse einfach 2 Zeilen in die Datenbank schreiben (je Sensor), sieht jetzt so aus:

    $TEMP1 = mysql_real_escape_string($_GET[‚T1‘]);
    $TEMP2 = mysql_real_escape_string($_GET[‚T2‘]);
    $DATUM = date(„Y-m-d H:i:s“);
    $SENSOR1 = „1“;
    $SENSOR2 = „2“;

    $result = mysql_query(„INSERT INTO arduino_sensorwerte (sensorid, datumzeit, sensorwert)
    VALUES(‚“.$SENSOR1.“‚, ‚“.$DATUM.“‚, ‚“.$TEMP1.“‚) „) or die(mysql_error());
    $result = mysql_query(„INSERT INTO arduino_sensorwerte (sensorid, datumzeit, sensorwert)
    VALUES(‚“.$SENSOR2.“‚, ‚“.$DATUM.“‚, ‚“.$TEMP2.“‚) „) or die(mysql_error());

    if(mysql_affected_rows() == 2)

    Die ID hab ich einfach fest als 1 und 2 festgelegt, der Arduino schreibt mir jetzt alle 15 Minuten die Werte von 2 Sensoren in die Datenbank, klappt wunderbar.

    Ob das jetzt eine elegante Lösung ist weiß ich nicht, aber es klappt.

    Wo ich allerdings noch Probleme habe ist bei der Formatierung des Charts, ich hab die Werte der Temperatur (testhalber) auf FLOAT (10,2) geändert, damit ich auch Nachkommastellen habe, das klappt auch (weil meine beiden Sensoren sonst exakt den selben Wert haben, liegen am Breadbord nebeneinander)

    Nur wo kann ich denn die X-Achse (Zeit) „feiner“ unterteilen, weil das Chart die Werte auf die Stunden rundet?

    Als Anfänger ist es doch noch ein wenig verwirrend, je mehr ich rumbastle umso weniger kenne ich mich noch aus, es grenzt ja schon an ein Wunder, dass er mir tatsächlich in die Datenbank schreibt und das erste Diagramm erfolgreich in Betrieb ist :)

    • Die X-Achse kannst Du direkt in der Datenbankabfrage ändern. Da wird ja jetzt nur nach Stunden ausgelesen.

      Deine SaveTempToMySQL ist so Misst. if(mysql_affected_rows() == 2) wird niemals wahr sein.

      Hier mal ein Beispiel.
      $DATUM = ‚2013-06-30 01:00:00‘;
      $TEMP1 = „19.99“;
      $TEMP2 = „23.45“;

      $SENSOREN = 2;

      for($i=1;$i< =$SENSOREN;$i++) { $result = mysql_query("INSERT INTO arduino_sensorwerte_neu (sensorid, datumzeit, sensorwert) VALUES(".$i.", '".$DATUM."', '".${"TEMP".$i}."') ") or die(mysql_error()); if(mysql_affected_rows() == 1) $a++; } if($a==$SENSOREN) { echo "Werte aller $SENSOREN Sensoren gespeichert!"; } else { echo "Es konnten nur $a von $SENSOREN Sensoren gespeichert werden!"; }

  7. Hi Enrico. Vielen Dank nochmal für Deine Hilfe, läuft jetzt perfekt! Die Idee und Umsetzung ist wirklich genial, ich hoffe Du lässt uns auch an Deinen weiteren Arduino Projekten teilhaben. Viele Grüße Matthias

  8. Hallo Enrico,
    Dein Guide ist wirklich genial; hat mir enorm geholfen.
    Woran ich aber leider bis jetzt gescheitert bin ist die Einbindung einer Live Update Funktion. Ich habe versucht die Funktion events – add series oder load einzubauen, aber bisher ohne Erfolg. Hast du vielleicht auch schon Erfahrungen damit?
    viele Grüße David

    • Damit kann ich Dir leider nicht helfen weil ich mich selber noch nicht damit beschäftigt habe.
      Vielleicht werde ich in naher Zukunft ja mal versuchen das umzusetzen.

  9. Danke für Deine Antwort.
    Sollte ich es schaffen diese Funktion erfolgreich einzubauen, kann ich dir gerne meinen Input schicken.
    vg
    David

  10. Hallo Enrico,
    Meine Daten kommen aus einer Wetterstation und sind nicht nach Sensor ID sortiert.
    Die Anordnung meiner Daten sieht wie folgt aus. 1. Spalte DatumZeit; 2. Spalte Sensor
    TempAussen; 3 Spalte Sensor Wind usw.. Kannst du mir sagen wie aus dieser Anordnung von Daten ein Diagramm erzeugen kann?
    Gruß Armin

    • Das ist eine PHP-Frage und würde hier jetzt zu weit führen.
      PS. wie Du oben sehen kannst antworte ich registrierten Usern meist sofort.

    • Dann habe ich es wohl einfach übersehen dass Du geschrieben hast, sorry.
      Habe leider nebenher noch einen Beruf in dem ich in 12 Stunden Schichten arbeite.

  11. Hallo,

    habe letztes Jahr ein ähnliches Projekt realisiert und bereits mehrfach verwendet. Heute habe ich mir etwas Zeit genommen und dies auch dokumentiert.

    http://www.edvler-blog.de/arduino-simple-charts-diagramm-visualisierung-messwerte/

    Ein großer unterschied von deiner zu meiner Lösung ist, dass bei mir direkt im Chart die Zeitspanne frei gewählt werden kann. Auch bei großen Datenmengen.

    Vllt. ist es für dich und andere auch interessant!
    Freue mich immer über ähnliche Lösungen, da man aus diesen meist was lernen kann.

    MfG
    EDVler

  12. Erst einmal Glückwunsch, Gute Anleitung. Ich bin gerade dabei, es auch ein bisschen nachzubauen

    Dabei habe ich 2 Probleme: Zum einen ist die y Achse negativ obwohl die Werte nicht negativ werden können. Hast du da einen Tip (mit min =0 hat es irgendwie nicht geklappt)

    und zum anderen habe ich 15 Stündliche Werte in der Datenbank und würde Sie gerne in diesem Abstand anzeigen lassen. Ich habe schon versucht den Ausdruck select date_format mit“ %H:%i zu erweitern, leider war dies nicht erfolgreich. Falls jemand dazu eine Idee hat wäre ich wirklich happy

    Gruß

    Köbi

    • Hallo Köbi,

      Warum die Achse negativ ist kann ich Dir nicht sagen. Schau mal in Deiner Datenbank ob Du dort eventuelle einen negativen Wert stehen hast. Die Achse zeigt nämlich die Werte an die aus der Datenbank gelesen werden. Bei mir ist also kein negativer Wert.

      In welchem Intervall hast Du die Werte in der Datenbank stehen, alle 5 Minuten, einer jede Stunde?

  13. Danke für die Schnelle Antwort. Ich werde mal die Datenbank auf negative Werte durchsuchen.

    DIe einzelnen Werte in der Datenbank sind wie folgt gespeichert

    2013-04-12 12:00:00 2013-04-12 12:15:00 2013-04-12 12:30:00 …..
    Habe mich im letzten Post nicht klar genug ausgedrückt. Die Werte liegen also in einem Intervall von 15 min vor. Ich würde also gerne die Werte im Viertelstündlichen abstand anzeigen, leider hat meine erste Idee einfach den Ausdruck zum Einlesen von Minuten einzufügen(%i) nicht geklappt.

    Hoffe ich konnte mich jetzt klarer Ausdrücken

    Gruß Köbi

    • Ok, Du willst also alle 15 Minuten einen Wert im Chart ausgeben und über welchen Zeitraum?
      Denk dran, wenn zu viele Daten ausgegeben werden dann kannst Du die Zeiten unten nicht mehr lesen, zumal Du dann wohl nicht nur Stunden sondern auch Minuten angezeigt bekommen willst.

    • Ja daran hatte ich auch gedacht und es würde auch genügen nur die letzten 8 Stunden angezeigt zu bekommen 32 (8+4) sind ja nicht viel mehr Datenpunkte als die 24 bei Tagesansicht. (in der Chart.php konnte ich die Anzeige auch schon auf 8 Stunden runtersetzen) nur strauchle ich wie man genau die Minutenwerte an highcharts übergibt, sodass diese auch angezeigt werden.

      gruß Köbi

    • Ich kann gerade nicht testen aber so sollte es gehen.

      SELECT ROUND(UNIX_TIMESTAMP(datumzeit)/(15 * 60)) AS MINUTEN FROM arduino_sensorwerte GROUP BY MINUTEN;
      oder
      select Round(date_format(datumzeit, "%i") / (15*60)) AS MINUTEN from arduino_sensorwerte GROUP BY MINUTEN

  14. Danke hab es gerade noch einmal versucht. Bin auf die Idee gekommen die Zeit doch mit select date_format(datumzeit, ‚%H.%i) auszugeben und als Bedingung noch „where date_format(datetime,’%i‘) IN (0,15,30,45) einzubeziehen. Somit spuckt er mir alle viertelstündlichen Werte aus.

    Das Problem dabei ist, dass im Chart dann bei den Halbstundenwerten leider die 0 weggeschnitten wird (statt 14.30 kommt 14.3 raus)

    Daher wollte ich jetzt noch einmal versuchen die Zeitfunktion von Highcharts zu benutzen über UNIX Timestamp.

    Dabei muss man aber wie ich das sehe statt 2 Arrays einen bilden der so aussieht [Zeit,Wert], [1366077600000 ,445] ….

    Hättest du eine Idee wie man das hinbekommen könnte?

    HOffe dich noch nicht zu nerven

    Gruß

    Köbi

  15. In den neueren php-Versionen kommt es zu dieser Meldung:
    „mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in“
    Könntest du evtl deine Anleitung/Scripte auf mysqli evtl umarbeiten?

  16. Hallo Enrico !

    Reife Leistung, vielen Dank für den Anschub und die Hilfestellungen welche Du mir gabst !
    Wenn alle mal so hilfsbereit wären… :-)

    • Danke, das ist sehr nett von Dir Jörg. ;-)
      Es ist schön auch mal ein positives Feedback zu bekommen. Meist ist es so dass man nicht einmal ein Danke hört wenn man geholfen hat.

  17. Der Beitrag ist echt Super
    Auch die vielen Kommentare im Code finde ich sehr gut.
    Vielen Dank !!!

  18. Genial, bester Beitrag!! Ich visualisiere damit die Werte meines Spark Core mit DHT22. Ich würde gerne die Luftfeuchtigkeit (wird alle 5 Min erfasst) in einem stündlichen Verlauf anzeigen, wie kann ich das anstellen? Habe auf deiner Seite gesehen du hast auch einen zweistündlichen Verlauf mit mehr Messpunkten. Bin dankbar für Hilfe

    Grüße
    Philipp

  19. Hallo Enrico,
    in diesem Beitrag „Arduino, MySQL – Temperatur-Sensoren über Webserver auslesen“,
    hab ich alles verstanden, funktioniert alles, danke !!
    Jetzt weiss ich aber nicht, wie ich die Werte in die neue Datenbank aus diesem Beitrag
    hineinbekomme und was und wo ich in dem anderen Script etwas ändern muss .

  20. Vielen Dank für Dein Tutorial gibt es soetwas auch für den raspberry mit ds18b20 ?

    • Da ich gerade mit dem Raspberry angefangen habe zu experimentieren, kann ich ja demnächst mal einen Artikel dazu veröffentlichen.

    • Also ich habe gerade mal etwas experimentiert.
      Es ist mit dem Raspberry Pi kein Problem einen oder auch mehrere unterschiedliche DS18B20, DS18S20 oder DS1822 auszulesen. Ich kann die Werte der Sensoren sogar per php auf meiner Website ausgeben lassen.
      Ich finde die ganze Sache sogar wesendlich einfacher als mit dem Arduino da Du hier zum ermitteln der Temperaturen rein gar nichts programmierenm musst.