FHEM Forum

FHEM => Codeschnipsel => Thema gestartet von: P-terrible am 10 August 2017, 18:56:53

Titel: einfacher Wecker mit DOIF
Beitrag von: P-terrible am 10 August 2017, 18:56:53
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
Titel: Antw:einfacher Wecker mit DOIF
Beitrag von: P-terrible am 10 August 2017, 19:02:40
Edit: Hier ein kleiner Screenshot, der zeigt, wie der Wecker dann bei mit in der Web-Oberfläche aussieht.
Titel: Antw:einfacher Wecker mit DOIF
Beitrag von: CoolTux am 10 August 2017, 19:12:38
Den Code bitte in Codetags. So kann das keiner vernünftig lesen.


Grüße
Titel: Antw:einfacher Wecker mit DOIF
Beitrag von: P-terrible am 10 August 2017, 19:17:59
@CoolTux: Gute Idee, hab's geändert. Danke.
Titel: Antw:einfacher Wecker mit DOIF
Beitrag von: Neuhier am 23 September 2017, 09:58:34
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?
Titel: Antw:einfacher Wecker mit DOIF
Beitrag von: CoolTux am 23 September 2017, 10:11:19
Du müsstest die Attribute aber haben.
Titel: Antw:einfacher Wecker mit DOIF
Beitrag von: Neuhier am 23 September 2017, 10:20:20
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.
Titel: Antw:einfacher Wecker mit DOIF
Beitrag von: CoolTux am 23 September 2017, 10:43:05
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
Titel: Antw:einfacher Wecker mit DOIF
Beitrag von: Neuhier am 23 September 2017, 10:52:31
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.