Ich nehme an, das Item
Garagentor_Status ist ein Rollershutter Item, welches als ungebunden ist und durch die Neigungssensoren (mittels Rule) exakt auf die Werte 0, 50 oder 100 gesetzt wird. Ich gehe davon aus, dass Du dieses Item für ein dynamische Icon verwendest.
Mein Tipp für diese Rule: erstelle zu Beginn eine Boolean Variable, die
false ist, wenn der Status des Items 100 ist. Damit kannst Du anschließend an den entsprechenden Stellen den Code vereinfachen.
Weiter... das Item
R_Urlaub kann (ordnungsgemäße Funktion von openHAB mal vorausgesetzt) nur zwei Status annehmen, nämlich
ON oder
OFF. Es ergibt keinen Sinn, hier in zwei Teilen einer if-Anweisung jeweils auf das Gegenteil zu prüfen (insbesondere, wenn Du beide Male mit
!= prüfst, das beinhaltet dann im Zweifel auch noch den dritten möglichen Status
NULL, aber für beide Schleifenteile. Lass also die Bedingung im else-Teil einfach weg.
Die Uhrzeit können wir genauso vereinfachen, wie die Prüfung auf geschlossen/offen, also eine weitere Variable, welche false ist, wenn wir uns außerhalb der Zeitspanne befinden.
Wenn wir den bestehenden Code auf diese Weise vereinfachen, und die eigentlichen Aktionen mal kurz durch Aktionskommentare ersetzen, bleibt folgendes Gerüst übrig:
Code: Alles auswählen
var things = Java.type('org.openhab.core.model.script.actions.Things');
var bOpen = true
var bTime = false
if(items.getItem('Garagentor_Status').state == '100') bOpen = false
if(time.ZonedDateTime.now.hour >= 21 || time.ZonedDateTime.now.hour < 6) bTime = true
if (items.getItem('R_Urlaub').state != 'ON') {
if (bOpen) {
if (bTime) // blau 100
} else if (bTime && !bOpen) // normaler Status
else if (bOpen) {
// blau
// timer
}
} else
if (bOpen) // telegramm
Jetzt kannst Du ganz gut sehen, dass Deine Bedingungen keinen Sinn ergeben:
Wenn kein Urlaub, prüfst Du, ob das Tor offen ist. Ist das der Fall, wird geprüft, ob wir uns im Zeitfenster befinden und gegebenenfalls das blaue Licht eingeschaltet. Danach folgt ein else, so dass in diesem Fall nichts weiter passiert (die Bedingung bOpen ist ja schon erfüllt, also wird abgebrochen. )
Ist das Tor nicht offen und wir befinden uns im Zeitfenster, so wird auf normalen Zustand geschaltet.
Die dritte Bedingung wird also nur erreicht, wenn das Tor geschlossen ist und wir uns außerhalb des Zeitfensters befinden. Und nun prüfst Du, ob das Tor offen ist, was aber nicht der Fall sein kann -> die Bedingung ist an dieser Stelle der Rule niemals erfüllt.
Der "bessere" Aufbau des Codes:
Code: Alles auswählen
var things = Java.type('org.openhab.core.model.script.actions.Things');
var bOpen = true
var bTime = false
if(items.getItem('Garagentor_Status').state == '100') bOpen = false
if(time.ZonedDateTime.now.hour >= 21 || time.ZonedDateTime.now.hour < 6) bTime = true
if (items.getItem('R_Urlaub').state == 'ON') {
if(bOpen) { // Telegramm }
} else {
if(bTime) {
if(bOpen) { // Blau }
else { // normal }
} else {
if(bOpen) { // blinken }
else { // aus }
}
}
Fange mit den einfachsten Fällen an, Urlaub oder kein Urlaub.
Im Fall Urlaub prüfst Du im Do-Teil, ob offen und sendest in diesem Fall das Telegramm
Im Fall kein Urlaub unterscheidest Du ob das Zeitfenster erfüllt ist oder nicht.
Falls das Zeitfenster erfüllt ist, prüfst Du auf offen oder nicht offen und reagierst entsprechend.
Falls das Zeitfenster nicht erfüllt ist, prüfst Du auf offen oder nicht offen und reagierst entsprechend.
Baue zuerst die Abfragen, bevor Du irgendwelche Aktionen einbaust. In der Blockly Ansicht wird es vermutlich keine Kommentarfunktion geben, aber die Anzahl der Möglichkeiten ist ja begrenzt

Wichtig ist, dass Du für jeden möglichen Fall einen "Ausgang" in der Logik hast, der auch sicher erreicht wird. Man kann diese Abfragen auch mit AND und ODER erreichen, das macht den Aufbau aber komplizierter und man gewinnt dabei nichts.
Ob der Timer Code so passt, kann ich nicht beurteilen

da ich kein Blockly verwende...