Zyklische Überprüfung von Geräten mit Benachrichtigung per Email
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 *%");;} 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; } } }