Rules - 2 Instanzen parallel, wie verhindern
- TorstenE
- Beiträge: 237
- Registriert: 12. Jan 2022 18:29
- Wohnort: Niederstaufen
Rules - 2 Instanzen parallel, wie verhindern
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
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
- peter-pan
- Beiträge: 2568
- Registriert: 28. Nov 2018 12:03
- Wohnort: Schwäbisch Gmünd
Re: Rules - 2 Instanzen parallel, wie verhindern
..evtl. mit Timer. Schau dir mal die Beispiele von @udo1toni an.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.2 openhabian
- TorstenE
- Beiträge: 237
- Registriert: 12. Jan 2022 18:29
- Wohnort: Niederstaufen
Re: Rules - 2 Instanzen parallel, wie verhindern
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"
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
- udo1toni
- Beiträge: 13948
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Rules - 2 Instanzen parallel, wie verhindern
Welche Version von openHAB nutzt Du? Wie hast Du die Rule angelegt?
Die schnellste Methode, Doppeltrigger zu verhindern:
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.
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
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
-
- Beiträge: 178
- Registriert: 6. Jun 2020 20:55
- Wohnort: Kirchheim Teck
Re: Rules - 2 Instanzen parallel, wie verhindern
Hier ein Kommentar aus dem englischen Forum. Die selbe Rule kann nur nacheinander ablaufenRich 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.
OH 3.4.2 auf Raspi 4 mit Aeotec z-wave Stick gen 5+ und zigbee conbee II
- udo1toni
- Beiträge: 13948
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Rules - 2 Instanzen parallel, wie verhindern
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
- TorstenE
- Beiträge: 237
- Registriert: 12. Jan 2022 18:29
- Wohnort: Niederstaufen
Re: Rules - 2 Instanzen parallel, wie verhindern
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
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
-
- Beiträge: 197
- Registriert: 23. Sep 2018 19:43
Re: Rules - 2 Instanzen parallel, wie verhindern
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.
Wenn z.B. ein Event abgefangen wird, den Umweg über ein Item gehen.
- TorstenE
- Beiträge: 237
- Registriert: 12. Jan 2022 18:29
- Wohnort: Niederstaufen
Re: Rules - 2 Instanzen parallel, wie verhindern
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
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
-
- Beiträge: 197
- Registriert: 23. Sep 2018 19:43
Re: Rules - 2 Instanzen parallel, wie verhindern
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.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.
Damit sparst du dir dann in der Rule den Timer.
Ob das funktioniert, wie gewünscht, hängt aber etwas vom Bewegungssender ab.