Zyklische Überprüfung von Geräten mit Benachrichtigung per Email

Aus FHEMWiki

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