Seite 1 von 1

Timer rules

Verfasst: 24. Sep 2020 14:15
von Innocent
Hallo zusammen.

Ich habe mich die letzten Tage mit rules beschäftigt.
Unter anderem damit, als Beispiel, eine Shelly Plug S per Ereignis ( Sonnenuntergang) einzuschalten und nach Ablauf einer gewissen Zeit wieder auszuschalten.

Die Sache funktioniert bei mir.

Bei meiner Suche bin ich unter anderem über dieses Beispiel gestolpert, welches ich nicht ganz verstehe, aber viele so machen...

Mir stellen sich die Fragen:

Zeile 1, warum var timer = null ?
Zeile 6, warum if(timer == null) ?
Zeile 11, warum timer = null ? Ich vermute ein Zurücksetzen, aber warum ?
Zeile 15 , warum timer.rescheduled ?

Code: Alles auswählen

var timer = null

rule "TSM02 Motion OFF"
when
    Item ZW_AnaKapi_Hareket received update ON
then
    if(timer == null) {
        logInfo("FILE", "Setting to ON and creating timer")
        timer = createTimer(now.plusMinutes(2), [|
            logInfo("FILE", "Timer expired and setting to OFF")
            ZW_AnaKapi_Hareket.postUpdate(OFF)
            timer = null
        ])
    } else {
        logInfo("FILE", "Timer rescheduled")
        timer.reschedule(now.plusMinutes(2))
    }
end
Meine simple Rule sieht so aus und funktioniert auch...

Code: Alles auswählen

rule "Sonnenuntergang Plug S 2 an"
when  
    Channel "astro:sun:home:set#event" triggered START
then
    SpsDgk2RelayOutput.sendCommand(ON)
    createTimer(now.plusMinutes(90)) [| SpsDgk2RelayOutput.sendCommand(OFF)]
end
Wer kann mir das verständlich machen bzw den Unterschied erklären ?

Als nächstes möchte ich eine Meldung meiner Waschmaschine bekommen, wenn diese fertig ist...
Daran setze ich mich mal.

Schönen Mittag !

Re: Timer rules

Verfasst: 24. Sep 2020 19:00
von violine21
Schau mal hier. Da hat mir der Udo das schon einmal ausgiebig erklärt:
viewtopic.php?f=15&t=3353

Re: Timer rules

Verfasst: 24. Sep 2020 22:09
von udo1toni
Also, erstmal machen die beiden Codes unterschiedliche Dinge :)
Deine Rule schaltet beim Ereignis sunset das Item SpsDgk2RelayOutput auf ON. danach wird ein freier Timer gestartet, der nach 90 Minuten SpsDgk2RelayOutput auf OFF setzt. Allerdings ist dieses Ereignis im Moment des Triggers unabänderlich festgelegt. Du kannst es nicht mehr beeinflussen.

Die andere Rule hat hier ein paar hässliche Makel. Es geht mit der Benennung des Timer Objekts los. Man sollte keine Schlüsselwörter als Objektnamen verwenden, also besser tMotion als timer.
Außerhalb der Rule wird das Objekt definiert, es handelt sich um einen Handle für den Timer. Damit kann man nun den Timer steuern, auch wenn er bereits angelegt wurde.
Der nächste Makel ist die Prüfung auf null. null ist eine besondere Konstante, eine Prüfung auf Gleichheit ist hier nicht korrekt. Die Codeprüfung meldet das auch :) Korrekt muss hier geprüft werden, ob das Objekt identisch mit null ist, das sieht dann so aus: if(tMotion === null)
Es wird hier nicht der Inhalt der Speicherzelle geprüft, sondern der Zeiger, mit dem auf die Speicherzelle verwiesen wird.
Innerhalb des Timers wird das Objekt mit null initialisiert, damit die Abfrage auf null außerhalb des Timers nach der ersten Ausführung auch ein Chance hat. ;) Bei der Initialisierung passiert die Wertzuweisung ebenfalls, die ist aber nur gültig, bis ein Timer angelegt wurde.
.reschedule() setzt den Timer auf einen neuen Wert, solange der Code noch nicht aus dem Scheduler gelöscht wurde. .reschedule funktioniert also innerhalb des Timercodes oder außerhalb, wenn sichergestellt ist, dass der Timer existiert. (Prüfung auf ungleich null)
Diese Rule legt also einen Timer an, der immer wieder auf einen neuen Ablaufzeitpunkt gesetzt wird, wenn die Rule neu getriggert wird. Der Timer hat somit einen variablen Ablaufzeitpunkt (und zwar über die Laufzeit des Timers)

Re: Timer rules

Verfasst: 25. Sep 2020 07:50
von Innocent
Dann kann ich meine rule so lassen?
Oder macht die irgendwann Ärger?

Re: Timer rules

Verfasst: 25. Sep 2020 08:11
von udo1toni
Es kommt ja nur darauf an, was Du erreichen willst. Solange Dir ein starrer 90 Minuten Timer reicht, spricht nichts gegen Deine Rule :)

Re: Timer rules

Verfasst: 25. Sep 2020 08:43
von Innocent
Vorerst reicht mir der timer starr. Hauptsache es gibt keine Konflikte, wenn ein anderer solcher timer startet.

Aktuell habe ich glaub beobachtet, daß wenn Dose eins per trigger an geht und nach 90 Minuten abschalten soll dies nicht tut wenn ich zwischenzeitlich eine Dose von Hand einschalte, die auch per rule nach 90 Minuten dann ausschalten soll....

Die von Hand eingeschaltete ging nach timer Ablauf aus.
Die andere nicht.

Re: Timer rules

Verfasst: 30. Sep 2020 12:39
von Innocent
Update.
Meine Timer kommen sich gegenseitig nicht ins Gehege.
Das war von mir falsch beobachtet.

An der Fertigmeldung der Waschmaschine komme ich nicht weiter.
Habe einige umsetzungen angesehen, verstehe aber das meißte daran nicht.
Wer hat mir ein Beispiel, anhand dessen er/ihr mir erklären könnt was dort steht und passiert.

Schönen Mittag 😊