Seite 1 von 2

Rules - 2 Instanzen parallel, wie verhindern

Verfasst: 15. Okt 2022 10:06
von TorstenE
Hallo Mitstreiter,

kann es sein, dass zwei Instanzen einer rule (fast) parallel ablaufen.

Laut Log-Einträge sieht es aus, dass wenn ein Bewegungsmelder
Bewegungsmelder "Bewegung erkennt", kurz hintereinander die
entsprechenden Rule mehrfach gestartet wird.
(durchaus möglich, dass der Bewegungsmelder das Signal mehrfach sendet)

Lässt sich das innerhalb von ein paar Millisekunden verhindern ?
D.h. läuft eine Instanz der Rule, soll keine zweite gestartet werden.

Danke

Torsten

Re: Rules - 2 Instanzen parallel, wie verhindern

Verfasst: 15. Okt 2022 12:34
von peter-pan
..evtl. mit Timer. Schau dir mal die Beispiele von @udo1toni an.

Re: Rules - 2 Instanzen parallel, wie verhindern

Verfasst: 15. Okt 2022 14:34
von TorstenE
An einem Art Pause-Timer dachte ich auch schon.
Aber die Timer machen glaube ich keine Pause, die werten gesetzt und laufen dann selbständig.

Ich schau mal ob ich es mit einer "globalen" Variablen hinbekomme, welche die Zeit
beinhaltet. Nach dem Motto, wenn zwischen dem 1 und 2 Aufruf weniger als 1 Sekunde
liegen, dann soll er beim 2 Aufruf einfach keine Aktion durchführen.

Im 1 Aufruf werden Item geschaltet. Der 2 Aufruf kommt so schnell, da sind die Items
noch gar nicht fertig. Deshalb die "Verzögerung"

Re: Rules - 2 Instanzen parallel, wie verhindern

Verfasst: 15. Okt 2022 20:11
von udo1toni
Welche Version von openHAB nutzt Du? Wie hast Du die Rule angelegt?
Die schnellste Methode, Doppeltrigger zu verhindern:

Code: Alles auswählen

var Boolean bLock = false

rule "einmal nicht zweimal"
when
    Item sonstwas changed
then
    if(bLock)
        return;
    bLock = true
    // erledige die Aufgabe
    // zuletzt unbedingt
    bLock = false
end
Wichtig ist, dass bLock eine globale Variable ist, damit sie schon zum Start der Rule mit Inhalt zur Verfügung steht.
Abfrage und Setzen der Variablen dauert weniger als eine Millisekunde, sollte also reichen, um doppelt laufende Rules zu verhindern.

Re: Rules - 2 Instanzen parallel, wie verhindern

Verfasst: 16. Okt 2022 12:04
von Mclupo
Rich Koshak
Foundation member
16h
I just want to provide a little but if background. @opus and @MikeJMajor nailed it. But what isn’t said it’s that it can’t be a multi threaded or race condition problem caused by the same rule running more than once at the same time. In OH 3, only one instance if a rule can run at a time. If the rule is running while it’s already running, the subsequent triggers queue up and run in sequence. So you won’t ever have two instances on a single rule interfering with itself.
Hier ein Kommentar aus dem englischen Forum. Die selbe Rule kann nur nacheinander ablaufen

Re: Rules - 2 Instanzen parallel, wie verhindern

Verfasst: 16. Okt 2022 22:11
von udo1toni
Ja, unter openHAB3 sollte das so sein. Unter openHAB2 ist das definitiv nicht so, deshalb die explizite Frage nach der Version, denn die nächste Stufe wäre, dass die Rule tatsächlich mehrfach hintereinander läuft. Dann muss es eben tatsächlich ein Timer sein, z.B. so:

Code: Alles auswählen

var Timer tLock = null

rule "einmal nicht zweimal"
when
    Item sonstwas changed
then
    if(tLock !== null)
        return;
    tLock = createTimer(now.plusSeconds(1), [| // frühestens nach einer Sekunde erneut ausführen.
        tLock = null
    ])
    // erledige die Aufgabe
end

Re: Rules - 2 Instanzen parallel, wie verhindern

Verfasst: 17. Okt 2022 11:39
von TorstenE
Es ist OH 3.3.0

Ich vermute in der Zwischenzeit ebenfalls, dass die Rule 2 x hintereinander aufgerufen wird.
Vom 1. Aufruf "Schalte Funzel ein" bis zum 2. Aufruf geht das so fix, dass die "Funzel noch nicht brennt".
Wenn die Rule wirklich nur hintereinander aufgerufen werden kann, dann macht eine Pause von 1 Sekunde
durchaus Sinn. Dann sollte die "Funzel brennen" und beim 2. Aufruf wird dies ja schon erkannt.

Ich versuch das mal mit der "Pause"

Danke

Torsten :-)

Re: Rules - 2 Instanzen parallel, wie verhindern

Verfasst: 18. Okt 2022 14:59
von BOP
Dann würde ich aber ggf. mal bei dem Aufrufer nachforschen, warum er den Befehl so schnell nacheinander sendet. Und dann dort ansetzen.
Wenn z.B. ein Event abgefangen wird, den Umweg über ein Item gehen.

Re: Rules - 2 Instanzen parallel, wie verhindern

Verfasst: 18. Okt 2022 15:49
von TorstenE
Warum das so schnell kommt, frag den Aquara Bewegungsmelder ;-)

Ich weis es nicht, aber ich hab die "Bremse" mit der 1 Sekunden-Pause
eingebaut und alles funktioniert wunderbar.

Es geht ja nicht darum, dass der Aquara so schnell sendet, sondern draum
dass ich z.B. eine "Funzel" abfrage ob diese schon leuchtet. D.h. nach dem
ersten Befehl (Aquara Bewegung) wird die "Funzel" eingeschaltet und beim 2. Befehl (Aquara Bewegung)
brennt das Licht noch nicht. Jetzt würde sie praktisch 2 x hintereinander schnell eingeschaltet.
Ja könnte einem egal sein, mir aber nicht, da ich z.B. auch abfrage ob die Lampe vor der 1. Bewegung
bereits eingeschaltet war. Und dann kommt alles durcheinander.

Aber wie gesagt, Pause hat den Effekt behoben

Trotzdem Danke

Torsten

Re: Rules - 2 Instanzen parallel, wie verhindern

Verfasst: 18. Okt 2022 19:07
von BOP
TorstenE hat geschrieben: 18. Okt 2022 15:49 Es geht ja nicht darum, dass der Aquara so schnell sendet, sondern draum
dass ich z.B. eine "Funzel" abfrage ob diese schon leuchtet. D.h. nach dem
ersten Befehl (Aquara Bewegung) wird die "Funzel" eingeschaltet und beim 2. Befehl (Aquara Bewegung)
brennt das Licht noch nicht.
Dann könnte es aber funktionieren an das Item über "Add Metadata" ein "Expiration Timer" hinzuzufügen. Das sollte verhindern, dass das Item innerhalb von ms zwischen ON und OFF wechselt.
Damit sparst du dir dann in der Rule den Timer.

Ob das funktioniert, wie gewünscht, hängt aber etwas vom Bewegungssender ab.