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 🙂

Ähnliche Beiträge
- Proxmox: USB Passthrough für LXC Container (Z-Wave UZB1)
- Proxmox: LXC Linux Container erstellen
- Xiaomi Aqara (ZigBee) ohne Mi Smart Gateway verwenden
- deCONZ: Hue-Bridge auf dem Raspberry Pi emulieren
- Kostenloses FHEM Backup in die Cloud (z.B. Dropbox)
- FreeNAS / TrueNAS für PLEX im HP Microserver Gen8 + Steuerung durch FHEM
- HomeMatic CCU2 mit YAHM auf Raspberry Pi 3
- QNAP NAS mit SNMP in FHEM einbinden
- LG Soundbar Airplay-fähig machen mit AirConnect
- Upgrade Raspbian Stretch Lite zur Desktop Version
[…] Alexa Wecker direkt in FHEM übernehmen […]
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“) }
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
Hallo Tim,
versuche mal mit RegExp zu arbeiten, poste gerne deine Lösung hier wenn du eine gefunden hast. Ansonsten kannst du natürlich neue DOIFs und Notifys für jeden Wecker anlegen (sagen wir z.B. für die ersten 3)
lg, Emanuel
Hallo,
wurde dazu eine Lösung gefunden?
Hallo,
könntest du vielleicht erklären, wie/welche DOIF’s man anlegen muss?
Gruß
Hey Bene,
sorry habe erst jetzt das Problem verstanden da ich erst heute das Modul geupdated habe.
So sollte es gehen:
set emanuel_echo_spot notifications_delete Alarm_[emanuel_echo_spot: alarm_01_originalTime]@[emanuel_echo_spot:alarm_01_id]
das ganze baust du, wie schon von „stoxx“ erwähnt, in deine AlarmRoutineOff mit ein
Hoffe es ist so verständlich, werde es im Blogbeitrag anpassen.
lg
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
Super, bin heute erst wieder dazu gekommen, das umzusetzen.
Hört sich vielversprechend an, vielen Dank 🙂
Hallo,
könntest du erklären was man ändern muss um die anderen Wecker zu berücksichtigen?
Danke
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?
Hallo Roland,
du kannst mehrere Userreadings pro Gerät setzen.
lg
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ß 😉
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
Hallo Daniel,
leider konnte ich das Problem noch nicht nutzen, ich denke aber es hat jemand einen Kommentar hinterlassen wie man immer auf den letzten Wecker triggern kann, vielleicht ist das eine Lösung für dich?
lg
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;
}
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;
}
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 🙂