Daten-Push mit der WebUI

Ich kann nicht anders: Ein kleines Framework für Datenbank-Updates

Wie immer bei meinen Projekten ist es mein Ziel, die Funktionen so einfach wie möglich in der Logikschicht der CCU verfügbar zu machen. Das gilt auch für die PHP-DB: Am Ende soll es reichen, zwei Systemvariablen mit Werten zu füllen, und diese werden dann in eine Tabelle geschrieben.

Etwas kompliziert wird die Sache dadurch, dass einige Funktionen von wget, die für die Daten-Aktualisierung gebraucht werden, erst ab der CCU 2 zur Verfügung stehen. Auf der anderen Seite bieten nicht alle Hoster dieselben Funktionen an.

Ich fange daher beim Idealfall an und arbeite mich zur Behelfslösung runter.

Variablen in HomeMatic-Scripten

Die CCU hatte früher ein Limit von maximal 200 Variablen, das mit Firmware-Version 2.29.18 aufgehoben wurde. Dieses Limit bezog sich auf alle Variablen, die in allen Scripten verwendet werden. Gemeint sind Variablen, die direkt im Script definiert werden: object x; object y; var z;

Wenn Scripte nicht mehr funktionieren und bei der Prüfung unerklärliche Syntax-Fehler auftreten, sollte versuchsweise dieses Programm wieder gelöscht oder deaktiviert werden – oder, noch besser, auf die aktuelle Firmware-Version aktualisiert werden.

Strings in HomeMatic-Scripten

Durch String-Verwendung in HomeMatic-Scripten kann die CCU fehlerhaft arbeiten, instabil werden oder sogar abstürzen. Grundsätzlich gilt: Je öfter mit Strings hantiert wird, desto eher führt dies zu Problemen.

Ich empfehle daher, nach Umsetzung dieser Anleitung die CCU unter Beobachtung zu halten.

String-Verlängerung

In den Scripten auf dieser Seite werden Strings verlängert (x = x # y). Dies führt oft zu Störungen bei der Ausführung von Programmen:

  • Scripte in Programmen werden nicht mehr ausgeführt
  • bei der Fehlerprüfung erscheinen unerklärliche Syntax-Fehler

Durch einen Neustart werden diese Probleme (vorübergehend) behoben. Auch hier hängt die Dauer, bis es zu Störungen kommt, davon ab, wie häufig diese Programmschritte ausgeführt werden.

Benennung von Systemvariablen

Prinzipiell kann man Systemvariablen – so wie allen Objekten in der CCU – beliebige Namen geben, also z. B. auch Umlaute und Sonderzeichen verwenden. Ich empfehle jedoch, sich auf reguläre Buchstaben (a-z, A-Z) zu beschränken: Bei Umlauten und Sonderzeichen besteht die Gefahr, dass Systemvariablen in Scripten nicht überall gefunden werden.

Systemvariablen

Für Einträge in die Datenbank richte ich zwei Systemvariablen ein: PHP-DB Table und PHP-DB Value.

In PHP-DB Table wird der Name der Tabelle gespeichert, in die der Wert geschrieben werden soll. Dies ist immer der erste Schritt, um einen Wert zu speichern.

Die PHP-DB auf dem Webserver kümmert sich dann darum, dass die Tabelle bei Bedarf angelegt wird.

Die zweite Variable PHP-DB Value nimmt den Wert auf. Wird sie gesetzt, wird das folgende WebUI-Programm ausgeführt und der neue Wert in die bestehende oder neue Tabelle eingefügt.

Danach wird die Systemvariable zurückgesetzt und wartet auf den nächsten Datenbankeintrag.

WebUI zum Aufruf des Scripts

Wer meine anderen Frameworks kennt, der kennt auch schon fast dieses WebUI-Programm.

Die Funktion ist für jedes der folgenden Scripte gleich: Wenn die Systemvariable PHP-DB Value aktualisiert wird und nicht leer ist, wird das angehängt Script ausgeführt.

Je nachdem, auf welcher CCU das Programm ausgeführt wird und auf welchen Webspace man zugreift, muss man dann das passende aus den unten gezeigten Scripten einfügen – und natürlich die Parameter anpassen.

Scriptvarianten

Wie schon bei der Vorstellung beschrieben, sollte der Webspace, auf dem die PHP-DB läuft, im Idealfall über TLS abgesichert sein und Authentifizierung mit Usernamen und Passwort über HTTP bieten. Ab CCU 2 wird diese Variante unterstützt.

Dieses  ist also das richtige Script für die Optimallösung.

! HomeMatic-Script
! DATEN-PUSH MIT DER WEBUI
! http://www.christian-luetgens.de/homematic/phpdb/webuiprogramm/WebUI-Einrichtung.htm

! HTTP-Authentifizierung
string user = "homematic";
string pass = "http-passwort";

! URL
string url = "https://luetgens.bplaced.net/homematic/set.php";

! CUxD-Gerät
string cuxd = "CUxD.CUX2801001:7";

! Parameter
object table = dom.GetObject ("PHP-DB Table");
object value = dom.GetObject ("PHP-DB Value");

if ((table.Value() != "") && (value.Value() != "")) {

  string cmd = 
	"wget --no-check-certificate --quiet --output-document - " #
	" --user " # user # " --password " # pass # 
	" \"" # url # "?table=" # table.Value() # "&value=" # value.Value() # "\"";

  dom.GetObject(cuxd # ".CMD_EXEC").State (cmd);

  value.State ("");

}

!  Ende des Scripts

Das Script ist für meine Verhältnisse geradezu ausführlich kommentiert.

Das Script prüft zunächst, ob in beiden Systemvariablen Werte stehen. Wenn ja, wird der komplette Aufruf von wget mit allen Parametern zusammengesetzt und abgesendet Danach wird die Systemvariable für den Wert zurückgesetzt: Falls das Script erneut aufgerufen wird, werden keine doppelten Werte in der Datenbank eingetragen.

Wichtig vielleicht noch der Hinweis, dass in diesem Script kein Token vorgesehen ist. Die entsprechende Variable im PHP-DB-Scriptpaket muss leer bleiben.

Das Problem bei diesem Script war, dass es bei meinem Freund – dem mit der Wärmepumpe  – einfach partout nicht lief. Nach langem Hin und Her haben wir dann festgestellt, dass das uralte wget auf der CCU 1 sowohl mit dem TLS-Verbindungsaufbau als auch mit der HTTP-Authentifizierung ein Problem hatte.

Am Ende kam ein zweites Script heraus, das so ungefähr alles über Bord wirft, was im oberen Script so perfekt war. Nur die Kommentare sind noch da.

! Token-Authentifizierung
string token = "config-passwort";

! URL
string url = "http://luetgens.bplaced.net/homematic/set.php";

! CUxD-Gerät
string cuxd = "CUxD.CUX2801001:7";

! Parameter
object table = dom.GetObject ("PHP-DB Table");
object value = dom.GetObject ("PHP-DB Value");

if ((table.Value() != "") && (value.Value() != "")) {
  string cmd = 
    "wget --quiet --output-document - " #
    " \"" # url # "?table=" # table.Value() # "&value=" # value.Value() # "&token=" # token # "\"";

  dom.GetObject(cuxd # ".CMD_EXEC").State (cmd);

  value.State ("");
}

Statt der HTTP-Authentifizierung gibt es hier einen Token. Dieser muss identisch sein mit dem Token, der in der Config-Datei des PHP-DB-Scriptpaketes vermerkt ist.

Da bei dieser Variante auch keine TLS-Verbindung verwendet wird, gehen alle Daten unverschlüsselt über die Leitung – einschließlich des Tokens. Man sollte hier also wirklich nichts nehmen, was irgendwo anders womöglich als Passwort zum Einsatz kommt.

Die beiden Scripte stellen die Extrembeispiele dar. Irgendwo dazwischen muss man sich eine funktionsfähige Variante zusammenbasteln, z. B. mit TLS und Token, aber ohne HTTP-Authentifizierung.

Navigation