einfacher Wecker mit DOIF

Begonnen von P-terrible, 10 August 2017, 18:56:53

Vorheriges Thema - Nächstes Thema

P-terrible

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

P-terrible

Edit: Hier ein kleiner Screenshot, der zeigt, wie der Wecker dann bei mit in der Web-Oberfläche aussieht.

CoolTux

Den Code bitte in Codetags. So kann das keiner vernünftig lesen.


Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

P-terrible

@CoolTux: Gute Idee, hab's geändert. Danke.

Neuhier

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?

CoolTux

Du müsstest die Attribute aber haben.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Neuhier

#6
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.

CoolTux

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
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Neuhier

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.