Hauptmenü

DOIF Frage

Begonnen von aplatac, 02 Februar 2017, 23:58:12

Vorheriges Thema - Nächstes Thema

aplatac

Hallo,
ich habe eben ein DOIF um eine doelseif-Eben erweitert und nu hackelt es :(


define TV_Licht DOIF ( [TV] eq "on" ) ( set HUEDevice6 off ) DOELSEIF ( [Tageslicht:twilight_weather] < 75 and [15:00-22:00] ) ( set HUEDevice6 on ) DOELSE ( set HUEDevice6 bri 16 )


TV ist ein dummy der per fhem2fhem vom Fernseher an und aus geschaltet wird. Um fhem2fhem testweise raus zu haben, hab ich es auch mit einem unabhängigen test-dummy versucht. Das DOIF reagiert zwar auf das einschalten des dummys und macht die Leuchte aus, aber nach ein paar Minuten geht sie wieder an obwohl TV weiterhin "on" ist und die beiden else nicht auslösen sollten. Wenn ich den Eventmoni mir ansehe, dann wird das von twilight getriggert, die mittlere Bedingung trifft nicht zu, weil später als 22:00h und das DOELSE löst aus aber warum wenn die Erste Bedingung bereits wahr ist?

vielen Dank

Ellert

Das ist das Standardverhalten des DOIF und ist dort Punkt 3 und 3.1 genauer erklärt.

aplatac

Hm, tut mir leid aber verstehe ich nicht. :(
Danach sollte doch die Verarbeitung nach dem ersten Wahrwerden (TV on) immer abgebrochen werden und es nicht in den zweiten oder letzten Zweig laufen.

aplatac

o.k. hab mir das jetzt dreimal angesehen, ist spät und ich bin krank also teste ich das erst morgen aber ich habe jetzt einen Verdacht: es liegt an der Ereignisauslösung, bzw. daran, dass der "ständig on TV" sich halt nicht ändert. Das twilight aber laufend was raushaut... und ich könnte das mit vorgestelltem ? ändern.

Ellert

Ich würde die 2. Bedingung sauber formulieren. Wenn Du nicht möchtest, dass das Licht angeht , wenn der TV an ist, solltest Du es in die Bedingung rein schreiben.

aplatac

Hi,
habe ich gemacht, bevor ich gestern das mit dem Fragezeichen gesehen habe. Ich prüfe jetzt in der 2. und 3. auf "TV off". Aber das hatte heute zur Folge, das die Lampe um 22:01 runter dimmt wurde obwohl der TV bis dahin noch nicht an war (blöder Sonderfall, nicht bedacht...). Ich glaube alle Auslöser sollten mit ? rausgenommen werden außer TV. Ich möchte nicht verhindern, dass das Licht angeht wenn der TV läuft, das kann in Sonderfällen mal von Hand geschaltet werden. Ich möchte dass die Leuchte beim TV-Einschalten aus geht und beim TV-Ausschalten wieder an, aber wenn es nach 22:00h ist nur gedimmt. Wenn kein TV läuft, keine Änderungen.

Ellert

Also grundsätzlich müstest Du für alle Fälle, die Du sprachlich formulierst eine logische Verküpfungerstellen und einen Bedingungszweig erstellen und diese eventuell gegenseitig  verriegeln indem Du auf den Status des DOIF prüfst.

Also allgemein:

Bedingung y and [$SELF] !~ "cmd_x"

aplatac

Ich hab mir diese $SELF-Zusammenhänge eben hier https://wiki.fhem.de/wiki/DOIF/partielle_Deaktivierung_der_Befehlsausführung,_Zurücksetzen_eines_Wait-Timers_mit_$SELF_oder_IsDisabled_verhindern,_im_Vergleich
angesehen und war überfordert. Ich glaube nicht, dass ich das genug verstehe ums einsetzen zu können. Ich müsste prüfen ob cmd=1 ausgeführt wurde bevor 2 oder 3 ausgeführt werden, richtig?

Ellert

Im Prinzip schon, Du solltest Dir erstmal klar werden, welche Zustände der Eingangsvariablen zu welchem Ergebnis führen sollen und zwar für alle Kombinationen.

Da Du 4 Eingangsgrössen genannt hast (TV eq on, Licht < 75,  15:00-22:00 und HUEDevice6 manuell on), gibt es 16 Möglichkeiten sie zu kombinieren.

Du könntest Dir eine Wahrheitstabelle erstellen und zu jeder Kombination der Eingangsgößen das Ergebnis schreiben.
Für jede Kombination zu der Du ein Ergebnis zu ordnest musst Du einen Bedingungszweig erstellen.
Alle Kombinationen deren Ergebnis Dir egal ist, fängst Du mit DOELSE ab

Das dann konstruierte DOIF ist dann die Grundlage, um unerwünsche Efekte über eine Verriegelung zu umgehen.

Das wäre ein systematischer Lösungsweg, wenn es intuitiv nicht klappt.