ich komme grad nicht weiter. Ich möchte innerhalb eines Moduls ein zyklisches Ereignis anlegen das jede Nacht um 0 Uhr eine Variable zurücksetzt.
Mein bisheriger Code dazu sieht wie folgt aus:
Das Ereignis wird damit auch angelegt, aber wie und wo gebe ich dem Ereignis jetzt mit das eine Variable zurückgesetzt werden soll? Über die WebConsole kann ich das ja unter „Aktion“ einstellen. Muss ich bei dem Ereignis jetzt mit IPS_SetEventScript eine Funktion innerhalb des Moduls rufen die die Variable zurücksetzt oder gibt es noch einen anderen Weg?
Völlig falscher Ansatz, da Module keine zyklischen Ereignisse nutzen, sondern Timer.
Und bitte im richtigen Bereich schreiben.
Dort wurde diese Frage auch schon häufiger gestellt.
Ich verschiebe das Thema.
Michael
Magst Du mir vielleicht nochmal einen kleinen Schubs in die richtige Richtung geben? Evtl. den passenden Thread den Du meinst? Ich habe bislang den Thread hier gefunden: https://www.symcon.de/forum/threads/33607-RegisterTimer-und-t%C3%A4gliches-Update . Dort wird auch IPS_SetEventCyclicTimeFrom erwähnt. Wenn ich nun RegisterTimer nutze dann wird dieser doch mit dem angegebenen Intervall permanent ausgeführt oder nicht? Ich brauche ja nur eine Ausführung am Tag (um 0 Uhr), quasi wie ein Cronjob.
Ja das ist doch der Sinn der Sache das bei einem zyklischen Timer dieser in einem vorgegebenen Intervall erneut ausgeführt wird oder nicht? Du willst doch schließlich jeden Tag was machen, also ist das doch ein festes Intervall. Um Null würde ich das nicht unbedingt ausführen, kann sein das da auch noch andere Prozesse laufen, wenn nicht unbedingt notwendig, dann eher ein paar Sekunden nach 0 Uhr, das nicht zufällig Prozesse, die um 0 Uhr greifen, alle zeitgleich ausgeführt werden.
Nicht verwirren lassen.
Es gab zum Beginn der PHP-Module kein RegisterTimer, darum wurden dort wirklich noch normale zyklische Ereignisse benutzt.
Ist jetzt aber obsulent und somit bitte RegisterTimer nutzen.
Einfach im Applychanges und in der eigentlichen Methode welche durch den Timer startet, das Intervall zur Zielzeit ausrechnen und mit SetTimerInterval bei setzen.
Michael
Ok alles klar. Wie es jetzt umgesetzt werden muss weiß ich dann. Grundsätzlich nochmal zum Verständnis, der Timer sollte genutzt werden weil er intern pro Instanz läuft und von außen nicht verändert werden kann richtig? Ein Ereignis würde ja in der Konsole angezeigt werden und wäre somit editierbar bzw. ließe sich löschen.
Ja es sollte in einem Modul immer ein interner Timer benutzt werden um etwas auszuführen bzw. die MessageSink, ein Ereigniss ist für einen User, aber nicht für eine Modulinstanz.
Genau man will ja nicht das etwas gelöscht wird, das schließt ja aber nicht aus, dass der User das editieren kann. Wenn Du willst das dies vom User verändert werden kann, must Du halt eine Property für das Intervall setzten, dass vom User verändert werden kann und das Du dann im Modul abfragst. Wenn es an dem Intervall nichts zu verstellen gibt, dann brauchst Du auch keine Property.
OK, aber wäre so etwas nicht über einen Cronjob einfacher zu realisieren bzw. warum geht Symcon hier den Weg über Timer? Ein Cronjob wäre ein Einzeiler, bei einem Timer muss ich jedesmal erst den passenden Intervall berechnen.
Chronjob sind eher Jobs für einen Cron-Daemon der ja idr auf OS Ebene läuft.
Du bewegst dich hier aber ausschließlich innerhalb des SDK von Symcon.
Und das hat seine eigene interne Timer/Job Verwaltung und agiert OS unabhängig.
Michael
Eine kurze Rückmeldung von mir, der Timer läuft und arbeitet „unsichtbar“ im Modul. Geht dies mit Ereignissen (z.B bei einer Variablenaktualisierung) auch? Die betreffen in meinem Fall auch nur Abläufe innerhalb des Moduls und müssten in der Webconsole eigentlich nicht angezeigt werden weil sie dadurch ja vom Benutzer wieder veränderbar / löschbar wären. Mit IPS_SetHidden kann ich die zwar von der Visualisierung ausschließen aber sie werden eben noch immer in der Console angezeigt.
Ja, das nennt sich MessagSink als Methode zum verarbeiten der Nachricht.
Und auf die Nachricht registrierte das Modul sich auf ein Update der Variable (VM_UPDATE) mit RegisterMessage.
Michael
Der Timer gibt ein Zeitintervall an. So wie das aussieht, nimmst du die Dauer bis zum nächsten Mal 0:01 Uhr. Danach wird wieder das gleiche Intervall genommen, nicht unbedingt das nächste mal um 0:01. Wenn du beispielsweise ApplyChanges um 23:01 ausführst, ist das Intervall eine Stunde lang und würde nach 0:01 das nächste mal um 1:01 auslösen. Wenn du immer um 0:01 auslösen möchtest, dann müsstest du beim Auslösen des Timers die Dauer bis zum nächsten Mal 0:01 berechnen und das Intervall neu setzen. In deinem Fall könntest du also in ResetValues einfach nochmal die Funktion SetResetTimerInterval aufrufen.