Linux-Projekte für die HomeMatic
(in Python realisiert)
Scripte ohne grafische Oberfläche der HomeMatic




Seit etlichen Jahren ist bei mir zur Hausautomatisierung die HomeMatic von ELV / eq3 installiert (zuerst die CCU1, jetzt die CCU2). Damit werden unter anderem...

  • alle Lichter geschaltet

  • die Rolläden, gesteuert

  • die Heizung geregelt

  • die Rauchmelder überwacht

  • überwacht, ob im Keller Wasser eingedrungen ist

  • die Warmwasser-Kreislaufpumpe gesteuert

  • Fenster geöffnet/ geschlossen

  • angezeigt, ob die Garage geöffnet/ geschlossen ist

  • abhängig von den Außentemperaturen Elektro-Heizkörper zu- oder abgeschaltet

  • . und und und.

Bildquelle: eQ-3/ Homematic


Um in der Homematic auf Ereignisse und Werte reagieren zu können, gibt es dort die Möglichkeit entsprechende Programme zu erstellen. Dafür gibt es dort einen einfachen, grafischen Editor. Hier können Geräte oder Systemvariablen ausgewählt werden, Zeiträume definiert, Grenzwerte eingegeben werden …. und, und, und.

Aber das Alles ist in manchen Situationen noch nicht Auswahl genug. Für solche Fälle ist es möglich, per Script-Programmierung auf die Logikschicht zuzugreifen. Damit kann man, unter anderem, auf jeden einzelnen Datenpunkt von jedem Gerät zugreifen.




Bildquelle: eQ-3/ Homematic

Diese Scripte entwickelt man in einem Unterfenster bei der grafischen Programmierung.

Hierzu muß aber per WEB-Browser auf das grafische User-Interface (GUI), auch Benutzeroberfläche genannt, der Homematic zugegriffen werden. Dort muß dann die Anmeldeprozedur ausgeführt werden, worauf die Startseite der GUI angezeigt wird.

Hier ist dann unter dem Menüpunkt 'Programme und Verknüpfungen' der Unterpunkt 'Programme & Zentralenverknüpfungen' auszuwählen.

Bildquelle: eQ-3/ Homematic

Das ganze dauert aber eine geraume Zeit, da zunächst anscheinend ALLE vorhandenen Geräte, Kanäle und Datenpunkte vorbereitet werden. Die 'Sanduhr' läuft dabei ziemlich lange!



Im nun folgenden Bildschirm, mit der Auflistung der bereits vorhandenen Programme, ist dann am unteren Rand der Punkt“Script testen' auszuwählen

Bildquelle: eQ-3/ Homematic

Im sich nun öffnenden Unterfenster kann dann das Script eingegeben und getestet werden

Die bereits werksseitig vorgegebene Zeile (die man auch löschen kann) kann mit dem Button „Ausführen' gestartet werden und erzeugt das Ergebnis :

Hallo Welt!

Nun geht es normalerweise daran, eigene Scripte zu entwickeln, einzutippen und auszutesten.


Dabei ist der Befehlsinterpreter der Homematic allerdings extrem pingelig. Falls irgend etwas nicht stimmt (Groß- Kleinschreibung, Syntax, Semikolon vergessen, und, und, und ...), wird das Programm erst garnicht ausgeführt. Eine Fehlermeldung erhält man an dieser Stelle leider auch nicht.

Hier die Eingabe eines Beispiel-Scripts im oberen Teil des Fensters 'Eingabe'


Bildquelle: eQ-3/ HomeMatic

Wird dieses durch Druck auf den Button 'Ausführen' gestartet erscheint bei diesem Beispiel in dem unteren Fensterteil 'Ausgabe' die hier gezeigte Ausgabe mit den aktuell vorhandenen Servicemeldungen.


Wer sich mit der Script-Programmierung befassen will, muß sich natürlich auch mit der Sprachbeschreibung, dem Objektmodell und den Datenpunkten befassen. Dazu sei an dieser Stelle aber nur auf die zum Teil doch recht ausführliche Dokumentation von eQ-3 hingewiesen



Das Entwickeln und Testen von Scripten ist auf der HomeMatic-Zentrale also ziemlich Zeitaufwendig. Allein das Einloggen und Warten auf das Testfenster dauert dabei einige Minuten. Das spätere Schließen des Fensters geht zwar verzögerungsfrei, aber das AUSLOGGEN kann schon mal etliche Minuten in Anspruch nehmen! Schnell mal kurz was testen, kann man also vergessen.

Nun kam mir die Idee, ob man diese Tests nicht auch OHNE die Grafische Oberfläche (GUI) der Homematic durchführen könnte.

Es hat mich zwar einiges an kaum mehr vorhandenen grauen Haaren gekostet, aber es funktioniert wie gewünscht/ gedacht.

Dazu muß allerdings auf die sogenannte 'ServiceSchnittstelle' der HomeMatic zurückgegriffen werden. Diese verbirgt sich bei der normalen HomeMatic IP-Adresse hinter dem Port 8181. Dorthin können 'HTTP POST-Header' mit Scripten gesendet werden. Diese verarbeitet die HomeMatic dann und liefert die dort gemachten Ausgaben der 'Write' Script-Befehle an den aufrufenden Prozeß zurück.

Dieses Vorgehen habe ich bereits bei der Darstellung von auf der HomeMatic erzeugten Dateien mit Temperaturverläufen angewendet.

Hierzu mußte ich nur das bereits vorhandene Programm anpassen und entsprechend abwandeln. Das hat dann doch mal wieder mehr Zeit verschlungen, als zunächst vermutet.


Der Ablauf ist nun folgendermaßen:


Bildquelle: J. Hoppe

Das Python-Programm wird gestartet und erscheint mit der Abfrage:

'Datei' , 'ENTER' oder 'ende'

Das Script, das getestet werden soll steht in einer Textdatei. Pfad und Dateiname stehen in der Zeile mit der Bezeichnung 'Scriptdatei'.

Wird bei Auswahl 'datei' eingegeben, kann man den NAMEN einer bestehenden Scriptdatei eingeben. Dieser erscheint dann auch wieder in der Zeile 'Scriptdatei'

Alle Scriptdateien müssen sich im aktuellen Verzeichnis im Unterverzeichnis 'SCRIPT' befinden.


Die Eingabe von 'ende' beendet das Programm wieder.

Wird aber nur die Eingabetaste gedrückt, wird das Script an die HomeMatic gesendet und deren Antwort im Programmfenster angezeigt.

SCRIPT:

var suchDev;
string indexSM;
var Smess;
string finde;
var stelle;
var stelle2;
var geraet=dom.GetObject(28);! === Alle System ServiceMeldungen
foreach(indexSM, geraet.EnumUsedIDs())
Smess=dom.GetObject(indexSM);
if(Smess.State())
{! === Wenn Status aktiv dann...
finde="BidCos-RF." # Smess.Name().Substr(3);
suchDev=dom.GetObject(finde);
Write(Smess.Timestamp().Format("%Y-%m-%d %H:%M")#";");
var istDev=dom.GetObject(suchDev.Device());
stelle=istDev.Name().Find(":");
stelle2=Smess.Name().Find(".");
Write(istDev.Name().Substr(0,stelle) # ";");
WriteLine(Smess.Name().Substr(stelle2+1));
}
}

Das links vorgestellte Script durchforscht auf der HomeMatic die Servicemeldungen und gibt diese dann direkt im Programmfenster aus (siehe unten). Ist enorm schnell!

Und das Ganze ohne den Umweg über die grafische Oberfläche

ERGEBNIS:

> > >
> Gesendet: 643 (Bytes)
< Empfangen, Länge (soll): 589
empfangsdatenlänge:
0 589

Anzahl Einträge: 4
------------------------------------------------------------
2017-08-02 20:40;OG_Bewegung_Balkon_S;LOWBAT
2017-04-08 12:26;EG_Briefkasten_u_Klingel;UNREACH
2017-08-02 20:41;OG_Heizung_Bad_neu;LOWBAT
2017-05-09 17:44;DG_DachFenster_offen_Sued;CONFIG_PENDING
< < <


Auf diese Weise ist auch ein Schalten von Geräten, z.B. Lichtern möglich.

Dazu müssen im rechts vorgestellten Beispielscript 'Bezeichnung' und 'Kanal' durch tatsächlich in der HomeMatic vergebene Name und Kanäle ersetzt werden.

Ist die Runde Klammer hinter 'geraet.State' leer, wird der Status abgefragt, wird dort statt dessen eine 0 oder 1 eingegeben, wird das entspechende Licht (oder ähnliches) aus- oder eingeschaltet!

SCRIPT:


var geraet=dom.GetObject("Bezeichnung:Kanal");
WriteLine("Gerätestatus");
WriteLine(geraet.Name() # " = " # geraet.State());


Öffnet man neben dem Python Programmfenster zum Beispiel noch ein Editor-Fenster mit der Text-Datei ist, im Gegensatz zu der 'Frickelei' in der grafischen Oberfläche der HomeMatic', ein 'relativ' einfaches und entspanntes Arbeiten möglich. Inclusive 'Save', 'Load', 'Find', 'Replace', 'Print', usw.

Speichert man die gerade im Editor gemachten Änderungen kurz ab (meist über 'STRG + S'), kann mit Druck auf die 'Enter' Taste im Pythonfenster die Auswirkung unmittelbar angesehen werden.

Ich find's extrem praktisch ;-)


Dieses Programm funktioniert nur mit HomeMatic-CCU2 bis maximal Firmwareversion 2.27.7. Seit Firmware Version 2.27.8 wurde die ‚Service-Schittstelle‘ (port 8181) von eQ-3 geändert und das hier vorgestellte ‚Script-Programm‘ lieferte dann keine Ergebnisse mehr. Eine Anfrage bei eQ-3 (dem Hersteller) brachte die sehr kundenfreundliche Antwort, daß man nur ‚NORMALE‘ WEB-GUI-Anwender unterstützen könne.

Eigene Recherchen haben dann ergeben, daß eQ-3 anscheinend den Port 8181 intern nun an einen anderen Programmteil als bisher übergibt. Dieser prüft die eingehenden HTTP-Header Daten wohl intensiver auf Vollständigkeit.
Nachdem ich etwas mit den Parametern der HTTP-Header herumexperimentiert hatte, bin ich darauf gekommen, daß der Eintrag : ‚HOST:‚ jetzt erforderlich ist. Nachdem ich diesen hinzugefügt habe, funktioniert das ‚Script‘-Programm auch mit der neuesten HomeMatic Firmware (aktuell 2.45.1) wieder.


Das Python-Programm kann entweder __HIER__ oder im Downloadbereich heruntergeladen werden