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