FHEM > DOIF

[Gelöst] DOIF Relative Zeitangaben nach Zeitraster ausgerichtet mit wait

(1/2) > >>

Mastodon:
Hallo zusammen,

ich möchte mit fhem und HUE gerne eine "Farbuhr" im Glasentakt (8 Farben) realisieren. Die Zeit wird mittels zweier Leuchtmittel (für Stunde und Minute) angezeigt. Wenn ich für die Minutenanzeige 8 Farben über 30 Minuten ineinander übergehen lassen möchte, muss ich alle 225s einen (set-Befehl) Farbwechsel an die HUE-Bridge absetzen. DOIF kann allerdings nur ganze Minuten auf das Zeitraster ausrichten. Also habe ich mir gedacht, dass ich zu den jeweils vollen Minuten (0,3,7,11...) set-Befehle ausführe, diese aber mit dem wait-Attribut jeweils um 0s, 15s, 30s oder 45s verzögere. Die Befehle würden damit gleichverteilt über die 30min abgesetzt werden. Der gesamte Ablauf wiederholt sich jeweils alle 30min (1. und 2. Stundenhälfte).
Mir ist aufgefallen, dass die einzelnen Befehle trotz wait-Definition jeweils zu den vollen Minuten abgesetzt werden. Mir ist nicht klar, wo in diesem Fall der Fehler liegen könnte. Wer kann helfen?


--- Code: ---defmod di_Gen_Minutenlicht DOIF (([:00] or [:30]) and [Farbuhr1:state] eq "on") (set HUEDevice10 rgb ff00ff : bri 10 : transitiontime 2250) DOELSEIF (([:03] or [:33]) and [Farbuhr1:state] eq "on") (set HUEDevice10 rgb 0000ff : bri 10 : transitiontime 2250) DOELSEIF (([:07] or [:37]) and [Farbuhr1:state] eq "on") (set HUEDevice10 rgb 00ffff : bri 10 : transitiontime 2250) DOELSEIF (([:11] or [:41]) and [Farbuhr1:state] eq "on") (set HUEDevice10 rgb 00ff00 : bri 10 : transitiontime 2250) DOELSEIF (([:15] or [:45]) and [Farbuhr1:state] eq "on") (set HUEDevice10 rgb ffff00 : bri 10 : transitiontime 2250) DOELSEIF (([:18] or [:48]) and [Farbuhr1:state] eq "on") (set HUEDevice10 rgb ff7f00 : bri 10 : transitiontime 2250) DOELSEIF (([:22] or [:52]) and [Farbuhr1:state] eq "on") (set HUEDevice10 rgb ff0000 : bri 10 : transitiontime 2250) DOELSEIF (([:26] or [:56]) and [Farbuhr1:state] eq "on") (set HUEDevice10 rgb ffffff : bri 10 : transitiontime 2250) DOELSE (set HUEDevice10 off)
attr di_Gen_Minutenlicht wait 0:45:30:15:0:45:30:15:0
--- Ende Code ---

Damian:
Du musst noch ein Attribut setzen, da Timer standardmäßig nicht per wait verzögert werden.

siehe: https://fhem.de/commandref_DE.html#DOIF_timerWithWait

Die Aufgabe kann man sicherlich eleganter im DOIF-Perl-Modus realisieren.

Mastodon:
Das hatte ich in der Referenz zwar bereits gelesen, aber letztendlich wohl doch nicht verstanden. Vielen Dank für den Hinweis. Das ist der erste Schritt einer Realisierung, damit ich mich schnell über das Resultat freuen kann. Nach und nach versuche ich die Strukturen dann sicherlich auch eleganter zu gestalten.   

Damian:
So würde ich es lösen:


--- Code: ---defmod di_uhr DOIF {\
  if (([:00] or [:30]) and [Farbuhr1:state] eq "on") {\
    @{$_rgb}=("ff00ff","0000ff","00ffff","00ff00","ffff00","ff7f00","ff0000","ffffff");;\
    set_Exec("timer",'$count ? 225:0','fhem_set"HUEDevice10 rgb $_rgb[$count] : bri 10 : transitiontime 2250 "','$count < 8')\
  }\
}
--- Ende Code ---

siehe: https://wiki.fhem.de/wiki/DOIF/Perl-Modus#Timer_setzen:_set_Exec.28.29

Mastodon:
Hallo!

Vielen Dank. Das kannte ich bisher noch nicht. Wieder einmal ein Beweis dafür, dass es sich bei FHEM um ein wahres Füllhorn handelt und ein weiterer Beweis dafür, dass ich meine PERL-Fähigkeiten mal auf einen gewissen Stand bringen sollte.

Ein schönes WE wünsche ich.

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln