Hi Leute, hab die Tage mal ein Alarmplugin geschrieben, weil wir vor 1 Woche Einbrecher im Haus hatten.
Das ganze basiert auf die Auswertung der Daten der Bewegungsmelder/Präsenzmelder im Haus. Die Benachrichtigungsart kann eingstellt werden, derzeit ist folgendes möglich -> per Telefon (erfordert Fritzbox mit aktiviertem Telnet), per SMS (erfordert Account bei smscreator), per Email, alle Lichter im Haus an -> geplant Polizeisirene auf Paging Kanal -> Abspieler pulse/audio und Auslagerung ins conf File
Wenn Ihr Verbessungsideen habt oder Fehler seht, sagt bescheid.
TODO: Auslagerung in conf-File
Status: absolute alpha
PM_BM_Telnet.pl
Das ganze basiert auf die Auswertung der Daten der Bewegungsmelder/Präsenzmelder im Haus. Die Benachrichtigungsart kann eingstellt werden, derzeit ist folgendes möglich -> per Telefon (erfordert Fritzbox mit aktiviertem Telnet), per SMS (erfordert Account bei smscreator), per Email, alle Lichter im Haus an -> geplant Polizeisirene auf Paging Kanal -> Abspieler pulse/audio und Auslagerung ins conf File
Wenn Ihr Verbessungsideen habt oder Fehler seht, sagt bescheid.
TODO: Auslagerung in conf-File
Status: absolute alpha
PM_BM_Telnet.pl
Code:
############################################################################# # Plugin: Motion detector # V0.1 2012-07-11 # Copyright: Lars Tolkmitt (lars at stefla-web.de) # License: GPL (v3) # # Plugin for motion detector alarm / -> when moving -> Phone / send SMS / turn on all lights / TODO -> Multi-Room announcement # # Suggested settings: # =================== # ############################################################################# #return; # uncomment to disable plugin ############################################################################# # Alarmmelder-Plugin fuer Bewegungs/praesenzmelder -> bei Bewegung -> Anruf/SMS/alle Lichter an/TODO -> Multiroomansage ### Definitionen my $alarm_ga_control = "0/7/0"; # Gruppenadresse, auf die Alarm de- und aktiviert wird my $licht_ga = "1/2/0"; # Gruppenadresse fuer Zentralfunktion alle Lichter an/aus -> Zentralfunktion Licht my $ip_address = "192.168.XXX.XXX"; # IP-Adrassse des Fritzbox Gateaways fuer Telnetzugriff my $user = ""; # Benutzername für telnet login my $passwd = "XXX"; # Passwort des Benutzers my $remote_command1 = 'echo "ATDT**9" | nc 127.0.0.1 1011'; # Befehl zum Senden an alle internen Apparate per Telnet my $remote_command2 = 'echo "ATH0" | nc 127.0.0.1 1011'; # Befehl zum Auflegen, falls nicht abgenommen wurde per Telnet #my %notify_method("phone" => 1, "lights" => 0, "sms" => 0); my %notify_method; # Bei Alarmauslösung Festlegung von einzelnen Aktionen 1 = aktiviert, !=1 deaktiviert, Anzahl Treffer im Log $notify_method{'phone'}{'active'} = 1; $notify_method{'phone'}{'action_match_counter'} = 3; $notify_method{'lights'}{'active'} = 0; $notify_method{'lights'}{'action_match_counter'} = 5; $notify_method{'sms'}{'active'} = 0; $notify_method{'sms'}{'action_match_counter'} = 3; $notify_method{'email'}{'active'} = 1; $notify_method{'email'}{'action_match_counter'} = 3; my @mail_recipients = ('mail@sld.tld'); #Benachrichtigung an Emailadresse my @sms_recipients = ('XXX'); #SMS an Handynummer my $read_alarm_ga_control = knx_read($alarm_ga_control,0,1); # Auslesen Wert von Gruppenadresse, auf die Alarm de- und aktiviert wird my $plugin_pm_bm_telnet_retvalue = ''; #Debuggin # Auswertungsfilter, um Fehlalarme zu vermeiden - Sensibilitätseinstellung my $match_counter = 0; # Countervariable fuer Einträge im Alarm-Log innerhalb von $match_intval (zB wieoft ist ein Logneintrag fuer erkannte Bewegung innerhalb von 300 Sekunden, wenn mehr als zB 5 Einträge innerhalb von 300 Sekunden aktiviere Alarm) my $match_intval = 300; #Zeitintervall, innerhalb welches gefunde Treffer im Log ausgwertete werden dürfen, zB die letzten 5 Minuten #my $action_match_counter = 3; # Einstellung fuer Anzahl von Treffern innerhalb von Zeitintervall, ab wann Alarm ausgelöst werden soll -> Routine, um Fehlalarme zu vermeiden, je kleiner die Zahl, je höher die Sensibilität my @watch_ga = ("1/2/139", "2/1/21", "2/6/114", "2/6/124", "2/6/137"); # Array für GA Bewegungsmelder, die zur Alarmmeldung rekrutiert werden my $logfile="/var/log/PM_BM_Telnet"; # Logile für Alarmanalyse my $unixzeit= time; ### Ende Definitionen use Getopt::Std; use Socket; use Net::Telnet; # Plugin an Gruppenadresse "anmelden" $plugin_subscribe{$alarm_ga_control}{$plugname} = 1; $plugin_subscribe{$read_alarm_ga_control}{$plugname} = 1; $plugin_subscribe{$licht_ga}{$plugname} = 1; # aboniere alle zu überwachenden GAs foreach my $i (@watch_ga){ $plugin_pm_bm_telnet_retvalue .= $i."\n"; $plugin_subscribe{$i}{$plugname} = 1; } # Eigenen Aufruf-Zyklus ausschalten $plugin_info{$plugname.'_cycle'} = 0; if ($msg{'apci'} eq "A_GroupValue_Write" && grep(/$msg{'dst'}/i, @watch_ga) && $read_alarm_ga_control == 1) { #Wert vom Bus if (defined $msg{'data'}) { if ( $msg{'data'} != 00 ) { my $log_search_log_action_return_value = search_log_action(); my $log_action_return_value = log_action(); if( $notify_method{'phone'}{'active'} == 1 && $log_search_log_action_return_value >= $notify_method{'phone'}{'action_match_counter'} ) { my $remote_login_return_value = remote_login(); } if( $notify_method{'lights'}{'active'} == 1 && $log_search_log_action_return_value >= $notify_method{'lights'}{'action_match_counter'} ) { my $turn_on_lights_return_value = turn_on_lights(); } if( $notify_method{'sms'}{'active'} == 1 && $log_search_log_action_return_value >= $notify_method{'sms'}{'action_match_counter'} ) { my $send_sms_return_value = send_sms(); } if( $notify_method{'email'}{'active'} == 1 && $log_search_log_action_return_value >= $notify_method{'email'}{'action_match_counter'} ) { my $send_email_return_value = send_email(); } $plugin_pm_bm_telnet_retvalue .= "Command1 ".$remote_command1." Command2 ".$remote_command2." an ".$ip_address." ".$log_action_return_value." counter ".$log_search_log_action_return_value." data".$msg{'data'}. " apci". $msg{'apci'}. " read_alarm_ga_control ".$read_alarm_ga_control. " dst".$msg{'dst'}; } } } else { $plugin_pm_bm_telnet_retvalue .= "nicht zu tun an ip_address ".$ip_address." data".$msg{'data'}. " apci". $msg{'apci'}. " read_alarm_ga_control ".$read_alarm_ga_control. " dst".$msg{'dst'}; } return $plugin_pm_bm_telnet_retvalue; ### sub remote_login { my $command; my $tfritz = new Net::Telnet (Timeout => 10, Prompt =>'/#/'); $tfritz->open($ip_address); $plugin_pm_bm_telnet_retvalue .= "connecting............."; $tfritz->waitfor('/Fritz!Box web password:/'); $tfritz->print($passwd); $tfritz->waitfor('/#/'); $plugin_pm_bm_telnet_retvalue .= "done\n"; $plugin_pm_bm_telnet_retvalue .= "send command1...."; my @rc1 = $tfritz->cmd($remote_command1); $plugin_pm_bm_telnet_retvalue .= $rc1[1]; #foreach my $i (@rc1){ # $plugin_pm_bm_telnet_retvalue .= $i."\n"; # } if(grep(/ERROR/i, @rc1)) { $plugin_pm_bm_telnet_retvalue .= "Fehler send command1\n"; $plugin_pm_bm_telnet_retvalue .= "send command2...."; my @rc2 = $tfritz->cmd($remote_command2); $plugin_pm_bm_telnet_retvalue .= $rc2[1]; $plugin_pm_bm_telnet_retvalue .= "done\n"; $plugin_pm_bm_telnet_retvalue .= "send command1...."; my @rc3 = $tfritz->cmd($remote_command1); $plugin_pm_bm_telnet_retvalue .= $rc3[1]; $plugin_pm_bm_telnet_retvalue .= "done\n"; $plugin_pm_bm_telnet_retvalue .= "sende close\n"; } $tfritz->close; return; } sub turn_on_lights { return knx_write($licht_ga,1,1); } sub log_action { open(LOGFH, ">>$logfile") || die "Datei nicht gefunden\n"; print LOGFH "$msg{'dst'};$unixzeit\n"; close LOGFH; } sub search_log_action { my @data = (""); open(SEARCHFH, "< $logfile") || die "Datei nicht gefunden\n"; while (chop(my $zeile = <SEARCHFH>)) { @data = split(/;/,$zeile); my $time_diff = $unixzeit-$data[1]; $plugin_pm_bm_telnet_retvalue .= "adresse $data[0] logzeit $data[1] time_diff $time_diff\n"; if($time_diff <= $match_intval ) { $match_counter++;} } #close(SEARCHFH); return $match_counter; } sub send_sms { #use Configuration; #use Services; #use IPC::ShareLite; #use DBI; use LWP::UserAgent; #use File::stat; use strict; #use Data::Dumper; use POSIX; my $user = ''; my $pass = ''; my $sender = 'ALARM BEWEGUNGSMELDER'; my $text = shift; my $type = '18'; foreach my $recipient (@sms_recipients){ my $caption = "$sender->$recipient"; my $url = 'http://soap.smscreator.de/send.asmx/SendText'; $url.= "?User=$user&Password=$pass&Caption=$caption&Sender=$sender&Recipient=$recipient&SMSTyp=$type&SMSText=$text&SendDate=".(&get_send_date); my $ua = LWP::UserAgent->new; my $res = $ua->get($url); } } sub get_send_date { my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $mon="0".$mon if(length($mon)==1); $mday="0".$mday if(length($mday)==1); $mon++; $year+=1900; return("$mday.$mon.$year $hour:$min:$sec"); } sub send_email { my $ret = shift; foreach my $recipient (@mail_recipients){ system("echo '$ret' | mail -s 'ALARM BEWEGUNGSMELDER' $recipient"); } }
Kommentar