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

Begonnen von Mastodon, 11 Januar 2022, 19:00:23

Vorheriges Thema - Nächstes Thema

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?

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

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

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

#3
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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

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.

Mastodon

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?

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF