E-Mail per notify nach Zeitablauf erneut senden

Aus FHEMWiki
Version vom 7. April 2015, 10:48 Uhr von Krikan (Diskussion | Beiträge) (Hinweis auf (einfachere) alternative mit DOIF)
Info green.pngIn aktuellen Fhem-Versionen lässt sich das hier Beschriebene einfacher über DOIF realisieren. Ein übertragbares Beispiel enthält die commandref unter "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.pmangelegt werden. Eine 99_myUtils.pmerzeugt man sich nach 99 myUtils anlegen. Im Bereich von sub myUtils_Initializewird die Variable $NewMailtimeangelegt. 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 timeaufgerufen, die die Sekunden seit dem 01.01.1970, 00:00 Uhr, zurück gibt.

Nun wird in der Fhem-Konfigurationsdatei fhem.cfgdas notifyangelegt, 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(("%" !~ m/dry/) && (time > $main::NewMailtime)) {\
  {FB_Mail('IhrMailName@@IhrMailServer.de','FHEM Alarm','@ %')};;\
  $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(("%" !~ 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','@ %')};;\

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.