Zeitlich wiederholtes Triggern einer DOIF_Readings-Berechnung?

Begonnen von Reinerlein, 14 April 2018, 16:40:02

Vorheriges Thema - Nächstes Thema

Reinerlein

Hallo,

ich habe ein DOIF_Readings definiert, welches mir eine Art Countdown zu einem Zeitpunkt berechnet, der aus einem Reading stammt.
Dieses Reading ist die Wait-Timerfestlegung eines anderen DOIF (das wait ist auf 9000 Sekunden eingestellt). Eine Perl-Funktion zerlegt diesen wait_timer und errechnet zur aktuellen Uhrzeit die Differenz und macht eben diesen Prozentwert daraus.

Das ganze funktioniert prinzipiell super, leider nur zu den beiden Zeitpunkten, wo der wait_timer auf einen Zeitpunkt gesetzt wird, und wo er wieder auf "no timer" zurückgesetzt wird.
Ich dacht mir dann halt, gebe ich meiner Perl-Funktion eben einen überflüssigen Parameter mit auf den Weg, der einen zeitlichen DOIF-Trigger darstellt (sowas wie [+60] für minütlich):

A_PercentEndeRegenpause: (
  getPercentRegenpause([garten_Regen:wait_timer:"^(.+? .+?)($| )","no timer"], [+60])
)
Der reguläre Ausdruck sorgt dafür, dass meine Perl-Funktion nur noch die Datums & Uhrzeitangabe oder eben den String "no timer" bekommt. Der Default ist dann wichtig, wenn das andere Doif den wait_timer noch nie gesetzt hatte...

Ich hatte die Hoffnung, dass diese Angabe auch bei DOIF_Readings zu einem Trigger und damit zu einer Berechnung führt. Dem ist wohl leider nicht so.

Gibt es eine Möglichkeit dieser zeitlich wiederholten Triggerung (ohne ein weiteres DOIF zwischen meinem wait_timer-Doif und diesem DOIF_Readings)?

Danke schon mal...

Grüße,
Reinerlein

Damian

DOIF_Readings kennt keiner Timer.

Das lässt sich sicherlich konventionell mit DOIF in Verbindung mit FHEM-setreading realisieren, eleganter und performanter kann man das mit DOIF-Perl umsetzen:

DOIF {
  if ([garten_Regen:wait_timer] ne "no timer] or [$SELF:"Timer_counter"]) { # wenn wait_timer gesetzt wird oder Counter-Timer abläuft
    set_Reading("A_PercentEndeRegenpause",getPercentRegenpause([?garten_Regen:wait_timer:"^(.+? .+?)($| )","no timer"]),1); #Reading setzen
    set_Timer ("Timer_counter",60); #Counter-Timer setzen
  }
}
{if ([garten_Regen:wait_timer] eq "no timer]) { # wenn wait_timer abläuft
    set_Reading("A_PercentEndeRegenpause","Ende",1);
    del_Timer ("Timer_counter"); # Counter-Timer wird gelöscht
  }
}

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Reinerlein

Hi Damian,

Schade, das wäre also ein weiteres DOIF dazwischen. Dieses DOIF_Readings ist Bestandteil eines sehr komplexen Doifs, welches ich nicht so umbauen kann, wie du es geschrieben hast.

Aber danke für den Hinweis, dann brauche ich in der Richtung nicht weiter probieren, und setze etwas anderes dazwischen...

Grüße
Reinerlein