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
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.
Mit DOIF
{if ([{sunset}-00:00] and [Garagentor:open]) {fhem "set Licht_Garage on-for-timer 300"}}
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?
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...
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
Hier
if ({*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?
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
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 ...
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.
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 ;)
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.
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?
Zitat von: Damian am 21 September 2018, 15:31:52
Es war noch ein Fehler drin, ich habe eine korrigierte DOIF-Version hochgeladen.
Vielen Dank
Tut mir leid, dass ich das fragen muss. Aber wohin hochgeladen?
https://svn.fhem.de/fhem/trunk/fhem/FHEM/98_DOIF.pm (https://svn.fhem.de/fhem/trunk/fhem/FHEM/98_DOIF.pm)
ZitatTut mir leid, dass ich das fragen muss
Wir haben alle gefragt. Und dann viel gelesen. Dann wird man auch "bewandert"...
LG
pah
Vielen Dank für eure Hilfe.
Ich schaffe es einfach nicht...
Jetzt geht das Licht einfach auch am Tag an... auch egal.
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
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