FHEM Forum

FHEM => Automatisierung => Thema gestartet von: eberlrudi am 20 September 2018, 22:30:53

Titel: Licht in Garage beim öffnen des Tores ab *sunset
Beitrag von: eberlrudi am 20 September 2018, 22:30:53
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
Titel: Antw:Licht in Garage beim öffnen des Tores ab *sunset
Beitrag von: Pfriemler am 20 September 2018, 22:58:22
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.
Titel: Antw:Licht in Garage beim öffnen des Tores ab *sunset
Beitrag von: Ellert am 20 September 2018, 23:03:27
Mit DOIF

{if ([{sunset}-00:00]  and [Garagentor:open]) {fhem "set Licht_Garage on-for-timer 300"}}
Titel: Antw:Licht in Garage beim öffnen des Tores ab *sunset
Beitrag 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?
Titel: Antw:Licht in Garage beim öffnen des Tores ab *sunset
Beitrag von: Beta-User am 20 September 2018, 23:40:19
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 (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...
Titel: Antw:Licht in Garage beim öffnen des Tores ab *sunset
Beitrag von: Ellert am 21 September 2018, 12:36:48
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?
Titel: Antw:Licht in Garage beim öffnen des Tores ab *sunset
Beitrag von: Gasmast3r am 21 September 2018, 13:29:40
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
Titel: Antw:Licht in Garage beim öffnen des Tores ab *sunset
Beitrag von: Pfriemler am 21 September 2018, 14:14:43
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 ...

Titel: Antw:Licht in Garage beim öffnen des Tores ab *sunset
Beitrag von: Beta-User am 21 September 2018, 14:55:50
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.
Titel: Antw:Licht in Garage beim öffnen des Tores ab *sunset
Beitrag von: Damian am 21 September 2018, 15:01:29
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 ;)
Titel: Antw:Licht in Garage beim öffnen des Tores ab *sunset
Beitrag von: Damian am 21 September 2018, 15:31:52
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.
Titel: Antw:Licht in Garage beim öffnen des Tores ab *sunset
Beitrag von: eberlrudi am 21 September 2018, 22:31:30
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?
Titel: Antw:Licht in Garage beim öffnen des Tores ab *sunset
Beitrag von: TomLee am 21 September 2018, 22:37:02
Zitat von: Damian am 21 September 2018, 15:31:52
Es war noch ein Fehler drin, ich habe eine korrigierte DOIF-Version hochgeladen.
Titel: Antw:Licht in Garage beim öffnen des Tores ab *sunset
Beitrag von: eberlrudi am 21 September 2018, 22:40:48
Vielen Dank
Tut mir leid, dass ich das fragen muss. Aber wohin hochgeladen?
Titel: Antw:Licht in Garage beim öffnen des Tores ab *sunset
Beitrag von: TomLee am 21 September 2018, 22:46:14
https://svn.fhem.de/fhem/trunk/fhem/FHEM/98_DOIF.pm (https://svn.fhem.de/fhem/trunk/fhem/FHEM/98_DOIF.pm)
Titel: Antw:Licht in Garage beim öffnen des Tores ab *sunset
Beitrag von: Prof. Dr. Peter Henning am 22 September 2018, 19:05:26
ZitatTut mir leid, dass ich das fragen muss
Wir haben alle gefragt. Und dann viel gelesen. Dann wird man auch "bewandert"...

LG

pah
Titel: Antw:Licht in Garage beim öffnen des Tores ab *sunset
Beitrag von: eberlrudi am 30 September 2018, 08:00:24
Vielen Dank für eure Hilfe.

Ich schaffe es einfach nicht...
Jetzt geht das Licht einfach auch am Tag an... auch egal.
Titel: Antw:Licht in Garage beim öffnen des Tores ab *sunset
Beitrag von: Damian am 30 September 2018, 09:39:18
Zitat von: eberlrudi am 30 September 2018, 08:00:24
Vielen Dank für eure Hilfe.

Ich schaffe es einfach nicht...
Jetzt geht das Licht einfach auch am Tag an... auch egal.

poste mal die Ausgabe von "list <dein Device>" von deiner aktuellen Definition
Titel: Antw:Licht in Garage beim öffnen des Tores ab *sunset
Beitrag von: Helmi55 am 30 September 2018, 18:29:28
So habe ich ein Licht im Wintergarten (Eingang) definiert. Wenn die Türe geöffnet wird und es Sunset bis Sunrise ist
geht das Licht für 300 Sekunden an
defmod di_WinterGartenlicht DOIF (([Eingangstuere] eq "Offen") and [[Daemmerung:ss]-[Daemmerung:sr]]) (set Wintergartenlicht on-for-timer 300)
attr di_WinterGartenlicht room Steuerung


Gruß
Helmut