Archiv

Archiv für die Kategorie ‘PHP’

EIB-Werte sammeln

10. Januar 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. von linKNX ausliest und mit einem timestamp in eine mySQL Datenbank (mySQL ist auch auf dem NAS DS101j) schreibt:

<?php
# -------------------------------------------------
# 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
# -------------------------------------------------

require('linknx.php');

/* EIB Werte mit LinKNX auslsen */
$ga1 = getEibValue("value1");
$ga2 = getEibValue("value2");
$ga3 = getEibValue("value3");
$ga4 = getEibValue("value4");
/* ...u.s.w. */
echo "Auslesen der EIB 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("eib") or die("Auswahl der Datenbank fehlgeschlagen\n");

/* aufbau der SQL Anfrage */
$query = "INSERT INTO eib (ga1, ga2, ga3, ga4) values ";
$query = $query . "('$ga1', '$ga2', '$ga3', '$ga4')";

/* ausführen der SQL Anfrage */
$result = mysql_query($query) or die("Anfrage:\n\n$query\n\nfehlgeschlagen: " . mysql_error() . "\n");
echo "EIB 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 DS101j aufgerufen.

Somit habe ich eine Historie mit einer Auflösung von 10 Minuten in der mySQL-Datenbank.

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 (Noch nicht bewertet)
Loading ... Loading ...

EIB-Werte setzen und abfragen

10. Januar 2010

Über linKNX lässt sich zum Beispiel auch eine Visualisierung realisieren.

Dazu spreche ich linKNX über die XML-Schnittstelle mit PHP an und gebe die Werte dann aus.

Um das ganze zu vereinfachen habe ich eine linknx.php Datei programmiert, welche mir die zentralen Funktionen getEibValue(id) und setEibValue(id, value) zur Verfügung stellt:

<?php
# ------------------------------------------------
# Datei: linknx.php
# ------------------------------------------------
# Beschreibung:
# Stellt zentrale Funktionen zur Verfuegung:
# - knxread()
# - knxwrite()
# - getEibValue()
# - openEib()
# - closeEib()
# ------------------------------------------------
# Autor: Christian Haeussler
# geändert am: 17.01.2008
# ------------------------------------------------

function knxread($fp, $id) {
    $in = "<read><object id='$id'/></read>\n\4";

    fwrite($fp, $in);

    $ret = '';
    $cnt = 0;
    while ($cnt < 4 && $fp && !feof($fp)) {
        $ret .= fgets($fp, 128);
        $c = fgetc($fp);
        if ($c == "\4") {
            if (ereg ("<read status='success'>([^<]+)</read>", $ret,$regs))
              $ret = $regs[1];
            break;
        }
        $ret .= $c;
        $cnt++;
    }
    return $ret;
}

function knxwrite($fp, $id, $value) {
    $in = "<write><object id='$id' value='$value'/></write>\n\4";

    fwrite($fp, $in);

    $ret = '';
    $cnt = 0;
    while ($cnt < 4 && $fp && !feof($fp)) {
        $ret .= fgets($fp, 128);
        $c = fgetc($fp);
        if ($c == "\4") {
            if (ereg ("<write status='success'", $ret))
              return 1;
            break;
        }
        $ret .= $c;
        $cnt++;
    }
    return 0;
}

function getEibValue($id) {
  $fp = openEib();
  $value = knxread($fp, $id);
  closeEib($fp);
  return $value;
}

function setEibValue($id, $value) {
  $fp = openEib();
  $status = knxwrite($fp, $id, $value);
  closeEib($fp);
  return $status;
}

function openEib() {
	$address = "IP des linKNX Gateways";
	$port = "Port des linKNX Gateways";

	$fp = fsockopen($address, $port, $errno, $errstr, 30);

	if (!$fp) {
    	echo "$errstr ($errno)<br />\n";
	}
	return $fp;
}

function closeEib($fp) {
	fclose($fp);
}

?>

Als Parameter übergebe ich den Funktionen immer die Objekt-ID (id), wie sie in der linknx XML-Konfiguration definiert wurden.

Bei der set-Funktion übergebe ich noch den zu setzenden Wert (value).

Diese Funktionen kann man dann z.B. in einer Visualisierungs-Seite nutzen. Hier ein Beispiel für die Visualisierung meiner EIB-Heizungs-Steuerung.

PHP , ,


1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (Noch nicht bewertet)
Loading ... Loading ...