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 *$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;
}
}
}