Hallo,
habe mal zum "InternalTimer" einige Fragen:
1. Zeitwert gettimeofday()+ $delay
Da ich in fhem bislang nur für den Zeitwert "ganze Sekunden" gesehen habe, war ich davon ausgegangen, dass es auch nur sekundenweise geht.
Nun habe ich das mal mit "krummen Werten", wie z.B. für $delay = 3.51 getestet und gemessen und es geht tatsächlich genauso präzise, wie man erwartet, was bei der Berechnung von Fahrtzeiten und Positionen sehr hilfreich ist.
2. interne Verwaltung der Timer:
ich habe z.B. folgendes programmiert:
InternalTimer(gettimeofday()+ 60, "Wcmcom_BrennerDaten", $hash, 0);
InternalTimer(gettimeofday()+ 1800, "Wcmcom_SolarDaten", $hash, 0);
Zu der Instanz $hash werden also alle 60 Sekunden die Routine Wcmcom_Brennerdaten und alle 1800 s die Routine Wcmcom_Solardaten aufgerufen und zwar jeweils mit dem Parameter "$hash".
RemoveInternalTimer($hash);
löscht dann wohl aber beide Timer, da die interne Verwaltung "$hash" als Kriterium verwendet.
Was müsste ich tun, wenn ich die beiden Timer getrennt löschen wollte?
So was bspw:
InternalTimer(gettimeofday()+ 60, "Wcmcom_BrennerDaten", "$hash,20", 0);
RemoveInternalTimer("$hash,20");
Wird "$hash,20" als statischen Text für die Verwaltung der Timer verwendet?
Und wie kann man dann zum AufrufZeitpunkt der Subroutine (z.B. Wcmcom_BrennerDaten) dynamisch Werte übergeben? (z.B. "$hash,$wert1)
Vermutlich direkt nicht, da ja dann die Verwaltung der Timer nicht funktioniert.
Nur indirekt, über $hash->{Wert1) = $wert1..
Sehe ich das so richtig?
Gruß
Elektrolurch
Vielleicht hilft dir diese Routine
forum.fhem.de/index.php/topic,18734.msg124978.html#msg124978 (http://forum.fhem.de/index.php/topic,18734.msg124978.html#msg124978)
zu 2.: du erzeugst dir jeweils einen eigenen hash. da steckst du den fhem hash rein und alles was du sonst noch brauchst. an InternalTimer übergibst du dann eine referenz darauf. in der timer routine bekommst du deinen hash übergeben und hast zugriff auf alles was du da rein gesteckt hast. beim remove verwendest du auch deine eindeutige referenz.
gruss
andre
Hallo,
ja stimmt, so wie es bei den http-utils gemacht wird.
Beispiel my $hash = {'Wert1' => $wert1, 'state' => 'up'};
Danke und Gruß
Oder du nutzt gleich die beiden Routinen
myInternalTimer
myRemoveInternalTimer
Die in Twilight definiert sind.
Also nur vorher Twilight laden.
Beispiele wie die Routinen zu nutzen sind findest du in Twilight selbst. Sie werden meines Wissens auch in RandomTimer genutzt!