AVR-Werte sammeln per PHP
Um z.B. Temperatur-Werte historisch zu halten und darstellen zu können, habe ich ein PHP-Skript update.php programmiert, welches mir Werte z.B. vom AVR-NET-IO ausliest und mit einem timestamp in eine mySQL Datenbank (mySQL ist auch auf dem NAS DS209) schreibt:
<?php
# -----------------------------------------------------
# Datei: update.php
# -----------------------------------------------------
# Beschreibung:
# Holt AVR-Werte und schreibt sie in eine Datenbank
# -----------------------------------------------------
# Autor: Christian Haeussler
# geändert am: 05.05.2009
# -----------------------------------------------------
/* Ausgabe vom AVR-NET-IO: webpage.h -> daten.html
// 1-Wire Sensor-Werte
"AT_Akt=%OW@00\r\n"
"AT_Min=%OW@08\r\n"
"AT_Max=%OW@16\r\n"
// SHT Sensor-Werte
"IT_Akt=%OW@05\r\n"
"IT_Min=%OW@13\r\n"
"IT_Max=%OW@21\r\n"
"Humi_Akt=%OW@06\r\n"
"Humi_Min=%OW@14\r\n"
"Humi_Max=%OW@22\r\n"
"Taup_Akt=%OW@07\r\n"
"Taup_Min=%OW@15\r\n"
"Taup_Max=%OW@23\r\n"
// AD-Werte
"AD1=%VA@04\r\n"
*/
function getAVRNetIOValue($id) {
$value = NULL;
error_reporting(0);
$avr_net_io = fopen("http://IP-des-AVR/daten.html", "r")
or die("Die Werte des AVR-NET-IO konnten nicht ermittelt werden!<BR>Der AVR-NET-IO ist offline!");
if ($avr_net_io!=false) {
while ( ($data = fgetcsv($avr_net_io, 1000, "=")) !== FALSE ) {
$num = count($data);
$row++;
if ($data[0] == $id) {
$value = $data[1];
}
}
fclose($avr_net_io);
}
return $value;
}
/* AVR Werte auslsen */
$AT_Akt = getAVRNetIOValue("AT_Akt");
$AT_Min = getAVRNetIOValue("AT_Min");
$AT_Max = getAVRNetIOValue("AT_Max");
$IT_Akt = getAVRNetIOValue("IT_Akt");
$IT_Min = getAVRNetIOValue("IT_Min");
$IT_Max = getAVRNetIOValue("IT_Max");
$Humi_Akt = getAVRNetIOValue("Humi_Akt");
$Humi_Min = getAVRNetIOValue("Humi_Min");
$Humi_Max = getAVRNetIOValue("Humi_Max");
$Taup_Akt = getAVRNetIOValue("Taup_Akt");
$Taup_Min = getAVRNetIOValue("Taup_Min");
$Taup_Max = getAVRNetIOValue("Taup_Max");
$AD1 = getAVRNetIOValue("AD1");
echo "Auslesen der AVR Werte erfolgreich\n";
/* Verbindung zu mySQL aufbauen, auswählen einer Datenbank */
$link = mysql_connect("localhost", "user", "passwort")
or die("Keine Verbindung möglich: " . mysql_error() . "\n");
echo "Verbindung zum Datenbankserver erfolgreich\n";
mysql_select_db("io") or die("Auswahl der Datenbank fehlgeschlagen\n");
/* aufbau der SQL Anfrage */
$query = "INSERT INTO avr (temp_aussen, aussen_min, aussen_max, temp_innen, innen_min,
innen_max, relf_innen, relf_min, relf_max, taup_innen, taup_min, taup_max, ad1) values ";
$query = $query . "('$AT_Akt', '$AT_Min', '$AT_Max', '$IT_Akt', '$IT_Min', '$IT_Max',
'$Humi_Akt', '$Humi_Min', '$Humi_Max', '$Taup_Akt', '$Taup_Min', '$Taup_Max', '$AD1')";
/* ausführen der SQL Anfrage */
$result = mysql_query($query)
or die("Anfrage:\n\n$query\n\nfehlgeschlagen: " . mysql_error() . "\n");
echo "AVR Werte in Datenbank geschrieben\n";
/* schliessen der mySQL Verbinung */
mysql_close($link);
echo "Verbindung zum Datenbankserver abgebaut\n";
?>
Dieses PHP-Skript wird per cron-Job mit “wget http://localhost/update.php“ alle 10 Minuten auf dem NAS DS209 aufgerufen.
Somit habe ich eine Historie mit einer Auflösung von 10 Minuten in der mySQL-Datenbank.
Die entsprechende Datenbank kann dann z.B. so aussehen:
CREATE TABLE IF NOT EXISTS `avr` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `relf_innen` text CHARACTER SET utf8, `temp_innen` text CHARACTER SET utf8, `temp_aussen` text CHARACTER SET utf8, `aussen_max` text CHARACTER SET utf8, `aussen_min` text CHARACTER SET utf8, `taup_innen` text CHARACTER SET utf8, `innen_max` text CHARACTER SET utf8, `innen_min` text CHARACTER SET utf8, `relf_max` text CHARACTER SET utf8, `relf_min` text CHARACTER SET utf8, `taup_max` text CHARACTER SET utf8, `taup_min` text CHARACTER SET utf8, `sonne` text CHARACTER SET utf8, PRIMARY KEY (`id`), KEY `idx_ts` (`ts`) )
Im Prinzip geht das dann genauso bei anderen AVR-Webservern, es muss eben nur eine daten.html Seite vorhanden sein.
Auswerten lässt sich diese Historie z.B. mit Digrammen, wie dies funktioniert, steht hier:
Werte als Diagramm darstellen


(6 Bewerter, Durchschnittlich: 3,67 von 5)





