FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Mastodon am 11 Januar 2022, 19:00:23

Titel: [Gelöst] DOIF Relative Zeitangaben nach Zeitraster ausgerichtet mit wait
Beitrag von: Mastodon am 11 Januar 2022, 19:00:23
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?

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
Titel: Antw:DOIF Relative Zeitangaben nach Zeitraster ausgerichtet mit wait
Beitrag von: Damian am 11 Januar 2022, 19:17:50
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.
Titel: Antw:DOIF Relative Zeitangaben nach Zeitraster ausgerichtet mit wait
Beitrag von: Mastodon am 11 Januar 2022, 20:07:34
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.   

Titel: Antw:DOIF Relative Zeitangaben nach Zeitraster ausgerichtet mit wait
Beitrag von: Damian am 11 Januar 2022, 22:44:56
So würde ich es lösen:

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')\
  }\
}


siehe: https://wiki.fhem.de/wiki/DOIF/Perl-Modus#Timer_setzen:_set_Exec.28.29
Titel: Antw:[Gelöst] DOIF Relative Zeitangaben nach Zeitraster ausgerichtet mit wait
Beitrag von: Mastodon am 14 Januar 2022, 17:22:06
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.
Titel: Antw:DOIF Relative Zeitangaben nach Zeitraster ausgerichtet mit wait
Beitrag von: Mastodon am 15 Januar 2022, 15:48:29
Zitat von: Damian am 11 Januar 2022, 22:44:56
So würde ich es lösen:

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')\
  }\
}


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

Das würde aber bedeuten, dass der Counter jeweils nur zur halben oder vollen Stunde losläuft. Wenn ich die Uhr bspw. zum Sonnenuntergang irgendwann zwischen diesen beiden Zuständen durch Setzen des Dummies aktiviere, muss erst bis zur vollen halben Stunde gewartet werden, bis der Zähler losläuft und die Uhr "synchronisiert" ist. Richtig?
Titel: Antw:DOIF Relative Zeitangaben nach Zeitraster ausgerichtet mit wait
Beitrag von: Damian am 15 Januar 2022, 16:08:32
Zitat von: Mastodon am 15 Januar 2022, 15:48:29
Das würde aber bedeuten, dass der Counter jeweils nur zur halben oder vollen Stunde losläuft. Wenn ich die Uhr bspw. zum Sonnenuntergang irgendwann zwischen diesen beiden Zuständen durch Setzen des Dummies aktiviere, muss erst bis zur vollen halben Stunde gewartet werden, bis der Zähler losläuft und die Uhr "synchronisiert" ist. Richtig?

ja, im Schnitt musst du hier 15 Minuten warten, bis die Uhr anläuft. Dafür sind die Zeitabstände alle genau 225 Sekunden lang.