FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Jens__K am 13 September 2015, 01:15:56

Titel: DOIF Anfängerfrage
Beitrag von: Jens__K am 13 September 2015, 01:15:56
Tach!

Ich bin gerade dabei, mich mit DOIF zu beschäftigen.
Jetzt habe ich folgenden einfachen Fall:

Es gibt eine Wandschalter (HM-LC-Sw1PBU-FM), der die SofaBeleuchtung steuert.
Dieser Schalter heißt "SW.EG.Wohnzimmer.SofaBeleuchtung".

Dann habe ich eine Steckdose (HM-ES-PMSw1-Pl) mit Namen "VAR.Steckdose.01_Sw".
An dieser Steckdose ist eine Lampe im Flur angeschlossen.

Jetzt möchte ich, dass wenn die Lampe im Flur aus ist und die SofaBeleuchtung ausgeschaltet wird, die Lampe eingeschaltet wird.

Ich habe es mit folgendem DOIF versucht:
define XX.Test DOIF ([VAR.Steckdose.01_Sw] eq "off" and [SW.EG.Wohnzimmer.SofaBeleuchtung:?off]) (set VAR.Steckdose.01_Sw on)

Es tut zunächst auch das, was es soll.
Wenn die Lampe im Flur aus ist und die SofaBeleuchtung ausgeschaltet wird, geht die Lampe an.
Aber: Wenn die Lampe im Flur aus ist und die SofaBeleuchtung ebenfalls aus ist und EINgeschaltet wird, auch dann geht die Lampe an.

Auch mit einem zusätzlichen ? vor dem Device, das ich im TRUE Fall einschalte, geht es nicht.
define XX.Test DOIF ([?VAR.Steckdose.01_Sw] eq "off" and [SW.EG.Wohnzimmer.SofaBeleuchtung:?off]) (set VAR.Steckdose.01_Sw on)
Interessanterweise wird mit diesem Code die Lampe manchmal (!) nicht eingschaltet, wenn die SofaBeleuchtung ausgeschaltet wird, aber nicht immer. Ohne das ? ist das Verhalten immer gleich wie oben beschrieben. So ganz kann ich mir da keinen Reim drauf machen.

Kann mir jemand auf die Sprünge helfen?!?

Jens
Titel: Antw:DOIF Anfängerfrage
Beitrag von: Damian am 13 September 2015, 08:24:17
Zitat von: Jens__K am 13 September 2015, 01:15:56
Tach!

Ich bin gerade dabei, mich mit DOIF zu beschäftigen.
Jetzt habe ich folgenden einfachen Fall:

Es gibt eine Wandschalter (HM-LC-Sw1PBU-FM), der die SofaBeleuchtung steuert.
Dieser Schalter heißt "SW.EG.Wohnzimmer.SofaBeleuchtung".

Dann habe ich eine Steckdose (HM-ES-PMSw1-Pl) mit Namen "VAR.Steckdose.01_Sw".
An dieser Steckdose ist eine Lampe im Flur angeschlossen.

Jetzt möchte ich, dass wenn die Lampe im Flur aus ist und die SofaBeleuchtung ausgeschaltet wird, die Lampe eingeschaltet wird.

Ich habe es mit folgendem DOIF versucht:
define XX.Test DOIF ([VAR.Steckdose.01_Sw] eq "off" and [SW.EG.Wohnzimmer.SofaBeleuchtung:?off]) (set VAR.Steckdose.01_Sw on)

Es tut zunächst auch das, was es soll.
Wenn die Lampe im Flur aus ist und die SofaBeleuchtung ausgeschaltet wird, geht die Lampe an.
Aber: Wenn die Lampe im Flur aus ist und die SofaBeleuchtung ebenfalls aus ist und EINgeschaltet wird, auch dann geht die Lampe an.

Auch mit einem zusätzlichen ? vor dem Device, das ich im TRUE Fall einschalte, geht es nicht.
define XX.Test DOIF ([?VAR.Steckdose.01_Sw] eq "off" and [SW.EG.Wohnzimmer.SofaBeleuchtung:?off]) (set VAR.Steckdose.01_Sw on)
Interessanterweise wird mit diesem Code die Lampe manchmal (!) nicht eingschaltet, wenn die SofaBeleuchtung ausgeschaltet wird, aber nicht immer. Ohne das ? ist das Verhalten immer gleich wie oben beschrieben. So ganz kann ich mir da keinen Reim drauf machen.

Kann mir jemand auf die Sprünge helfen?!?

Jens

Das Modul wertet eigene Zustände aus und schaltet nur nach Bedarf. Du hast nur einen Zustand, der sich nicht ändert, daher wirst du das Attribut do always setzen müssen. Ansonsten noch mal die Commandref des Moduls gründlich studieren. Unter Ereignissteuerung steht:

ZitatWünscht man eine Ausführung des gleichen Befehls mehrfach nacheinander bei jedem Trigger, unabhängig davon welchen Zustand das DOIF-Modul hat, weil z. B. Garage nicht nur über die Fernbedienung geschaltet wird und dann muss man das per "do always"-Attribut angeben:

Gruß

Damian
Titel: Antw:DOIF Anfängerfrage
Beitrag von: Jens__K am 13 September 2015, 09:42:32
Hallo!

define XX.Test DOIF ([?VAR.Steckdose.01_Sw] eq "off" and [SW.EG.Wohnzimmer.SofaBeleuchtung:?off]) (set VAR.Steckdose.01_Sw on)
attr XX.Test DOIF do always


Auch mit dieser Kombination wird die Lampe eingeschaltet, wenn zuvor beide Devices aus waren und man die SofaBeleuchtung einschaltet.

Ich dachte, dass der Trigger in diesem Fall die Kombination aus a) dem aktuellen Zustand der Lampe/Steckdose ("off") und b) dem Event des Schalters "ausschalten" (":?off") ist.
Diese Kombination ist ja nicht wahr, wenn beide Aktoren aus sind und der eine EINgeschaltet wird (":?on"). Trotzdem wird in diesem Fall die Aktion ausgeführt.

[edit]
Es ist alles viel einfacher als ich gedacht habe.
define XX.Test DOIF ([?VAR.Steckdose.01_Sw] eq "off" and [SW.EG.Wohnzimmer.SofaBeleuchtung] eq "off") (set VAR.Steckdose.01_Sw on)
führt zum gewünschten Ergebnis. Dabei ist ein "do always" gar nicht nötig. Wichtig ist nur das "?" bei der Angabe des in der Aktion geschalteten Devices in der Bedingung, um eine Rekursion zu vermeiden. Fehlt das, kann man die Lampe nur ausschalten, wenn die SofaBeleuchtung EIN ist.