RegisterTimer und tägliches Update

Hi zusammen,

Bei der Modulentwicklung kann man ja mit RegisterTimer einen Timer erstellen! Mit SetTimerInterval(…) kann man in Millisekunden das Interval einstellen. Meistens will man aber nicht in ms arbeiten, d.h. z.B. ein tägliches Update um Mitternacht einstellen. Das geht so aber nicht, oder?

Wie macht Ihr das?

Danke Pitti

Da musst Du Dir eine eigene Funktion für schreiben. Schau mal z.B. ins Astronomie Modul bei Astrotimer das wird ein Timer anders gesetzt.

Warum muss es ausgerechnet Mitternacht sein ?
Reicht nicht einfach alle 15min , 1h, 4h oder 8h ?
Kommt ja häufig auf den Zweck des Moduls an.

Meine Schulferien lasse ich einfach alle 900Sek (15Min) einmal starten.

Michael

PS: Aktuell gehen auch gar keine ms… in __ipsmodule wird das einfach in sekunden umgerechnet, da die ‚zyklischen Ereignisse‘ nur sekundengenau arbeiten. Hier fehlen noch immer die echten internen Timer.

@Frozo: Danke, schau ich mir mal an!

Klar kann man das auch in anderen Intervallen machen, aber gewisse Dinge braucht man nur 1x täglich und meistens irgendwann in der „Schlafenszeit“.

In meinem Fall will ich eigentlich nur einmal die Entsorgungstermine für den aktuellen Tag abholen (Modul IPSymconAwido).
Mehrmals macht keinen Sinn.

Ich will aber auch mal das Update stoppen und dann wieder starten. Mit den vorhanden Methoden kann ich nur ab diesem Moment loslegen - nie zu einem bestimmten Zeitpunkt!

RegisterCyclicTimer
in
IPSymconAstronomy/module.php at master · Wolbolar/IPSymconAstronomy · GitHub

Bzw. Du musst die Funktion so an deine Bedürfnisse anpassen das der Timer eben so gesetzt wird wie Du das willst.

Da war ich zu langsam, das Beispiel gibt es auch irgendwo im Forum.

Ich starte um 00:20 und wiederhole in festen Abständen.


    protected function RKDWDgateway_RegisterTimer($Name, $Script)
    {
        $id = @IPS_GetObjectIDByIdent($Name, $this->InstanceID);
        if ($id === false)
            $id = 0;

        if ($id > 0) {
            if (!IPS_EventExists($id))
                throw new Exception("Ident with name " . $Name . " is used for wrong object type", E_USER_WARNING);

            if (IPS_GetEvent($id)['EventType'] <> 1) {
                IPS_DeleteEvent($id);
                $id = 0;
            }
        }

        if ($id == 0)
        {
            $id = IPS_CreateEvent(1);
            IPS_SetParent($id, $this->InstanceID);
            IPS_SetIdent($id, $Name);
        }
        IPS_SetName($id, $Name);
        IPS_SetHidden($id, true);
        IPS_SetEventScript($id, $Script);

		IPS_SetEventCyclic($id, 0, 0, 0, 0, 2, 30);
		IPS_SetEventCyclicTimeFrom($id, 0, 20, 0);  
		IPS_SetEventActive($id, true);
    }

Das ging ja mal schnell und gleich zum Copy/Pasten :wink:

Vielen Dank Euch allen!

Je nachdem was Du genau machen willst musst Du eventuell noch
IPS_SetEventCyclicTimeTo
in dem Skript oben ergänzen.

Danke, aber ich will es ja täglich einmal ausführen lassen, also ohne IPS_SetEventCyclicTimeTo.

Vorsicht, mein Beispiel startet um 00:20 und läuft dann alle 30 Minuten, da ich die Daten immer um xx:20 und xx:50 abholen möchte.
Mit dem …To müsstest du die „Endzeit“ setzen können und die dann so kurz, dass der Timer nur einmal laufen kann.

Ja, hatte ich gesehen.

Das habe ich in der Doku gefunden und genau so brauche ich es ja (nur andere Uhrzeit)

//Täglich um 15 Uhr
$eid = IPS_CreateEvent(1);
IPS_SetParent($eid, $_IPS[‚SELF‘]);
IPS_SetEventCyclicTimeFrom($eid, 15, 0, 0);

Habe das gerade mal in einem kleinen Script ausprobiert, passt … aber

    IPS_SetEventScript($id, $Script); 

Wie muss $Script genau aussehen damit meine Funktion aufgerufen wird … so …

$Script = „AWIDO_Update($_IPS[‚TARGET‘]);“;

Siehe Zeile 39
IPSymconAstronomy/module.php at master · Wolbolar/IPSymconAstronomy · GitHub


$this->RegisterCyclicTimer('AstroTimerUpdate', 0, 5, 0, 'AstronomyTimer_Set('.$this->InstanceID.')');

bzw. bei Dir dann


AWIDO_Update('.$this->InstanceID.')

Zeile 146


IPS_SetEventScript($id, "\$id = \$_IPS['TARGET'];
$script;");

Tip zur besseren Lesbarkeit.
Man muss da nix escapen, wenn man einfach Anführungszeichen nutzt.

$Script = 'AWIDO_Update($_IPS["TARGET"]);';

Ob man nun $_IPS[„TARGET“] oder fest die ID einbaut ist Geschmacksache.
Finde ich aber unleserlicher.

$Script = 'AWIDO_Update('.$this->InstanceID.');';

Michael

Danke, habe es jetzt mit der direkten ID gemacht und ohne escapen - läuft :wink:

Ist schon eingecheckt und online https://github.com/Wilkware/IPSymconAwido

Nochmal Danke für die super Unterstützung!
Gute Nacht
Pitti

Am besten übrigens nicht genau 0h nehmen. Wenn das alle Module machen, gibt es um Mitternacht immer Chaos :slight_smile:

paresy

Ja, habe es mal auf 0:10 Uhr eingestellt :wink: