FHEM Widget Services

FHEM Widget integriert zwei voneinander quasi unabhängige Services, Push und Sync.

Informationen zur Datenerhebung und Nutzung dieser sind weiter unten bei Datennutzung

Push bietet eine Schnittstelle mit der ein (FHEM)Client über den FHEM Widget Server eine Apple Push Nachricht and alle registrierten und aktivierten Devices schicken kann. Ein FHEM kann also beispielsweise dem iPhone eine Nachricht schicken wenn die Türklingel läutet.

Sync ist ein Service, der die Zustände der FHEM Devices auf einem Server spiegelt und so die FHEM Instanz von außen erreichbar macht ohne dass sie von außen zugänglich ist. Mehr dazu weiter unten.

Beide Services nutzen den Token, welcher unter

"Einstellungen" -> "Push und Synchronisation"

zu finden ist. Hier kann man ihn auch verändern um z.B. einen vorher genutzten wieder zu verwenden. Dieser Token dient der anonymen Identifikation, welcher Sync Client zu welcher App gehört.

Beide Services nutzen einen Java-Client um mit dem Server zu sprechen. Falls Java nicht installiert ist, am besten für die entsprechende Plattform googlen wie das am leichtesten geht.

BananaPi: Ich empfehle Java8, da die Prozessorlast mit Java 7 durchgehend auf >20% liegt.

FHEM Widget Push Service

FHEM Widget bietet einen Push Service, der mit einem Java-Client gesteuert werden kann. Dafür muss der Client unter https://tasior.info:42333/FHEM_Sync_Client.jar geladen und auf der Festplatte gespeichert werden. Ja, das ist derselbe Client, der auch den FHEM Sync Service steuert. Man versetzt ihn nur in einen anderen Modus.

Ausgeführt wird der Client folgendermaßen:

java -jar FHEM_Sync_Client.jar -push -token='DerSyncTokenAusDerApp' -message="DiePushNachricht" -title="EinOptionalerTitel" -subtitle="EinOptionalerUntertitel"  

Wobei alle Parameter in einer Zeile übergeben werden. titleund subtitlesind optional, dann schaut die Push Nachricht ein wenig anders aus.
So sollte auf allen registrierten Devices die Nachricht erscheinen. Ein Device ist registriert wenn das Abo aktiv ist und es mindestens einmal mit in der neuesten Version gestartet wurde.

Integration in FHEM (simpel)

Derzeit habe ich den Client in FHEM folgendermaßen integriert:

define msgHandler dummy
define pushService notify msgHandler:.* { system("java -jar /tmp/FHEM_Sync_Client.jar -push -token='<token>' -message=\"$EVENT\"") }

So kann ich mit set msgHandler Nachricht eine Nachricht über Push verschicken. Hier muss ich noch herausfinden wie ich Titel und Untertitel getrennt übergebe.

Integration in FHEM (mächtig)

Der Stefan hat mir eine wesentlich mächtigere Version gebaut:

define pushWidget dummy
attr pushWidget stateFormat message
attr pushWidget webCmd send
attr pushWidget room System
setstate pushWidget DiePushNachricht
setstate pushWidget message DiePushNachricht
setstate pushWidget state ready
setstate pushWidget subtitle EinOptionalerUntertitel
setstate pushWidget title EinOptionalerTitel

define pushWidgetService notify pushWidget:send set pushWidget ready;; {system ("java -jar /pfad/zu/FHEM_Sync_Client.jar -push -token=".ReadingsVal("fhem_widget_sync_token","state","")." -message=".ReadingsVal("pushWidget","message","empty")." -title=".ReadingsVal("pushWidget","title","")." -subtitle=".ReadingsVal("pushWidget","subtitle","")."")}
attr pushWidgetService room System

FHEM Widget Sync Service

FHEM Widget bietet einen Sync Service an, der aus einem kleinen Java-Client auf FHEM Seite und einem Synchronisationsserver auf Amazon AWS besteht. Einmal aktiviert versucht FHEMWidget die Devices zunächst lokal zu erreichen. Sollte dies in einen Timeout laufen wird der Online Service angefragt.
Sämtliche Kommunikation mit dem Server ist SSL verschlüsselt und die Daten sind nicht persistent. Sollte die FHEM Seite sich 20s nicht melden werden sämtliche Daten gelöscht. Der csrfToken wird ab Client Version 24 unterstützt. Version 23 funktioniert weiterhin.

Die App-Seite

Das aktivieren des Services in der App ist leicht. Einfach in den Einstellungen -> Push Sync den sync aktivieren. Der Token wird als Identifier genutzt und muss auch in FHEM enthalten sein.
Um mehr als ein iOS Gerät mit derselben FHEM Instanz zu synchronisieren, einfach diesen Token in die anderen Geräte kopieren. Das geht mit Cloud Copy (iOS 10) ganz gut. Einfach auf dem einen Gerät kopieren und auf dem anderen Gerät, welches mit der Selben AppleID verknüpft ist, einfügen.
Ab 2.4: Ein schmaler Streifen überhalb der Schalter zeigt den Status des Sync Service. Grün, alles OK, rot: keine Daten im Backend vorhanden. Vermutlich ist der Sync Client gestorben.

FHEM Widget Logo

Die FHEM-Seite

Auf der FHEM Seite einfach die folgenden Zeilen in die fhem.cfg hinzufügen und damit ein neues globales Attribut definieren:

#fhemWidget sync token
attr global userattr fhem_widget_sync_token <all_your_other_global_attributes>
attr global fhem_widget_sync_token <your_token_from_the_app>

Auf einem Rechner mit direktem Zugriff auf deinen FHEM und auf das Internet muss das folgende Skript gestartet werden (Bitte passe die Pfade an)

#!/bin/sh
while true; do
rm path/to/FHEM_Sync_Client.jar
echo "Lade Client"
wget https://tasior.info:42333/FHEM_Sync_Client.jar /path/to/
echo "Starte FHEMSyncClient"
java -jar FHEM_Sync_Client.jar -v -url=http://localhost:8083
echo "Beendet. Oder Gestorbern. Egal, hauptsache es gibt eine neue Version"
done

Dieses Skript lädt den Client und startet ihn. Der Client beendet sich sobald er veraltet ist. Deswegen lassen wir ihn in einer Schleife laufen die ggf. den neuesten Client lädt um ihn immer up to date zu halten. Derzeit wird vom Client kein Basic Auth unterstützt weswegen er auf einen ungesichertden Port zugreifen muss.
Der Client akzeptiert die folgenden Parameter:

-v          verbose
-url=<url>  URL:port of your FHEM instance. e.e. -url=http://localhost:8083
-room=<val> The room (optional)
-silent     suppress all push messages from the client

Das wärs gewesen. Wenn ein room gesetzt ist, so sollte auch der room global in der Liste stehen (kommasepariert) da sonst der Token nicht gelesen werden kann.
Das FHEMWEB Device muss natürlich auch das jsonlist2 command zulassen und der Zugriff auf die entsprechenden Räume darf dort nicht gesperrt sein. Am besten mit einer offenen FHEMWEB Instanz aufsetzen und dann Schritt für Schritt die entsprechenden Rechte entfernen die nicht gebraucht werden.

Tip

Mein Client läuft in einem screen

screen -dmS FHEMSyncClient /bin/sh <name_of_script>

Datennutzung

Der Sync Service ist Teil des Abos. Alle Daten, die der Client im Sync-Mode an den Server schickt, sind flüchtig. Das heißt, sobald der Client gestoppt wird werden die Daten auf dem Server nach maximal einer Minute gelöscht. Die Daten auf dem Server liegen nur und ausschlißlich im RAM. Es existiert keine Datenbank. Die Daten, die der Client an den Server schickt, sind das FHEM Command zum Auslesen des States und die jsonlist2-Antwort für das Device. Das passiert nur für Devices, die auch einen Fhem-Widget Kanal definiert haben.

Der Push Service ist Teil des Abos. Es werden die Apple Push Tokens, der FHEMWidget Sync Token und der Abostatus (Abo aktiv / nicht aktiv) beim Shutdown des Servers auf die Festplatte (Amazon EBS) persistiert. Beim Restart werden diese Daten wieder eingelesen um den Push Service ohne Unterbrechung weiter verfügbar zu halten.

Jede Kommunikation zwischen Client und dem Server und zwischen App und dem Server ist SSL verschlüsselt.

IMPRESSUM