Timer immer eine Stunde weiter stellen

Für die Abfrage von Energiedaten möchte ich gerne einen Timer in einem Modul immer zur vollen Stunde laufen lassen. Hierfür habe ich die folgende Funktion gebaut.


$this->SetTimerInterval("QueryAWATTAR",3600000);
$now = new DateTime();
$target = new DateTime();
$now->getTimestamp();
$nextHour = (intval($now->format('H'))+1) % 24;
$target->setTime($nextHour, 00, 0);
$diff = $target->getTimestamp() - $now->getTimestamp();
$EvaTimer = $diff * 1000;
$this->SetTimerInterval('QueryAWATTAR', $EvaTimer);
$this->QueryAWATTAR();

Bie der Initialisierung kommt auch korrekterweise die nächste volle Stunde … danach wir die Wiederholung aber nicht korrekt in 60 Minuten gesetzt, sondern „irgendwo“ dazwischen. Kann mir jemand einen Tipp geben was ich hier falsch mache?

was meinst du mit „irgendwie dazwischen“?

demle

Auch wenn ich es nicht nicht probiert habe vermute ich, dass der Timer wenn er final gesetzt wird, nicht die 3600 Sekunden von oben verwendet, sondern die Zeit die ich unten im Diff Ermittle. Deswegen war sie bei meinen Tests auch nicht gleich. So meine Vermutung - muss morgen Mal schauen das ich einen Unterschied machen beim Anlegen des Timers und beim erneuten setzen.

Gesendet von iPhone mit Tapatalk

Im Create einmalig die nächste Stunde berechnen und beim erzeugen des Timers den Wert mitgeben.
In der Timer Funktion dann knallhart auf 3600 Sekunden setzen.
Wobei ich aber, ohne den Code jetzt getestet zu haben, auch kein Problem da oben sehe.
Ich nutze auch Timer mit errechneten Intervall für eine Zielzeit. Nur das ich direkt mit Sekunden und somit immer mit UnixTimestamp arbeite und nicht die nächste volle Stunde benötige.

Michael

Also die Funktion geht so nicht - auch bekomme ich es mit dem setzen im Create nicht hin, da der Timer leider nicht immer laufen soll, sondern nur wenn eine bestimmte Funktion aktiv ist.

Das Problem ist wohl, Das Symcon das initiale Setzen des Timers auf 3600000 durch den Timer ersetzt (also wenn er zur vollen Stunde gelaufen ist) der für das setzen auf die volle Stunde benötigt wurde.

Ich müsste also nach dem ersten Lauf den Timer auf 3600000 setzen, aber erst dann, da vorher jedes Anpassen des Intervalls zu einer Änderung der Uhrzeit führt.

Da ich hier einen externen Webservice abfrage und die maximal 100 Abfragen pro Tag zulassen, kann ich auch nicht einfach minütlich setzen. Die neuen Tarife kommen sowieso „nur“ stündlich.

Ich denke ich habe es jetzt hin gebastelt … keine Ahnung ob es schöner geht.

Im Apply_Changes setze ich einen ersten Timer auf die volle Stunde … in der Funktion prüfe ich dann ob ein Timer aktiv und ob das Intervall > 0 ist. Wenn ja, setze ich dann hier den Timer auf 1 Stunde als Intervall.



$CurrentTimer = $this->GetTimerInterval("QueryAWATTAR");
if ($CurrentTimer > 0 AND $ConsumptionMainaWATTar == 1) {
	$this->SetTimerInterval("QueryAWATTAR",3600000);
}

Damit geht es.

… und das gleiche wie in Apply muss noch in Create, sonst stimmen die Timer bei einem Neustart nicht.