Pushover Nachricht nach 10 Min. Fenster offen

Begonnen von iamandy, 24 Februar 2016, 21:55:04

Vorheriges Thema - Nächstes Thema

iamandy

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.

willyk

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
NUC mit Ubuntu, MAX!Cube, CUNO, 6 MAX WT, 16 MAX HT, 2 MAX Fensterkontakt, MaxScanner

Rince

Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Kharim

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
Raspberry Pi 2 + Minibian + 2x MAX Cube CUN (868/433Mhz) + Thermostate + Fensterkontakte + Taster+RGB-LED Band über pigpiod + TFA Sensoren 30.3169/3125
Raspberry Pi 2 + Minibian +Z-Wave (USB) + Bewegungsmelder + Fensterkontakt + Sirene + SMS Steuer-/Benachrichtigung (ohne Internet)

iamandy

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

Cluni

#5
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

scheich

#6
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.

adn77

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

Sebastian84

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

MadMax-FHEM

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
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Sebastian84

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

MadMax-FHEM

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
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Sebastian84

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??????


KernSani

Bitte code tags verwenden. Das notify kann eigentlich nie funktioniert haben, da muss .* statt nur * stehen.


Kurz, weil mobil....
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

Sebastian84

Das ging ohne Probleme ohne den Punkt. Nur jetzt kommt keine push mehr nach pushover