E-Mail per notify nach Zeitablauf erneut senden: Unterschied zwischen den Versionen

Aus FHEMWiki
(ersetzen von %/@ mit $EVENT/$NAME)
(E-Mail)
 
(3 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
{{Randnotiz|RNTyp=Info|RNText=In aktuellen Fhem-Versionen lässt sich das hier Beschriebene einfacher über [[DOIF]] realisieren. Übertragbare Beispiele enthält die [http://fhem.de/commandref_DE.html#DOIF commandref] unter ''"Anwendungsbeispiel: Die Meldung soll maximal dreimal erfolgen mit einer Pause von mindestens 10 Minuten"'' bzw. ''"Anwendungsbeispiel: Meldung beim Ausbleiben eines Events"''}}'''E-Mail per notify nach Zeitablauf erneut senden'''
{{Randnotiz|RNTyp=Info|RNText=In aktuellen FHEM-Versionen lässt sich das hier Beschriebene auch über [[DOIF]] realisieren. Übertragbare Beispiele enthält die {{Link2CmdRef|Lang=de|Anker=DOIF}} unter ''"Anwendungsbeispiel: Die Meldung soll maximal dreimal erfolgen mit einer Pause von mindestens 10 Minuten"'' bzw. ''"Anwendungsbeispiel: Meldung beim Ausbleiben eines Events"''}}'''E-Mail per notify nach Zeitablauf erneut senden'''
<ins>Ausgangssituation:</ins>
<ins>Ausgangssituation:</ins>


Viele Fhem-Benutzer möchten, dass eine automatisierte E-Mail bei einem Warnzustand (Temperatur zu hoch, Türe bzw. Fenster offen usw.) nur genau ein Mal verschickt wird, denn viele (aber nicht alle!) Sensoren melden sich alle paar Minuten wieder und bei jeder Meldung wird eine neue E-Mail erzeugt.
Viele FHEM-Benutzer möchten, dass eine automatisierte E-Mail bei einem Warnzustand (Temperatur zu hoch, Türe bzw. Fenster offen usw.) nur genau ein Mal verschickt wird, denn viele (aber nicht alle!) Sensoren melden sich alle paar Minuten wieder und bei jeder Meldung wird eine neue E-Mail erzeugt.


Dafür gibt es einige Lösungen in diesem Wiki.  
Dafür gibt es einige Lösungen in diesem Wiki.  
Zeile 10: Zeile 10:
<ins>Problem:</ins> Man braucht einen Merker (Variable), wann das letzte Mal die Aktion zum Versand der E-Mail ausgelöst wurde.
<ins>Problem:</ins> Man braucht einen Merker (Variable), wann das letzte Mal die Aktion zum Versand der E-Mail ausgelöst wurde.


<ins>Lösung:</ins> Diese Variable kann z.B. in der Datei ''99_myUtils.pm''angelegt werden. Eine ''99_myUtils.pm''erzeugt man sich nach [[99 myUtils anlegen]]. Im Bereich von ''sub myUtils_Initialize''wird die Variable ''$NewMailtime''angelegt. Das sieht dann wie folgt aus:
<ins>Lösung:</ins> Diese Variable kann z.B. in der Datei ''99_myUtils.pm'' angelegt werden. Eine ''99_myUtils.pm'' erzeugt man sich nach [[99 myUtils anlegen]]. Im Bereich von ''sub myUtils_Initialize'' wird die Variable ''$NewMailtime'' angelegt. Das sieht dann wie folgt aus:


  <nowiki>sub
  <nowiki>sub
Zeile 18: Zeile 18:
  my $NewMailtime = time;
  my $NewMailtime = time;
}</nowiki>
}</nowiki>
In der Variablen ''$NewMailtime''wird ein sogenannter Timestamp abgespeichert. Genauer gesagt wird die Perl-Funktion ''time''aufgerufen, die die Sekunden seit dem 01.01.1970, 00:00 Uhr, zurück gibt.
In der Variablen ''$NewMailtime''wird ein sogenannter Timestamp abgespeichert. Genauer gesagt wird die Perl-Funktion ''time'' aufgerufen, die die Sekunden seit dem 01.01.1970, 00:00 Uhr, zurück gibt.


Nun wird in der Fhem-Konfigurationsdatei ''fhem.cfg''das ''notify''angelegt, das diese Variable und die gemeldeten Warn- bzw. Alarmzustände auswertet und die erste sowie die - nach festzulegendem Zeitablauf - nachfolgenden E-Mails versendet:
Nun wird in der FHEM-Konfigurationsdatei ''fhem.cfg'' das ''notify'' angelegt, das diese Variable und die gemeldeten Warn- bzw. Alarmzustände auswertet und die erste sowie die - nach festzulegendem Zeitablauf - nachfolgenden E-Mails versendet:


  <nowiki>define WarnungPerEMail notify Raum.Melder:contact.* {\
  <nowiki>define WarnungPerEMail notify Raum.Melder:contact.* {\
Zeile 31: Zeile 31:
* ''Raum.Melder:contact.*'' ist das Pattern (der Filter) auf den meldenden Sensor sowie dessen Meldung (hier ein Wassermelder). Bei einem Temperatur-/Tür-/Fenstersensor sieht das natürlich anders aus (aber das ist nicht Gegenstand dieses Artikels).
* ''Raum.Melder:contact.*'' ist das Pattern (der Filter) auf den meldenden Sensor sowie dessen Meldung (hier ein Wassermelder). Bei einem Temperatur-/Tür-/Fenstersensor sieht das natürlich anders aus (aber das ist nicht Gegenstand dieses Artikels).
* ''if(("$EVENT" !~ m/dry/)'' prüft darauf, ob der Wassermelder einen Zustand '''un'''gleich ''dry'' meldet (also z.B. "wet" oder "water" für feucht bzw. nass). Der Teil ''dry'' muss von ihnen also angepasst werden.
* ''if(("$EVENT" !~ m/dry/)'' prüft darauf, ob der Wassermelder einen Zustand '''un'''gleich ''dry'' meldet (also z.B. "wet" oder "water" für feucht bzw. nass). Der Teil ''dry'' muss von ihnen also angepasst werden.
* ''&amp;&amp; (time &gt; $main::NewMailtime)'' prüft, ob seit der letzten Mail noch nicht die Zeit (in Sekunden) vergangen ist, wie sie in ''$NewMailtime'' zwischengespeichert worden ist. Da hier erneut gegen die Anzahl der (seit Erstinitialisierung der Variablen ''$NewMailtime'') Sekunden seit dem 01.01.1970, 00:00 Uhr, geprüft wird und Fhem ja zumindest 1 Sekunde (in der Realität natürlich mehr) seit erstmaligem Auftreten der Warnmeldung läuft, ist die Bedingung erfüllt und die nachfolgenden Befehle werden ausgeführt:
* ''&amp;&amp; (time &gt; $main::NewMailtime)'' prüft, ob seit der letzten Mail noch nicht die Zeit (in Sekunden) vergangen ist, wie sie in ''$NewMailtime'' zwischengespeichert worden ist. Da hier erneut gegen die Anzahl der (seit Erstinitialisierung der Variablen ''$NewMailtime'') Sekunden seit dem 01.01.1970, 00:00 Uhr, geprüft wird und FHEM ja zumindest 1 Sekunde (in der Realität natürlich mehr) seit erstmaligem Auftreten der Warnmeldung läuft, ist die Bedingung erfüllt und die nachfolgenden Befehle werden ausgeführt:
* der Code
* der Code
  <nowiki>{FB_Mail('IhrMailName@IhrMailServer.de','FHEM Alarm','$NAME&#160;$EVENT')};;\</nowiki>
  <nowiki>{FB_Mail('IhrMailName@IhrMailServer.de','FHEM Alarm','$NAME&#160;$EVENT')};;\</nowiki>
ruft eine andere in Perl definierte Fhem-Funktion (sub) auf, die die eigentliche E-Mail formuliert und versendet. Näheres dazu finden Sie [[E-Mail senden]].
ruft eine andere in Perl definierte FHEM-Funktion (sub) auf, die die eigentliche E-Mail formuliert und versendet. Näheres dazu finden Sie [[E-Mail senden]].


* ''$main::NewMailtime = time + 14400'' setzt nun die Variable ''$NewMailtime'' neu. Dabei wird wieder ''time'' (siehe oben =&gt; Anzahl der Sekunden ab ...) gelesen und dieser Wert um 14400 erhöht. 14400 entspricht der Anzahl der Sekunden von 4 Stunden (60 * 60 * 4). Dieser Wert kann von ihnen frei angepasst werden, um die Zeit bis zur nächsten E-Mail zu verkürzen oder zu verlängern.
* ''$main::NewMailtime = time + 14400'' setzt nun die Variable ''$NewMailtime'' neu. Dabei wird wieder ''time'' (siehe oben =&gt; Anzahl der Sekunden ab ...) gelesen und dieser Wert um 14400 erhöht. 14400 entspricht der Anzahl der Sekunden von 4 Stunden (60 * 60 * 4). Dieser Wert kann von ihnen frei angepasst werden, um die Zeit bis zur nächsten E-Mail zu verkürzen oder zu verlängern.
Zeile 41: Zeile 41:


* Diese Seite ist noch nicht vollständig. Falls innerhalb der hier benutzten 4 Stunden der Warnzustand behoben wird und erneut auftritt, wird eine weitere E-Mail erst nach 4 Stunden abgesendet. Die Variable ''$NewMailtime'' muss also zurückgesetzt werden.
* Diese Seite ist noch nicht vollständig. Falls innerhalb der hier benutzten 4 Stunden der Warnzustand behoben wird und erneut auftritt, wird eine weitere E-Mail erst nach 4 Stunden abgesendet. Die Variable ''$NewMailtime'' muss also zurückgesetzt werden.
* Diese ''notify'' '''funktioniert nicht''' mit Sensoren, die ihre Warn-/Alarm-Meldung nur ein einziges Mal an Fhem senden (so z.B. der HomeMatic Wassermelder HM-Sec-WDS).
* Diese ''notify'' '''funktioniert nicht''' mit Sensoren, die ihre Warn-/Alarm-Meldung nur ein einziges Mal an FHEM senden (so z.B. der HomeMatic Wassermelder HM-Sec-WDS).
* Falls Ihr Sensor mehrere unterschiedliche Melde-, Warn- oder Alarmzustände (wie z.B. bei Wassermeldern, die neben Bodennässe auch noch stehendes Wasser ab einer gewissen Höhe melden, oder Füllstandsmesser), reicht die oben benutzte ''if ...'' Bedingung nicht aus. Es wird nur auf einen Zustand anders als der Normalzustand (hier: ''dry'') geprüft. '''Ändert''' sich aber der Zustand innerhalb der vorgegebenen Wartezeit (also im Beispiel 4 Stunden) bis zur Mailwiederholung, wird keine neue E-Mail verschickt. Hier müssten andere if-Bedingungen (oder - je nach Sensor - mehrere) erstellt werden.
* Falls Ihr Sensor mehrere unterschiedliche Melde-, Warn- oder Alarmzustände (wie z.B. bei Wassermeldern, die neben Bodennässe auch noch stehendes Wasser ab einer gewissen Höhe melden, oder Füllstandsmesser), reicht die oben benutzte ''if ...'' Bedingung nicht aus. Es wird nur auf einen Zustand anders als der Normalzustand (hier: ''dry'') geprüft. '''Ändert''' sich aber der Zustand innerhalb der vorgegebenen Wartezeit (also im Beispiel 4 Stunden) bis zur Mailwiederholung, wird keine neue E-Mail verschickt. Hier müssten andere if-Bedingungen (oder - je nach Sensor - mehrere) erstellt werden.
[[Kategorie:HOWTOS]]
[[Kategorie:HOWTOS]]
[[Kategorie:Code Snippets]]
[[Kategorie:Code Snippets]]
[[Kategorie:E-Mail]]

Aktuelle Version vom 14. November 2018, 13:08 Uhr

Info green.pngIn aktuellen FHEM-Versionen lässt sich das hier Beschriebene auch über DOIF realisieren. Übertragbare Beispiele enthält die commandref/DOIF unter "Anwendungsbeispiel: Die Meldung soll maximal dreimal erfolgen mit einer Pause von mindestens 10 Minuten" bzw. "Anwendungsbeispiel: Meldung beim Ausbleiben eines Events"

E-Mail per notify nach Zeitablauf erneut senden Ausgangssituation:

Viele FHEM-Benutzer möchten, dass eine automatisierte E-Mail bei einem Warnzustand (Temperatur zu hoch, Türe bzw. Fenster offen usw.) nur genau ein Mal verschickt wird, denn viele (aber nicht alle!) Sensoren melden sich alle paar Minuten wieder und bei jeder Meldung wird eine neue E-Mail erzeugt.

Dafür gibt es einige Lösungen in diesem Wiki.

Dann gibt es aber den Fall, dass man sich diese E-Mail nach Ablauf einer bestimmten Zeitspanne (hier 4 Stunden) erneut zuschicken lassen möchte. Darum geht es hier.

Problem: Man braucht einen Merker (Variable), wann das letzte Mal die Aktion zum Versand der E-Mail ausgelöst wurde.

Lösung: Diese Variable kann z.B. in der Datei 99_myUtils.pm angelegt werden. Eine 99_myUtils.pm erzeugt man sich nach 99 myUtils anlegen. Im Bereich von sub myUtils_Initialize wird die Variable $NewMailtime angelegt. Das sieht dann wie folgt aus:

sub
myUtils_Initialize($$)
{
 my ($hash) = @_;
 my $NewMailtime = time;
}

In der Variablen $NewMailtimewird ein sogenannter Timestamp abgespeichert. Genauer gesagt wird die Perl-Funktion time aufgerufen, die die Sekunden seit dem 01.01.1970, 00:00 Uhr, zurück gibt.

Nun wird in der FHEM-Konfigurationsdatei fhem.cfg das notify angelegt, das diese Variable und die gemeldeten Warn- bzw. Alarmzustände auswertet und die erste sowie die - nach festzulegendem Zeitablauf - nachfolgenden E-Mails versendet:

define WarnungPerEMail notify Raum.Melder:contact.* {\
 if(("$EVENT" !~ m/dry/) && (time > $main::NewMailtime)) {\
  {FB_Mail('IhrMailName@IhrMailServer.de','FHEM Alarm','$NAME $EVENT')};;\
  $main::NewMailtime = time + 14400;;\
 }\
}
  • WarnungPerEMail ist der Name des notify und kann von ihnen frei gewählt werden.
  • Raum.Melder:contact.* ist das Pattern (der Filter) auf den meldenden Sensor sowie dessen Meldung (hier ein Wassermelder). Bei einem Temperatur-/Tür-/Fenstersensor sieht das natürlich anders aus (aber das ist nicht Gegenstand dieses Artikels).
  • if(("$EVENT" !~ m/dry/) prüft darauf, ob der Wassermelder einen Zustand ungleich dry meldet (also z.B. "wet" oder "water" für feucht bzw. nass). Der Teil dry muss von ihnen also angepasst werden.
  • && (time > $main::NewMailtime) prüft, ob seit der letzten Mail noch nicht die Zeit (in Sekunden) vergangen ist, wie sie in $NewMailtime zwischengespeichert worden ist. Da hier erneut gegen die Anzahl der (seit Erstinitialisierung der Variablen $NewMailtime) Sekunden seit dem 01.01.1970, 00:00 Uhr, geprüft wird und FHEM ja zumindest 1 Sekunde (in der Realität natürlich mehr) seit erstmaligem Auftreten der Warnmeldung läuft, ist die Bedingung erfüllt und die nachfolgenden Befehle werden ausgeführt:
  • der Code
{FB_Mail('IhrMailName@IhrMailServer.de','FHEM Alarm','$NAME $EVENT')};;\

ruft eine andere in Perl definierte FHEM-Funktion (sub) auf, die die eigentliche E-Mail formuliert und versendet. Näheres dazu finden Sie E-Mail senden.

  • $main::NewMailtime = time + 14400 setzt nun die Variable $NewMailtime neu. Dabei wird wieder time (siehe oben => Anzahl der Sekunden ab ...) gelesen und dieser Wert um 14400 erhöht. 14400 entspricht der Anzahl der Sekunden von 4 Stunden (60 * 60 * 4). Dieser Wert kann von ihnen frei angepasst werden, um die Zeit bis zur nächsten E-Mail zu verkürzen oder zu verlängern.

Anmerkungen:

  • Diese Seite ist noch nicht vollständig. Falls innerhalb der hier benutzten 4 Stunden der Warnzustand behoben wird und erneut auftritt, wird eine weitere E-Mail erst nach 4 Stunden abgesendet. Die Variable $NewMailtime muss also zurückgesetzt werden.
  • Diese notify funktioniert nicht mit Sensoren, die ihre Warn-/Alarm-Meldung nur ein einziges Mal an FHEM senden (so z.B. der HomeMatic Wassermelder HM-Sec-WDS).
  • Falls Ihr Sensor mehrere unterschiedliche Melde-, Warn- oder Alarmzustände (wie z.B. bei Wassermeldern, die neben Bodennässe auch noch stehendes Wasser ab einer gewissen Höhe melden, oder Füllstandsmesser), reicht die oben benutzte if ... Bedingung nicht aus. Es wird nur auf einen Zustand anders als der Normalzustand (hier: dry) geprüft. Ändert sich aber der Zustand innerhalb der vorgegebenen Wartezeit (also im Beispiel 4 Stunden) bis zur Mailwiederholung, wird keine neue E-Mail verschickt. Hier müssten andere if-Bedingungen (oder - je nach Sensor - mehrere) erstellt werden.