Automatisierung: Unterschied zwischen den Versionen
Trelle (Diskussion | Beiträge) K (→Gerätedefinitionen: ergänzt) |
K (Links auf nicht existierende Seite(n) entfernt) |
||
(8 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
== Begriff == | == Begriff == | ||
Mit Bezug auf [[FHEM]], ist Automatisierung die Verknüpfung von [[Gerät|Geräten]], mit der sie befähigt werden ohne menschlichen Eingriff Handlungen auszuführen.<ref>https://de.wikipedia.org/wiki/Automatisierung</ref> | Mit Bezug auf [[FHEM]], ist Automatisierung die Verknüpfung von [[Gerät|Geräten]], mit der sie befähigt werden ohne menschlichen Eingriff Handlungen auszuführen.<ref>https://de.wikipedia.org/wiki/Automatisierung</ref> | ||
Zeile 7: | Zeile 6: | ||
=== Ereignissteuerung === | === Ereignissteuerung === | ||
externes Objekt -> [[Gerät]] -> Zustandsaktualisierung -> [[Event]] -> [[Eventhandler]] -> Verarbeitung -> | externes Objekt -> [[Gerät]] -> Zustandsaktualisierung -> [[Event]] -> [[Eventhandler]] -> Verarbeitung -> Befehl -> [[Gerät]] -> externes Objekt | ||
=== Zeitsteuerung === | === Zeitsteuerung === | ||
[[Timehandler]] -> Verarbeitung -> | [[Timehandler]] -> Verarbeitung -> Befehl -> [[Gerät]] -> externes Objekt | ||
== Definition der verwendeten Begriffe == | |||
=== 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. | Ein externes Objekt existiert außerhalb des FHEM-Servers, z.B. Türkontakte, I2C-Sensoren, Heizungsventile, eine Spracherzeugung, eine Webseite, usw. | ||
Zeile 18: | Zeile 18: | ||
=== Zustandsaktualisierung === | === 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 [[Event|Events]] auslösen. Befehle können eine Interaktion des [[Gerät|Gerätes]] mit dem externen Objekt auslösen, wie | 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 [[Event|Events]] auslösen. Befehle können eine Interaktion des [[Gerät|Gerätes]] mit dem externen Objekt auslösen, wie ein Relais schalten oder Daten abholen und dadurch eine Zustandsaktualisierung bewirken. | ||
=== [[Event]] === | === [[Event]] === | ||
Zeile 32: | Zeile 32: | ||
Die Verarbeitung stellt die Automatisierungslogik dar. Sie kann die Verknüpfung verschiedener [[Gerät|Geräte]] über [[Gerätevariable|Gerätevariablen]] beinhalten, so wie deren Verknüpfung mit Zeitangaben. Im Ergebnis werden Befehle abgesetzt oder [[Event|Events]] erzeugt. | Die Verarbeitung stellt die Automatisierungslogik dar. Sie kann die Verknüpfung verschiedener [[Gerät|Geräte]] über [[Gerätevariable|Gerätevariablen]] beinhalten, so wie deren Verknüpfung mit Zeitangaben. Im Ergebnis werden Befehle abgesetzt oder [[Event|Events]] erzeugt. | ||
=== | === Befehl === | ||
Befehle können unmittelbar auf [[Gerät|Geräte]] wirken und dann mittelbar auf externe Objekte. Es sind drei {{Link2CmdRef|Anker=command|Lang=de|Label=Befehlstypen}} zu unterscheiden, FHEM-Befehle, Befehle auf Betriebssystemebene und Perl-Ausdrücke. | |||
== Beispiel einer Automatisierungsaufgabe == | == Beispiel einer Automatisierungsaufgabe == | ||
Zeile 40: | Zeile 40: | ||
=== Wirkungskette === | === Wirkungskette === | ||
Das externe Objekt, der Bewegungsmelder unter dem Esstisch, liefert bei Bewegung über das [[Gerät]] ''PIR_Tisch'' regelmäßig [[Event|Events]], z.B. | Das externe Objekt, der Bewegungsmelder (IT PIR-1000) unter dem Esstisch, liefert bei Bewegung über das [[Gerät]] ''PIR_Tisch'' regelmäßig [[Event|Events]], z.B. | ||
2018-08-07 08:46:33 IT '''PIR_Tisch on''' | 2018-08-07 08:46:33 IT '''PIR_Tisch on''' | ||
2018-08-07 08:46:37 IT '''PIR_Tisch off''' | 2018-08-07 08:46:37 IT '''PIR_Tisch off''' | ||
Der [[Eventhandler]] ''Tisch_besetzt'' reagiert auf diese [[Event|Events]], ermittelt zur Frühstückszeit die Eventrate und erzeugt einmalig ein [[Event]] , wenn der Esstisch besetzt ist. | Der [[Eventhandler]] ''Tisch_besetzt'' reagiert auf diese [[Event|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''' | 2018-08-07 08:52:17 DOIF '''Tisch_besetzt cmd_1''' | ||
Der Eventhandler ''Ansage_steuern'' reagiert auf dieses [[Event]] und setzt einen | Der Eventhandler ''Ansage_steuern'' reagiert auf dieses [[Event]] und setzt einen Befehl an das [[Gerät]] ''Ansagen'' ab. | ||
set Ansagen tts {(erzeugeWettertext)} | set Ansagen tts {(erzeugeWettertext)} | ||
Der | 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''' | 2018-08-07 08:54:05 Text2Speech '''Ansagen playing: 0''' | ||
Der Eventhandler ''Ansage_steuern'' reagiert auch auf dieses [[Event]] und setzt einen | Der Eventhandler ''Ansage_steuern'' reagiert auch auf dieses [[Event]] und setzt einen Befehl an das [[Gerät]] ''rss_tagesschau100'' ab. | ||
get rss_tagesschau100 ts100 | get rss_tagesschau100 ts100 | ||
Der | 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 | 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. | 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äte- und Scriptdefinitionen === | ||
<div class="toccolours mw-collapsible mw-collapsed" style="font-weight:bold"> | <div class="toccolours mw-collapsible mw-collapsed" style="font-weight:bold"> | ||
Definition des Gerätes ''Tisch_besetzt'' | Definition des Gerätes ''Tisch_besetzt'' | ||
Zeile 96: | Zeile 96: | ||
DOELSEIF (![Ansagen:playing] and [?$SELF] eq "cmd_1")\ | DOELSEIF (![Ansagen:playing] and [?$SELF] eq "cmd_1")\ | ||
(get rss_tagesschau100 ts100) | (get rss_tagesschau100 ts100) | ||
</syntaxhighlight> | |||
</div> | |||
<div class="toccolours mw-collapsible mw-collapsed" style="font-weight:bold"> | |||
Definition des Gerätes ''Ansagen'' | |||
<syntaxhighlight lang="perl" class="mw-collapsible-content" style="font-weight:normal"> | |||
defmod Ansagen Text2Speech hw=0.0 | |||
attr Ansagen TTS_Language Deutsch | |||
attr Ansagen TTS_MplayerCall sudo /usr/bin/mplayer | |||
attr Ansagen TTS_Ressource Google | |||
attr Ansagen TTS_TimeOut 60 | |||
attr Ansagen TTS_UseMP3Wrap 1 | |||
attr Ansagen TTS_noStatisticsLog 1 | |||
</syntaxhighlight> | |||
</div> | |||
<div class="toccolours mw-collapsible mw-collapsed" style="font-weight:bold"> | |||
Definition des Perl-Scriptes ''erzeugeWettertext'' | |||
<syntaxhighlight lang="perl" class="mw-collapsible-content" style="font-weight:normal"> | |||
######## Zahl 1.5 in 1koma5 umwandeln ############ | |||
sub Wert2Text | |||
{ | |||
my $text = $_[0]; | |||
$text =~ s/\./komma/; | |||
$text =~ s/\:/Uhr/g; | |||
return $text; | |||
} | |||
sub erzeugeWettertext { | |||
return "Heute kurz das Wetter. Die Temperaturen liegen zwischen ".ReadingsNum("aktWetter","fc1_low_c","-1000")." und ".Wert2Text(ReadingsNum("CUL_HM_HTO1","temperature","1000"))." Grad. Aktuell sind draußen ".ReadingsNum("CUL_HM_HTO1","temperature","1000")." Grad bei ".ReadingsNum("CUL_HM_HTO1","humidity","1000")." Prozent Feuchte und ".ReadingsNum("BMP180","pressure","2000")." millibar Luftdruck, Tendenz ".ReadingsVal("aktWetter","pressure_trend_txt","keine").". Der Wind weht mit ".ReadingsNum("woWetter","wind","1000")." km/h und Böen blasen bis ".ReadingsNum("woWetter","boen","1000")." Stundenkilometer. Morgen ".ReadingsVal("aktWetter","fc2_condition","auch kein Wetter")." und Temperaturen zwischen ".ReadingsNum("aktWetter","fc2_low_c","-1000")." und ".ReadingsNum("aktWetter","fc2_high_c","1000")." Grad. Im Wohnzimmer sind ".Wert2Text(int(ReadingsNum("SHT21","temperature","1000")*10+.5)/10)." Grad bei einer Luftfeuchtigkeit von ".ReadingsNum("SHT21","humidity","200")." Prozent. "; | |||
} | |||
</syntaxhighlight> | </syntaxhighlight> | ||
</div> | </div> | ||
Zeile 154: | Zeile 185: | ||
<references /> | <references /> | ||
[[Kategorie: | [[Kategorie:HOWTOS]] | ||
[[Kategorie:FHEM-Verwendung]] | [[Kategorie:FHEM-Verwendung]] | ||
[[Kategorie:Glossary]] | [[Kategorie:Glossary]] |
Aktuelle Version vom 3. Dezember 2021, 13:18 Uhr
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
Definition der verwendeten Begriffe
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 ein Relais schalten 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 oder Events erzeugt.
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 (IT PIR-1000) 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äte- und Scriptdefinitionen
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 Ansagen
defmod Ansagen Text2Speech hw=0.0
attr Ansagen TTS_Language Deutsch
attr Ansagen TTS_MplayerCall sudo /usr/bin/mplayer
attr Ansagen TTS_Ressource Google
attr Ansagen TTS_TimeOut 60
attr Ansagen TTS_UseMP3Wrap 1
attr Ansagen TTS_noStatisticsLog 1
Definition des Perl-Scriptes erzeugeWettertext
######## Zahl 1.5 in 1koma5 umwandeln ############
sub Wert2Text
{
my $text = $_[0];
$text =~ s/\./komma/;
$text =~ s/\:/Uhr/g;
return $text;
}
sub erzeugeWettertext {
return "Heute kurz das Wetter. Die Temperaturen liegen zwischen ".ReadingsNum("aktWetter","fc1_low_c","-1000")." und ".Wert2Text(ReadingsNum("CUL_HM_HTO1","temperature","1000"))." Grad. Aktuell sind draußen ".ReadingsNum("CUL_HM_HTO1","temperature","1000")." Grad bei ".ReadingsNum("CUL_HM_HTO1","humidity","1000")." Prozent Feuchte und ".ReadingsNum("BMP180","pressure","2000")." millibar Luftdruck, Tendenz ".ReadingsVal("aktWetter","pressure_trend_txt","keine").". Der Wind weht mit ".ReadingsNum("woWetter","wind","1000")." km/h und Böen blasen bis ".ReadingsNum("woWetter","boen","1000")." Stundenkilometer. Morgen ".ReadingsVal("aktWetter","fc2_condition","auch kein Wetter")." und Temperaturen zwischen ".ReadingsNum("aktWetter","fc2_low_c","-1000")." und ".ReadingsNum("aktWetter","fc2_high_c","1000")." Grad. Im Wohnzimmer sind ".Wert2Text(int(ReadingsNum("SHT21","temperature","1000")*10+.5)/10)." Grad bei einer Luftfeuchtigkeit von ".ReadingsNum("SHT21","humidity","200")." Prozent. ";
}
Definition des Gerätes rss_tagesschau100
defmod rss_tagesschau100 HTTPMOD none 0
attr rss_tagesschau100 userattr event-on-change-reading get01Name get01URL reading01Name reading01Regex stateFormat userReadings
attr rss_tagesschau100 alias Tagesschau in 100 s
attr rss_tagesschau100 enableControlSet 1
attr rss_tagesschau100 get01Name ts100
attr rss_tagesschau100 get01URL http://www.tagesschau.de/export/video-podcast/webm/tagesschau-in-100-sekunden/
attr rss_tagesschau100 icon rc_WEB
attr rss_tagesschau100 reading01Name Link
attr rss_tagesschau100 reading01Regex <enclosure url="(.*)" length
attr rss_tagesschau100 stateFormat click_link
attr rss_tagesschau100 userReadings click_link:Link.* {"<html><a target='_blank' href='".ReadingsVal('rss_tagesschau100','Link','none')."'>Tagesschau in 100s</a></html>"}
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