Hallo,
ich habe seit langem je ein DOIF für jede Jalousie oder Rolladen zur Beschattungssteuerung im Einsatz. Es betätigt jeweils aufgrund verschiedener Argumente die Jalousien/Rolläden und hat bisher immer zuverlässig funktioniert. Dies ist ein Beispiel für die Jalousie Festverglasung SüdWest, allerdings nur die modifizierten Teile:
([?du_Rollo_Master] ne "aus" and [du_Tageslicht] eq "dunkel" and [?Jal_WZ_Fest_SuedWest_03:level] > 3) (set Jal_WZ_Fest_SuedWest_03 level 3) ##1 Abends schliessen
DOELSEIF ([Ga_UmweltSen:windSpeed] > 35) (set Jal_WZ_Fest_SuedWest_03 level 100) ## Öffnen, wenn Windgeschwindigkeit zu hoch
DOELSEIF ([23:59]) ##5 andere commands wieder freimachen
Jetzt habe ich ein weiteres dummy gesetzt, das alle Jalousien im Haus sofort schließen soll, wenn ein Button am Tablet (Bedientablet für die Hausautomatisation an der Wand, FHEM läuft auf einem Raspi 3B+) betätigt wird. Diesen dummy habe ich mit einer OR-Anwesiung verknüpft.
([du_tablet_Jal_switch] eq "zu" or ([?du_Rollo_Master] ne "aus" and [du_Tageslicht] eq "dunkel" and [?Jal_WZ_Fest_SuedWest_03:level] > 3)) (set Jal_WZ_Fest_SuedWest_03 level 3) ##1 Abends schliessen
DOELSEIF ([du_tablet_Jal_switch] eq "auf" or [Ga_UmweltSen:windSpeed] > 35) (set Jal_WZ_Fest_SuedWest_03 level 100) ## 5 Öffnen, wenn Windgeschwindigkeit zu hoch oder Befehl über Tablet
DOELSEIF ([23:59]) ##7 andere commands wieder freimachen
Scheinbar blockiert die Abfrage [du_tablet_Jal_switch] eq "XXX"
trotz der OR-Verknüpfung die ganze Anweisung. Bisher kenne ich OR so, dass entweder die eine Bedingung (nur Betätigung des Buttons) ODER die andere Bedingung (verknüpfte Argumente wie Tageslicht etc.) gelten muss. Hier scheint es anders zu sein und ich sehe den Grund und damit auch die Lösung nicht.
Hat mir jemand einen Tip?
Gruß Jürgen
[du_tablet_Jal_switch] eq "XXX"
heisst nicht "Betätigung des Buttons", sondern "Zustand des dummys".
So lange dieses auf "on" bleibt, sieht der DOIF die notwendigkeit nicht, den Zustand zu wechseln, weil diese Bedingung wahr bleibt.
Hier wäre eine Ereignistriggerung wahrscheinlich besser: [du_tablet_Jal_switch:"on"] or ...
https://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung_ueber_Auswertung_von_Events
Du hast recht. Ich wollte das Event (Befehl alle Jalousien schließen) abfragen und nicht den Zustand des Buttons.
Allerdings muss ich gestehen, dass ich mir der unterschiedlichen Bedeutung der Schreibweisen gar nicht bewußt war (immer noch Anfänger). Nichts desto trotz kenne ich aus meiner Programmierzeit (Assembler), dass eine OR-Bedingung zwei Befehle strikt trennt. Deswegen ist mir nicht klar, warum der Teil hinter der OR-Anwesiung nicht ausgeführt wird, weil der Teil vor der OR-Anweisung einen Zustand statt Event abfragt. Der erste Teil tritt doch bei Eintreten einer Bedingung des 2.ten Teils (Z.B. Tageslicht wird dunkel) gar nicht in Erscheinung?
Habe es jetzt mal geändert und bin gespannt, ob es morgen früh wie üblich weider hell wird im Haus. :)
Grüße Jürgen
Wenn [du_tablet_Jal_switch] eq "XXX"
wahr ist, dann ist [du_tablet_Jal_switch] eq "XXX" or egal was da steht
auch wahr.
Warum sollte DOIF weiter schauen? Er hat eine wahre Bedingung gefunden.
Zitat von: bmwfan am 05 Oktober 2020, 20:59:07
Du hast recht. Ich wollte das Event (Befehl alle Jalousien schließen) abfragen und nicht den Zustand des Buttons.
Allerdings muss ich gestehen, dass ich mir der unterschiedlichen Bedeutung der Schreibweisen gar nicht bewußt war (immer noch Anfänger). Nichts desto trotz kenne ich aus meiner Programmierzeit (Assembler), dass eine OR-Bedingung zwei Befehle strikt trennt. Deswegen ist mir nicht klar, warum der Teil hinter der OR-Anwesiung nicht ausgeführt wird, weil der Teil vor der OR-Anweisung einen Zustand statt Event abfragt. Der erste Teil tritt doch bei Eintreten einer Bedingung des 2.ten Teils (Z.B. Tageslicht wird dunkel) gar nicht in Erscheinung?
Habe es jetzt mal geändert und bin gespannt, ob es morgen früh wie üblich weider hell wird im Haus. :)
Grüße Jürgen
([du_tablet_Jal_switch] eq "zu" or ([?du_Rollo_Master] ne "aus" and [du_Tageslicht] eq "dunkel" and [?Jal_WZ_Fest_SuedWest_03:level] > 3))
du_Tageslist ist hier triggernd definiert, wenn du_Tageslicht irgend etwas liefert z. B. hell, dann wird die erste Bedingung komplett ausgewertet und wenn du_tablet_Jal_switch auf "zu" steht, dann ist die ganze Bedingung wegen or wahr und die restlichen Bedingung bzw. Zweige werden gar nicht mehr angepackt.
So langsam glaube ich es zu verstehen.
Ich dachte bisher bei einer OR-Verknüpfung wird nur der Teil ausgewertet, in dem sich der Triggerauslöser befindet.
So wie ich das nach Euren Erklärungen verstehe, löst irgendwo im Zweig ein Trigger aus und der ganze Zweig wird von "Links nach rechts" durchlaufen. Da ich die Abfrage [du_tablet_Jal_switch] eq "zu" vor dem Teil, in dem sich der Triggerauslöser befindet, plaziert habe, hört er nach der Zustandsabfrage des Tablet-Buttons auf und der Schließen-Befeht wird nicht ausgeführt.
In der jetzigen Schreibweise wird beim Durchlaufen des Zweigs dagegen abgefragt, ob ein Event von dem Button vorliegt und da das nicht der Fall ist, wird zum nächsten Teil, dem nach der OR-Verknüpfung, gegangen und korrekt die Jalousie geschlossen
Auf alle Fälle funktioniert es jetzt. Besten Dank an alle.
Jürgen