Hallo in die Runde,
Ich bräuchte maöl eure Hilfe - ich möchte die state Änderung meines Sat Receivers zum Schalten einer Lampe nutzen (wenn aus, dann kann 15 min später auch das Licht im Wohnzimmer aus usw.)
Folgendes habe ich definiert:
DEF wz.SATReceiver:state:off set IT_V3_Dose4 off
NAME ntest
NOTIFYDEV wz.SATReceiver
REGEXP wz.SATReceiver:state:off
STATE active
TYPE notify
Irgendwie löst die State Änderung vom wz.SATReceiver von "on" zu "off" nichts aus - habe ich hier einen Denkfehler? "set IT_V3_Dose4 off/on" funktioniert händisch perfekt.
Gruss und Danke
Christian
versuch es mal ohne state: ;)
Die events/regex immer so aufbauen, wie sie im event monitor zu sehen sind. Dort kannst Du Dir ein notify auch über den Create/Modify Device Button erzeugen lassen.
Ich mach das ähnlich mit einem notify, TV aus -> Licht aus.
DEF: SonyTV:off.* {fhem("set WZ_Licht_Sw off")}
REGEXP: SonyTV:off.*
Wer bringt den Anfängern bloß den Unsinn bei auf Perlebene gehen zu müssen bei einem einfachen set Befehl.
DEF: SonyTV:off.* set WZ_Licht_Sw off
Und es sollte nur ein off ohne weitere RegEx auf Zeichen reichen
DEF: SonyTV:off set WZ_Licht_Sw off
Es sei denn im Event steht hinter off noch mehr
wz.SATReceiver:off set IT_V3_Dose4 $EVENT
Sollte reichen.
Sorry, ich hab nur den passenden Ausschnitt gepostet.
Komplett sieht das DEF so aus:
SonyTV:off.* {fhem("IF ([WZ_Fenster] eq \"closed\") (set WZ_heiz1_Clima controlMode auto)"); fhem ("set WZ_Licht_Sw off")}
Anders hab ich das mit IF und mehreren Befehlen einfach nicht hinbekommen :(
Zitat von: pcbastler am 19 September 2017, 12:14:40
Sorry, ich hab nur den passenden Ausschnitt gepostet.
Komplett sieht das DEF so aus:
SonyTV:off.* {fhem("IF ([WZ_Fenster] eq \"closed\") (set WZ_heiz1_Clima controlMode auto)"); fhem ("set WZ_Licht_Sw off")}
Anders hab ich das mit IF und mehreren Befehlen einfach nicht hinbekommen :(
Da Du das FHEM IF verwendest brauchst Du auch hier nicht auf Perlebene gehen. Schau mal bitte in die Commandref wie man es macht.
Würde ich so versuchen (DEF), das Erste ist die IF Bedingung, das Zweite nach dem Semikolon einfach ein Befehl
SonyTV:off.* IF ([WZ_Fenster] eq "closed") (set WZ_heiz1_Clima controlMode auto); set WZ_Licht_Sw off
Quelle
https://fhem.de/commandref_DE.html#command
https://fhem.de/commandref_DE.html#IF
@Christian Zur eigentlichen Frage: Beachte unbedingt den Hinweis von Kölnsolar! https://wiki.fhem.de/wiki/Event_monitor
Gruß Otto
Danke Dir Otto
Grüße
Hallo.
Ich hänge mich da mal an, auch auf die Gefahr der Steinigung ???:
Mein Receiver ist aus, also State:off und die Dämmerung setzt ein. Meine Lampe (wz.Schranklicht) geht an
defmod Wz.Lichtsim.on at *{sunset("REAL",-1000,"16:00","22:15")} set Wz.Schranklicht on
Naja, das Licht geht 1000 Sekunden früher an ;)
So wie es bei uns üblich ist, setzen wir uns irgendwann vor den Fernseher und schalten den Receiver an (State:on)
jetzt gibt es aber 2 Situatione, wann das Licht (wz.sch...) ausgehen soll:
1. Wenn wir nicht zuhause sind, dann geht es ein paar Stunden nach Sonnenuntergang aus (Das kann ich und hab ich wie folgt gemacht):
defmod Wz.Lichtsim.off at *{sunset("REAL",10000,"16:00","22:15")} set Wz.Schranklicht off
ABER: Wenn der Fernseher läuft, dann soll das Licht erst 1 Minute nach dem ausschalten des Receivers ausgehen. Da scheine ich zu blöd zu sein.
Wie kann ich das denn einbinden? Ich habe an ein IF gedacht, oder sollte ich auf doif schauen? Kann mir da jemand weiterhelfen?
Mir fehlt die Zeitverzögerung. Wenn das Licht ausgehen soll, wenn der Fernseher ausgeht, dann sehe ich kein Problem, aber ich möchte ja noch bis in die Küche kommen, ohne gegen die Tür zu treten (Ich glaube, die verschiebt sich im dunkeln ::)
Du könntest ein sleep davor setzen
Zitat von: CoolTux am 19 September 2017, 13:08:55
Du könntest ein sleep davor setzen
Mhh, das habe ich verstanden, aber wenn der Fernseher an ist, dann möchte ich das Licht ja nicht 10000 Sekunden nach Sonnenuntergang ausschalten (Mit oder ohne sleep) sondern erst, wenn der Fernseher ausgeschaltet wird und dann mit 60 Sekunden Verzögerung.
Bin leider nicht zuhause, aber vom Verständnis her, kann das wie folgt funktionieren??:
defmod Wz.Lichtsim.off at *{sunset("REAL",10000,"16:00","22:15")} IF ([receiver:state] = off) (set Wz.Schranklicht off)
und dann mit nem Notify beim ausschalten des receivers mit einem sleep 60 das licht ausschalten??:
defmod n_WZ_schranksch notify ([receiver] eq "off") (sleep 60) (set Wz.Schranklicht off)
Hab ich da irgend etwas richtig gemacht? ???
Leider nein
defmod n_WZ_schranksch notify receiver:off sleep 60; set Wz.Schranklicht off
Sehr cool - nun läuft es. Nun haben ja einige in diesem Thread ähnliche Vorhaben geäussert - ich dachte, alles weitere wäre einfach. Wie kombiniere ich das den mit eine Bedingung von "nur zwischen 22:00-23:55" ..... also nur innerhalb der knapp 2h soll ein Receiver ausschalten auch den Licht auschalten (mit sleep verzögert).
Danke für eure Hilfe
Christian
Dafür hatte ich mir mal Code geklaut und hier angeboten. Mom ich schaue.
Gefunden
https://forum.fhem.de/index.php/topic,76660.0.html
Bei Fragen fragen
Alternativ auf DOIF wechseln ;)
Und wie würde das gehen?
Habe VOR der Idee folgendes für das Wohnzimmer definiert:
( ([6:00-9:00|123] or [15:00-23:55|123] or [6:00-23:55|4560]) and [twilight:light] <= 5)
(set Wohnzimmerbeleuchtung on)
DOELSE
(set Wohnzimmerbeleuchtung off)
wie kombiniere ich das nun mit dem Receiver state "off"?
Christian
a) bitte Codetags nutzen :)
b) Du konntest diese DOIF selbst bauen und weißt nicht, wie du noch die Prüfung rein bekommst, ob der State von Receiver off ist? Wie haste dann geschafft zu wissen, wie du den Status des Reading light von Twilight rein bekommst?
Geklaut ;)
Und ausserdem weiss ich nicht, wie DOIF sich im laufenden Betrieb verhält - also wie oft wird das DO geprüft ob das IF zutrifft- einmal beim Erreichen des ersten Zeitpunkts des angegebenen Zeitframes oder periodisch immer wieder?
Bin übrigens mit dem Twilight nicht so glücklich.
Christian
Dann nimmst Du den Eventmonitor -> https://wiki.fhem.de/wiki/Event_monitor
Schaltest den receiver off, suchst Dir die Zeile aus die genau diesen Event eindeutig enthält, markierst die, lässt Dir ein DOIF erzeugen und baust dann die gewonnene Erkenntnis in deine Bedingung mit ein. ;)
Gruß Otto
Bezüglich der Frage, wie sich DOIF verhält verweise ich mal auf die CommandRef. DOIF ist sehr komplex und schreckt sicher auch ab, wenn man die CommandRef dazu liest. Aber Damian hat trotz der Komplexität eine sehr gut CommandRef geschrieben (finde ich) mit einigen Beispielen. Daher lesen und dann gerne konkrete Fragen im Unterboard DOIF stellen, oder hier, wenn es Bezug zur Frage hat.
Und wieso willst Du Dich jetzt noch mit DOIF quälen? Alles was Du machen musst ist die kleine myUtils einbauen und eine Abfrage in Deinem jetzigen Code einbauen.
Ich habe ihn nicht gezwungen, habe es nur als Alternative vorgeschlagen :)
Danke euch beiden ....
Fragen an CoolTux
- 99_myUtils.pm gibt es nicht mehr, nur 99Utils.pm und myutilsTemplate.pm, in welche nun (wahrscheinlich egal)
- wie nutze ich syntaktisch die neue Funktion in meinem Beispiel, einfach anhängen des IF Statements mit den entsprechenden Variablen für IsInTime?
DANKE!
Christian
Und ja, ich versuche es zu lernen
Immer eins nach dem anderen
https://wiki.fhem.de/wiki/99_myUtils_anlegen
Erstmal das hier und dann kommt das notify
Erledigt! Also 99_myUtils.pm
Christian
defmod n_WZ_schranksch notify receiver:off { fhem("sleep 60; set Wz.Schranklicht off") if( isInTime("22:00-23:55")); }
So sollte es gehen. Kannst auch mal testen. In der FHEMWEB Befehlszeile oben einfach eingeben
{ isInTime("22:00-23:55") }
Grüße
Zumindest der ReturnValue toggled :P ... teste mal das Ganze heute Abend