Archiv

Archiv für die Kategorie ‘PHP’

AVR-Werte sammeln per PHP

4. September 2010

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

PHP , , , ,


1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (6 Bewerter, Durchschnittlich: 3,67 von 5)
Loading ... Loading ...

Werte als JPGraph Digramm darstellen

11. Januar 2010

Historische Werte lassen sich zum Beispiel mit jpgraph als Diagramm darstellen.

Dazu benötigt man lediglich die jpgraph Lib und eine PHP-Datei, die das Bild generiert.

Hier ein Beispiel eines 48 Stunden Digramms für 2 Werte (Temperatur und Luftfeuchte):

<?php
# ————————————————-
# Datei: graph_48h.php
# benötigt: jpgraph Libs
# ————————————————-
# Beschreibung:
# Holt Werte aus einer Datenbank und generiert draus ein Diagramm mit jpgraph
# ————————————————-
# Autor: Christian Haeussler
# geändert am: 04.07.2008
# ————————————————-

// jpgraph Libs einbinden
require_once(“jpgraph/src/jpgraph.php”);
require_once(“jpgraph/src/jpgraph_line.php”);
require_once(“jpgraph/src/jpgraph_date.php”);

// Grafik definieren
$graph = new Graph(800,600,”auto”,60);
$graph->SetScale(“datlin”);
$graph->SetY2Scale(“lin”);

// Raender definieren
$graph->img->SetMargin(60,60,40,80);

// Datumsformat der Zeitachse einstellen
$graph->xaxis->scale->SetDateFormat(‘H:i’);

// Maximal und Minimalwert der Skala einstellen
$graph->xaxis->scale->SetTimeAlign(MINADJ_10);

// Label-Text Winkel um 90° drehen
$graph->xaxis->SetLabelAngle(90);

$sline = new PlotLine(HORIZONTAL,0,”black”,1);
$graph->Add($sline);

// Verbindung zu mySQL aufbauen, auswählen einer Datenbank
$link = mysql_connect(“localhost”, “user”, “passwort”);
mysql_select_db(“io”);

// ausführen der SQL Anfrage (288 Werte = 2 Tage * 24 h * 60 min / 10 min)
$query = “SELECT * FROM DB ORDER BY id DESC LIMIT 288″;
$result = mysql_query($query);

// Ausgabe der Ergebnisse in Array
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
$times[] = $row["timestamp"];
$ydata1[] = $row["relf"];
$ydata2[] = $row["temp"];
}

// Freigeben des Resultsets
mysql_free_result($result);

// schliessen der mySQL Verbinung
mysql_close($link);

// Arrays umsortieren
$times = array_reverse($times);
$ydata1 = array_reverse($ydata1);
$ydata2 = array_reverse($ydata2);

// Die Zwei Linien generieren
$lineplot1 = new LinePlot($ydata1,$times);
$lineplot2 = new LinePlot($ydata2,$times);

// Legende definieren
$graph->legend->Pos(0.50,0.95,”center”,”top”);
$graph->legend->SetLayout(LEGEND_HOR);
$graph->legend->SetShadow(false);

// Titel für Legende
$lineplot1->SetLegend(“Luftfeuchte “);
$lineplot2->SetLegend(“Temperatur “);

$graph->xaxis->SetPos(“min”);
$graph->xgrid->Show(true,false);

// Titel und Beschriftung der Skalen
$graph->title->Set(“Verlauf der Daten”);
$graph->subtitle->Set(“über 48 Stunden”);
$graph->subtitle->SetColor(“darkred”);
$graph->xaxis->title->Set(“t”);
$graph->xaxis->SetTitleSide(SIDE_RIGHT);
$graph->yaxis->title->Set(“°C”);
$graph->yaxis->SetColor(“red”);
$graph->y2axis->title->Set(“%rH”);
$graph->y2axis->SetColor(“blue”);

// Schriftarten und Groesse festlegen
$graph->title->SetFont(FF_FONT2,FS_BOLD);
$graph->subtitle->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->y2axis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);

// Lienfarben und staerke definieren
$lineplot1->SetColor(“blue”);
$lineplot1->SetWeight(2);
$lineplot2->SetColor(“red”);
$lineplot2->SetWeight(2);

// Die Linien zu der Grafik hinzufügen
$graph->AddY2($lineplot1);
$graph->Add($lineplot2);

// Grafik anzeigen
$graph->Stroke();
?>

Dieses PHP-Skript wird dann ganz einfach in eine HTML-Seite als IMG-Tag
<img href=”graph_48h.php”>
mit eingebunden.

Das generierte Diagramm sieht dann z.B. so aus:

# -------------------------------------------------
# Datei: update.php
# benötigt: linknx.php
# -------------------------------------------------
# Beschreibung:
# Holt EIB-Werte und schreibt sie in eine Datenbank
# -------------------------------------------------
# Autor: Christian Haeussler
# geändert am: 17.02.2008
# -------------------------------------------------

PHP ,


1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (4 Bewerter, Durchschnittlich: 4,75 von 5)
Loading ... Loading ...

EIB-Visualisierung mit PHP

10. Januar 2010

Ich habe meine EIB Heizungs Steuerung mit PHP und linKNX visualisiert!

Für die Anzeige verwende ich ein Bild, welches ich selbst erstellt habe und meine Heizungsanlage darstellt:

heizung

Darauf habe ich an den Stellen, wo die Werte erscheinen sollen entsprechende Layer (DIV) deviniert, in denen die Werte dargestellt werden sollen.

In den Layern wird eine get-Funktion mit
<?php getEibValue(‘temp_speicher’); ?>
aufgerufen und gibt zur Laufzeit dann den Wert aus.

Bei den Ventilen und Pumpen wird der aktuelle Zustand angezeigt und kann durch klicken auf den Wert verändert werden. Dabei wird eine set-Funktion
<?php setEibValue(‘pumpe_ofen’,1); ?>
aufgerufen, die den Wert an den EIB-Bus schickt.

Beschreibung der Funktionen

Neben der Visualisierung der Zustände und Werte lasse ich noch die gesammelten Temperatur-Werte als Diagramm darstellen.

Die Diagramme erstelle ich dynamisch für verschiedene Zeitintervalle (24h, 48h, Woche, Monat und Jahr):

Heizung Graph 24h

24 Stunden

48 Stunden

48 Stunden

1 Woche

1 Woche

1 Monat

1 Monat

Wie dies funktioniert, siehe: Werte als Diagramm darstellen

PHP ,


1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (7 Bewerter, Durchschnittlich: 5,00 von 5)
Loading ... Loading ...