Seite 1 von 1

Auslösen von rules beim Neustart verhindern

Verfasst: 6. Sep 2019 21:06
von BtBread
Hallo.

Vielleicht nochmal ne Grundlagenfrage, die ich nicht ergooglet bekomme:
Wie kann ich beim Neustart verhindern, dass Rules ausgelöst werden?
Also Items wechseln von NULL oder UNDEF to irgendein Wert und schon kommt die Rule "when item changed".
Ist nicht schlimm, aber mir gefällts nicht.
Es bringt auch nichts, wenn ich die Werte in einer Rule "when System started" auf den Wert OFF oder so setze. Die nachfolgende Rule wegen Item Änderung kommt dann trotzdem.
Geht das irgendwie: einen definierten Zustand am Anfang vorgeben, ohne gleich alle Rules mal durchzulaufen?

Vielen Dank und schönen Abend.

Re: Auslösen von rules beim Neustart verhindern

Verfasst: 6. Sep 2019 21:30
von udo1toni
Den Trigger selbst kannst Du nicht verhindern, ebenso natürlich nicht, dass die Rule los läuft. Wohl kannst Du aber in der Rule prüfen, ob der alte Wert NULL war und die Rule damit abbrechen lassen:

Code: Alles auswählen

rule "testrule"
when
    Item MyItem changed
then
    if(previousState == NULL) return;
    logInfo("test","Die Rule wurde getriggert, alter Wert {}, aktueller Wert {}",previousState,MyItem.state)
end
Anzumerken ist vielleicht noch, dass previousState etwas anderes ist, als MyItem.previousState, für Letzteres wird eine laufende Persistence benötigt, für Ersteres nicht, denn previousState ist eine implizite Variable, die immer bei changed als Trigger zur Verfügung steht.

EDIT: es muss implizit heißen, nicht explizit...

Re: Auslösen von rules beim Neustart verhindern

Verfasst: 6. Sep 2019 22:33
von BtBread
super! Vielen Dank.
Werde die Rules (mal wieder) alle überarbeiten.
Schönen Abend noch.

Re: Auslösen von rules beim Neustart verhindern

Verfasst: 6. Sep 2019 22:40
von BtBread
sorry. doch noch ne Frage.
Sie verhält es sich bei

when
Item ITEM1 changed to OPEN
or
Item ITEM2 changed to OPEN

was steht dann in PreviousState? Der Wert von Item1 oder der von Item2?

Re: Auslösen von rules beim Neustart verhindern

Verfasst: 6. Sep 2019 23:17
von peter-pan
Das müsste eigentlich der Wert von dem Item sein, der den Trigger ausgelöst hat. Den kannst du auch abfragen wie den "previousState". Der heisst "triggeringItem".
z.B.:

Code: Alles auswählen

        logWarn("windchill"," Triggering Item: {} Status: {}",triggeringItem.name, triggeringItem.state) 

Re: Auslösen von rules beim Neustart verhindern

Verfasst: 7. Sep 2019 07:04
von udo1toni
Es ist unerheblich, ob der Trigger eingeschränkt wird, die implizite Variable ist immer gesetzt.
Die impliziten Variablen werden unmittelbar vor dem Abarbeiten der Rule gesetzt, logischerweise immer durch das auslösende Ereignis.
previousState enthält also den alten Wert des Items, welches die Rule getriggert hat.

Es gibt noch weitere implizite Variablen (Siehe hier: https://www.openhab.org/docs/configurat ... tion-block)

receivedCommand - Ist verfügbar, sobald die Rule mindestens einen Trigger received command hat.
previousState - Ist verfügbar, sobald die Rule mindestens einen Trigger changed hat.
newState - Ist verfügbar, sobald die Rule mindestens einen Trigger changed oder received update hat.
triggeringItem - Ist verfügbar, sobald die Rule mindestens einen Trigger received command, changed oder received update hat.
receivedEvent - Ist verfügbar, sobald die Rule mindestens einen channel-basierten Trigger hat.

Wenn man eine Rule baut, die unterschiedliche Trigger hat, kann man über diese Variablen auch gut zwischen den verschiedenen Triggern unterscheiden, da z.B. triggeringItem auf null gesetzt ist, falls die Rule durch Time cron, System started oder Channel triggered getriggerrt wurde. Entsprechendes ergibt sich für die anderen Variablen.
Man kann auch gut erkennen, dass (mindestens) noch eine implizite Variable fehlt, nämlich triggeringChannel.