[gelöst] Lampensteuerung mit DOIF und DOELSEIF

Begonnen von WhyTea, 05 September 2017, 08:29:51

Vorheriges Thema - Nächstes Thema

WhyTea

Moin
Ich habe ein eigentlich simples Problem und glaube sehe gerade den Wald vor lauter Bäumen nicht.

Ich möchte das meine Lampen auf der Terasse an sind wenn es dunkel ist und die Terrassentür nicht geschlossen ist.

define EG_WZ_di_Terassenlicht DOIF ([EG_WZ_Terassentuer] eq "open" and [CP_Bewegung:brightness] < 75) (set EG_WZ_Terassenlicht on)\
DOELSEIF ([EG_WZ_Terassenlicht] ne "off") (set EG_WZ_Terassenlicht off)
attr EG_WZ_di_Terassenlicht do always
attr EG_WZ_di_Terassenlicht room EG_Wohnzimmer


So habe ich es versucht aber es verhält sich leider nicht wie erwartet. Das Licht geht an und sofort wieder aus. Wenn es dunkel ist und ich die Tür öffne. :-(

Wenn ich das DOELSEIF durch ein DOELSE ersetze funktioniert es wie gewünscht aber im Log sehe ich alle 5 Minuten einen Logeintrag das er das Licht ausschaltet.
define EG_WZ_di_Terassenlicht DOIF ([EG_WZ_Terassentuer] eq "open" and [CP_Bewegung:brightness] < 75) (set EG_WZ_Terassenlicht on)\
DOELSE (set EG_WZ_Terassenlicht off)
attr EG_WZ_di_Terassenlicht do always
attr EG_WZ_di_Terassenlicht room EG_Wohnzimmer


Kann mir jemand saghen wo mein Fehler ist?

Gruß
Daniel

CoolTux

Im Moment reagiert das DOIF auf alles. Selbst wenn nur eine Batteriestatus vom Kontakt an der Terassentür abgefragt wird reagirt Dein DOIF und prüft.
Ich würde auf ein Ereignis reagieren (siehe Commandref).


([EG_WZ_Terassentuer:"open"] and [?CP_Bewegung:brightness] < 75) (set EG_WZ_Terassenlicht on) ELSE (set EG_WZ_Terassenlicht:FILTER=STATE!=off off)


Hier wird erstmal lediglich auf das open Event der Terassentür reagiert und der Helligkeitssensor wird nur abgefragt.
Bitte nicht einfach ungeprüft übernehmen sondern versuchen nach zu vollziehen an Hand der Commandref
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

WhyTea

Den ersten Teil Deiner Änderung verstehe ich. Statt mit eq zu arbeiten fragst Du direkt den Status ab.

Das ? habe ich bewusst weg gelassen da es ja auch sein kann das die Tür schon auf ist wenn es dunkel wird. Dann sollen die Lampen natürlich auch an gehen.

Warum nur ELSE, laut Commandref sollte das doch DOELSE sein, oder?

Den letzten Teil finde ich sehr interessant. ;-) Du ersetzt mit FILTER=STATE!=off mein ([EG_WZ_Terassenlicht] ne "off") und kannst so das DOELSEIF gegen ELSE ersetzen.
Wo ist der Vorteil das so zu tun?

CoolTux

Zitat von: WhyTea am 05 September 2017, 08:58:22
Den ersten Teil Deiner Änderung verstehe ich. Statt mit eq zu arbeiten fragst Du direkt den Status ab.

Das ? habe ich bewusst weg gelassen da es ja auch sein kann das die Tür schon auf ist wenn es dunkel wird. Dann sollen die Lampen natürlich auch an gehen.

Warum nur ELSE, laut Commandref sollte das doch DOELSE sein, oder?

Den letzten Teil finde ich sehr interessant. ;-) Du ersetzt mit FILTER=STATE!=off mein ([EG_WZ_Terassenlicht] ne "off") und kannst so das DOELSEIF gegen ELSE ersetzen.
Wo ist der Vorteil das so zu tun?

Ich kenne DOIF nicht wirklich so gut. Es wird also in der Tat DOELSE heißen, war mir da unsicher.
Ich Frage den Status nicht ab, ich reagiere auf ein Ereignis/Event. Also nur wenn tatsächlich dieses Event eintritt springt das DOIF an.
Kurz zum FILTER. Das ist nichts DOIF spezielles sondern kommt von FHEM. Du kannst bei einem Schaltbefehlt (set) eine Filterabfrage machen. Diese bezieht sich aber immer nur auf das Device wo Du auch den set machen willst. So kannst Du zum Beispiel abfragen ob die Lampe aus ist und nur dann soll er den Schaltbefehl aus senden. Das kann helfen unnötigen Datenverkehr zwischen FHEM und dem Controler des Endgerätes zu vermeiden.

Schau mal bitte ob es so bei Dir geht

( ([EG_WZ_Terassentuer:"open"] and [?CP_Bewegung:brightness] < 75) or (["CP_Bewegung:brightness",1000] < 75 and [?EG_WZ_Terassentuer] eq "open") ) (set EG_WZ_Terassenlicht:FILTER=STATE!=on on) DOELSE (set EG_WZ_Terassenlicht:FILTER=STATE!=off off)


Warum mache ich das so. Ich finde es sauberer weitestgehend auf Eventbasis zu arbeiten. Nun kann nicht gleichzeitig ein Event Tür open kommen und ein Event brightness. Also wäre eine solche Bedingung immer unwahr. Daher zwei and Einheiten mit einem or verbunden. Ich behauote mal so sollte es gehen. Ungetestet

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

WhyTea

Es funktioniert!  ;D Danke!

define EG_WZ_di_Terassenlicht DOIF (([EG_WZ_Terassentuer:"open"] and [?CP_Bewegung:brightness] < 75) or (["CP_Bewegung:brightness",1000] < 75 and [?EG_WZ_Terassentuer] eq "open")) (set EG_WZ_Terassenlicht:FILTER=STATE!=on on)\
DOELSE (set EG_WZ_Terassenlicht:FILTER=STATE!=off off)
attr EG_WZ_di_Terassenlicht do always
attr EG_WZ_di_Terassenlicht room EG_Wohnzimmer