|
Linux-Projekte
für den Raspberry Pi
(realisiert in Python)
HomeMatic
XML-RPC Schnittstelle und Alarm-Mail
|
|
Zuallererst
habe ich aber das Programm zum Starten des Homematic XML-RPC
Prozessen so abgeändert, daß man nun auswählen kann, ob der
XML-RPC Prozeß gestartet oder gestopt werden soll.
Es
lassen sich nun auch alle anderen Parameter -Menügesteuert-
temporär ändern.
Die
Grundaten (permanent) werden bei jedem Programmstart aus einer
‚config.txt‘ Datei geholt!
|
|
|
Nach
dem Serverstart auf dem RasPi muß nun in einem separaten
Python-Fenster mit obigem Programm der XML-RPC Client auf der
HomeMatic gestartet werden.
Nach dessen Start
sendet die HomeMatic als allererstes die Daten ALLER
vorhandenen Geräte an den RasPi (XML-RPC Server).
Dies
wurde durch das Clientprogramm mit dem ‚Init‘-Befehl
ausgelöst. Dieser Befehl startet auch den XML-RPC Prozess in
der Homematic.
|
|
|
Ist
diese Übertragung abgeschlossen wird im Anschluß laufend
sofort JEDES Ereignis der HomeMatic an den Server (also den
RasPi) gesendet. Das geht im Sekundentakt.
Hinweis:
Die
HomeMatic versucht das auch dann noch, wenn das
Server-Programm auf dem RasPi bereits beendet wurde und
produziert dadurch jede Menge Logbucheinträge im
Fehlerprotokoll des RasPi.
Damit
die HomeMatic die XML-RPC Sendungen einstellt, muß das
Clientprogramm eine leere idHM an die HomeMatic
senden, bevor das Serverprogramm gestopt wird!
|
|
Meine
Idee war nun, im Server-Programmteil in dem die Funktionen
definiert sind die durch die Homematic mit Daten versorgt wird,
im Programmteil in dem die Ereignissen behandelt werden, ein paar
Programmzeilen einzubauen, bei denen einzelne Ereignisse etwas
ausdrucken oder eine Mail versenden können.
Das
mit der Ereignisabfrage und dem Ausdruck war zwar schnell
erledigt, beim Mailversand stellte sich aber ein Problem heraus:
Die Mail-Prozedur wurde zwar aufgerufen, brach aber ab, sobald
neue Ereignisse eintrafen.
Sch…….!
(Hust, Hust)
Also
war klar: Es mußte ein anderer Lösungsweg gefunden werden.
Aber
ich hatte da schon so eine Idee:
Bei den Python-Modulen gibt
es eines, mit dem sich in einem Hauptprogramm weitere
Python-Programm (quasi) GLEICHZEITIG ausführen lassen. Nennt
sich Multithreading. Mit diesem Modul hatte ich mich schon mal
vor langer Zeit flüchtig beschäftigt.
Also
habe ich ein Grundprogramm erstellt, das das XML-RPC-
Serverprogramm als weiteren Prozeß startet. Das ließ sich nach
kurzer Einarbeitungszeit in das Modul dann auch recht einfach
realisieren. Es gab dabei aber, wie so oft, ein neues Problem:
die Daten der HomeMatic werden in Variablen des separaten XML-RPC
Prozessen gespeichert und dieser hat seinen eigenen
Namensbereich. Wie kann ich nun aus dem Hauptprogramm darauf
zugreifen?
Die Lösung war eigentlich recht
simpel:
Die Variablen wurden im Grund- (Haupt-) Programm
definiert, im Threading-Prozess (XML-RPC Server) als ‚global‘
definiert und konnten somit dort befüllt werden. Damit konnte
ich nun die ständig von der HomeMatic hereinkommenden Daten im
Grundprogramm analysieren und abfragen.
Im
Threading-Prozess (XML-RPC Server) muß zwar noch die Bedingung
für ein Ereignis/Alarm eingebaut sein, aber im Grundprogramm
wird die Alarm-Bedingung festgelegt. Dort erfolgt auch die
weitere Verarbeitung.
Im
Threading-Prozess (XML-RPC Server) wird jeweils ein ‚globales‘
Flag gesetzt, wenn neue Ereignisse hereingekommen sind, bzw.
auch, wenn die Alarm-Bedingung erfüllt ist.
Beide
Flags können im Grundprogramm -das in einer Endlosschleife läuft
und eigentlich nur auf gesetzte Flags aus dem Thread wartet-
entsprechend verarbeitet werden. Somit war es nun auch
unterbrechungsfrei möglich, sobald eine Alarmbedingung erfüllt
wurde, unmittelbar eine Mail zu senden.
|
Ja,
das mit der Mail…..
es
liest sich so einfach…….., aber wie mache ich das???
Ein
Studium der Python Module hat mich auf den richtigen Weg
gebracht. Die Module ‚smtplib‘ / poplib‘ ermöglichen
selbst den Mailversand an einen ‚sicheren‘ Server. Dazu
habe ich -mal wieder- ein Klassenmodul erstellt und es in das
Grundprogramm eingebunden.
Der
Mailinhalt wird dabei dynamisch mit den ‚Alarm‘-Daten aus
dem entsprechenden HomeMatic-Event gefüllt.
|
|
Obige
(echte) Beispielmail ist die Reaktion auf einen Tastendruck auf
einer Fernbedienung. Ich konnte die neue Mailfunktion natürlich
nur mit einem reproduzierbaren Ereignis testen. Auf z.B. einen
Feueralarm konnte, bzw. wollte ich nicht wirklich warten!!!
Die
meisten Parameter des Serverprogramms können in einer
Konfigurationsdatei angepaßt werden. Dort stehen die Parameter
jeweils in einer Zeile, durch Doppelpunkt vom Wert getrennt
(KEINE Leerzeichen). Beginnt eine Zeile mit „#“, wird sie als
Kommentar gewertet und nicht verarbeitet. Für die
Mailkonfiguration gibt es eine eigene Konfigurationsdatei, für
die das Gleiche gilt.
Ach
jaaaaaaaa….
Eines hatte ich ja fast vergessen:
Über
die XML-RPC Schnittstelle werden die Geräte nur mit ihrer
Seriennummer identifiziert. ÄÄÄääähhh…..
Pfffffffft.
Aber alles halb so wild: Glücklicherweise
hatte ich bereits lange zuvor ein HomeMatic Script entwickelt,
das über die Serviceschnittstelle (HomeMatic IP-Adresse mit Port
8181) geschickt, alle in der CCU vorhandenen Geräte mit Namen
und Seriennummer auflistet. Auf dieses Programm wird hier nun
zurückgegriffen und dieses setzt die Seriennummern wieder in
die, aus der GUI (Browser), bekannten Namen um.
Nachtrag:
Mit
der Firmwareversion 2.27.8 hat eQ-3 (der Hersteller) den
Serviceport 8181 so abgeändert, daß die dorthin gesendeten
Daten von einem anderen Firmwareteil behandelt wurden. Das führte
dazu, daß mein Python-Programm die Klartextnamen der Geräte
nicht mehr abfragen konnte. Nach einigen Versuchen konnte ich
aber herausfinden, was sich geändert hatte und mit dieser
Änderung läuft das Python-Programm nun wieder einwandfrei auch
mit der aktuellen HomeMatic Firmwareversion (momentan 2.41.1)
Das
korrigierte Programm kann im Downloadbereich heruntergeladen
werden
Letzte Aktualisierung: 08.03.2019