Globale, flexible Fenster-/Tür-Offen-Meldungen

Begonnen von Benni, 20 April 2015, 20:19:31

Vorheriges Thema - Nächstes Thema

Benni

Denn sie wissen nicht, was sie tun ...

Zitat von: stromer-12 am 26 April 2015, 20:31:15
Vesuch es mal so:
sub PushInfo($$) {
   my ($msgsubj,$msgtext) = @_;

   fhem ({DebianMail('XX@xx.com','winOpenMessage',"$msgsubj - $msgtext")})
}


wie wäre es denn damit:

sub PushInfo($$) {
   my ($msgsubj,$msgtext) = @_;

   DebianMail('XX@xx.com',$msgsubj,$msgtext);
}


Das ist übrigens schon wieder OT ;)


noanda

Danke erst mal für die Hilfe, nun komme ich schon wieder nicht weiter, auch wenn ich vielleicht OT bin damit.

Ziel ist es das notify so anzupassen, dass die Mail nur generiert wird, wenn im Modul Resident alle "Absent" sind, mag an der Uhrzeit liegen, aber bekomme ich nicht hin:


(Melder.*|Familie) if ((Value("Melder.*") eq "open") && (Value("Familie") eq "absent")) {winOpenStart($NAME)}


Bei mir Fangen alle Fesnter und Türen mit Melder an.
Raspberry Pi - FHEM 5.5
HMLAN, RFXtrx433 , CUL 868
HM-CC-RT-DN, HM-SEC-MDIR , HM-SEC-SC-2
HM-LC-SW2-FM, ROTO_ZEL-STG-RM-FZS
ELRO440AB, Flamingo

jove01

Hallo

ich wollte meinen watchdog zur Fensterüberwachung durch diese shr flexible Überwachung ersetzen, leider hat sich durch irgendetwas ein Fehler eingeschlichen. Ein Trigger2 scheint permanent zu laufen, obwohl ich ihn im System nicht finde.

Durch zusätzliche Log-Einträge versuche ich dem Übel auf den Grund zu gehen. Diese Logs entstehen, obwohl alle Fenster zu sind!


2015.12.05 10:59:55 1: sub winOpenStart Anfang Chr_Fenster
2015.12.05 10:59:55 1: sub winOpenStart Chr_Fenster
2015.12.05 10:59:55 1: sub winOpenStart Chr_Fenster
2015.12.05 10:59:55 1: timer 2 00:05:00
2015.12.05 11:00:00 1: trigger Chr_Fenster_OpenTimer PushInfo('Fenster','Fenster Christoph ist noch  offen');;winOpenStart('Chr_Fenster','1');;
2015.12.05 11:00:00 1: sub winOpenStart Anfang Chr_Fenster
2015.12.05 11:00:00 1: sub winOpenStart Chr_Fenster
2015.12.05 11:00:00 1: sub winOpenStart Chr_Fenster
2015.12.05 11:00:00 1: timer 2 00:05:00
2015.12.05 11:00:01 1: trigger Chr_Fenster_OpenTimer PushInfo('Fenster','Fenster Christoph ist noch  offen');;winOpenStart('Chr_Fenster','1');;
2015.12.05 11:03:59 1: sub winOpenStart Anfang Chr_Fenster
2015.12.05 11:03:59 1: sub winOpenStart Chr_Fenster
2015.12.05 11:03:59 1: sub winOpenStart Chr_Fenster
2015.12.05 11:03:59 1: timer 2 00:05:00
2015.12.05 11:04:00 1: trigger Chr_Fenster_OpenTimer PushInfo('Fenster','Fenster Christoph ist noch  offen');;winOpenStart('Chr_Fenster','1');;
2015.12.05 11:08:03 1: sub winOpenStart Anfang Chr_Fenster
2015.12.05 11:08:03 1: sub winOpenStart Chr_Fenster
2015.12.05 11:08:03 1: sub winOpenStart Chr_Fenster
2015.12.05 11:08:03 1: timer 2 00:05:00
2015.12.05 11:08:04 1: trigger Chr_Fenster_OpenTimer PushInfo('Fenster','Fenster Christoph ist noch  offen');;winOpenStart('Chr_Fenster','1');;


Meine Utils sieht wie folgt aus

###############################################################################
#
#   Fenstersteuerung http://forum.fhem.de/index.php/topic,36504.0.html
#
#   1. Start
#
###############################################################################
sub winOpenStart($;$) {
    #Als Parameter muss der device-Name übergeben werden
    my $dev=shift(@_);
   Log3($dev,1,"sub winOpenStart Anfang $dev");
    #Optional kann noch ein Zähler für das erneute Triggern übergeben werden,
    #dieser ist per default 0
    my $retrigger=shift(@_);
   Log3($dev,1,"sub winOpenStart $dev");
    $retrigger=0 if (!$retrigger);
   Log3($dev,1,"sub winOpenStart $dev");

    #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);
# Log3($dev,1,"1. if $dev $maxtrigger");
   
        if($maxtrigger) {
# Log3($dev,1,"2. if");
   
      #Festlegen des Namens für den Timer, der angelegt wird um die Meldung nach gewünschter
          #Zeit auszugeben.
          my $devtimer=$dev.'_OpenTimer';
# Log3($dev,1,"2. if $devtimer");

          #Sollte dieser Timer bereits existieren, so wird er zunächst gelöscht.
          fhem("delete $devtimer") 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');
#   Log3($dev,1,"1. if $dev $waittime");

          #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);
Log3($dev,1,"timer 2 $devtimer2");

          #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
          #(Ich habe eine sub PushInfo, die Betreff und Text als Parameter erhält und aktuell
          # meine Meldungen über Pushover ausgibt)
          my $pushcmd="PushInfo('$devtype','$devname ist $immer $devstate');;";
# Log3($dev,1,"push $pushcmd");
         
          #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
          $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','07 FensterSteuerung'));
  fhem("attr $devtimer verbose ".AttrVal($dev,'verbose','5'));
Log3($dev,1,"trigger $devtimer $pushcmd");
        }
    }
}
###############################################################################
#
#   2. Stop
#
###############################################################################
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';
#   Log3($dev,1,"sub winOpenStop $dev $devtimer");
       
    #Existiert ein Timer diesen Namens, so wird er jetzt gelöscht und das war's auch schon.
    if ($defs{$devtimer}) {
        fhem("delete $devtimer");
    }
}
###############################################################################
#
#   3. Message
#
###############################################################################
sub PushInfo($$) {
   my ($msgsubj,$msgtext) = @_;

#   fhem("set <Pushover> msg 'winOpenMessage' '$msgsubj - $msgtext' ")
#}

# Log3(undef,1,"sub push winOpenMessage: $msgsubj - $msgtext"); #????
fhem ("set Juergens_TAB_S screen on;
set Juergens_TAB_S volume 10; sleep 2;
set pushMsg msg 'winOpenMessage' '$msgsubj - $msgtext' 'TabS-Juergen' 1 'climb'; sleep 8;
");
fhem ("set Juergens_TAB_S ttsMsg Achtung $msgtext !;
")
}
###############################################################################


Ursache liegt m.E bei dem $devtimer2. Ein restart habe ich durchgeführt. In der fhem.save finde ich auch nichts !

Ich hoffe, das mir einer helfen kan.

Jürgen
Aktuelles FHEM auf Raspi 3 und dbLog
CUL 433
HMLan Rolladensteuerung

Benni

Kannst du mal bitte noch ein List des Device Chr_Fenster posten?

jove01

Hallo Benni

danke für die schnelle Reaktion


Internals:
   CODE       51e996
   CUL_0_MSGCNT 33
   CUL_0_RAWMSG T51E99602
   CUL_0_RSSI -71.5
   CUL_0_TIME 2015-12-05 13:46:40
   DEF        51e996
   IODev      CUL_0
   LASTInputDev CUL_0
   MSGCNT     33
   NAME       Chr_Fenster
   NR         168
   OPEN       0
   PREVSTATE  Closed
   PREVTIMESTAMP 1449319356
   STATE      Closed
   TYPE       CUL_FHTTK
   CHANGETIME:
   Helper:
     Dblog:
       Battery:
         Mydblog:
           TIME       1449317648.47355
           VALUE      ok
       State:
         Mydblog:
           TIME       1449319600.03974
           VALUE      Closed
   Prev:
     STATE      02
     TIMESTAMP  1449319600
   Readings:
     2015-12-05 13:46:40   Battery         ok
     2015-11-28 10:41:04   Previous        Open
     2015-12-05 13:46:40   Reliability     ok
     2015-12-05 13:46:40   Window          Closed
     2015-12-05 13:46:40   state           Closed
Attributes:
   DbLogExclude Reliability,Window,Battery:6000
   IODev      CUL_0
   alias      Fenster Christoph
   devStateIcon Closed:signal_Fenster_Offen.off Open:signal_Fenster_Offen.on
   group      Fensterkontakte
   icon       fts_window_1w_open
   model      FHT80TF
   room       00 Info,02 Devices,07 FensterSteuerung,Christoph
   userattr   winOpenMaxTrigger winOpenTimer winOpenTimer2 winOpenType:Fenster,Türe winOpenName
   winOpenMaxTrigger 10
   winOpenTimer 00:15:00
   winOpenTimer2 00:05:00
   winOpenType Fenster


Im notify habe ich die Abfrage auf Open das FHT aktuell wieder raus.
Aktuelles FHEM auf Raspi 3 und dbLog
CUL 433
HMLan Rolladensteuerung

Benni

Sorry,

auf die Schnelle kann ich erst mal nichts erkennen.
Ich werde es morgen mal auf meinem Testsystem so einbauen und schauen, was dann dabei raus kommt.

Kannst du mir bis dahin auch noch ein list der zugehörigen notify geben?

Das kriegen wir schon hin :)

Bis dahin mal noch 2 Dinge zum Ausprobieren: Den Device-Namen ohne Unterstriche gestalten und für das Device mal das attribut event-on-change-reading auf .* oder auf state setzen.

jove01

Hallo Benni

zum einen hat tatsächlich attribut event-on-change-reading auf .* dafür gesorgt, das hier das Chr_Fenster nicht irgendwie reinfunkt.

Zum anderen hatte ich nach dem ersten Test mit deinem Code in das Notify eine if-Abfrage auf Temeratur aus meinem watchdog eingefügt.

--> Diese Abfrage war mit le und wurde nie ausgeführt ! Nach langem rumdoktern habe ich die Abfrage auf < umgestellt. Siehe da, dass funktioniert!!!!

Danke Dir für die schnelle und gute Unterstützung sowie für das super Coding.

Jürgen
Aktuelles FHEM auf Raspi 3 und dbLog
CUL 433
HMLan Rolladensteuerung

Benni

Hallo Jürgen,

super!  8)
Freut mich, dass es nun bei dir läuft!

Und danke für die Lorbeeren :)

Camper

Hallo
auch ich möchte gerne diese super flexible Meldung nutzen.
Ich habe alle so wie im ersten Thread beschrieben installiert.
Jedoch funktioniert der Timer2 nicht es wird immer nur der Timer ausgeführt.

Im Log steht folgendes:
define Fenster1_OpenTimer at +00:00:30 {PushInfo('Fenster','Fenster1 ist immer noch  offen');;winOpenStart('Fenster1','2');;} : Fenster1_OpenTimer already defined, delete it first

Ein List Fenster1 ergibt folgendes:
Internals:
   CFGFN      ./FHEM/Raspberry.cfg
   DEF        RPI_PiFace:in1
   DEVICE     RPI_PiFace
   NAME       Fenster1
   NR         348
   NTFY_ORDER 50-Fenster1
   READING    in1
   STATE      closed
   TYPE       readingsProxy
   Content:
     RPI_PiFace 1
   Readings:
     2016-01-10 17:05:25   state           0
Attributes:
   devStateIcon closed:fts_window_1w open:fts_window_1w_tilt
   eventMap   0:closed 1:open
   getFn      1
   getList    1:noArg
   room       Flur
   userattr   winOpenMaxTrigger winOpenTimer winOpenTimer2 winOpenType:Fenster,Türe winOpenName
   valueFn    ""
   winOpenMaxTrigger 3
   winOpenName Fenster1
   winOpenTimer 00:01:00
   winOpenTimer2 00:00:30
   winOpenType Fenster

Was mach ich falsch? Kann mir jemand hierbei helfen?

Vielen Dank
FHEM 5.5 auf RasPi
HM: 2x HM-CFG-LAN|3x HM-LC-SW1-FM|3x HM-LC-BL1-FM|5x HM-LC-Bl1PBU-FM|1x HM-Sen-MDIR-O|1x HM-CC-RT-DN|1x HM-SCI-3-FM
1x AVR-NET-IO
1x JeeLink 868MHz

Benni

Entweder wird das  Event open mehrfach hintereinander ausgelöst. Das wird im Moment nicht abgefangen, es wird einfach davon ausgegangen, dass nach einem open für ein Device nicht nochmal ein open kommen kann.
Stichwort hier evtl. noch event-on-change-reading

Oder Problem liegt irgendwo in deiner sub winOpenStart deiner 99_myUtils.pm.
eventuell wird dort der Timer als periodischer Timer definiert (*)

kannst du die beiden Dinge mal prüfen und ggf.  deine sub mal hier posten?
Aber bitte in Code-Tags!

Camper

Hallo Benni,
vielen Dank für die schnelle Antwort hier ist meine Sub.
Ein event-on-change-reading hab ich nicht, allerdings schreib ich mit addlog alle 5 Min. den state dieses events ins Log. 
Ist dies evtl. das Problem?

Viele Grüße
Harald

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.
          fhem("delete $devtimer") if ($defs{$devtimer});
          # fhem("delete $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
          #(Ich habe eine sub PushInfo, die Betreff und Text als Parameter erh�lt und aktuell
          # meine Meldungen �ber Pushover ausgibt)
          my $pushcmd="PushInfo('$devtype','$devname ist $immer $devstate');;";
  # my $pushcmd="Log3();;";         

          #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
          $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}) {
        fhem("delete $devtimer");
    }
}
FHEM 5.5 auf RasPi
HM: 2x HM-CFG-LAN|3x HM-LC-SW1-FM|3x HM-LC-BL1-FM|5x HM-LC-Bl1PBU-FM|1x HM-Sen-MDIR-O|1x HM-CC-RT-DN|1x HM-SCI-3-FM
1x AVR-NET-IO
1x JeeLink 868MHz

Benni

Zitat von: Camper am 10 Januar 2016, 21:46:04
allerdings schreib ich mit addlog alle 5 Min. den state dieses events ins Log. 
Ist dies evtl. das Problem?

Ja! Siehe entsprechenden Artikel im Wiki

onkel-tobi

Hi zusammen,

finde die Idee von Benni auch super und würde diese Lösung etwas abgeändert auch gerne bei mir verwenden.
Ich habe zunächst einmal alles 1:1 übernommen (beide winopen Routinen, die notify's und die PushInfo, die einfach nur ins Log schreibt) und das User Attribut folgendermaßen hinzugefügt:
attr eg_gb_fenster userattr winOpenMaxTrigger winOpenTimer:1 winOpenTimer2 winOpenType:Fenster,Türe winOpenName:Gaestebad
Die Beiden notify's funktionieren, beim Öffnen/Schließen bekomme ich bei log Level 5 angezeigt, dass gestartet/beendet wird. Allerdings gibt es weder eine Meldung ins Log, noch eine Whatsapp message (hatte ichvorher in der PushInfo).

Habe den winOpenTimer mal auf 1 gesetzt zum testen, aber auch wenn ich ihn weglasse passiert nach 10 Minuten nichts...Hat noch jemand eine Idee?

Gruß,
Tobi

Benni

Hallo Tobi,

gib mal bitte ein list von deinem eg_gb_fenster

wenn ich das richtig sehe hast du userattr nicht richtig verstanden.
Damit werden die zusätzlich möglichen Attribute für das device lediglich definiert.

gesetzt werden müssen sie natürlich mit ganz normal mit

attr <device> <attribut> <attributvalue>

Schau dir auch bitte nochmal im ersten Post den list des Beispiel-Dummys an. Dort siehst du, wie die Attribute bspw. zu setzen sind.

Gruß Benni.

onkel-tobi

#44
Hi Benni,

danke Du lagst völlig richtig.
Nun sieht es so aus:
Attributes:
   IODev      HMLAN_AZ
   IOgrp      vccu:HMLAN_AZ
   actCycle   028:00
   actStatus  alive
   autoReadReg 4_reqStatus
   expert     2_full
   firmware   2.4
   model      HM-SEC-SC-2
   peerIDs    00000000,
   room       CUL_HM
   serialNr   LEQ1243614
   subType    threeStateSensor
   userattr   winOpenMaxTrigger winOpenTimer winOpenTimer2 winOpenType:Fenster,Türe winOpenName
   winOpenName Gästebad
   winOpenTimer 00:00:01
   winOpenType Fenster


Scheine aber dann noch was falsch zu machen? Erstelle gerade mal einen Dummy und teste damit weiter.

Gruß,
Tobi