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

Aus FHEMWiki
Wechseln zu: Navigation, Suche

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