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

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

Vorheriges Thema - Nächstes Thema

CoolTux

scheint erstmal zu passen.
Dann gib mal bitte Deine Funktion.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Fredi69

Ich habe die Ursache gefunden, ich frage einen zusätzlichen Parameter ab:
my $Heizung=ReadingsVal('Heizperiode','STATE','');
In "Heizperiode" steht "on" oder "off" drin.
Leider liefert mein "ReadingsVal" nichts zurück, warum?
fhem auf Raspberry Pi 3
FRITZ!Box7490, Fritz!Box 3270 AP, 3xHMLAN, CUL868, nanoCUL 433 für IT, JeeLink für LaCrosse, HUE Bridge 2.0, Samsung UE46C8790 (STV), mehrere Homematic, Intertechno, Shelly und LaCrosse Komponenten

CoolTux

Zitat von: Fredi69 am 04 November 2018, 21:36:03
Ich habe die Ursache gefunden, ich frage einen zusätzlichen Parameter ab:
my $Heizung=ReadingsVal('Heizperiode','STATE','');
In "Heizperiode" steht "on" oder "off" drin.
Leider liefert mein "ReadingsVal" nichts zurück, warum?

Weil Du ein nicht existierendes Reading ab fragst. STATE ist ein Internal kein Reading. Nimm state
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Fredi69

Zitat von: CoolTux am 04 November 2018, 21:42:53
Weil Du ein nicht existierendes Reading ab fragst. STATE ist ein Internal kein Reading. Nimm state

Das war es, herzlichen Dank.
fhem auf Raspberry Pi 3
FRITZ!Box7490, Fritz!Box 3270 AP, 3xHMLAN, CUL868, nanoCUL 433 für IT, JeeLink für LaCrosse, HUE Bridge 2.0, Samsung UE46C8790 (STV), mehrere Homematic, Intertechno, Shelly und LaCrosse Komponenten

CoolTux

Ich gehe davon aus das wenn Heizperiode off ist keine Fenster offen Meldung kommen soll, oder?
Dann würde ich die Abfrage in eine Bedingung ins Notify ein bauen.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Benni

Ich habe bei mir übrigens inzwischen längst von at auf benanntes sleep und cancel umgestellt.

relevanter Auszug aus der sub winOpenStart():


#Namen für das benannte sleep bauen
my $sleepId='sleep.'.$dev;
 
#Nachdem wir hier alles zusammen haben,
#legen wir den Timer (das benannte sleep) an
fhem("sleep $sleeptime $sleepId;{$pushcmd}");


Passend dazu der entsprechende Auszug aus der sub winOpenStop():


#Namen für das benannte sleep bauen
my $sleepId='sleep.'.$dev;

#Abbrechen des entsprechenden sleep
fhem("cancel $sleepId");


gb#

det.

Hallo Benni,
Hast Du den in Post 172 erwähnten Einbruchsfall bereits bei Dir irgendwie eingebaut und kannst das für programmiertechnische Blindgänger zur Verfügung stellen? Da bei Deiner Lösung die Auswahl der Device, welche erfasst werden sollen sehr einfach ist und die Device in der Telegramm Meldung auch noch sinnvoll benannt werden können, wäre das m.mn eine prima Erweiterung.
LG
det.

Benni


Zitat von: det. am 12 November 2018, 16:37:43
Hast Du den in Post 172 erwähnten Einbruchsfall bereits bei Dir irgendwie eingebaut ...

Äh, nö! Hatte ich eigentlich auch nicht vor.
In dem genannten Post habe ich ja auf einen weiteren Post verwiesen, der den Fall mit einem DOIF bereits abdeckt:
https://forum.fhem.de/index.php/topic,36504.msg726139.html#msg726139

gb#

det.

Ok, da ich die sofortige Meldung ,,Tür geöffnet" bei Abwesenheit mit Auswahl der Device, welche für Benni's window.Open Routine mit userAttr benannt und festgelegt werden unbedingt haben wollte, hab ich den Programmierschweinehund in mir besiegt und es selbst hinbekommen. Danke für den Anstoß und den Code vom Anfang dieses Themas, den ich dazu als Grundgerüst verwendet habe.
LG
det.

gandi1791

Vielen Dank! Läuft prima.

Habe die UserAttribute noch um winOpenAlexaDevice ergänzt.
Da meine Echos mit 37_Echodevice.pm integriert habe, gebe ich nun, je nach dem welches Echo als Attribut dort angegeben ist, dort eine Sprachmeldung aus.
Also genauer gesagt:
Standardmäßig wird immer im Wohnzimmer ausgegeben und wenn das Attribut ungleich dem Wohnzimmer Echo ist, dann wird auch zusätzlich an dem angegebenen Echo ausgegeben.

fhem auf proxmox container
minicul>ESP-01>868>MAX!; minicul>ESP-01>433>SignalDuino>RSL/Jaro/IT
ESP-01>HM-MOD-RPI-PCB>HM
MySensorsGW>NodeMCU>Sensoren, Aktoren, div.
Broadlink RM Pro+ >433 Steckdosen, IR TV/Receiver; Hue, Alexa Echo Plus, div.Dot 2/3/4;DVB-T Stick>mqtt>TFA 30.3180

willib

Zitat von: Benni am 05 November 2018, 08:24:59
Ich habe bei mir übrigens inzwischen längst von at auf benanntes sleep und cancel umgestellt.

Würdest du eventuell deinen aktuellen Code nochmal vollständig posten?
Vielen Dank.
FHEM in Debian 10 LXC unter Proxmox auf NUC, Homematic, Hue, Intertechno, Jeelink, RFXTRX, Harmony Hub, VU+ Uno 4K, Sonos, AMAD

KyleK

Zitat von: willib am 13 Februar 2019, 16:11:52
Würdest du eventuell deinen aktuellen Code nochmal vollständig posten?
Vielen Dank.

Mich würde interessieren ob sleep/cancel einen Vorteil gegenüber at bringen?
FHEM on Raspberry Pi 3B+
CUL868
7x MAX! Thermostat, 8x MAX! Fensterkontakte
Conbee II + deConz, TradFri Lampen, Osram Smart+ Steckdosen

Benni

#192
Zitat von: KyleK am 13 März 2019, 22:14:07
Mich würde interessieren ob sleep/cancel einen Vorteil gegenüber at bringen?

Hauptvorteil für mich war, dass keine Devices erzeugt und wieder gelöscht werden.
Ich führe u.a. bei global:DEFINED events Aktionen aus.

gb#

Benni

Zitat von: willib am 13 Februar 2019, 16:11:52
Würdest du eventuell deinen aktuellen Code nochmal vollständig posten?
Vielen Dank.

Den Code müsste ich erst mal wieder etwas vereinfachen (bei mir passiert da noch mehr) um ihn hier in verständlicher Weise zu präsentieren.

Mal sehen, ob und wann ich dafür mal Zeit und Muse habe? Im Moment leider nicht, sorry!  :-[

gb#

flummy1978

#194
Hallo zusammen,

zunächst einmal @Benni:
Vielen Dank für die Erweiterung. Es ist wieder ein kleiner (Anfänger)schritt, der mich wieder voran gebracht hat. Vor allem aber, ist Deine Erweiterung einfach so genial beschrieben und dokumentiert dass sogar der größte Depp (ich :D) sie verstehen kann, wenn man sich ein wenig hinein versetzt und liest, was dort steht.  Einfach nur genial gemacht !!!! Fettes DANKE Dafür !!

@willib:
Ich weiss nicht ob das noch aktuell ist....
Zitat von: willib am 13 Februar 2019, 16:11:52
Würdest du eventuell deinen aktuellen Code nochmal vollständig posten?
Vielen Dank.
Nachdem ich das heute erst zusammengebaut habe, ist es recht jungfräulich und daher gut zu kopieren:

Ich habe das jetzt mit sleep & cancel sleep übernommen und umgesetzt. Oben im Beispiel war noch ein kleiner Fehler im cancel Befehl.  ALLE Texte / Kommentare inkl. Originalcode (at Timer) als Kommentar drin gelassen, damit man sieht was geändert wurde. Pushinfo als Log Datei Eintrag ist auch noch drin.

Vier Änderungen gegenüber dem Original sind bei mir: (Wenn ich keine vergessen hab  ::) )

- Zusätzlicher Text: 1. Meldung: wurde hinzugefügt.
- Meine Tür & Fenster Kontakte haben / werden das Präfix _TK_ haben. Daher taucht das im notify auf
- Jeweiliges notify für den Aufruf ist als Kommentar zu Begin der Subroutine
- Man muss die Attribute winOpenTimer und winOpenTimer2 natürlich auf XXX Sek Anzahl ändern (mit 00:00:10 kann sleep nix anfangen)

####################################
# Überwachung offene Tür / Fenster #
####################################

sub winOpenStart($;$) {
# Notify dafür
# define winOpen_noti notify .*TK.*:(open|tilted) {winOpenStart($NAME)}

    #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';
  my $sleepId='sleep.'.$dev;

          #Sollte dieser Timer bereits existieren, so wird er zunächst gelöscht.
          #fhem("delete $devtimer") if ($defs{$devtimer});
  fhem("cancel $sleepId") if ($defs{$sleepId});

          #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="PushInfo('$devtype','";
  $pushcmd.=$retrigger+1;
  $pushcmd.=".Meldung: $devname ist $immer $devstate');;";
  #my $pushcmd="PushInfo('$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
          $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'));
  fhem("sleep $waittime $sleepId;{$pushcmd}");
        }
    }
}

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

   Log3(undef,1,"winOpenMessage: $msgsubj - $msgtext");
}

sub winOpenStop($) {
#Notify dafür:
#define winOpen.CloseNotify notify .*:closed {winOpenStop($NAME)}

    #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';
my $sleepId='sleep.'.$dev;
   
   
    #Existiert ein Timer diesen Namens, so wird er jetzt gelöscht und das war's auch schon.
#    if ($defs{$sleepId}) {
        #fhem("delete $devtimer");
fhem("cancel $sleepId");
Log3(undef,1,"SleepID: $sleepId");
#   }
}



Hoffe das hilft.

Grüße
Andreas

# Edith sagt: In der Timer-löschen Routine, musste noch die Abfrage entfernt werden

# Ediths Schwester sagt: Wenn das für alle anderen so funtioniert, wie für mich könntest Du das auch im ersten Beitrag mit anpinnen, als Option oder Benni?