Arduino – Heizungssteuerung – Webanwendung

Dieser Beitrag demonstriert, wie man die Temperaturwerte der verschiedenen Sensoren unserer Heizungssteuerung, die zuvor alle 10 Minuten über ein Arduino Board in einer MySQL-Datenbank gespeichert wurden,  als GoogleChart ausgeben lassen kann.  Für das Beispiel werde ich für jeden Sensor die Werte der letzten 24 Stunden ausgeben. Da das Arduino Board die Temperatur Werte alle 10 Minuten in der Datenbank gespeichert hat, sind nun für jede Stunde 6 Einträge vorhanden. Aus diesen 6, teils unterschiedlichen Werten, werden wir den Mittelwert errechnen und diesen einen Wert für jede Stunde ausgeben. Zum Schluss werden also 24 Temperaturwerte im Google Chart angezeigt wobei jeder Wert den Mittelwert einer Stunde darstellt.

So wird das Ergebnis aussehen

Heizungsanlage_ChartView

Heinzungsanlage_ListView

MySQL-Datenbank

--
-- Tabellenstruktur für Tabelle `arduino_temperaturen`
--

CREATE TABLE IF NOT EXISTS `arduino_temperaturen` (
  `id` bigint(11) NOT NULL AUTO_INCREMENT,
  `datumzeit` datetime NOT NULL,
  `temp1` float(10,2) NOT NULL,
  `temp2` float(10,2) NOT NULL,
  `temp3` float(10,2) NOT NULL,
  `temp4` float(10,2) NOT NULL,
  `temp5` float(10,2) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci;

ARDUINO/Heizung/styles/default.css

body{font-size:12pt; font-family:"Lucida Sans Unicode", "Lucida Grande", sans-serif;}

h2{color:#4e74a7; margin:0px 0px 20px 0px;}

.w620 { width: 620px; }
.h160 { height: 160px; }

ARDUINO/Heizung/inc/db.inc.php

<?php
define('DB_SERVER',"localhost");
define('DB_NAME',"DBNAME");
define('DB_USER',"DBUSERNAME");
define('DB_PASSWORD',"DBPASSWORD");

$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);
}
?>

ARDUINO/Heizung/index.php

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>Heizungssteuerung</title>
        <link rel="stylesheet" type="text/css" href="styles/default.css">
    </head>
<body>

<?php
include("inc/db.inc.php");

// Temperaturwerte der letzten 24 Stunden aus Datenbank auslesen
// Bei mehreren Werten in einer Stunde, den Mittelwert aus diesen Werten errechnen
$q_data  = mysql_query("SELECT DATE_FORMAT(datumzeit,'%H') AS STUNDE, DATE_FORMAT(datumzeit,'%d.%m.%Y') AS DATUM, 
                               DATE_FORMAT(datumzeit,'%H.%i') AS ZEIT, temp1, temp2, temp3, temp4, temp5 
                               FROM arduino_temperaturen WHERE datumzeit >= date_sub(now(), interval 24 hour) and datumzeit <= now()
                               GROUP BY DATE_FORMAT(datumzeit, '%Y-%m-%d %H') 
                               ORDER BY datumzeit DESC") or die(mysql_error());                     

//Prüfen ob mind. 1 Wert in der Datenbank steht
if(mysql_num_rows($q_data) > 0)
{
    $i  = 0;
    $ti = '';

    //Alle Werte aus Datenbank in Schleife ausgeben
    while($r_data = mysql_fetch_array($q_data))
    {
        //Wenn ein Temperaturwert im negativen Bereich (Sensor ausgefallen) dann Wert auf 0 setzen
        if($r_data['temp1'] < 0) $temp1 = 0; else $temp1 = number_format($r_data['temp1'], 1, '.', '');
        if($r_data['temp2'] < 0) $temp2 = 0; else $temp2 = number_format($r_data['temp2'], 1, '.', '');
        if($r_data['temp3'] < 0) $temp3 = 0; else $temp3 = number_format($r_data['temp3'], 1, '.', '');
        if($r_data['temp4'] < 0) $temp4 = 0; else $temp4 = number_format($r_data['temp4'], 1, '.', '');
        if($r_data['temp5'] < 0) $temp5 = 0; else $temp5 = number_format($r_data['temp5'], 1, '.', '');

        //Alle Werte eines Sensors in einem Array speichern 
        $temp1chart[]  = $temp1;
        $temp2chart[]  = $temp2;
        $temp3chart[]  = $temp3;
        $temp4chart[]  = $temp4;
        $temp5chart[]  = $temp5; 
        $stundechart[] = $r_data['STUNDE'];  

        //die zuletzt gespeicherten Temperaturwerte ermitteln 
        $i++;
        if($i==1)
        {
            $DATUM      = $r_data['DATUM'];
            $ZEIT       = $r_data['ZEIT'];

            $lastValue1 = $temp1;
            $lastValue2 = $temp2;
            $lastValue3 = $temp3;
            $lastValue4 = $temp4;
            $lastValue5 = $temp5;       
        }
    }

    //Die Daten im Array mit den Werten eines Sensors umkehren
    //Komma hinter dem letzten Wert entfernen
    $temp1chart  = array_reverse($temp1chart);
    foreach ($temp1chart as $v) 
    { 
        $ti .= $v.","; 
    }
    $temp1chart  = substr($ti, 0, -1);

    $temp2chart  = array_reverse($temp2chart);
    foreach ($temp2chart as $v) 
    { 
        $ti .= $v.","; 
    }
    $temp2chart  = substr($ti, 0, -1);

    $temp3chart  = array_reverse($temp3chart);
    foreach ($temp3chart as $v) 
    { 
        $ti .= $v.","; 
    }
    $temp3chart  = substr($ti, 0, -1);

    $temp4chart  = array_reverse($temp4chart);
    foreach ($temp4chart as $v) 
    { 
        $ti .= $v.","; 
    }
    $temp4chart  = substr($ti, 0, -1);

    $temp5chart  = array_reverse($temp5chart);
    foreach ($temp5chart as $v) 
    { 
        $ti .= $v.","; 
    }
    $temp5chart  = substr($ti, 0, -1);

	$test = '';
    $stundechart  = array_reverse($stundechart);
    foreach ($stundechart as $v) 
    { 
        $test .= $v."|"; 
    }
    $stundechart  = substr($test, 0, -1);
}   
else
{
    //Meldung erzeugen wenn keine Temperaturwerte in der Datenbank gefunden wurden
    $E = 1;
    $M = "Es wurden keine Temperaturwerte in der Datenbank gefunden!";
}

function googleChartUrl($width=620, $height=150, $color=000000, $stundechart=0, $chartValues=0)
{
    $url = "http://chart.apis.google.com/chart?cht=lc";
    $link = $url."&chs=".$width."x".$height."&chco=".$color."&chxt=y,x&chg=4,10&chxl=0:|10|20|30|40|50|60|70|80|90|Temp|1:|".$stundechart."&chd=t:".$chartValues;
    return("<img src=\"".$link."\">");
}

//Wenn Daten in der Datenbank gefunden wurden, diese ausgeben
if(!isset($E))
{
?>
    <h2>Letzter gespeicherter Temperatur-Messwert</h2>
    <h3><?php echo $DATUM.", ".$ZEIT." Uhr";?></h3>
<?php
}
else
{
    //Meldung ausgeben wenn keine Temperaturwerte in der Datenbank gefunden wurden
    echo $M;
}
?>

<table border="2" cellpadding="10" cellspacing="10">
 <tr>
  <th>Puffer Messpunkt 5 oben</th>
  <th><?php echo $lastValue5;?> &deg;C</th>
  <td class="w620 h260"><a href="listView.php?chart=5"><?php echo googleChartUrl(620, 250, "008000", $stundechart, $temp5chart); ?></a></td>
 </tr>
 <tr>
  <th>Puffer Messpunkt 4</td>
  <th><?php echo $lastValue4;?> &deg;C</td>
  <td class="h260"><a href="listView.php?chart=4"><?php echo googleChartUrl(620, 250, "6699CC", $stundechart, $temp4chart); ?></a></td>
 </tr>
 <tr>
  <th>Puffer Messpunkt 3</td>
  <th><?php echo $lastValue3;?> &deg;C</td>
  <td class="h260"><a href="listView.php?chart=3"><?php echo googleChartUrl(620, 250, "FF8000", $stundechart, $temp3chart); ?></a></td>
 </tr>
 <tr>
  <th>Puffer Messpunkt 2</td>
  <th><?php echo $lastValue2;?> &deg;C</td>
  <td class="h260"><a href="listView.php?chart=2"><?php echo googleChartUrl(620, 250, "FF00FF", $stundechart, $temp2chart); ?></a></td>
 </tr>
 <tr>
  <th>Puffer Messpunkt 1 unten</td>
  <th><?php echo $lastValue1;?> &deg;C</td>
  <td class="h260"><a href="listView.php?chart=1"><?php echo googleChartUrl(620, 250, "004080", $stundechart, $temp1chart); ?></a></td>
 </tr>
</table>

  </body>
</html>

ARDUINO/Heizung/listView.php

Diese Seite zeigt alle Werte eines bestimmten Temperatursensors der letzten 24 Stunden. Die Seite wird aufgerufen indem man auf der index.php Seite auf eines der Charts klickt.

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>Listenansicht</title>
        <link rel="stylesheet" type="text/css" href="styles/default.css">
    </head>
<body>

<?php
include("inc/db.inc.php");

$ZEITRAUM = 24; //Anzeige in Stunden

if(isset($_GET['chart']))
{
    $CHART = $_GET['chart'];
    $q_data  = mysql_query("SELECT DATE_FORMAT(datumzeit,'%d.%m.%Y') AS DATUM, DATE_FORMAT(datumzeit,'%H.%i') AS ZEIT, temp".$CHART." AS TEMPERATUR  
                               FROM arduino_temperaturen WHERE datumzeit >= date_sub(now(), interval ".$ZEITRAUM." hour) and datumzeit <= now()
                               ORDER BY datumzeit DESC") or die(mysql_error());                     

    echo "<h1>Anzeige der letzten ".$ZEITRAUM." Stunden</h1>\n";
    echo "<h2>Puffer Messpunkt ".$_GET['chart']."</h2>\n";
    echo "<a href=\"index.php\">Zur&uuml;ck</a>";

    //Prüfen ob mind. 1 Wert in der Datenbank steht
    if(mysql_num_rows($q_data) > 0)
    {

        echo "<table border=\"2\" cellpadding=\"10\" cellspacing=\"10\">\n";
        echo "  <tr>\n";
        echo "      <td><strong>Datum</strong></td>\n";
        echo "      <td><strong>Zeit</strong></td>\n";
        echo "      <td><strong>Temperatur</strong></td>\n";
        echo "  </tr>\n";

        //Alle Werte aus Datenbank in Schleife ausgeben
        while($r_data = mysql_fetch_array($q_data))
        { 
            //Wenn ein Temperaturwert im negativen Bereich (Sensor ausgefallen) dann Wert auf 0 setzen
            if($r_data['TEMPERATUR'] > 0) 
            {
                $temp = number_format($r_data['TEMPERATUR'], 1, '.', '');

                echo "<tr>\n";
                echo "  <td>".$r_data['DATUM']."</td>\n";
                echo "  <td>".$r_data['ZEIT']."</td>\n";
                echo "  <td>".$temp." &deg;C</td>\n";
                echo "</tr>\n";
            }
        }
        echo "</table>\n";
    }   
    else
    {
        //Meldung erzeugen wenn keine Temperaturwerte in der Datenbank gefunden wurden
        echo "F&uuml;r die letzten ".$ZEITRAUM." Stunden konnten keine Temperaturwertein der Datenbank gefunden werden!<a href=\"index.php\">Zur&uuml;ck</a>";
    }
} //if isset $_GET['chart']
else
{
    echo "<h2>Achtung!</h2>Bitte rufen Sie diese Seite auf indem Sie auf ein Chart auf der Seite index.php klicken!<a href=\"index.php\">Zur&uuml;ck</a>";
}
?>

  </body>
</html>

Über Enrico S.

Programmierer, Webdesigner, Grafiker, Blogger, Screencaster, Arduino- und eMobility Enthusiast.

Kommentare geschlossen.