Seite 1 von 1

Zyklische "rule" Bearbeitung unregelmäßig

Verfasst: 25. Okt 2020 17:46
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

Re: Zyklische "rule" Bearbeitung unregelmäßig

Verfasst: 25. Okt 2020 21:38
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.