Seite 1 von 1

Items per Script schalten

Verfasst: 11. Jun 2021 16:01
von manes
irgendwie bin ich jetzt ein wenig verwirrt. Wenn ein ITEM von einem EVENT geschaltet wird (von OFF auf ON), wie schnell kann man dann auf den neuen Zustand des ICONS über ein SCRIPT zugreifen? Also EVENT wird ausgelöst, ICON wird auf ON geschaltet. Dann reagiert eine RULE, die ein Script aufruft um das ICON auf ON abzufragen.
Wobei mir noch eine weitere Frage hoch kommt. Wenn man in einer Rule nacheinander Scripte aufruft, werden die seriell, oder parallel abgearbeitet? Mit anderen Worten, wird jedes Script erst abgearbeitet und dann kommt das nächste dran, oder wie verhält sich das?

Re: Items per Script schalten

Verfasst: 11. Jun 2021 18:58
von udo1toni
openHAB arbeitet asynchron. Wenn wir von openHAB2 sprechen, dann stehen 5 + 2 Threads für die Abarbeitung von Rules zur Verfügung. Sprechen wir von openHAB3, so hat jede Rule ihren exklusiven Thread. Das heißt, wenn eine Rule gestartet wird und eine andere Rule ebenfalls gestartet wird, so werden diese Rules parallel abgearbeitet, bei OH2 maximal 7, bei OH3 alle.

Du hast leider einen Begriff eingeführt, der an dieser Stelle völlig verkehrt ist, nämlich Icon. Das tragische daran: Es gibt im Zusammenhang mit Items auch Icons, allerdings kannst Du gewöhnlich nicht darauf zugreifen, sondern es allenfalls manipulieren.

Was Du aber meinst (das geht aus dem Kontext hervor), ist der Status des Items.

Weiter: Ein Event schaltet gar nichts. Mit Event wird ein Ereignis bezeichnet. Es gibt verschiedene Ereignisse, welche im Zusammenhang mit Items, Channels oder auch als Systemevent auftreten können. Diese Ereignisse kann man als Trigger verwenden, um eine Rule zu starten.
Innerhalb einer Rule kann man mit dem Befehl sendCommand() einen Befehl an ein Item senden. Dieser Befehl wird dann vom Item an die angebundene Hardware gesendet. Wenn dies nicht abgeschaltet wurde, versucht openHAB außerdem, den wahrscheinlichen Status zu erraten, den das Item nach dem Senden des Befehls annehmen wird. In der Folge wird dieser Status dann aktiv gesetzt (dabei geht es um schnellere Reaktion der UI...)
Eigentlich sollte der Status aber als Rückmeldung von der Hardware kommen, die den Befehl ausführt.
Weiterhin kann man auch gezielt den Status eines Items setzen, das geschieht mit dem Befehl postUpdate(). Hier wird ausschließlich der Status des Items geändert.

Ich habe das oben schon erwähnt: openHAB arbeitet asynchron. Das gilt ganz besonders auch für die Befehle sendCommand() und postUpdate().
Wenn Du innerhalb einer Rule einen dieser beiden Befehle verwendest (gleich ob als Action oder als Methode), löst die Rule die entsprechende Funktion im Core von openHAB aus und fährt unmittelbar mit der Abarbeitung des Codes fort, die Rule wartet nicht auf ein Ergebnis.
Insbesondere im Fall von sendCommand() kommt es fast sicher zu Verzögerungen, selbst wenn das autoupdate (hab ich oben beschrieben) aktiv ist. Die Befehlsfolge ist ja Kommando senden -> neuen Status errechnen -> neuen Status setzen.
Aber selbst bei postUpdate() gibt es keine garantierten Antwortzeiten, der Core braucht die Zeit, die er braucht, um den Status zu setzen.
Im realen Betrieb werden nur selten mehr als eine einstellige Zahl Millisekunden vergehen, bis der neue Status im Item vorliegt, aber das reicht, um mehrere Dutzend Befehle abzuarbeiten (die Rules DSL geht eher gemütlich vor).