Zyklische Überprüfung von Geräten mit Benachrichtigung per Email
Zur Navigation springen
Zur Suche springen
Hiermit können Geräte zyklisch überprüft werden und es erfolgt eine Benachrichtigung per Email.
Folgendes Parameter können über das Webfrontend eingegeben werden:
- Suchstring und Parameter der Geräte
- IP-Adresse der Mailserver
- Sender-Emailadresse
- Empfanger-Emailadresse
- Tag der Prüfung bzw. tägliche Prüfung
- Uhrzeit der Prüfung
- Art der Benachrichtigung (Info oder Error)
Zentrale FHEM Konfiguration fhem.cfg
include /opt/fhem/include/Global.cfg
Konfigurationsdatei Global.cfg
define checkDevice_time dummy attr checkDevice_time room Globale_Einstellungen attr checkDevice_time setList state:time attr checkDevice_time webCmd state define checkDevice_notify notify checkDevice_time {fhem("modify checkDevice_at *$EVENT");;} attr checkDevice_notify room Globale_Einstellungen define checkDevice_at at *09:00 {\ if ( ($wday eq Value("checkDevice_day")) || (Value("checkDevice_day") eq "*") ) {\ checkDevice(Value("checkDevice_device_parameter"),Value("checkDevice_mailserver"),Value("checkDevice_sender"),Value("checkDevice_recipient"),Value("checkDevice_mailsend"));;\ }\ } attr checkDevice_at room Globale_Einstellungen define checkDevice_day dummy attr checkDevice_day eventMap So:0 Mo:1 Di:2 Mi:3 Do:4 Fr:5 Sa:6 attr checkDevice_day room Globale_Einstellungen attr checkDevice_day setList state:So,Mo,Di,Mi,Do,Fr,Sa,* attr checkDevice_day webCmd state define checkDevice_device_parameter dummy attr checkDevice_device_parameter room Globale_Einstellungen define checkDevice_mailserver dummy attr checkDevice_mailserver room Globale_Einstellungen define checkDevice_recipient dummy attr checkDevice_recipient room Globale_Einstellungen define checkDevice_sender dummy attr checkDevice_sender room Globale_Einstellungen define checkDevice_mailsend dummy attr checkDevice_mailsend room Globale_Einstellungen attr checkDevice_mailsend setList state:Info,Error attr checkDevice_mailsend webCmd state
99_myUtils.pm
use Net::SMTP; ############################################## # Prozedur zur Überprüfung der Geräte # Parameter: # 1. Suchstring für die Geräte und der Parameter (z.B. .*_Relais,PIO.ALL,.*_Temperatursensor,temperature) # 2. Mailserver (z.B. 127.0.0.1) # 3. Sender Emailadresse (z.B. fhem@fhem.de) # 4. Empfänger Emailadressen (z.B. recipient@fhem.de,recipient1@fhem.de) # 5. Mailbenachrichtigung bei (Info,Error) # # Bsp: checkDevice(".*_Relais,PIO.ALL,.*_Temperatursensor,temperature","127.0.0.1","fhem@fhem.de","recipient@fhem.de","Info") ############################################## sub checkDevice($$$$$) { my($deviceParameter,$mailserver,$mailsender,$mailrecipient,$checkDevice_mailsend) = @_; if ( $deviceParameter eq "???" ) { Log 3, "Abbruch: checkDevice_device_parameter ist nicht initialisiert"; return; } if ( $mailserver eq "???" ) { Log 3, "Abbruch: checkDevice_mailserver ist nicht initialisiert"; return; } if ( $mailsender eq "???" ) { Log 3, "Abbruch: checkDevice_sender ist nicht initialisiert"; return; } if ( $mailrecipient eq "???" ) { Log 3, "Abbruch: checkDevice_recipient ist nicht initialisiert"; return; } if ( $checkDevice_mailsend eq "???" ) { Log 3, "Abbruch: checkDevice_mailsend ist nicht initialisiert"; return; } my @deviceParameterArray = split(/,/,$deviceParameter); if ( (scalar(@deviceParameterArray) % 2) ) { Log 3, "Abbruch: checkDevice_device_parameter enthält eine unglültige Anzahl von Parametern"; return; } my ($Sekunden, $Minuten, $Stunden, $Monatstag, $Monat, $Jahr, $Wochentag, $Jahrestag, $Sommerzeit) = localtime(time); $Monat += 1; $Jahr += 1900; $Sekunden = sprintf("%02d", $Sekunden); $Minuten = sprintf("%02d", $Minuten); $Stunden = sprintf("%02d", $Stunden); $Monatstag = sprintf("%02d", $Monatstag); $Monat = sprintf("%02d", $Monat); $mailrecipient =~ tr/;/,/; my @mailrecipientArray = split(/,/,$mailrecipient); my $device; my $deviceCounter; my $deviceValue; my $error=0; my $deviceString; my $deviceListe; my @deviceArray; my $mailsubject_info = "Info zum DeviceCheck am $Monatstag\.$Monat\.$Jahr um $Stunden:$Minuten:$Sekunden"; my $mailsubject_error = "Fehler beim DeviceCheck am $Monatstag\.$Monat\.$Jahr um $Stunden:$Minuten:$Sekunden"; my $mailData = "Start der Prüfung: $Stunden:$Minuten:$Sekunden $Monatstag\.$Monat\.$Jahr\n"; for ($deviceCounter=0;$deviceCounter<=$#deviceParameterArray;$deviceCounter+=2) { $deviceString = $deviceParameterArray[$deviceCounter]; $deviceParameter = $deviceParameterArray[($deviceCounter)+1]; $mailData = $mailData."\n\nSuchstring fuer die Geräte: ".$deviceString."\n"; $mailData = $mailData."Parameter der Geräte: ".$deviceParameter."\n\n"; $deviceListe = fhem("list $deviceString NAME"); $deviceListe =~ tr/\n/,/; @deviceArray = split(/,/,$deviceListe); foreach $device (@deviceArray) { $device =~ s/^(.*) (.*)$/$1/; $deviceValue = fhem("get $device $deviceParameter"); if ( $deviceValue eq "???" ) { $error++; $deviceValue = "Error"; } if ( $deviceValue eq "" ) { $error++; $deviceValue = "Error"; } $mailData = "$mailData$device\t\t$deviceValue\n"; } } if ($checkDevice_mailsend eq "Info"){ my $smtp = Net::SMTP->new($mailserver); $smtp->mail($mailsender); $smtp->to(@mailrecipientArray); $smtp->data(); if ( $error > 0 ) { $smtp->datasend("subject: $mailsubject_error \n"); } else { $smtp->datasend("subject: $mailsubject_info \n"); } $smtp->datasend("from: $mailsender\n"); $smtp->datasend("To: $mailrecipient\n"); $smtp->datasend("\n"); $smtp->datasend("$mailData"); $smtp->dataend(); $smtp->quit; } if ($checkDevice_mailsend eq "Error"){ if ( $error > 0 ){ my $smtp = Net::SMTP->new($mailserver); $smtp->mail($mailsender); $smtp->to(@mailrecipientArray); $smtp->data(); $smtp->datasend("subject: $mailsubject_error \n"); $smtp->datasend("from: $mailsender\n"); $smtp->datasend("To: $mailrecipient\n"); $smtp->datasend("\n"); $smtp->datasend("$mailData"); $smtp->dataend(); $smtp->quit; } } }