Hallo liebe Community,
nachdem ich jahrelang von Eurem Know-How gezehrt habe, möchte ich mal etwas zurückgeben und meinen Ansatz für einen einfach zu implementierenden Wecker mit Euch teilen. Inspiriert hat mich dazu folgender Beitrag:
https://wiki.fhem.de/wiki/DOIF/Ein-_und_Ausgabe_in_FHEMWEB_und_Tablet-UI_am_Beispiel_einer_Schaltuhr
Voraussetzungen:
Etwas um den Weckton auszugeben: Ich habe das Sonos-System in Einsatz. Im Schlafzimmer steht ein Device vom TYPE SONOSPLAYER mit dem Namen Sonos_Schlafzimmer, das ich für die Ausgabe verwende.
Optional Wake-Up-Light: Ich verwende für mein Beispiel zwei Devices vom TYPE HUEDevice, weiß, dimmbar, mit den Namen L_NT_L und L_NT_R, die (Ihr werdet es erraten haben) in den Nachttischlampen links und rechts stecken.
Mein Schlafzimmer-Rollladen hört auf den Namen R_SZ und ist von TYPE CUL_HM.
Los geht's!
Wir brauchen zuerst einmal eine DOIF-Device, dem ich in meinem Beispiel den Namen doif_Wecker gebe. Sehr einfallsreich, ich weiß.
Für's erste reicht ein einfaches
define doif_Wecker DOIF (true) ()
Zuerst müssen wir ein paar Attribute setzen, um später die passenden Readings zu haben, nämlich
setList _power:on,off _time:time _mode:Stumm,Piepen,Kuckuck,Hahnenschrei,Wetter,Radio
readingList _power _time _mode
stateFormat _power
webCmd _time:_mode
Im Reading _time soll die Weckzeit gespeichert werden. _power gibt an, ob der Wecker überhaupt aktiv sein soll, und _mode gibt die Art und Weise des Weckrufes an. Ich habe hier mal ein paar verschiedene Möglichkeiten aufgenommen.
Damit wir beim Klicken auf das StateIcon zwischen aktiv und inaktiv schalten können, brauchen wir noch folgende Attribute:
devStateIcon on:rc_AN@GREEN:_power-off off:rc_AUS@RED:_power-on
eventMap /_power off:_power-off/ /_power on:_power-on/
Letzteres ist notwendig, um das Leerzeichen beim Befehl set $SELF _power off bzw. on zu maskieren. Siehe hierzu folgenden Beitrag: https://wiki.fhem.de/wiki/DevStateIcon
Jetzt passen wir noch die DEF an, die über die Web-Oberfläche aufrufbar ist. Die Zeilen stammen so aus der Web-Oberfläche. Wer die fhem.cfg direkt editiert, muss die Zeilenumbrüche mit \ maskieren.
([$SELF:_power] eq "on" && [([$SELF:_time]-900)]) (
IF ([WE_twilight:light] < 4 || [WE_twilight:light] > 9) (set L_NT_.* pct 75 : ct 450 : transitiontime 9000)
)
DOELSEIF ([$SELF:_power] eq "on" && [([$SELF:_time]+0)]) (
IF ([$SELF:_mode] eq "Piepen") (set Sonos_Schlafzimmer PlayURITemp \\\192.168.0.XXX\SonosSpeak\Piepen.mp3 30),
IF ([$SELF:_mode] eq "Kuckuck") (set Sonos_Schlafzimmer PlayURITemp \\\192.168.0.XXX\SonosSpeak\Kuckuck.mp3 35),
IF ([$SELF:_mode] eq "Hahnenschrei") (set Sonos_Schlafzimmer PlayURITemp \\\192.168.0.XXX\SonosSpeak\Hahn.mp3 30),
IF ([$SELF:_mode] eq "Wetter") ({ good_morning }),
IF ([$SELF:_mode] eq "Radio") (set Sonos_Schlafzimmer StartRadio Deutschlandfunk)
)
DOELSEIF ([$SELF:_power] eq "on" && [([$SELF:_time]+30)]) (
IF ([$SELF:_mode] eq "Piepen") (set Sonos_Schlafzimmer PlayURITemp \\\192.168.0.XXX\SonosSpeak\Piepen.mp3 35),
IF ([$SELF:_mode] eq "Hahnenschrei") (set Sonos_Schlafzimmer PlayURITemp \\\192.168.0.XXX\SonosSpeak\Hahn.mp3 35)
)
DOELSEIF ([$SELF:_power] eq "on" && [([$SELF:_time]+60)]) (
IF ([$SELF:_mode] eq "Piepen") (set Sonos_Schlafzimmer PlayURITemp \\\192.168.0.XXX\SonosSpeak\Piepen.mp3 40),
IF ([$SELF:_mode] eq "Hahnenschrei") (set Sonos_Schlafzimmer PlayURITemp \\\192.168.0.XXX\SonosSpeak\Hahn.mp3 40),
IF ([$SELF:_mode] eq "Kuckuck") (set Sonos_Schlafzimmer PlayURITemp \\\192.168.0.XXX\SonosSpeak\Kuckuck.mp3 35)
)
DOELSEIF ([$SELF:_power] eq "on" && [([$SELF:_time]+300)]) (
set R_SZ on,
set $SELF _power off
)
Im Klartext:
900 Sekunden (im Volksmund eine Viertelstunde) vor der eigentlichen Weckzeit werden die Nachttischlampen hochgedimmt bis auf 75 Prozent. ct 450 gibt die Farbtemperatur an. transitiontime 9000 lässt das Hochdimmen über einen Zeitraum von 9000 Zehntelsekunden, also 15 Minuten geschehen.
Zur Weckzeit werden (je nach _mode) verschiedene mp3-Dateien abgespielt, die ich im Verzeichnis /opt/fhem/SonosSpeak abgelegt habe. Voraussetzung ist, dass eine Freigabe für SonosSpeak eingerichtet ist, wie in diesem Blog beschrieben:
http://www.meintechblog.de/2015/07/sonos-play1-und-fhem-sound-im-ganzen-haus/
Nützliche Soundfiles gibt es im WWW zuhauf. Achtet nur darauf, dass Ihr sie für den Privatgebrauch legal nutzen könnt. Piepen, Hahnenschrei und Kuckuck sind die 3 Sounds, für die ich mich entschieden habe.
Die Funktion { good_morning } ist eine kleine Perl-Prozedur, die mit das Wetter und meine Termine ansagt. Die Einzelheiten sprengen aber den Umfang dieses Beitrags.
Deutschlandfunk habe ich in der Sonos-App unter "Radio von TuneIn", "Meine Radiosender" eingetragen. Leerzeichen müssen ggf. maskiert werden (mit %20).
Das Wecksignal wird dann nach 30 bzw. 60 Sekunden noch wiederholt. 5 Minuten nach der Weckzeit geht dann unbarmherzig der Rollladen rauf (set R_SZ on).
Statt 192.168.0.XXX verwendet Ihr selbstverständlich die IP Eures FHEM-Servers.
Zum Schluss können wir noch ein paar Attribute für eine gefälligere Optik setzen:
alias Wecker
room Schlafzimmer
group Wecker
icon clock
Ich hoffe, der Beitrag war für den einen oder anderen von Euch nützlich. Über Feedback und Verbesserungsvorschläge würde ich mich freuen.
Grüße
Peter
Edit: Hier ein kleiner Screenshot, der zeigt, wie der Wecker dann bei mit in der Web-Oberfläche aussieht.
Den Code bitte in Codetags. So kann das keiner vernünftig lesen.
Grüße
@CoolTux: Gute Idee, hab's geändert. Danke.
Ich werde angemeckert, weil DOIF weder setList, noch readingsList noch stateFormat oder wbCmd annimmt.
Das sind Attribute eines Dummys?
Oder habe ich meine Anlage schon so verwürgt, daß die nicht mehr mitspielen mag?
Du müsstest die Attribute aber haben.
Wiki sagt:
Einschränkungen
Dieses Attribut existiert nur bei dummy- und readingsProxy-Devices.
Laut Post 1 wird aber ein DOIF erstellt.
Irgendwie bekomme ich das nicht auf die Reihe.
Edit:
Fehlermeldung: Unknown command setList, try help.
Hast du das DOIF schon angelegt? Wenn ja gehe in FHEMWEB in die Details des DOIF und schaue unten unter Attribute ob du da das setList findest.
Der Kollege oben hat den Code etwas gekürzt.
Wenn du den Befehl nehmen willst so steht im Anfängerdokument
attr DEVICENAMEN setList blablabla
Stimmt. Danke.
Jetzt leuchtet es mir ein, weil kein Device davorsteht.
Wollte das einfach in der RAWDefinition einfügen und speichern.
Also muß doch jeweils das Device davor.