Licht in Garage beim öffnen des Tores ab *sunset

Begonnen von eberlrudi, 20 September 2018, 22:30:53

Vorheriges Thema - Nächstes Thema

eberlrudi

Hallo liebe FHEMler

Ich bräuchte kurz Hilfe bei der Umsetzung meines Notifys...


Der Plan:

Es soll wenn es draußen dunkel ist das Garagenlicht beim öffnen des Tores für 5 Minuten angehen. Somit wäre die Garage beim aussteigen aus dem Auto beleuchtet.
Dafür habe ich am Tor einen Optischen Homematic-Fensterkontakt und für das Licht einen Homematic Hutschienen-Aktor verbaut.
Beides funktioniert natürlich einwandfrei. "Sunset" greife ich von Yahoo ab. Damit schaltet seit 2 Jahren erfolgreich meine Wegbeleuchtung automatisch und zuverlässig.

Ich habe dafür ein Notify angelegt. Leider klappt es nicht. Es wäre toll, wenn jemand mir einen Schups in die richtige Richtung geben könnte. Oder sind mehrere Bedingungen besser mit "Doif" zu lösen?...



if ({*sunset}  && {Garagentor:open})  set Licht_Garage on-for-timer 300

Pfriemler

Das klappt sowohl mit notify als auch mit DOIF. Ich bin allerdings ein DOIF-Mensch.
Leider ist die Definition unvollständig - ein Notify triggert auf ein Event. Ich würde hier Garagentor:open nehmen. Im Ausführungsteil wird dann nur auf Helligkeit geprüft und bei Bedarf geschaltet.
Kleiner Schönheitsfehler denkbar: Wenn der HM-Türsensor kein event-on-change-reading gesetzt hat, würde so auch im Dunkeln bei seinen zyklischen Statusmeldungen das Licht eingeschaltet werden, wenn das Tor länger offen ist.
"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."

Ellert

Mit DOIF

{if ([{sunset}-00:00]  and [Garagentor:open]) {fhem "set Licht_Garage on-for-timer 300"}}

eberlrudi

#3
Vielen Dank für die schnellen Antworten.

Leider klappt das Doif {if ([{sunset}-00:00]  and [Garagentor:open]) {fhem "set Licht_Garage on-for-timer 300"}} auch nicht...

Schreibweisen sind korrekt und der Aktor und Sensor funktionieren auch...
Mit Doif bin ich nicht so bewandert. wofür ist {sunset}-00:00?

Beta-User

#4
Livebeispiel für ein notify:defmod Licht_Tuer_unten notify Tuer_unten:ope.* {if (ReadingsVal("Bewegungsmelder_1","brightness","100")<80) {fhem( "set Aussenlicht_Garage on-for-timer 300")}}
Kann man aber genausogut mit isday() machen (https://wiki.fhem.de/wiki/SUNRISE_EL)
Sollte dann ungetestet und mit invertierter Darstellung, da einfache Abfrage so aussehen:
defmod Licht_Tuer_unten notify Tuer_unten:ope.* { fhem "set Aussenlicht_Garage on-for-timer 300" if !isday()"}

Gruß, Beta-User

EDIT: isday() invertiert, soll ja nachts passieren, nicht tags...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Ellert

#5
Zitat von: eberlrudi am 20 September 2018, 23:11:51
Vielen Dank für die schnellen Antworten.

Leider klappt das Doif {if ([{sunset}-00:00]  and [Garagentor:open]) {fhem "set Licht_Garage on-for-timer 300"}} auch nicht...

Schreibweisen sind korrekt und der Aktor und Sensor funktionieren auch...
Mit Doif bin ich nicht so bewandert. wofür ist {sunset}-00:00?

[Garagentor:open] hätte als Eventtrigger formuliert werden sollen ["^Garagentor$:^open$"], hättest Du nachlesen können https://commandref.fhem.de/commandref_DE.html#DOIF_Ereignissteuerung_ueber_Auswertung_von_Events und https://commandref.fhem.de/commandref_DE.html#DOIF_Indirekten_Zeitangaben

Hierif ({*sunset}  && {Garagentor:open}) stimmt eigentlich nichts, ich befürchte Du musst Dir die Syntax des Event- und Timehandlers Deiner Wahl noch einmal gründlich ansehen.

Wo hast Du diese {*sunset}Schreibweise her  und wo hast Du das  {Garagentor:open} gelernt?

Gasmast3r

#6
So habe ich das gemacht

([?Lichtsteuerung:light] < 3 and [ESPEasy_Sonoff11_GARAGE:"^Tor_auf:.1$"]) (set ESPEasy_sonoff15_PUMP on)

Dazu noch ein Doif wenn Garage zu Licht aus

Pfriemler

Nochmal von vorn. Ich guck mal auf die Anzahl Beiträge des Themenerstellers ...  :)

Zitat von: eberlrudi am 20 September 2018, 22:30:53
Es soll wenn es draußen dunkel ist das Garagenlicht beim öffnen des Tores für 5 Minuten angehen.
...
if ({*sunset}  && {Garagentor:open})  set Licht_Garage on-for-timer 300

Die Denkweise ist für eine lineare Programmierung richtig, nicht aber für eine ereignisbasierte wie sie in FHEM üblich ist. Ein so geschriebenes Progrämmchen muss man anderweitig regelmäßig aufrufen, etwa jede Minute ... was natürlich volliger Blödsinn ist. Denn um auf ein Ereignis zeitnah zu reagieren, kann man das Ereignis selbst als Auslöser des Programms wählen.

Das Ereignis ist in diesem Fall nicht, dass es dunkel ist, sondern dass das Tor aufgeht. In FHEM äußert sich das so, dass der Sensor am Tor "open" meldet. Das tut er immer wenn sich sein Zustand ändert oder wenn es Zeit ist ein Lebenszeichen abzugeben (im Falle des optischen HM-Sensors). Deswegen werden alle Routinen, die nur auf den Zustand "open" reagieren, ungefähr jede Stunde erneut ausgeführt werden, weil der HM-Sensor dann seinen Status unaufgefordert erneut sendet. Das war es, was ich mit einer längeren Öffnungszeit und dem erneuten Einschalten des Aktors meinte. Das Problem ist nicht theoretischer Natur: Arbeitest Du nachts in der Garage bei offenem Tor und Licht, würde so nach einer guten Stunde das Licht ausgehen (genau: nach spätestens 75 Minuten), weil dann ein etwaig dauerhaft eingeschaltetes Licht durch die Routine auf 5 Minuten herunterbegrenzt wurde und danach eben aus geht. Deswegen sollte man in diesem Fall am HM-Sensor die Ereigniserzeugung mit dem Attribut event-on-change-reading auf jede Änderung des Torstatus begrenzen. So wird in diesem Fall die ereignisbasierte Routine genau einmal ausgeführt, wenn sich nämlich der Status des Tores von irgendwas auf "open" ändert.

Erst dann kümmert man sich um die Dunkelheit. Das hat Beta-User bereits beschrieben, allerdings in der für perl typischen, jedoch für jemanden aus anderer Programmierumgebung nicht sofort verständlichen Schreibweise (obgleich das Konstrukt viel besser an der menschlichen Sprache ist als vieles andere!):
defmod Licht_Garage_Nachts_Auto notify Garagentor:open.* { fhem "set Licht_Garage on-for-timer 300" if !isday()}
"Wenn das Tor aufgegangen ist, übergib FHEM den Befehl: "Schalte das Licht in der Garage ein",  aber nur wenn es nicht Tag ist."
In genau dieser Reihung der Anführungszeichen, d.h. die Prüfung auf Tag findet im perl-Teil des Notify statt.

Ich nutze allerdings nicht isday, sondern einen Helligkeitssensor am Haus.
defmod di_GarageLEDLicht_Automatik DOIF ([GaragentorSensor] ne "closed" and [?HM_UWS1:luminosity] < 500) (set GarageLEDLampe on-for-timer 600)\
DOELSEIF ([GaragentorSensor] eq "closed") (set GarageLEDLampe off)
attr di_GarageLEDLicht_Automatik cmdState AutoEin|AutoAus
attr di_GarageLEDLicht_Automatik do always

Das ist nicht sauber, weil es bei allen Events des GaragentorSensor angeworfen wird, aber es liest sich einfach besser... ;)
Besser ist es mit den "^...$" ... aber wie sieht denn das aus ...

"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."

Beta-User

Nachtrag: Sorry, ich habe ein " im code unterschlagen, als ich das "live-Beispiel" modifiziert habe.

Der ursprüngliche Code arbeitet übrigens auch mit einem Helligkeitswert, wie bei Pfriemler:
Zitat von: Beta-User am 20 September 2018, 23:40:19
defmod Licht_Tuer_unten notify Tuer_unten:ope.* {if (ReadingsVal("Bewegungsmelder_1","brightness","100")<80) {fhem( "set Aussenlicht_Garage on-for-timer 300")}}
In jedem Fall würde ich eine lokale Datenlage immer einem Internet-Wetterbericht für die Frage der Helligkeit vorziehen (Yahoo ändert hin und wieder seine API). Daher m.E. lieber isday() als yahoo.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Damian

Zitat von: Pfriemler am 21 September 2018, 14:14:43
nutze allerdings nicht isday, sondern einen Helligkeitssensor am Haus.
defmod di_GarageLEDLicht_Automatik DOIF ([GaragentorSensor] ne "closed" and [?HM_UWS1:luminosity] < 500) (set GarageLEDLampe on-for-timer 600)\
DOELSEIF ([GaragentorSensor] eq "closed") (set GarageLEDLampe off)
attr di_GarageLEDLicht_Automatik cmdState AutoEin|AutoAus
attr di_GarageLEDLicht_Automatik do always

Das ist nicht sauber, weil es bei allen Events des GaragentorSensor angeworfen wird, aber es liest sich einfach besser... ;)
Besser ist es mit den "^...$" ... aber wie sieht denn das aus ...

mit [GaragentorSensor:state] wird das Modul neuerdings nur noch getriggert, wenn sich der Status ändert - das sieht doch gar nicht so schlimm aus ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Zitat von: eberlrudi am 20 September 2018, 23:11:51
Vielen Dank für die schnellen Antworten.

Leider klappt das Doif {if ([{sunset}-00:00]  and [Garagentor:open]) {fhem "set Licht_Garage on-for-timer 300"}} auch nicht...

Schreibweisen sind korrekt und der Aktor und Sensor funktionieren auch...
Mit Doif bin ich nicht so bewandert. wofür ist {sunset}-00:00?

Es war noch ein Fehler drin, ich habe eine korrigierte DOIF-Version hochgeladen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

eberlrudi

#11
Ich hatte wohl vergessen, dass ich einen Alias auf den Autor gesetzt habe...

mit {if ([Garagentor:open] and [{sunset}-00:00]) {fhem "set HM_5D7839 on-for-timer 300"}}

bekomme ich folgenden Fehler:

timer_01_c01         error: the function "*sunset" must return a timespec and not *main::sunset.

Wo ist denn da der Hund begraben?

TomLee

Zitat von: Damian am 21 September 2018, 15:31:52
Es war noch ein Fehler drin, ich habe eine korrigierte DOIF-Version hochgeladen.

eberlrudi

Vielen Dank
Tut mir leid, dass ich das fragen muss. Aber wohin hochgeladen?