FHEM: wir basteln uns einen Sonnenaufgang

Aufgabe:

Ich benutze zum Wecken den „Alarmdroid“ auf meinem alten Shield Tablet. Dort lasse ich mich mit dem mp3-Stream eines Radiosenders wecken. Bei „Alarmdroid“ lasse ich die Lautstärke langsam hochfahren, so dass ich sanft geweckt werde. Zum „Radiowecker“ wäre es jetzt noch schön, wenn man auch das Licht langsam hochfahren würde.

  • der Lichtwecker soll sich selbständig einstellen
  • der Lichtwecker soll sich auch deaktivieren lassen (um den Partner nicht zu wecken)
Hardware:
  • Philips HUE
  • Linux-Büchse mit FHEM drauf
  • Nvidia Shield Tablet
Software:
  • FHEM
  • Tasker
  • AutoAlarm
  • Alarmdroid
FHEM konfigurieren:

bei FHEM habe ich den Sonnenaufgang über eine eigene Routine in der 99_myUtils.pm realisiert. Es gibt zwar schon fertige Module, aber Basteln macht mehr Spaß ;) …

die Routine für die Lampensteuerung in 99_myUtils.pm:

  1. Lampe wird auf blau und 4% Helligkeit gestellt
    fhem("set HUEDevice5 hue 48163: pct 4")
  2. ein Timer von 4min wird gesetzt ⇒
    fhem("define sz_sonnenaufgang1 at +00:04:00 {sonnenaufgang(2)}")
  3. nach 4min: Lampe wird auf rot gestellt
    fhem("set HUEDevice5 hue 0")
  4. ein Timer von 3min wird gestellt
    fhem("define sz_sonnenaufgang2 at +00:03:00 {sonnenaufgang(3)}")
  5. nach 3min: Lampe wird auf orange gestellt
    fhem("set HUEDevice5 hue 4586")
  6. ein Timer von 1min wird gesetllt
    fhem("define sz_sonnenaufgang1 at +00:01:00 {sonnenaufgang(4)}")}
  7. nach 1min: Lampe wird in einem Zeitraum von 30s auf 30% Helligkeit gebracht
    fhem("set HUEDevice5 pct 30 30")
  8. ein Timer von 1min wird gestellt
    fhem("define sz_sonnenaufgang2 at +00:01:00 {sonnenaufgang(5)}")
  9. nach 1min: Lampe wird in einem Zeitraum von 60s auf 70% Helligkeit gebracht
    fhem("set HUEDevice5 hue 5568: pct 70 60")
  10. ein Timer von 30min wird gestellt
    fhem("define sz_sonnenaufgang1 at +00:30:00 {sonnenaufgang(6)}")
  11. nach 30min: Lampe wird ausgeschaltet
    fhem("set HUEDevice5 off")
  12. damit wir die Routine auch deaktivieren können ⇒ eine if-Klausel drumrum gebastelt
    if (ReadingsVal("wecker_wunsch","state","") eq "on"){
      ...
    }
sub sonnenaufgang{
   my $sub=$_[0];
   if (ReadingsVal("wecker_wunsch","state","") eq "on"){
     if ($sub == 2){fhem("set HUEDevice5 hue 0");fhem("define sz_sonnenaufgang2 at +00:03:00 {sonnenaufgang(3)}")}
     elsif ($sub == 3){fhem("set HUEDevice5 hue 4586");fhem("define sz_sonnenaufgang1 at +00:01:00 {sonnenaufgang(4)}")}
     elsif ($sub == 4){fhem("set HUEDevice5 pct 30 30");fhem("define sz_sonnenaufgang2 at +00:01:00 {sonnenaufgang(5)}")}
     elsif ($sub == 5){fhem("set HUEDevice5 hue 5568: pct 70 60");fhem("define sz_sonnenaufgang1 at +00:30:00 {sonnenaufgang(6)}")}
     elsif ($sub == 6){fhem("set HUEDevice5 off")}
     else{fhem("set HUEDevice5 hue 48163: pct 4");fhem("define sz_sonnenaufgang1 at +00:04:00 {sonnenaufgang(2)}")}
   }
}

die Routine zum Weckerstellen in 99_myUtils.pm:

  • wird off gesetzt, wird der Weckertimer gelöscht
  • ist die gemeldete Uhrzeit nicht die, die im Weckertimer steht, wird gelöscht und neu angelegt
sub wecker_stellen{
   my $wecker="Next: ".$_[0].":00";
   my $fhemwecker=ReadingsVal("weckerat","state","");
   if ($_[0] eq "off"){fhem("delete weckerat")}
   elsif ($wecker ne $fhemwecker){
     fhem("delete weckerat");
     fhem("define weckerat at ".$_[0].":00 {sonnenaufgang()}");
     fhem("attr weckerat room Schlafzimmer");
     fhem("attr weckerat group Schlafzimmer-Wecker");
   }
}

Dummy-Schalter wecker_wunsch anlegen:

hier wird nicht nur der Status gesetzt. Falls mal der Sonnenaufgang ausversehen aktiviert wurde, wird dieser beim setzen auf „off“ , sofort gelöscht und die Lampe wird ausgeschaltet.

define wecker_wunsch dummy
attr wecker_wunsch alias Wecken mit Licht
attr wecker_wunsch setList on off
attr wecker_wunsch webCmd on:off

define wecker_wunsch_off notify wecker_wunsch:off {fhem("delete sz_sonnenaufgang1");;fhem("delete sz_sonnenaufgang2");;fhem("set HUEDevice5 off");;wecker_stellen("off");;}
Tasker konfigurieren:

Ich lasse Tasker jede Stunde prüfen, ob ein Wecker aktiv ist. Ich gehe mal davon aus, dass ich nicht innerhalb einer Stunde einen Wecker stelle, bei dem ich einen Sonnenaufgang brauche. Eine weitere Besonderheit: Diese Konstellation berücksichtigt keinen Wecker der zB für Übermorgen gesetzt wurde.

Task erstellen:

1 → AutoAlarm nur hinzufügen (Plugin⇒AutoAlarm)

2 → den aktuelle Wert der Variable %Alarm in die Variable %AlarmAlt schreiben

3 → kann AutoAlarm keinen aktiven Wecker bei Android finden, wird %raw auch nicht befüllt und erscheint mit dem Inhalt „%raw“ . Dementsprechend ist der Füllstand „%raw“ gleich Wecker off. Die IF-Klausel reagiert wenn %raw nicht „%raw“ als Inhalt enthält.

4 bis 7 → der Inhalt von %raw wird zusammengekürzt und in die Variable %Alarm geschrieben

9 → Variable %Alarm wird auf „off“ gesetzt

11 → ist der neu ausgelesene Wert von %Alarm ungleich des Wertes von %AlarmAlt wird die IF-Klausel ausgeführt

sonnenaufgang_tasker1

12 → die Variable %url wird befüllt

Zeichenerklärung nach cmd=
  %7b ⇒ Zeichen {
  %28 ⇒ Zeichen (
  %22 ⇒ Zeichen "
  %29 ⇒ Zeichen )
  %7d ⇒ Zeichen }
ergibt dann {wecker_stellen(%Alarm)}

sonnenaufgang_tasker3

13 → die Alarmzeit wird mit HTTP Get an FHEM übergeben

sonnenaufgang_tasker2

Profil erstellen:

das Profil wird ab 00:04 Uhr jede Stunde ausgeführt

 sonnenaufgang_tasker4

Task erstellen (Lichtwecker aktivieren/deaktivieren):

das ist jetzt ein klassischer „Toggle“. Je nach Variableninhalt von %Lichtwecker wird der FHEM-Dummy wecker_wunsch auf „on“ bzw „off“ gesetzt. Wichtig: der Task braucht ein Icon, sonst kann man diesen nicht als Widget benutzen.

2 und 8 → befüllen der Variable %url

3 und 9 → mit HTTP Get wird FHEM gefüttert

4 und 10 → das Icon auf dem Desktop wird entsprechend geändert

6 und 12 → der Icon-Text auf dem Desktop wird entsprechend geändert

5 und 11 → die Variable %Lichtwecker wird befüllt

sonnenaufgang_tasker8

%20 ist ein Leerzeichen und das FHEM-Kommando lautet dann

set wecker_wunsch on
bzw 
set wecker_wunsch off

sonnenaufgang_tasker9

Tasker-Widget noch auf dem Desktop platzieren:

sonnenaufgang_tasker5

sonnenaufgang_tasker6

Synchronisierung einrichten

es kann ja auch mal vorkommen, dass man direkt über FHEM den Dummyschalter wecker_wunsch verändert. Da ist es blöd, wenn man auf dem Android einen Sonnenaufgang erwartet und dieser aber im FHEM deaktiviert ist. Also muss das Tablet periodisch abfragen, wie der Status ist. Ich lasse das Tasker jede Stunde abfragen.

!!!Text kommt noch!!!