Zyklische "rule" Bearbeitung unregelmäßig

GUI Relevanten, PaperUI, BasicUI, HabPanel ...

Moderatoren: seppy, udo1toni

Antworten
franzda
Beiträge: 26
Registriert: 9. Jun 2019 21:12
Answers: 0

Zyklische "rule" Bearbeitung unregelmäßig

Beitrag von franzda »

Hallo Leute
Wie kann ich sicherstellen dass rules zyklisch richtig bearbeitet werden. bzw Werte richtig übernommen werden
Folgende "rules" habe ich

Code: Alles auswählen

rule "zylisch0"
when 
    Time cron  "0 */5 * ? * *"
then
    AEwert.postUpdate (0.0)
    AFwert.postUpdate (0.0)
    AGwert.postUpdate (0.0)
end



rule "zylisch1"
when 
    Time cron  "0 * * * * ?"
then
    AEwert.postUpdate (AEwert.state as Number + 1.0)
    AAwert.postUpdate (ENBW_Bezogen.state as Number - ACwert.state as Number)
    ABwert.postUpdate (ENBW_Geliefert.state as Number- ADwert.state as Number)
    ACwert.postUpdate (ENBW_Bezogen.state as Number)
    ADwert.postUpdate (ENBW_Geliefert.state as Number)
    AFwert.postUpdate (AFwert.state as Number + AAwert.state as Number )
    AGwert.postUpdate (AGwert.state as Number + ABwert.state as Number )
end
Und das ist das Protokoll dazu. Rules werden zwar durchlaufen aber scheinbar werden die Werte nicht übernommen obwohl protokolliert.
Jeder Fall ist anders! Zeitstempel zwar ok aber nicht der Wert!


Code: Alles auswählen

2020-10-25 17:07:00.025 [vent.ItemStateChangedEvent] - AEwert changed from 1.0 to 2.0
2020-10-25 17:08:00.023 [vent.ItemStateChangedEvent] - AEwert changed from 2.0 to 3.0
2020-10-25 17:09:00.021 [vent.ItemStateChangedEvent] - AEwert changed from 3.0 to 4.0
2020-10-25 17:10:00.019 [vent.ItemStateChangedEvent] - AEwert changed from 4.0 to 0.0
2020-10-25 17:10:00.059 [vent.ItemStateChangedEvent] - AEwert changed from 0.0 to 1.0
2020-10-25 17:11:00.020 [vent.ItemStateChangedEvent] - AEwert changed from 1.0 to 2.0
2020-10-25 17:12:00.016 [vent.ItemStateChangedEvent] - AEwert changed from 2.0 to 3.0
2020-10-25 17:13:00.021 [vent.ItemStateChangedEvent] - AEwert changed from 3.0 to 4.0
2020-10-25 17:14:00.023 [vent.ItemStateChangedEvent] - AEwert changed from 4.0 to 5.0
2020-10-25 17:15:00.025 [vent.ItemStateChangedEvent] - AEwert changed from 5.0 to 0.0
2020-10-25 17:15:00.042 [vent.ItemStateChangedEvent] - AEwert changed from 0.0 to 6.0
2020-10-25 17:16:00.025 [vent.ItemStateChangedEvent] - AEwert changed from 6.0 to 7.0
2020-10-25 17:17:00.019 [vent.ItemStateChangedEvent] - AEwert changed from 7.0 to 8.0
2020-10-25 17:18:00.016 [vent.ItemStateChangedEvent] - AEwert changed from 8.0 to 9.0
2020-10-25 17:19:00.026 [vent.ItemStateChangedEvent] - AEwert changed from 9.0 to 10.0
2020-10-25 17:20:00.018 [vent.ItemStateChangedEvent] - AEwert changed from 10.0 to 0.0
2020-10-25 17:20:00.061 [vent.ItemStateChangedEvent] - AEwert changed from 0.0 to 1.0
2020-10-25 17:21:00.023 [vent.ItemStateChangedEvent] - AEwert changed from 1.0 to 2.0
2020-10-25 17:22:00.019 [vent.ItemStateChangedEvent] - AEwert changed from 2.0 to 3.0

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

Re: Zyklische "rule" Bearbeitung unregelmäßig

Beitrag von udo1toni »

Ich sehe jetzt ehrlich gesagt kein unerwartetes Ergebnis.
Ich gehe mal davon aus, dass Du das Log auf AEwert gefiltert hast.
In der einen Rule (alle 5 Minuten) setzt Du den Status auf 0 Das sind diese Zeilen:

Code: Alles auswählen

2020-10-25 17:10:00.019 [vent.ItemStateChangedEvent] - AEwert changed from 4.0 to 0.0
2020-10-25 17:15:00.025 [vent.ItemStateChangedEvent] - AEwert changed from 5.0 to 0.0
2020-10-25 17:20:00.018 [vent.ItemStateChangedEvent] - AEwert changed from 10.0 to 0.0
Die andere Rule zählt den Status um 1 nach oben.
Beide Rules triggern zur vollen Minute, das heißt, strenggenommen zeitgleich (alle 5 Minuten) weshalb es im 5-Minuten-Rythmus zu einem nicht-deterministischen Verhalten kommt. (ich liebe Fremdworte, dieses wollte ich immer schon mal verwenden) ;)

Die Zugriffe auf die Item Status sind asynchron, es gibt keine garantierten Zugriffsreihenfolgen und erst recht keine garantierten Antwortzeiten. Das Auslesen des Status kann eine Millisekunde brauchen oder eine Stunde, genau wie das postUpdate eine Millisekunde oder eine Stunde brauchen kann. In der Realität wird der Zugriff maximal im unteren zweistelligen Millisekundenbereich liegen (also vielleicht 1-15 Millisekunden).

Auch die Ausführung der Rules kann nicht auf die Millisekunde genau getimet werden. openHAB ist ein Steuersystem, aber sicher nicht für millisekundengenaue Steuerungsaufgaben.

Es kann also sein, dass die 5-Minuten-Rule extrem schnell abgearbeitet wird, dann ist der Status bereits auf 0 gesetzt und die 1-Minuten-Rule zählt auf eins hoch:

Code: Alles auswählen

2020-10-25 17:10:00.059 [vent.ItemStateChangedEvent] - AEwert changed from 0.0 to 1.0
2020-10-25 17:20:00.061 [vent.ItemStateChangedEvent] - AEwert changed from 0.0 to 1.0
Es kann aber auch sein, dass die 1-Minuten-Rule den Status schon erfolgreich gelesen hat, bevor die 5-Minuten-Rule den Status geändert hat:

Code: Alles auswählen

2020-10-25 17:15:00.042 [vent.ItemStateChangedEvent] - AEwert changed from 0.0 to 6.0
Die pragmatische Lösung im vorliegenden Fall wäre, die Minutenrule z.B. erst zwei Sekunden nach der vollen Minuten zu triggern.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten