Guten Morgen,
ein Notify soll melden, wenn ein Fenster längere Zeit geöffnet ist. So funktioniert es aktuell:
defmod n_BadfensterP notify Fenster_BadP:offen ;; sleep 5600 ;; set ECHO_Gxxx speak Badfenster ist immer noch offen. Bitte schließen!
Allerdings wird die Meldung auch ausgegeben, wenn das Fenster während der Wartezeit geschlossen wurde. Gibt es eine einfache Möglichkeit, das Notify durch eine weitere Bedingung zu stoppen? Ich hab mit Watchdog und DOELSE herumprobiert, es aber nicht hinbekommen.
LG Ingo
Du brauchst nach der Wartezeit eine Bedingung die prüft ob das Fenster weiterhin offen ist, sonst wird doch nach der Wartezeit einfach immer die Sprachansage erfolgen ?
Könnte so aussehen:
defmod n_BadfensterP notify Fenster_BadP:offen sleep 5600; {if (ReadingsVal($NAME,'state','zu') eq 'offen') {set ECHO_Gxxx speak Badfenster ist immer noch offen. Bitte schließen!} }
Gruß
Thomas
Super, vielen Dank, Thomas!
Bitte noch eine Zusatzfrage, welche die Syntax betrifft:
Wenn die Sprachdurchsage über mehrere Echos erfolgen soll, werden die set-Befehle dann jeweils in eigene geschweifte Klammern gesetzt und einfach einander gereiht? Also zB
defmod n_BadfensterP notify Fenster_BadP:offen sleep 5600; {if (ReadingsVal($NAME,'state','zu') eq 'offen') {set ECHO_Gxxx speak Badfenster ist immer noch offen. Bitte schließen!} {set ECHO_Gyyy.......}}
Vielen Dank!
Nein.
Und es fehlt verm. noch der "fhem-Befehl":
{fhem("set ECHO_Gxxx speak Badfenster ist immer noch offen. Bitte schließen!; set ECHO_Gyyy.......")}
Gruß, Joachim
Ja, an den fhem-Befehl hab ich nicht gedacht, einfach nur kopiert.
Nein, die werden dann in dem Ausführungsteil (den geschweiften Klammern) des if Semikola-getrennt angegeben.
{fhem('set ECHO_Gxxx speak Badfenster ist immer noch offen. Bitte schließen!;set ECHO_Gyyy...')}
geht aber auch etwas kürzer:
Zitat{fhem('set ECHO_Gxxx,ECHO_Gyyy... speak Badfenster ist immer noch offen. Bitte schließen!')}
noch etwas kürzer wenn die Sprachansage auf allen Echos erfolgen soll:
{fhem('set TYPE=echodevice:FILTER=model!=ACCOUNT speak bla')}
Hat aber dann den Nachteil, wenn man in der Zwischenzeit das Fenster mehrfach auf und zu macht, dass mehrere sleeps im System rumdümpeln. Ich definiere mir dafür ein eindeutiges at, das ich auch wieder löschen kann. Einem sleep kann man auch eine ID mitgegeben, habe ich selbst noch nicht genutzt.
Bei mir wird nach Fenster offen die Heiztemperatur verzögert hoch gesetzt.
Hier mal mein notify im RAW Format:
defmod ntArbeitszimmerFenster_STATE notify ArbeitszimmerFenster:1.STATE.* {\
fhem("delete atAZHeizungToAuto") if (defined($defs{atAZHeizungToAuto}));;\
my $state=ReadingsVal("ArbeitszimmerFenster", "1.STATE", "");;\
if ($state eq "closed") {\
fhem("set ArbeitszimmerHeizung datapoint SET_POINT_TEMPERATURE 14");;\
fhem("define atAZHeizungToAuto at +00:03:00 set ArbeitszimmerHeizung Auto");;\
}\
}
Fenster offen Meldungen laufen bei mir über einen Watchdog, da muss ich selbst nichts aufräumen:
defmod wdArbeitszimmerFensterOpen watchdog ArbeitszimmerFenster:1.STATE.*open 00:04:00 ArbeitszimmerFenster:1.STATE.*closed {\
fhem("set teleBot message ".telegramEmpfaenger(1)." Das Fenster im Arbeitszimmer ist schon länger offen!");;\
fhem("trigger wdArbeitszimmerFensterOpen .");;\
}
Klasse, herzlichen Dank an alle!
Allerdings schaffe ich es als Syntaxspasti immer noch, eine Fehlermeldung zu erzeugen:
Bareword "Fenster_BadP" not allowed while "strict subs" in use at (eval 6358862) line 1.
Missing right curly or square bracket at (eval 6358862) line 1, at end of line
syntax error at (eval 6358862) line 1, at EOF
bei folgendem Code:
Fenster_BadP:offen ; sleep 5600 ; {if (ReadingsVal(Fenster_BadP,'state','zu') eq 'offen') {fhem("set ECHO_S,ECHO_H,ECHO_C,ECHO_6,ECHO_F speak Badfenster ist immer noch offen. Bitte schließen!; set Sonos_Unnamed_Room Speak 50 de |TempleBell| Badfenster ist immer noch offen. Bitte schließen!")}
LG Ingo
Zitatdass mehrere sleeps im System rumdümpeln.
Unabhängig was korrekter, richtiger, besser ist lässt sich das, mein ich, ohne auszuprobieren, bei meinem gezeigten notify mit einem gesetzten Attribut
disabledAfterTrigger 5600 verhindern.
Mache ich einen Fehler bei der Bezeichnung des Dummy?
{if (ReadingsVal(Fenster_BadP,.......
Das "$" gehört doch nicht davor, oder? Habe es als Hinweis verstanden, dass bei "$NAME" das Device eingesetzt werden soll.
LG Ingo
Zitat von: is2late am 14 März 2021, 11:07:56
Klasse, herzlichen Dank an alle!
Allerdings schaffe ich es als Syntaxspasti immer noch, eine Fehlermeldung zu erzeugen:
Bareword "Fenster_BadP" not allowed while "strict subs" in use at (eval 6358862) line 1.
Missing right curly or square bracket at (eval 6358862) line 1, at end of line
syntax error at (eval 6358862) line 1, at EOF
bei folgendem Code:
Fenster_BadP:offen ; sleep 5600 ; {if (ReadingsVal(Fenster_BadP,'state','zu') eq 'offen') {fhem("set ECHO_S,ECHO_H,ECHO_C,ECHO_6,ECHO_F speak Badfenster ist immer noch offen. Bitte schließen!; set Sonos_Unnamed_Room Speak 50 de |TempleBell| Badfenster ist immer noch offen. Bitte schließen!")}
LG Ingo
ReadingsVal('Fenster_BadP','state','zu')
Also Fenster_BadP in Anführungszeichen. Je nachdem in einfache (wie hier) oder doppelte...
EDIT: nutze zwar DOIF nicht aber das klingt doch wie DOIF mit wait!? Da gibt es im DOIF Wiki/commendref doch bestimmt ein Beispiel was genau das macht was du willst...
Gruß, Joachim
Du kannst doch wie gezeigt $NAME verwenden, da kann man die Hochkomma weglassen, wenn du den Namen des dummy nehmen möchtest dann sind die nötig.
Zitatdass bei "$NAME" das Device eingesetzt werden soll.
$NAME ist der dummy, das war kein Hinweis, lies dich halt mal zu notify ein.
Hi Joachim,
vielen Dank! Die Fehlermeldung ist jetzt tatsächlich weg, wird aber durch eine neue ersetzt:
Missing right curly or square bracket at (eval 6853437) line 1, at end of line
syntax error at (eval 6853437) line 1, at EOF
Auch mehrfaches Durchzählen der Klammern ergab kein abweichende Ergebnis ;-)
@Thomas: Dann muss $NAME doch irgendwo definiert sein, oder? Ich würde gern den Namen des Dummy nehmen, also Fenster_BadP in Anführungszeichen. Dann kommt aber die neue Fehlermeldung, s.o.
LG Ingo
Wie wäre es dann den Code zu posten!?
So KÖNNEN wir ja nicht helfen!!
Oder sollen wir "Phantasie-Klammern" zählen ;)
EDIT: $NAME ist beim notify "definiert". Es ist der Name des auslösenden Devices! Wie geschrieben: einlesen macht schlauer! ;)
Gruß, Joachim
ZitatAuch mehrfaches Durchzählen der Klammern ergab kein abweichende Ergebnis ;-)
Mehrfach falsch gezählt, nach dem letzten gezeigten Code fehlt am Ende eine geschweifte Klammer.
Das erste Semikolon ; gehört da nicht hin!
Fenster_BadP:offen ; sleep 5600 ; {if (ReadingsVal(Fenster_BadP,'state','zu') eq 'offen') {fhem("set ECHO_S,ECHO_H,ECHO_C,ECHO_6,ECHO_F speak Badfenster ist immer noch offen. Bitte schließen!; set Sonos_Unnamed_Room Speak 50 de |TempleBell| Badfenster ist immer noch offen. Bitte schließen!")}
https://wiki.fhem.de/wiki/Notify
$NAME ist das auslösenden Gerät. In deinem FALL also Fenster_BadP
Erklärung in der Doku https://fhem.de/commandref_modular_DE.html#notify
Gemischte Befehlytypen funktionieren nicht zwangsläufig! https://fhem.de/commandref_modular_DE.html#command
sleep 5600;{} ist eine Mischung aus einem FHEM und einem Perl Befehl!
Mann könnte es in der Art machen {if (open) {fhem("sleep 5600 Fenster ; set laberlaber")} elsif (closed) {fhem("cancel Fenster")}}
Fenster_BadP:offen|Fenster_BadP:geschlossen {if ($EVENT eq 'offen') { fhem("sleep 5600 Fenster; set ECHO_S,ECHO_H,ECHO_C,ECHO_6,ECHO_F speak $NAME ...")} elsif ($EVENT eq 'geschlossen') {fhem("cancel Fenster")}}
Gruß Otto
Peinlich....hab nur die runden Klammern gezählt. Danke für Eure Geduld!
Was neben meinem "Wachhund Nachbau" oben auch geht ist ein watchdog:
defmod WD_BadOg_open watchdog FensterBOg:open 00:10 FensterBOg:closed set Sonos_Arbeitszimmer speak 15 de Fenster im oberen Bad offen
attr WD_BadOg_open autoRestart 1
attr WD_BadOg_open room Bad
Danke, Otto!
Der Watchdog ist vermutlich die beste Lösung.
Bei der obigen "if-Variante" ist es nämlich so, dass bei den Sonos-Lautsprechern der Speak-Text "in den Kleidern" zu hängen scheint, dh es werden nur die ECHO-Durchsagen unterdrückt, nicht jedoch die Sonos. Oder ich mache wieder etwas falsch...
Ist aber jetzt egal; ich mag gar nicht mehr fragen und nehme die Sonos einfach raus. Also nur akademisches Interesse ;)
Fenster_BadP:offen sleep 60 ; {if (ReadingsVal($NAME,'state','zu') eq 'offen') {fhem("set ECHO_S,ECHO_G000JN06748607KH speak Badfenster ist immer noch offen. Bitte schließen!; set Sonos_Unnamed_Room Speak 50 de |TempleBell| Badfenster ist immer noch offen. Bitte schließen!")}}
LG Ingo
Hallo Ingo,
Du hast mein Post #15 irgendwie nicht gelesen! Ich hatte da noch editiert.
Edit: Ich glaube ich weiß was Du meinst: gerade probiert, der zweite Sprachbefehl wird irgendwie im sleep und nochmal extra ausgeführt - das wundert mich jetzt....
Gruß Otto
Hallo Otto,
ja, sorry, den Post #15 habe ich tatsächlich überlesen. Tja, seltsam ist dieses Verhalten. Hab die Reihenfolge der Geräte probeweise einmal umgedreht, den Sonos also nach vorn geholt, um auszuschließen, dass es am Sonos liegt:
defmod n_BadfensterP notify Fenster_BadP:offen sleep 60 ;; {if (ReadingsVal($NAME,'state','zu') eq 'offen') {fhem("set Sonos_Unnamed_Room Speak 50 de |TempleBell| Badfenster ist immer noch offen. Bitte schließen!;;set ECHO_S,ECHO_H speak Badfenster ist immer noch offen. Bitte schließen!")}}
Jetzt wird die Sonos-Meldung unterdrückt, während die ECHOs Laut geben.... Sonos trägt also keine Schuld. Scheint so, als wenn der zweite "set-Befehl" vom "if" unbeeindruckt bleibt.
LG Ingo
Das Logfile gibt folgenden Hinweis aus:
After sleep: Unknown command {if, try help.
An der Syntax des "if" kanns doch wohl nicht liegen, weil dieses jedenfalls für das erste "set" funktioniert. Oder ist die Klammer Schuld, womöglich vor dem Hintergrund Deines Hinweises, dass hier gemischte Befehlstypen zum Einsatz kommen?
LG Ingo
Zitat von: is2late am 14 März 2021, 14:01:27
Das Logfile gibt folgenden Hinweis aus:
After sleep: Unknown command {if, try help.
An der Syntax des "if" kanns doch wohl nicht liegen, weil dieses jedenfalls für das erste "set" funktioniert. Oder ist die Klammer Schuld, womöglich vor dem Hintergrund Deines Hinweises, dass hier gemischte Befehlstypen zum Einsatz kommen?
LG Ingo
Mach das mal so in eine Raw-Def:
defmod n_BadfensterP notify Fenster_BadP:offen sleep 60;; {fhem "set Sonos_Unnamed_Room Speak 50 de |TempleBell| Badfenster ist immer noch offen. Bitte schließen!;; set ECHO_S,ECHO_H speak Badfenster ist immer noch offen. Bitte schließen!" if (ReadingsVal($NAME,'state','zu') eq 'offen')}
Gruß
Dan
ich sage es gern nochmal: sleep 60;{Ein Perlbefehl} ist KEIN korrekter FHEM Syntax.
Aussage von Rudi dazu war: kann funktionieren - muss aber nicht! Deswegen würde ich mich darauf in keinster Weise einlassen und probieren solange er tut. Wenn das nächste Zeichen geändert wird muss er nicht mehr tun. ::)
Außerdem ist der Ausdruck ReadingsVal($NAME,'state','zu') CO2 Verschwendung wenn der Wert schon in der Variable $EVENT steht ;) ;D
Was ist schlecht an meiner Variante in #15?
Unabhängig von dem dann wohl nur korrektem Vorschlag aus #15, hab ich noch eine Anmerkung zu der Variante von if aus #22 (die mir besser gefällt).
Angenommen bei einem anderen Anwendungsfall (also ohne sleep), kommt die Variante bei der Bedingung auch ohne Klammern aus (die um ReadingsVal mein ich, hier jetzt $EVENT):
defmod bla notify du_t1:on {return fhem("saysonos bla;;") if $EVENT eq 'on'}
defmod n_BadfensterP notify Fenster_BadP:offen {fhem "set Sonos_Unnamed_Room Speak 50 de |TempleBell| Badfenster ist immer noch offen. Bitte schließen!;; set ECHO_S,ECHO_H speak Badfenster ist immer noch offen. Bitte schließen!" if ReadingsVal($NAME,'state','zu') eq 'offen'}
Wobei die Abfrage in der abgekürzten? Form auch redundant ist - wenn vorne bloß on reinkommt - braucht man nicht nochmal fragen ob es wirklich on war.
Es ging ja darum das sleep abzubrechen, das geht mit id und cancel. Um noch eine Variante in den Thread zu werfen: Es geht auch mit dem Dreier :)
defmod n_fenster notify Fenster_BadP:offen|Fenster_BadP:geschlossen {$EVENT eq 'offen' ? fhem("sleep 10 Fenster;; set alias=Test speak 25 offen") : fhem("cancel Fenster")}
Aber wie gesagt: ist das doch eigentlich bloß watchdog nachgebaut?
ZitatWobei die Abfrage in der abgekürzten? Form auch redundant ist - wenn vorne bloß on reinkommt - braucht man nicht nochmal fragen ob es wirklich on war.
dann war das halt ein doofes Beispiel, mir gings doch nur um die unnötigen Klammen bei dem "kurzen" if.
defmod bla notify du_t1:.* {return fhem("saysonos $EVENT") if $EVENT eq 'on'}
besser, zufrieden :P
@Dan: Habs probiert; das zweite "set" wird auch bei geschlossenem Fenster ausgeführt. Logfile:After sleep: Unknown command {fhem, try help.
@Thomas, #24, Otto #25: Beide Meldungen kommen sofort nach Öffnen des Fensters. Vermutlich verstehe ich Euch falsch - wo bleibt das sleep?
@Otto #15: Verstehe das "$NAME...." nicht.... Bei diesem Code
Fenster_BadP:offen|Fenster_BadP:zu {if ($EVENT eq 'offen') { fhem("sleep 60 Fenster_BadP; set ECHO_6,ECHO_S speak Badfenster ist immer noch offen. Bitte schließen! $NAME ...")} elsif ($EVENT eq 'zu') {fhem("cancel Fenster_BadP")}}
wird tatsächlich NICHT gemeldet bei geschlossenem Fenster. Wie/wo baue ich jetzt die Sonos ein? Semikolon hinter "schließen!"?
set Sonos_Unnamed_Room Speak 50 de |TempleBell| Badfenster ist immer noch offen. Bitte schließen!
LG Ingo
Hab die Sonos so eingesetzt:
defmod n_BadfensterP notify Fenster_BadP:offen|Fenster_BadP:zu {if ($EVENT eq 'offen') { fhem("sleep 60 Fenster_BadP;; set ECHO_G6,ECHO_S speak Badfenster ist immer noch offen. Bitte schließen!;; set Sonos_Unnamed_Room Speak 50 de |TempleBell| Badfenster ist immer noch offen. Bitte schließen!")} elsif ($EVENT eq 'zu') {fhem("cancel Fenster_BadP")}}
Ergebnis: Meldungen werden wunschgemäß unterdrückt bei geschlossenem Fenster. Bei geöffneten Fenster meldet jedoch NUR die Sonos... Es ist wie verhext!
Korrektur: Jetzt klappt es plötzlich auch mit den ECHO-Meldungen, also alles bestens. Ganz herzlichen Dank für Eure Hilfe und die lehrreichen Codes!
LG Ingo
Zitat von: is2late am 14 März 2021, 17:53:56
@Thomas, #24, Otto #25: Beide Meldungen kommen sofort nach Öffnen des Fensters. Vermutlich verstehe ich Euch falsch - wo bleibt das sleep?
@Otto #15: Verstehe das "$NAME...." nicht.... Bei diesem Code
das war ja kein kompletter Code, das $NAME habe ich eingeworfen - dann hätte er Fenster_BadP gesagt :)
Mein Code in #25 funktioniert, den habe ich getestet. Das sleep ist drin!
Vielleicht verstehst Du mein "Benanntes sleep" nicht? Du kannst anstatt sleep 10 Fenster ... cancel Fenster auch sleep 10 Willi ... cancel Willi schreiben
Ich habe noch ein bisschen nachgedacht. Man hat ja meist nicht nur ein Fenster. ;)
watchdog funktioniert nicht "generisch" - wird ja oft festgestellt ;)
Mein "Nachbau" funktioniert für mehrere Fenster, man benennt das sleep einfach nach dem Device welches auslöst.
defmod n_fenster notify Fenster.*:open|Fenster.*:closed {$EVENT eq 'open' ? fhem("sleep 600 $NAME;; set alias=Test speak 25 Fenster im Raum ".AttrVal($NAME,'room','unbekannt')." offen "):fhem("cancel $NAME quiet")}
Ich habe es jetzt für open und closed gemacht - meine Sensoren melden das so :)
Klingt gut, Otto.. leider zu hoch für mich :o
Ich legs mal zurück für den ungewissen Fall, dass ich irgendwann evtl mal besser durchblicke...
Vielen Dank jedenfalls für deine Mühe!
ZitatOtto.. leider zu hoch für mich
Was ist unklar?
Fenster.*:open|Fenster.*:closed triggert auf alle Geräte die mit Fenster beginnen und deren Event open oder closed ist
{} führt ein Perl Kommando aus
Die Abfrage anstatt mit if mit dem "dreifach Operator": Bedingung
? Reaktion für wahr
: Reaktion für falsch
Ist der Event open dann starte ein benanntes Sleep mit einer Ansage
Ist der Event closed dann lösche/stoppe das benannte Sleep
Faszinierend...ein ganz fernes Licht erscheint im Nebel...
Was macht bitte das "quiet" ?
Anstelle von alias=Test lässt sich sicher das Alexa, Sonos-Gerät oä setzen, oder?
Alle Fenster müssen in der Gruppe "room" liegen, richtig?
LG Ingo
ZitatFalls sleep in at/notify/etc aufgerufen wurde, und die nachfolgenden Kommandos einen nicht leeren Text zurückgeliefert haben, dann wird dieser Text mit loglevel 2 protokolliert.
quiet vermeidet diese Protokollierung.
Trifft bei cancel analog zu.
Der Sprachausgabebefehl ist meine Variante, musst Du natürlich durch Deinen Befehl ersetzen.
AttrVal($NAME,'room','unbekannt') liest das Attribute room des triggernden Device aus. Wenn das richtig gesetzt ist wird angesagt, dass in der Küche das Fenster offen ist.
Das ist nur ein Beispiel - Du kannst Dir auch $NAME vorlesen lassen - aber Fenster_BadP klingt halt doof ;) Du kannst auch "Willi" hinschreiben.
Die Funktion liegt im wesentlichen in sleep und cancel mit ID - das war ja Deine Ausgangsfrage. Die Sprachausgabe ist völlig frei wählbar.
Vielen Dank, Otto!