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 Client­pro­gramm 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