Ich finde viele Code Fragmente, komme damit aber nicht weiter (ich habe auch nicht viel Talent fürs Programmieren, leider).
Gesuchte Funktion:
Wenn ein oder mehrere Fenster länger als 10 Minuten offen sind, dann sende eine Nachricht mit z.B. "Fenster Bad" per Pushover.
Eckdaten:
Ich habe ca 10 Max! Fenstersensoren und möchte eine Benachrichtigung per Pushover erhalten. Jetzt suche ich einen schlanken Code der nicht erweitert werden muss wenn ein neuer Sensor hinzu kommt.
Wäre toll wenn mir jemand seinen Code Posten könnten, denn ich bekomme es nicht hin.
Hab mal was aus meiner Umgebung rauskopiert. Wenn das Fenster eine bestimmte Zeit offen ist, wird eine Meldung über whatsapp gesendet. Es passt also nicht ganz auf deine Bedürfnisse, aber ganz so leicht sollst du es ja auch nicht haben 8)
für fhem.cfg
define winOpen.OpenNotify notify .*:opened\b {winOpenStart($NAME)}
define winOpen.CloseNotify notify .*:closed {winOpenStop($NAME)}
zusätzliche Attribute für ein Fenster:
attr EG_Toilette_F winOpenMaxTrigger 3
attr EG_Toilette_F winOpenName Toilette EG
attr EG_Toilette_F winOpenTimer 00:30:00
attr EG_Toilette_F winOpenTimer2 00:15:00
attr EG_Toilette_F winOpenType Fenster
in 99_myUtils.pm einfügen:
#### offenes Fenster melden
sub winOpenStart($;$) {
#Als Parameter muss der device-Name übergeben werden
my $dev=shift(@_);
#Optional kann noch ein Zähler für das erneute Triggern übergeben werden,
#dieser ist per default 0
my $retrigger=shift(@_);
$retrigger=0 if (!$retrigger);
#Erst mal prüfen, ob das übergebene device überhaupt existiert
if ($defs{$dev}) {
#Aus dem device, sofern vorhanden das Attribut winOpenMaxTrigger auslesen, das
#angibt, wie oft eine Meldung ausgegeben werden soll.
#Fehlt dieses Attribut oder ist 0, dann wird für das device gar keine Offen-Meldung ausgegeben
my $maxtrigger=AttrVal($dev,'winOpenMaxTrigger',0);
if($maxtrigger) {
#Festlegen des Namens für den Timer, der angelegt wird um die Meldung nach gewünschter
#Zeit auszugeben.
my $devtimer=$dev.'_OpenTimer';
# #Sollte dieser Timer bereits existieren, so wird er zunächst gelöscht.
Log 1,"delete $devtimer" if ($defs{$devtimer});
fhem("delete $devtimer") if ($defs{$devtimer});
#Sollte dieser Timer bereits existieren, so ist er doppelt getriggert. Also brauchen wir nichts mehr zu machen.
#Log 1,"Timer $devtimer existiert schon, ignoriert" if ($defs{$devtimer});
#return if ($defs{$devtimer});
#Holen von weiteren Attributen, sofern vorhanden:
#Zeit, nach der die Meldung ausgegeben werden soll
#Default sind 10 Minuten, falls nicht angegeben
my $waittime=AttrVal($dev,'winOpenTimer','00:10:00');
#Zeit für die Folge-Meldungen, sofern abweichend angegeben
#Default ist die normale Zeit, die oben schon ermittelt wurde
my $devtimer2=AttrVal($dev,'winOpenTimer2',$waittime);
#Ein eventuell definierter "schöner" Name für das Device, der in der Meldung ausgegeben werden soll.
#Ist der nicht angegeben, wird das Device-Alias genommen, fehlt auch das, wir einfach der
#device-Name genommen.
my $devname=AttrVal($dev,'winOpenName',AttrVal($dev,'alias',$dev));
#Eine Art Typ (Tür oder Fenster), der bei mir quasi im Betreff der Offen-Meldung angegeben wird
my $devtype=AttrVal($dev,'winOpenType','Fenster/Tür');
#Hier wandeln wir noch den state des devices in deutschen Klartext um
my $devstate='offen';
$devstate='gekippt' if (ReadingsVal($dev,'state','') eq 'tilted');
#Hier wird, sofern bereits eine Wiederholung der Offen-Meldung ausgegeben werden soll,
#dies textlich auch so berücksichtigt.
my $immer='noch';
$immer='immer noch' if ($retrigger>0);
#Jetzt wird der Ausgabebefehl für die Offenmeldung zusammengebaut
my $pushcmd="fhem('set WhatsApp send 49172xxxxxx $devtype $devname ist $immer $devstate');;";
#Sind wir schon beim Einrichten einer Folgemeldung, muss die Wartezeit für die Folgemeldungen
#genommen werden.
$waittime=$devtimer2 if ($retrigger);
#Wir erhöhen hier den Trigger-Zähler um 1...
$retrigger+=1;
#... und fügen das Re-Triggern als weitere Code-Zeile für das at-DEF an.
#das sorgt dann dafür, dass diese Funktion hier nach Ablauf des Timers einfach wieder
#getriggert wird, um einen neuen Timer anzulegen für die Folgemeldung
#Log3 (undef,3,"winOpenStart('$dev','$retrigger');;") if($retrigger < $maxtrigger);
Log 1, "winOpenStart('$dev','$retrigger');;" if($retrigger < $maxtrigger);
$pushcmd.="winOpenStart('$dev','$retrigger');;" if($retrigger < $maxtrigger);
#Nachdem wir hier alles zusammen haben,
#legen wir den Timer (das at) an und legen ihn freundlicherweise in den, bzw. die
#selben Räumen ab, wie auch das auslösende device.
fhem("define $devtimer at +$waittime {$pushcmd}");
fhem("attr $devtimer room ".AttrVal($dev,'room','Unsorted'));
}
}
}
sub winOpenStop($) {
#Dazu muss das entsprechende device (TK/FK) per Name hierher übergeben werden
#Den übergebenen device-Namen holen
my ($dev)=@_;
#Den Namen des Timers zusammenbauen
my $devtimer=$dev.'_OpenTimer';
#Existiert ein Timer diesen Namens, so wird er jetzt gelöscht und das war's auch schon.
if ($defs{$devtimer}) {
Log3(undef,3,"delete $devtimer");
fhem("delete $devtimer");
}
}
Das sollte eigentlich funktionieren.
Gruss + viel Erfolg
willyk
Oder viel kürzer:
http://forum.fhem.de/index.php/topic,49635.msg413616.html#msg413616
Befel für Logfile austauschen, ein wait von 600 als Attribut.
Ich nutze so etwas um zweistufig zu benachrichtigen:
nach 4 Minuten: LED Blinken; E-Mail und Soundausgabe
nach 8 Minuten: Telefonanruf mit Soundausgabe aufs Handy
Ist im Grunde eine Kombination aus Notify und Watchdog mit ein bisschen "Drumherum".
Aber eben nichts was "einfach handhabbar" ist, sonder muss für jedes Fenster entsprechend angepasst werden.
(Da ich auch erfahre welches Fenster zu lange geöffnet ist)
Grüße,
Kharim
Ich habe jetzt doch pro Fenster ein eigenes DOIF geschrieben. Damit funktioniert es aber wirklich gut, darum möchte ich kurz meine Lösung vorstellen, vielleicht kann es ja jemand gebrauchen...
Es besteht nur aus der Definition (alles von define bis DOELSE) in die Befehlszeile und abschicken (123456 ist euer MAX! Sensor Name) und dann noch das attr wait hinterher. dann bekommt man den 1., 2. und 3. alarm je nach weiteren 1000 Sekunden...
define Balkontuer.Schlafzimmer.DoIf DOIF ([MAX_123456] =~ "opened") \
()\
(set pushmsg msg 'Schlafzimmer Balkontuer offen!')\
(set pushmsg msg 'Schlafzimmer Balkontuer noch offen!')\
(set pushmsg msg 'Schlafzimmer Balkontuer offen - letzte Meldung!')\
DOELSE
attr Balkontuer.Schlafzimmer.DoIf wait 0,1000,1000,1000:0
Ich nutze Pushover, darum muss das auch noch von euch angelegt werden (123 und 456 ist ein Beispiel)
define pushmsg Pushover 123 456
EDIT: Meine Frage hat sich erledigt - habe herausgefunden, dass man eigene Attribute als userattr anlegen kann. Jetzt geht es...
@willyk: Danke für de Funktion! Aber wie bekomme ich die zusätzlichen Attribute an den Fensterkontakt? Die gibt es ja gar nicht zur Auswahl... Oder stehe ich jetzt auf dem Schlauch?
Gruß, Bernd
Hey,
habe mir jetzt auch mal so einen Kontaktsensor geholt und wollte auch realisieren, dass ich eine Nachricht alle X-Minuten bekomme, wenn der Kontakt offen ist. Habe das mit einer notify zusammen mit einer Funktion gelöst. Das Interval wird auch durch ein Attribut festgelegt:
defmod n_checkopen notify .*:(open|closed) {\
\
if ( $EVENT =~ "open" ) {\
Log 1, ("$NAME - open");;\
my $checkinterval = AttrVal($NAME, "checkInterval", "00:30:00");;\
fhem("define at_checkopen_$NAME at +$checkinterval {checkOpen('$NAME')}");; \
}\
if ( $EVENT =~ "closed" ) {\
Log 1, ("$NAME - closed");;\
\
if (defined($defs{"at_checkopen_$NAME"})) { \
fhem("delete at_checkopen_$NAME");; \
my $alias = AttrVal($NAME, "alias", "unknown");;\
fhem("set <TELEGRAMBOT> message @#CHANNELID $alias ist jetzt geschlossen");;\
}\
}\
}
sub checkOpen($) {
my ($NAME) = @_;
Log 1, ("checkOpen - $NAME");
my $alias = AttrVal($NAME,"alias", "unknown");
my $state = ReadingsVal($NAME, "state", "Unknown");
my $readingage = sprintf "%02d:%02d:%02d:%02d", (gmtime(ReadingsAge($NAME,"state", 0)))[7,2,1,0];
if ( $state eq "open" ) {
if (defined($defs{"at_checkopen_$NAME"})) {
fhem("delete at_checkopen_$NAME");
}
my $checkinterval = AttrVal($NAME, "checkInterval", "00:30:00");
fhem("define at_checkopen_$NAME at +$checkinterval {checkOpen('$NAME')}");
fhem("set <TELEGRAMBOT> message @#<CHANNELID> $alias ist geöffnet seit $readingage");
}
}
Das läuft im definierten Interval solange bis der Sensor endlich geschlossen ist :-)
EDIT: Musste noch ein attr n_checkopen disabledAfterTrigger 10 einbauen, sonst kriegt man ständig eine Geschlossen-Nachricht, wenn man die Tür nur ein paar Sekunden auf hatte.
Ich bin ja ein großer Fan vom HomeMode Modul: https://wiki.fhem.de/wiki/HOMEMODE
Hat mir erlaubt, eine Unmenge von Notifys rauszuschmeißen.
1. Alle Senoren angeben
2. Die CMDs zu den Senoraktionen auswerten.
Es gibt quasi gratis eine Saisonal unterschiedliche Warndauer und mehrere Erinnerungen, falls man eine überhört hat. :)
Alex
Guten Abend.
Ich bin ganz hier. Ich habe Magnet Fenster unter Tür
Kontakte. Ich habe den Raspberry mit fhem draufgespielt
Und alle Sensoren von meinen Fritzboxen über dect ausgelesen und beschriftet. Jetzt wollte ich notify erstellen das wenn eine Tür auf eine Push über pushover bekomme und eine wenn wieder geschlossen ist. Aber wenn ich das mache habe
Ich das Problemm das er mir unendlich viele Push Narichten in geöffneten Zustand wie in Zuhen Zustand bekomme.
Wie kann ich die Programieren das das nicht der Fall ist?
Meine Zeite Frage währe das wenn die Tür aufvist das ich immer mal wieder ne push nach Zeit bekomme und bei schließen nur eine.
Danke schon mal
Zitat von: Sebastian84 am 13 Mai 2020, 18:01:08
Guten Abend.
Ich bin ganz hier. Ich habe Magnet Fenster unter Tür
Kontakte. Ich habe den Raspberry mit fhem draufgespielt
Und alle Sensoren von meinen Fritzboxen über dect ausgelesen und beschriftet. Jetzt wollte ich notify erstellen das wenn eine Tür auf eine Push über pushover bekomme und eine wenn wieder geschlossen ist. Aber wenn ich das mache habe
Ich das Problemm das er mir unendlich viele Push Narichten in geöffneten Zustand wie in Zuhen Zustand bekomme.
Wie kann ich die Programieren das das nicht der Fall ist?
Meine Zeite Frage währe das wenn die Tür aufvist das ich immer mal wieder ne push nach Zeit bekomme und bei schließen nur eine.
Danke schon mal
Schon mal mit event-on-change-reading versucht!?
Gruß, Joachim
Leider kenn ich mich noch gar nicht aus. Kann mir jemand ein Beispiel geben wo ich nur noch die Sensoren und die Zeiten eingeben muss
Zum selber schauen und lernen hast du aber schon Lust!?
Weil sonst wird das nix...
Hier schon mal was ohne dass du suchen musstest: https://wiki.fhem.de/wiki/Event-on-change-reading
Bewirkt, dass Events nur kommen, wenn sich der Zustand ändert, also auch das Notify nur reagiert, wenn sich was ändert, also bei Auf ein Event und Reaktion des Notify und bei Zu genauso...
...wenn zwischendrin das Fenster/Tür öfter offen/geschlossen meldet, dann wird das Notify nicht getriggert, sollte also auch keine Nachricht kommen...
Wenn du was mit Zeit usw. willst, dann auch so fragen, also was genau du willst...
...weil für das geschilderte "Problem" sollte event-on-change-reading helfen...
Ansonsten mal lists von den Dingen die du hast:
list DeviceName
in das FHEMWEB-Fenster und die Ausgabe hier posten in CODE-TAGS (das '#' im "Menü")...
Z.B. von einem solchen Kontakt und nat. vom Notify mit dem pushover...
Gruß, Joachim
ich hab jetz 2 Notify erstellt
define Dachfenster_HeidiZ_offen notify Dachfenster_HeidiZ:on* set pushmsg msg 'Dachfenster Heidizimmer' 'Dachfenster Heidizimmer offen' 'sebastian' 0 'bike'
define Dachfenster_HeidiZ_zu notify Dachfenster_HeidiZ:off* set pushmsg msg 'Dachfenster Heidizimmer' 'Dachfenster Heidizimmer zu' 'sebastian' 0 'bike'
Die gehen auch beide bekomme die ganze Zeit Push auf pushover in beiden zuständen.
Jetzt habe ich
attr <Dachfenster_HeidiZ> event-on-change-reading .*
seiddem bekomme ich garkeine Pushnarichen mehr auf Pushover in keinen zu stand ob offen oder zu.
Dann hab ich das probiert
attr <Dachfenster_HeidiZ> event-on-change-reading reading1[:threshold][,reading2[:threshold]...n]
Leider passiert auch da nix mehr
Was habe ich falsch gemacht??????
Bitte code tags verwenden. Das notify kann eigentlich nie funktioniert haben, da muss .* statt nur * stehen.
Kurz, weil mobil....
Das ging ohne Probleme ohne den Punkt. Nur jetzt kommt keine push mehr nach pushover
Ohne Punkt kann schon funktioniert haben: Zufall...
Wenn nach 'on' nichts mehr kommt oder nur noch viele 'n' ;) (also z.B. onnnnnnnn ;) ), dann geht auch "nur Stern" ansonsten aber NICHT!!
Es ist KEIN "wildcard" sondern RegEx!
Und das was du (vermutlich) willst/wolltest war trotzdem .* ;)
Dann bleibt nur EventMonitor öffnen und schauen was für Events kommen.
Und: das event-on-change-reading .* passt schon, es heißt: für ALLE Readings NUR Events, wenn sich der Zustand ändert. Also eigentlich Event wenn: on -> off bzw. off -> on
Und wenn das Notify tatsächlich schon mal ging, dann müsste es jetzt auch jeweils aber halt nur eine pushmessage pro Wechsel geben...
Aber wie geschrieben: EventMonitor hilft...
Gruß, Joachim
2020-05-13 22:42:11 FBDECT FBDECT_fritzbox2_11324_0481927 present: yes
2020-05-13 22:42:11 FBDECT FBDECT_fritzbox2_11324_0481927 FBNAME: Dachfenster Heidiz.
2020-05-13 22:42:11 FBDECT FBDECT_fritzbox2_11324_0481927 FBPROP: HANFUN
2020-05-13 22:42:11 FBDECT FBDECT_fritzbox2_11324_0481927 fwversion: 30.17.02.02.011
2020-05-13 22:42:11 FBDECT FBDECT_fritzbox2_11324_0481927 AIN: 11324 0481927
2020-05-13 22:43:51 FBDECT FBDECT_fritzbox2_11324_0481927 AIN: 11324 0481927
2020-05-13 22:43:51 FBDECT FBDECT_fritzbox2_11324_0481927 fwversion: 30.17.02.02.011
2020-05-13 22:43:51 FBDECT FBDECT_fritzbox2_11324_0481927 FBPROP: HANFUN
2020-05-13 22:43:51 FBDECT FBDECT_fritzbox2_11324_0481927 present: yes
2020-05-13 22:43:51 FBDECT FBDECT_fritzbox2_11324_0481927 FBNAME: Dachfenster Heidiz.
2020-05-13 22:43:51 FBDECT
Mehr stand da nicht
Und du hast das Fenster auf und zu gemacht!?
Und wenn du event-on-change-reading entfernst!?
Was steht dann im EventMonitor!?
Und bitte: in code-Tags posten! (das '#' im "Menü")
Wenn das dann (deutlich) anders aussieht, dann stimmt im FBDECT bzgl. event-on-change-reading nicht...
Gruß, Joachim
Geht es auch nicht mehr mit dem pushen zu pushover.
Ja ich hab das Fenster auf und zu gemacht.
Er zeigt mir über die Lampe auch an das er aktiv und nicht aktiv ist
Lampe?!
Eh eigenartig, dass ein Fenster-/Türkontakt on/off statt open/closed anzeigt...
...das meinst du doch!?
Und wo ist die EventMonitor-Ausgabe bei "ohne event-on-change-reading"!?
Kommen überhaupt Events (so wie du denkst)!?
Und man kann sich Notify auch im EventMonitor anlegen lassen.
Einfach: Event wählen -> create/modify fertig...
...bzw. anpassen...
Gruß, Joachim
Guten morgen.
Ich hab den Befehl attr event-on-change-reading im Sensor
Gelöscht und schon wurde ich wieder in beide Zuständen
Mit Narichten abgeknallt. Wenn ich im Sensor auf attr. Gebe event-on-change-reading ein und im Moment bekomme ich keine Naricht mehr.
Schön, dass du uns so ausreichend mit Informationen versorgst... ;)
Wie sollen wir helfen, wenn du nicht lieferst was wir brauchen/"fordern": Ausgaben EventMonitor, lists der Devices (zumindest mal EINES Kontaktes und des Notify)...
Und (wie auch schon geschrieben) bitte in code-Tags ('#' im "Menü") posten!
Ansonsten: viel Spaß beim rumprobieren...
...weil so kann man nicht wirklich weiterhelfen, außer weiter "mitraten"...
EDIT: und wenn es OHNE event-on-change-reading (vors. richtig angewendet: aber ohne list nicht "prüfbar") geht und MIT event-on-change-reading NICHT, dann erneut: dann läuft im verwendeten Modul wohl was bzgl. event-on-change-reading etc. "falsch"...
EDIT2: dann gibt es ja immer noch die Variante z.B. mit oldreading und eine if-Abfrage etc. Aber erneut: ohne weitere Infos, außer: "so geht es aber ballert und so geht es nicht" kann man nicht weiterhelfen...
Gruß, Joachim
Zitat von: MadMax-FHEM am 14 Mai 2020, 08:24:07
Aber erneut: ohne weitere Infos, außer: "so geht es aber ballert und so geht es nicht" kann man nicht weiterhelfen...
me2 ... ganz abgesehen davon das das Thema hier völlig OT ist und für so einen allgemein Fall es zig fertige Lösungen gibt ( wurde auf Seite 1 ja schon abgehandelt)
werf ich dennoch eine weitere Variante in den Raum -> https://forum.fhem.de/index.php/topic,36504.0.html
Danke für die Schnelle Hilfe.
Es war wirklich das Problem mit den .* im Notify
Und in den Attributen