[gelöst] Alternative zu wait im DOIF Perl Modus?

Begonnen von Aurel_B, 24 November 2023, 15:15:16

Vorheriges Thema - Nächstes Thema

Aurel_B

Hallo zusammen,

ich habe ein DOIF im Perl Modus mit vielen Verzweigungen (quasi ein "Zustandsautomat"), also im Prinzip ein IF-Baum. Das Doif wird per

[+00:03:00];
alle 3 Minuten ausgeführt. Je nach Zweig, möchte ich allerdings die Ausführung verzögern oder verkürzen. Im "DOIF FHEM" Modus könnte man ja wait verwenden, im "DOIF Perl" Modus wäre die Alternative ja set_Exec(). Nun möchte ich aber nicht jeden möglichen Entscheidungsweg in eine separate Subroutine (welche per set_Exec() aufgerufen wird) auslagern falls da für mich dann die Übersichtlichkeit leidet.
Eine alternative Möglichkeit wäre für mich, statt

[+00:03:00];
einen indirekten Timer welcher seinen Wert aus einem Reading bezieht einzusetzen. Also

[[<device>:<reading>]];
(siehe https://wiki.fhem.de/wiki/DOIF/Perl-Modus#indirekte_Zeitangaben). Dummerweise scheint das nach Doku nur mit absoluten Zeitangaben à la "HH:MM:SS" zu gehen und nicht relativ (+3 Minuten). Das heisst, ich müsste in meinem Reading auf welches sich obiger Timer bezieht jeweils den nächsten Ausführungszeitpunkt absolut angeben und diesen in meinem DOIF entsprechend berechnen.

Der langen Rede kurzer Sinn: hat jemand von euch schonmal so etwas gemacht und hätte eine Vorlage oder eine Alternative? Danke!

Edit: das DOIF ist etwas komplexer und ich bin mit dem Perl Modus viel besser vertraut als mit dem FHEM Modus. Deshalb möchte ich es auch nicht in den FHEM Modus konvertieren (wo ich wait verwenden könnte).

Aurel_B

Oha, jetzt habe ich gerade die commandref gelesen (bisher nur Wiki) und anscheinend kann man indirekte Zeitangaben aus einem Reading auch relativ definieren! Das müsste ein Lösungsansatz sein, ich probier das mal aus und poste mein Ergebnis.

Aurel_B

Ok, ausprobiert und es funktioniert phantastisch  :))

Pseudocode:

DOIF {
[+[$SELF:NaechsteAusfuehrungInSek]];
$NaechsteAusfuehrungInSek = get_Reading('NaechsteAusfuehrungInSek');

# If-Blocks etc die $NaechsteAusfuehrungInSek setzen

# Am Ende
set_Reading('NaechsteAusfuehrungInSek', $NaechsteAusfuehrungInSek);
}