Automatisierung
An dieser Seite wird momentan noch gearbeitet. |
Begriff
Mit Bezug auf FHEM, ist Automatisierung die Verknüpfung von Geräten, mit der sie befähigt werden ohne menschlichen Eingriff Handlungen auszuführen.[1]
Wirkungsweise
Die Automatisierung erfolgt entlang zweier Wirkungsketten, der Ereignissteuerung und der Zeitsteuerung
Ereignissteuerung
externes Objekt -> Gerät -> Zustandsaktualisierung -> Event -> Eventhandler -> Verarbeitung -> Befehl -> Gerät -> externes Objekt
Zeitsteuerung
Timehandler -> Verarbeitung -> Befehl -> Gerät -> externes Objekt
externes Objekt
Ein externes Objekt existiert außerhalb des FHEM-Servers, z.B. Türkontakte, I2C-Sensoren, Heizungsventile, eine Spracherzeugung, eine Webseite, usw.
Gerät
Ein Gerät kann ein externes Objekt abbilden oder als Hilfsgerät für sich selbst stehen, z.B. ein Dummy oder ein Eventhandler. In Readings werden die Zustände des externen Objektes dargestellt, z.B. der Zustand einer Funksteckdose im Reading state, der Batteriezustand im Reading batteryLevel. Ein Reading ist mit einem Zeitstempel versehen, der den Zeitpunkt der letzten Aktualisierung enthält.
Zustandsaktualisierung
Empfängt ein Gerät Zustandsdaten von einem externen Objekt oder erhält es einen Befehl, kann das zu einer Zustandsaktualisierung im Gerät führen. Diese Aktualisierungen können Events auslösen. Befehle können eine Interaktion des Gerätes mit dem externen Objekt auslösen, wie Zustände setzen oder Daten abholen und dadurch eine Zustandsaktualisierung bewirken.
Event
Ein Event ist eine Nachricht, die von einem Gerät ausgelöst wird. Die Nachricht beinhaltet Informationen über den Zustand des Gerätes. Events werden von Eventhandlern verarbeitet.
Eventhandler
Ein Eventhandler filtert bestimmte Ereignisse und verarbeitet sie.
Timehandler
Ein Timehandler löst über Zeitangaben eine Verarbeitung aus.
Verarbeitung
Die Verarbeitung stellt die Automatisierungslogik dar. Sie kann die Verknüpfung verschiedener Geräte über Gerätevariablen beinhalten, so wie deren Verknüpfung mit Zeitangaben. Im Ergebnis werden Befehle abgesetzt.
Befehl
Befehle können unmittelbar auf Geräte wirken und dann mittelbar auf externe Objekte. Es sind drei Befehlstypen zu unterscheiden, FHEM-Befehle, Befehle auf Betriebssystemebene und Perl-Ausdrücke.
Beispiel einer Automatisierungsaufgabe
Aufgabenstellung
Wenn zur Frühstückszeit der Esstisch besetzt ist, dann soll ein selbst erstellter Wetterbericht angesagt und danach die "Tagesschau in 100s"[2] abgespielt werden.
Wirkungskette
Das externe Objekt, der Bewegungsmelder unter dem Esstisch, liefert bei Bewegung über das Gerät PIR_Tisch regelmäßig Events, z.B.
2018-08-07 08:46:33 IT PIR_Tisch on 2018-08-07 08:46:37 IT PIR_Tisch off
Der Eventhandler Tisch_besetzt reagiert auf diese Events, ermittelt zur Frühstückszeit die Eventrate und erzeugt einmalig ein Event , wenn der Esstisch besetzt ist.
2018-08-07 08:52:17 DOIF Tisch_besetzt cmd_1
Der Eventhandler Ansage_steuern reagiert auf dieses Event und setzt einen Befehl an das Gerät Ansagen ab.
set Ansagen tts {(erzeugeWettertext)}
Der Befehl ruft im Argument über set magic ein Perl-Script erzeugeWettertext auf, das den Wettertext erstellt und zurück gibt. Der Befehl richtet sich an den Gerätetyp Text2Speech. Daher wird der Text an einen Sprachgenerator, ein externes Objekt gesendet, der den gesprochenen Text als MP3-Datei zur Verfügung stellt. Diese Datei wird dann auf der Betriebssystemebene über das externe Objekt Mplayer durch die angeschlossenen Lautsprecher wiedergegeben. Nachdem die Datei abgespielt wurde, wird ein Event erzeugt. Nach diesem Muster könnten weitere Ansagen folgen, z.B. die Ansage der aktuellen Termine und Aufgaben.
2018-08-07 08:54:05 Text2Speech Ansagen playing: 0
Der Eventhandler Ansage_steuern reagiert auch auf dieses Event und setzt einen Befehl an das Gerät rss_tagesschau100 ab.
get rss_tagesschau100 ts100
Der Befehl richtet sich an den Gerätetyp HTTPMOD. Das Gerät extrahiert aus einer Webseite, einem externen Objekt die URL der Datei mit der letzten "Tagesschau in 100 s". Wenn die URL bereit steht, wird ein Event erzeugt.
2018-08-07 08:54:16 HTTPMOD rss_tagesschau100 Link: http://media.tagesschau.de/video/100s/2018/0807/TV-100s-0836.webm.h264.mp4
Der Eventhandler playTagesschau100s reagiert auf dieses Event und lässt mit dem Aufruf eines Shellscriptes (externes Objekt) die Datei über die angeschlossenen Lautsprecher abspielen.
Gerätedefinitionen
Definition des Gerätes Tisch_besetzt
defmod Tisch_besetzt DOIF ## 1\
([?07:30-11:00] and ["^PIR_Tisch$:^(on|off)$"] and [?$SELF:count,0] == [?$SELF:countmax,10]) \
(cancel tisch quiet,\
setreading $SELF count {([$SELF:count] + 1)},\
{Log 1, "******************* Esstisch besetzt *******************"})\
## 2\
DOELSEIF ([?07:30-11:00] and ["^PIR_Tisch$:^(on|off)$"] and [?$SELF:count,0] < [?$SELF:countmax,10])\
(setreading $SELF count {([$SELF:count] + 1)},\
cancel tisch quiet,\
sleep [$SELF:warten,"120"] tisch;;\
setreading $SELF count 1)\
## 3\
DOELSEIF ([11:00]) \
(setreading $SELF count 0,\
setreading Ansage_steuern done 0)
attr Tisch_besetzt cmdIcon cmd_3:refresh
attr Tisch_besetzt do always
attr Tisch_besetzt icon motion_detector
attr Tisch_besetzt notexist "0"
attr Tisch_besetzt readingList countmax warten
attr Tisch_besetzt setList countmax:selectnumbers,2,2,20,0,lin \
warten:selectnumbers,30,15,360,0,lin
attr Tisch_besetzt webCmd countmax:warten:cmd_3
attr Tisch_besetzt webCmdLabel Trigger Threshold:Zähler Timeout:Reset ;
Definition des Gerätes Ansage_steuern
defmod Ansage_steuern DOIF ## 1\
([Tisch_besetzt:"^cmd_1$"] and ![?$SELF:done,0])\
(setreading $SELF done 1,\
set Ansagen tts {(erzeugeWettertext)})\
## 2\
DOELSEIF (![Ansagen:playing] and [?$SELF] eq "cmd_1")\
(get rss_tagesschau100 ts100)
Definition des Gerätes playTagesschau100s
defmod playTagesschau100s notify rss_tagesschau100:Link:.* "/opt/fhem/tagesschau100.sh $EVTPART1 playTagesschau100s"
Definition des Shellscriptes tagesschau100.sh
#!/bin/bash
url=$1;
device=$2;
#echo "tagesschau100.sh: $url for $device";
if [ "$url" ] && [ "$device" ]
then
perl /opt/fhem/fhem.pl 7072 "setreading $device playing 1";
ret="$(sudo /usr/bin/avconv -y -v error -i $url /opt/fhem/tagesschau100s.mp2 2>&1 >/dev/null)"
if [ "$ret" ] && [[ "$ret" =~ "Input/output error" ]]
then
perl /opt/fhem/fhem.pl 7072 "setreading $device returnvalue $ret";
perl /opt/fhem/fhem.pl 7072 "set Ansagen tts Ich bin untröstlich, ich habe keine Tagesschau gefunden";
else
perl /opt/fhem/fhem.pl 7072 "setreading $device returnvalue ok but $ret";
sudo /usr/bin/mplayer -ao alsa:device=hw=0,0 -nolirc -quiet −really−quiet -noconsolecontrols -softvol -softvol-max 110 -volume 100 /opt/fhem/tagesschau100s.mp2 >/dev/null
fi
perl /opt/fhem/fhem.pl 7072 "setreading $device playing 0";
else
echo "tagesschau100.sh: no parameter";
fi