Automatisierung

Aus FHEMWiki
Zur Navigation springen Zur Suche springen

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 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 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&nbsp;;

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

Links