Rules - 2 Instanzen parallel, wie verhindern

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

Benutzeravatar
TorstenE
Beiträge: 237
Registriert: 12. Jan 2022 18:29
Answers: 4
Wohnort: Niederstaufen

Rules - 2 Instanzen parallel, wie verhindern

Beitrag 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
openHAB 4.0.4 auf einem Pi 4 mit openHABian

Benutzeravatar
peter-pan
Beiträge: 2568
Registriert: 28. Nov 2018 12:03
Answers: 25
Wohnort: Schwäbisch Gmünd

Re: Rules - 2 Instanzen parallel, wie verhindern

Beitrag von peter-pan »

..evtl. mit Timer. Schau dir mal die Beispiele von @udo1toni an.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.2 openhabian

Benutzeravatar
TorstenE
Beiträge: 237
Registriert: 12. Jan 2022 18:29
Answers: 4
Wohnort: Niederstaufen

Re: Rules - 2 Instanzen parallel, wie verhindern

Beitrag 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"
openHAB 4.0.4 auf einem Pi 4 mit openHABian

Benutzeravatar
udo1toni
Beiträge: 13948
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Rules - 2 Instanzen parallel, wie verhindern

Beitrag 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.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Mclupo
Beiträge: 178
Registriert: 6. Jun 2020 20:55
Answers: 2
Wohnort: Kirchheim Teck

Re: Rules - 2 Instanzen parallel, wie verhindern

Beitrag 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
OH 3.4.2 auf Raspi 4 mit Aeotec z-wave Stick gen 5+ und zigbee conbee II

Benutzeravatar
udo1toni
Beiträge: 13948
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Rules - 2 Instanzen parallel, wie verhindern

Beitrag 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
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
TorstenE
Beiträge: 237
Registriert: 12. Jan 2022 18:29
Answers: 4
Wohnort: Niederstaufen

Re: Rules - 2 Instanzen parallel, wie verhindern

Beitrag 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 :-)
openHAB 4.0.4 auf einem Pi 4 mit openHABian

BOP
Beiträge: 197
Registriert: 23. Sep 2018 19:43
Answers: 1

Re: Rules - 2 Instanzen parallel, wie verhindern

Beitrag 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.

Benutzeravatar
TorstenE
Beiträge: 237
Registriert: 12. Jan 2022 18:29
Answers: 4
Wohnort: Niederstaufen

Re: Rules - 2 Instanzen parallel, wie verhindern

Beitrag 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
openHAB 4.0.4 auf einem Pi 4 mit openHABian

BOP
Beiträge: 197
Registriert: 23. Sep 2018 19:43
Answers: 1

Re: Rules - 2 Instanzen parallel, wie verhindern

Beitrag 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.

Antworten