Alexa Wecker direkt in FHEM übernehmen

Lichtwecker 2.0 - Alexa Wecker in FHEM übernehmen

Vielleicht habt ihr bereits den Artikels mit meinem ersten Versuch zur Integration des Alexa Weckers in FHEM gelesen. Damals habe ich die übernahme der Weckzeit über den Dienst IFTTT ausprobiert. Das funktioniert meisten auch ganz gut, das  Problem ist aber dass erst dann ein Event generiert wird, wenn der Wecker losgeht. Außerdem muss FHEM für den Dienst IFTTT nach außen geöffnet werden. Ich habe diese Lösung verlassen da es jetzt endlich ein Modul zu direkten Steuerung der Amazon Echo Geräte durch FHEM gibt. Das Modul könnt ihr hier finden: Forum-Link. Die Installation ist ganz einfach und im Forum beschrieben. Das Modul soll bald regulär per Update verteilt werden sodass du das Modul demnächst vielleicht sogar schon hast. In folgendem Artikel erfährst du wie ich damit das Wecker-Modul (alarmclock) steuere.

Definition des alarmclock Wecker Devices in FHEM

In FHEM gibt es grundsätzlich mehrere Möglichkeiten eine Wecker-Device zu erzeugen. Es geht über das Residents Modul, aber es gibt auch ein eigenes Wecker-Modul das ich dir hier näher beschreibe. Manche gehen auch einen ganz eigenen Weg und machen alles mit DOIFs und notifys. Ich habe alles ausprobiert und bin letztendlich beim alarmclock Modul geblieben da es für mich alle Wünsche erfüllt.

Mit

define emanuel_wecker alarmclock

legen wir das Weckergeräte an.Mit dem Attribut PreAlarmRoutine gebt ihr die Befehle an, die x Sekunden vor dem eigentlichen Alarm ausgeführt werden sollen. Das eignet sich wunderbar für einen Lichtwecker oder für Radiomusik die in der Lautstarke langsam ansteigt bis zum eigentlichen Weckton. Mit dem Attribut PreAlarmTimeInSec legt ihr den Wert X in Sekunden fest, wann vor dem eigentlichen Alarm mit dieser PreAlarm-Routine begonnnen werden soll. Bei mir 900 Sekunden, also 15 min vorher. Bei der PreAlarmRoutine gibst du die transitiontime des Lichtweckers der Hue-Geräte in Zehntel Sekunden an, also hier 9000. Dabei dimmt mein Hue-Licht langsam von schwachem rot bis zu kräftigen weiss hoch.

attr emanuel_wecker PreAlarmRoutine {fhem("set HUEGroup1 bri 1 : transitiontime 0;;sleep 1;; set HUEGroup1 hue 0 : sat 254 : transitiontime 0;;sleep 1;; set HUEGroup1 hue 14505 : sat 25 : bri 254 : transitiontime 9000")}
attr emanuel_wecker PreAlarmTimeInSec 900
attr emanuel_wecker alias Wecker
attr emanuel_wecker icon time_timer@black

Natürlich möchten ich dass das Licht ausgeschalten wird wenn ich aufgestanden bin. Mit dem Attribut AlarmRoutineOff stellt man genau das ein

attr emanuel_wecker AlarmRoutineOff defmod wecker_off at +00:10:00 set emanuel_og_hue.* off

Hier wird ein at erzeugt, mit dem nach 10 Minuten die Lichter ausgeschalten werden. Die 10 Minuten beginnen erst wenn ich "Alexa Wecker Aus" gesagt habe. Mehr dazu später.

Selbstverständlich soll unser Wecker auf Snooze können, oder wie man zu Alexa sagen muss: "Alexa, schlummern". Dafür musst du dem Wecker-Modul noch sagen was im Falle von "Schlummern" geschehen soll.

attr emanuel_wecker SnoozeRoutine {fhem("set emanuel_og_hue_bett off;;sleep 1;; set emanuel_og_hue_bett bri 1 : transitiontime 0;;sleep 1;; set emanuel_og_hue_bett hue 0 : sat 254 : transitiontime 0;;sleep 1;; set emanuel_og_hue_bett hue 14505 : sat 25 : bri 254 : transitiontime 5400")}
attr emanuel_wecker SnoozeTimeInSec 540

Das Licht geht aus und fängt dann von neuem an langsam hochzudimmen. Hier ist aber eine andere Zeit gewählt da die Snooze Zeit bei Alexa 9 Minuten beträgt.

Amazon Echo Gerät in FHEM

Wenn du das oben verlinkte modul 37_echodevice bereits installiert und eingerichtet hast müsstest du in FHEM bereits automatisch deine Alexa Geräte angezeigt bekommen. Stellst du mit deinem Amazon Gerät einen Wecker erscheint dir ein entsprechendes Reading für die Zeit (alarm_01_originalTime ) und den Status des Weckers (alarm_01_status). Da das Reading alarm_01_status nur angezeigt wird wenn der Wecker aktiv ist und schlummert, aber sofort veschwindet sobald der Wecker aus ist kann man nicht direkt darauf triggern. Die Lösung: ein userReading für den Status und für die Weckzeit, da die Weckzeit mit 09:00:00.000 ein paar Nullen zu viel für unser Wecker-Device hat.

attr emanuel_echo_spot userReadings Weckzeit {(split(':00.000', ReadingsVal($name,"alarm_01_originalTime",""), 2))[0]}, Wecker_aktiv { ReadingsVal($name,"alarm_01_status", "off") }

Falls der Befehl nicht direkt funktioniert so kannst du das userReading auch manuell hinzufügen (siehe auf folgendem Bild)

attr emanuel_echo_spot event-on-change-reading .*

erzeugt zwei neue Readings, nämlich Wecker_aktiv und Weckzeit. Zunächst sagen wir jetzt unserem Wecker-Device jetzt dass das Reading Wecker_aktiv den Status für Alarm-Aus und Snooze enthält

attr emanuel_wecker EventForAlarmOff emanuel_echo_spot:Wecker_aktiv: off
attr emanuel_wecker EventForSnooze emanuel_echo_spot:Wecker_aktiv: snoozed

Jetzt erstellen wir uns ein DOIF um den Wecker-Status vom Echo Gerät in das Wecker Device zu übernehmen. Ist der Alexa-Wecker aus wird der FHEM-Wecker deaktiviert.

define wecker_doif DOIF ([emanuel_echo_spot:Wecker_aktiv] eq "on" or [emanuel_echo_spot:Wecker_aktiv] eq "snoozed") (set emanuel_wecker disable 0) 
DOELSE (set emanuel_wecker disable 1)
attr wecker_doif do always

Ein notify hilft uns noch die Weckzeit vom Alexa-Wecker an den FHEM-Wecker zu übertragen.

define wecker_notify notify emanuel_echo_spot:Weckzeit:.* set emanuel_wecker AlarmTime_Weekdays $EVTPART1 ; set emanuel_wecker AlarmTime_Weekend $EVTPART1

Hierbei wird für jeden Wochentag (Montag - Sonntag) der Wecker auf die in Alexa hinterlegte Zeit gestellt. Das ist derzeit die einzige Möglichkeit die mir eingefallen ist, da das Alexa-Modul noch nicht den Wochentag ausspuckt an dem der Wecker triggert. Sollte sich das ändern werde ich natürlich nachreichen 🙂 Ich handhabe es bei mir ohnehin so dass ich mir jeden Tag vor dem Schlafengehen einen neuen Wecker für den nächsten Tag stelle.

Update: Wecker automatisch löschen

Mit einer neueren Version des Moduls werden alte Wecker bei Amazon nur noch deaktiviert, aber nicht mehr gelöscht. Das führt dazu, dass uns in FHEM mehrere Weckzeiten hinterlegt werden (alarm_01, alarm_02, alarm_03 etc...). Danke an Stoxx für den Tipp.

Es kann also passieren dass alarm_01 ein alter, deaktivierter Wecker ist, und dass unsere neue Weckzeit als alarm_02 abgelegt wird -> Unser FHEM Wecker funktioniert nicht mehr.

Abhilfe schafft folgender Code. Damit wird jeder Wecker bei Amazon vollständig gelöscht, sobald dieser abgelaufen ist. Am besten du schreibst die folgende Zeile mit in deine AlarmRoutineOff

set emanuel_echo_spot notifications_delete Alarm_[emanuel_echo_spot: alarm_01_originalTime]@[emanuel_echo_spot:alarm_01_id]

Fazit

Mit dieser Wecker-Lösung bin ich absolut zufrieden. Jeden Tag vor dem Schlafengehen per Sprache einen Wecker zu stellen und dann am nächsten Morgen sanft mit Licht geweckt zu werden bevor der eigentliche Weckton losgeht ist schon eine sehr feine Sache. Und seitdem Alexa nun auch endlich als Radiowecker benutzt werden kann ist das für mich die ideale Lösung. Früher habe ich den Wecker im Handy benutzt - aber da es meiner Meinung nach unmöglich ist den iOS Wecker mit FHEM zu synchronisieren bin ich jetzt komplett auf Alexa umgestiegen. Wie ich gelesen habe funktioniert der Wecker auch ohne Internetverbindung und man ist auf der sicheren Seite. Sollte es in Zukunft endlich ordentliche smarte Kaffeemaschinen geben, so werde ich vielleicht bald schon von frischem Kaffeeduft geweckt wenn ich aufstehe 🙂 

Über den Author

Emanuel

teilt seine Begeisterung im Bereich Technik, DIY und Hausautomatisierung gerne auf seinem Blog coldcorner.de

Abonnieren
Benachrichtige mich bei
18 Kommentare
Ältester
Neuster Am meisten bewertet
Inline Feedbacks
View all comments
6 Jahre zuvor

[…] Alexa Wecker direkt in FHEM übernehmen […]

Simon
5 Jahre zuvor

Danke für die gute Lösung. Wer den Lichtwecker mit dem „Radio“ bzw Musikwecker verbinden möchte, der muss einfach nur folgendes Readin ändern:

attr emanuel_echo_spot userReadings Weckzeit {(split(‚:00.000‘, ReadingsVal($name,“alarm_01_originalTime“,““), 2))[0]}, Wecker_aktiv { ReadingsVal($name,“alarm_01_status“, „off“) }

in:

attr emanuel_echo_spot userReadings Weckzeit {(split(‚:00.000‘, ReadingsVal($name,“musicalarm_01_originalTime“,““), 2))[0]}, Wecker_aktiv { ReadingsVal($name,“musicalarm_01_status“, „off“) }

Tim
5 Jahre zuvor

Hallo, vielen Dank für die Anleitung. Leider habe ich das Problem, dass der Wecker über Alexa hin und wieder nicht als alarm_01 gespeichert wird sondern je nach Anzahl alter Wecker als 02 oder so weiter in den Readings erscheint. alarm_01 bleibt somit off und beispielsweise alarm_03 geht auf on, wird aber natürlich nicht getriggert. Gib es dafür bereits eine Lösung oder ist das nur bei mir der Fall?

Beste Grüße

Benedikt
Reply to  Emanuel
5 Jahre zuvor

Hallo,
wurde dazu eine Lösung gefunden?

Bene
Reply to  Emanuel
5 Jahre zuvor

Hallo,
könntest du vielleicht erklären, wie/welche DOIF’s man anlegen muss?

Gruß

stoxx
Reply to  Tim
5 Jahre zuvor

Hi Tim, das Problem hatte ich auch. Ich habe es folgendermaßen gelöst: Man kann die im Gerät abgespeicherten Weckzeiten über „set …. notifications_delete …“ löschen. Leider geht das nur einzeln, das kann dann je nach Anzahl der Weckzeiten etwas aufwändig sein. Sind alle notifications gelöscht, wird beim nächsten Definieren einer Weckzeit wieder der Alarm1 verwendet. Damit das immer so ist, habe ich beim der definierten Alarmclock in der AlarmRoutineOff den Befehl zur Löschung des Alarms1 (über notifications_delete) gesetzt. Damit wird nach dem Wecken immer die notification gelöscht und jedesmal auf den Alarm1 zugegriffen.
@Emanuel: Danke für die Anleitung!
vg stoxx

Tim
Reply to  stoxx
5 Jahre zuvor

Super, bin heute erst wieder dazu gekommen, das umzusetzen.

Hört sich vielversprechend an, vielen Dank 🙂

Benedikt
5 Jahre zuvor

Hallo,
könntest du erklären was man ändern muss um die anderen Wecker zu berücksichtigen?

Danke

roland
5 Jahre zuvor

Das ist ja schön gemacht, aber ich brauche mein echodevice ja noch für andere Zwecke, damit kann ich das UserReading nicht so über nehmen. Irgendwelche Idee, wie man das anders machen kann?

David
5 Jahre zuvor

Habe das ganze, zwar auch mit dem alarmclock device gelöst, aber etwas anders gelöst: Der Vorteil liegt darin, dass beliebig viele Alarme gestellt werden können. Für den Fhem alarm wird immer der späteste Alarm vor einer definierten Uhrzeit (bei mir 10 Uhr) genommen. Somit kann bei unterschiedlichen Aufstehzeiten der Partner/ die Partnerin noch weiter schlafen, da nur das kurze Gedudel von Alexa aber kein Licht und keine Musik kommt. Falls jemand das nutzen möchte steht unten die Erklärung was zu tun ist.:
Ihr braucht zwei notifys:
define ntfy_EchoWeckerAlarm notify Dein_Echo_Device:.*alarm_.*_status:.on {SetAlarmTime($NAME,$EVENT)}
define ntfy_EchoWeckerOff notify Dein_Echo_Device:.*alarm_.*_status:.off { SetAlarmOff($NAME,$EVENT) }

und dann noch zwei Funktionen in der 99_myUtils.pm, dazu einfach das folgende hineinkopieren:

sub SetAlarmTime($$) {
my ($Devicename,$Event) = @_;
my $AlarmName = substr($Event, 0, index($Event, ’status‘));
my $AlarmTimeReading= $AlarmName . ‚originalTime‘;
my $NewAlarmTimeFull = ReadingsVal($Devicename, $AlarmTimeReading, ’00:00′);
my $NewAlarmTime = substr($NewAlarmTimeFull,-12,5);
my $OldAlarmTimeTomorrow = ReadingsVal(„Wakeupalarm“, „AlarmTomorrow“, ’00:00′);
Log 3, („neue Alarmzeits: $NewAlarmTime“);
Log 3, („alte Alarmzeits: $OldAlarmTimeTomorrow“);
if ($NewAlarmTime le ’10:00′ && ($NewAlarmTime ge $OldAlarmTimeTomorrow || $OldAlarmTimeTomorrow eq „off“ )) {
Log 3, („Setze neue Alarmzeit: $NewAlarmTime“);
fhem(„set Wakeupalarm AlarmTime_Weekdays „.$NewAlarmTime);
fhem(„set Wakeupalarm AlarmTime_Weekend „.$NewAlarmTime);
}
}

sub SetAlarmOff($$) {
my ($Devicename,$Event) = @_;
my $AlarmName = substr($Event, 0, index($Event, ’status‘));
my $AlarmTimeReading= $AlarmName . ‚originalTime‘;
my $AlarmIDReading = $AlarmName . ‚id‘;
my $NewAlarmTimeFull = ReadingsVal($Devicename, $AlarmTimeReading, ’00:00′);
my $AlarmTimeDeleted = substr($NewAlarmTimeFull,-12,5);
my $AlarmTimeTomorrow = ReadingsVal(„Wakeupalarm“, „AlarmTomorrow“, ’00:00′);
if ($AlarmTimeDeleted eq $AlarmTimeTomorrow) {
Log 3, („Loesche Alarm: $AlarmTimeDeleted“);
fhem(„set Wakeupalarm AlarmOff All“);
}
fhem(„set $Devicename notifications_delete Alarm_[$Devicename: $AlarmTimeReading]@[$Devicename:$AlarmIDReading]“);
}

zusätzlich muss beim event-on-change-reading vom echodevice noch „.*_status“ hinzugefügt werden.

Viel Spaß 😉

Daniel
5 Jahre zuvor

Hallo Emanuel,
wirklich eine gute und verständliche Anleitung.
Jedoch habe ich derzeit ein kleines Problem!
Ich benutze nich nur eine Weckzeit sondern mehrer. Dabei macht das echodevice jedoch für jede weckzeit einen neuen Eintrag.
Zum Beispiel der erste heißt „alarm_01_originalTime“ und „alarm_01_status“ der zweite heißt dann aber „alarm_02_originalTime“ und „alarm_02_status“.
Nun kann ich das UserReading zum auslesen der Weckzeit nicht mehrfacht verwenden.
Kannst du mir dabei vielleicht weiterhelfen? Vielleicht hast du das Problem auch schon bemerkt und bereits ein Löschung dafür?
Vielen Dank und Grüße
Daniel

Torsten
4 Jahre zuvor

Klasse Idee. Ich hole mir jetzt so die nächste WakeUp-Zeit 🙂 Parameter ist der Devicename vom AlexaDevice

sub getNextAlarm($){
my ($dev) = @_;
my $cnt = ReadingsNum($dev,“alarm_count“,““);
my $name = „“;
my $time = „“;
my $nextWakeUp = „“;
for (my $j=1; $j $_) {$nextWakeUp = $_;}
}
}
return $nextWakeUp;
}

Torsten
Reply to  Torsten
4 Jahre zuvor

Sorry, da kam nur die Hälfte mit 🙁

sub getNextAlarm($){
my ($dev) = @_;
my $cnt = ReadingsNum($dev,“alarm_count“,““);
my $name = „“;
my $time = „“;
my $nextWakeUp = „“;
for (my $j=1; $j $_) {$nextWakeUp = $_;}
}
}
return $nextWakeUp;
}

Torsten
4 Jahre zuvor

Hi, würde mein Coding gerne hier posten. Leider wird immer die Hälfte beim Abspeichern gelöscht. Ich werde daher mein Coding im FHEM-Forum posten 🙂