Heute möchte ich ein wenig tiefer in FHEM eintauchen und zeigen, wie man einen AutoOff für seine Geräte erstellen kann. Dies erfordert leicht Grundkenntnisse in FHEM und der Programmierung in PERL (Code kopieren geht auch *g*).

Ziel: Ein Gerät soll nach dem Einschalten nach einer definierten Zeit automatisch wieder ausgehen.

Update (05.08.2015): Die Variante mit +$durationHMS funktioniert nur bedingt gut. Jedes Mal, wenn man das System neu startet und ein Timer noch aktiv ist, wird der AutoOff neu gesetzt. Somit kommt man nicht drum herum anstatt mit relativen mit absoluten Zeitangaben zu arbeiten.

define OG_Bad_IT_TV IT FFF0000F0F FF F0
attr OG_Bad_IT_TV userattr Geschoss Geschoss_map Haus Haus_map structexclude
attr OG_Bad_IT_TV Geschoss OG
attr OG_Bad_IT_TV Haus Zuhause
attr OG_Bad_IT_TV IODev SCC
attr OG_Bad_IT_TV alias TV
attr OG_Bad_IT_TV devStateIcon on:light_light_dim_100@orange off:light_light@505050
attr OG_Bad_IT_TV group Geräte
attr OG_Bad_IT_TV model CUL
attr OG_Bad_IT_TV room Badezimmer
attr OG_Bad_IT_TV webCmd :

define OG_Bad_IT_TV_notify notify OG_Bad_IT_TV.*(on|off) { dkAutoOff($NAME, "$EVENT", "0.5") }
attr OG_Bad_IT_TV_notify group Notifiers
attr OG_Bad_IT_TV_notify room System

In dem obigen Code-Beispiel wird ein Gerät (OG_Bad_IT_TV) definiert. In diesem Fall ist es ein TV, der sich im Obergeschoss im Badezimmer befindet.

Zusätzlich wird ein Notifier definiert, der auf ON oder OFF des Geräts OG_Bad_IT_TV reagiert und die Funktion dkAutoOff() aufruft. An diese Funktion wird der NAME des Geräts – also OG_Bad_IT_TV – übergeben sowie das EVENT und die definierte Zeit in Stunden (0.5 = 30 Minuten).

sub dkAutoOff($$$) {
  my ($device, $event, $duration) = @_;

  my ($deviceAutoOff) = $device . "_AutoOff";
  if (dkExists($deviceAutoOff)) { fhem ("delete $deviceAutoOff"); }

  if ($event eq "on") {
    # alter Teil
    #my $durationHMS = strftime("\%H:\%M:\%S", gmtime($duration * 60 * 60));
    #fhem ("define $deviceAutoOff at +$durationHMS { fhem('set $device off') }");

    # neuer Teil
    my $myTime = strftime("\%H:\%M:\%S", localtime(time +($duration * 60 * 60)) );
    fhem("define $deviceAutoOff at +$myTime { fhem('set $device off') }");
  }
} 

Die Funktion dkAutoOff() wird in einer eigenen „Bibliothek“ ausgelagert, z. B. 99_myUtils.pm (eine Anleitung findet ihr im FHEM Wiki).

Wir das entsprechende Gerät angeschaltet, wird die Funktion über den Notifier aufgerufen. An die Funktion werde drei Parameter übergeben (device, event und duration). Anschließend wird der Name für das AutoOff-device erstellt, nämlich der Gerätename + „_AutoOff“. Wenn dieses Gerät bereits existiert, wird es gelöscht. Wenn das Event „on“ ist, wird die Zeit in Minuten bestimmt und ein neues Device erstellt.

Wird das Gerät ausgeschaltet, wird die Funktion über den Notifier erneut aufgerufen und das AutoOFF-Device wird wieder gelöscht.

Damit der obige Code funktioniert, benötigt ihr noch folgende Funktion:

sub dkExists($) {
  my ($object) = @_;
  if (Value($object) ne "") { return 1; } else { return 0; }
}

Die Funktion dkExists() überprüft ob ein Device existiert (1 = TRUE) oder nicht (0 = FALSE) und gibt den jeweiligen Wert zurück.

Viel Spaß mit der AutoOff-Funktion.