HowTo
Einfacher Taster
Zielstellung
Ein Dummy mit klickbarem Symbol für die Weboberfläche als "Taster" für verschiedenen Aktionen.Als erste Komponente stattet man einen dummy mit dem Attribute devStateIcon aus:
define testdummy dummy attr testdummy devStateIcon _start:on:stop _stop:off:start attr testdummy event-on-change-reading state set testdummy _stop
Als Zweites braucht man ein notify welches nur auf die Events start und stop vom testdummy reagiert:
define nty_test notify testdummy:(start|stop) set $NAME _$EVENT
Diese Konstruktion wirkt wie ein toggle Schalter, das Symbol beim dummy ist klickbar und bei jedem Klick schaltet es sichtbar on und off.
Die Rückmeldung des Schalters ist damit vorhanden nur er tut nicht wirklich etwas. Zur Demonstration lassen wir "noch etwas tun":
defmod nty_test notify testdummy:(start|stop) sleep 2;;set $NAME _$EVENT
Jetzt erfolgt die Reaktion auf den Klick mit kurzer Pause, stattdessen kann man natürlich auch etwas sinnvolles tun.
Remote Taster mit Rückmeldung
Zielstellung
Ein "Taster" in der Weboberfläche, der auf einem Remote System z.B. einen Dienst startet oder beendet. Mein Taster soll erst reagieren, wenn der Befehl vom Remote System ausgeführt wurde.Die System sind mit ssh "gekoppelt", wie das geht steht in meinem vorherigen Beitrag.
Achtung! Seit März 2017 funktioniert die hier beschriebene Steuerung von FHEM über die Webschnittstelle nicht mehr so einfach. Bitte meinen Beitrag im März beachten.
Demo Script
Auf dem Remote System wird ein Script im Home Verzeichnis des verwendeten Remote Benutzers erzeugt/abgelegt und mit chmod +x test.sh ausführbar gemacht:#!/bin/sh # Parameter Übergabe host=$1 name=$2 event=$3 # Kontrollausgabe zum Test aktivieren # echo $host $name $event # Zur Demo ein Sleep sleep 3 # Abfrage und Verzweigung case "$event" in start) # hier kann etwas spezifisches bei Start passieren ;; stop) # hier kann etwas spezifisches bei Stop passieren ;; *) exit 1 ;; esac # Web Kommando an FHEM absetzen h=$host':8083'; c='set '$name' '$status; curl --data "fwcsrf=$(curl -s -D - http://$h/fhem?XHR=1 | awk '/X-FHEM-csrfToken/{print $2}')" http://$h/fhem?cmd=$(echo $c|sed 's/ /%20/g') exit 0
Zum Test kann man dieses Script mit ./test.sh <FHEM hostname> testdummy start aufrufen. Dabei muss sich der Status unseres Dummy ändern.
Funktioniert dieser Test, wird das notify geändert, die hostnamen müssen angepasst werden:
defmod nty_test notify testdummy:(start|stop) "ssh pi@<remote hostname> ./test.sh <FHEM hostname> $NAME $EVENT"
An der Reaktion des Dummy hat sich nicht viel geändert, da ich im Script sleep 3 gesetzt habe dauert es jetzt 1 Sekunde länger. Dafür passiert aber etwas auf einem anderen System!
Praktische Verwendung
Das Demo Script kann so als Grundgerüst verwendet werden. Im einfachsten Fall fügt man an den entsprechende Stellen einfach nur Befehle ein. Komplizierter wird es, wenn man z.B. vor Rückkehr (absetzen des Befehls an FHEM) wirklich überprüfen will/muss ob die gewünschet Aktion auch gelaufen ist.Das notify kann für mehrere dummy verwendet werden.
Dienst steuern
Um einen Dienst zu starten und zu stoppen muss das Script und der dummy etwas angepasst werden. Zum Testen habe ich meinen Dienst aus diesem Beitrag genommen. Der Name muss entsprechend angepasst werden. Man könnte den Dienstnamen auch im notify übergeben.Der Steuerbefehl (event) wird nochmal überprüft und übergeben. Nach kurzer Wartezeit wird der Status abgefragt und dieser direkt an FHEM übergeben. Der Status ist also direkt im dummy sichtbar
#!/bin/sh # Parameter Übergabe host=$1 name=$2 event=$3 service=<Dienst Name> # Abfrage und Verzweigung case "$event" in start|stop) # Sicherstellen das nur zulässige Events verwendet werden sudo systemctl $event $service sleep 2 status=$(systemctl is-active $service) # Web Kommando an FHEM absetzen (neu mit csrfToken) h=$host':8083'; c='set '$name' '$status; curl --data "fwcsrf=$(curl -s -D - http://$h/fhem?XHR=1 | awk '/X-FHEM-csrfToken/{print $2}')" http://$h/fhem?cmd=$(echo $c|sed 's/ /%20/g') ;; *) exit 1 ;; esac exit 0Wenn der Dienst läuft wird er als active erkannt, wenn er gestoppt ist liefert er unknown zurück. Das Mapping des devStateIcon wird einfach angepasst.
attr testdummy devStateIcon active:on:stop unknown:off:start