Funktion: Socket laut makkis Anleitung für TCP->UDP (s. Anhang), dann Plugin starten
die Namensauflösung ist optional, wenn vorhanden, wird bei Anruf oder verpasstem Anruf ein Wert auf die definierte GA gesendet. DPT-Angabe ist Pflicht.
Edit 15/08/2012: RSSLog-Anbindung
die Namensauflösung ist optional, wenn vorhanden, wird bei Anruf oder verpasstem Anruf ein Wert auf die definierte GA gesendet. DPT-Angabe ist Pflicht.
Code:
# Plugin zur Anbindung des Fritzbox-Callmonitors
# Version 0.2 15.08.2012
# Copyright: JNK (https://knx-user-forum.de/members/jnk.html)
# License: GPL (v2)
#
# nein zur Blockwart-Mentalitaet => nein zu Plugin-Config-Files
#
####################
###Einstellungen:###
####################
my $socknum = 28; # Eindeutige Nummer des Sockets +1
my $send_ip = "localhost"; # Sendeport (UDP, siehe in Socket-Einstellungen)
my $send_port = "50151"; # Sendeport (UDP, siehe in Socket-Einstellungen)
my $recv_ip = "localhost"; # Empfangsport (UDP, siehe in Socket-Einstellungen)
my $recv_port = "50150"; # Empfangsport (UDP, siehe in Socket-Einstellungen)
my %localnumbers = (
"0209XXXXXXX" => "Janessa Fon",
"0209XXXXXXX" => "Janessa Fax"
);
my %remotenumbers = (
"0157XXXXXXX" => { name => "Jan",
ring => { GA => "7/0/1", DPT => 1, value => 1 },
missed => { GA => "7/1/1", DPT => 1, value => 1 }
},
"0176XXXXXXX" => { name => "Essa",
ring => { GA => "7/0/2", DPT => 1, value => 1 }
}
);
my $debug = 2;
my $logdb = '/var/www/rsslog.db';
## don't touch anything below
use DBI;
use DateTime;
if ($logdb ne "") { # check only if logdb is defines
# check setup, rights, DB
if (! -d dirname($logdb)) {
mkdir(dirname($logdb),0777);
}
if (! -e $logdb) {
return "$logdb existiert nicht! Bitte mit rsslog.php anlegen"; # FIXME: create sqlite-db
}
}
$plugin_info{$plugname.'_cycle'} = 0; # nur bei Telegramm aufrufen
if (!$socket[$socknum]) { # socket erstellen
$socket[$socknum] = IO::Socket::INET->new(LocalPort => $recv_port,
Proto => "udp",
LocalAddr => $recv_ip,
PeerPort => $send_port,
PeerAddr => $send_ip,
ReuseAddr => 1
)
or return ("open of $recv_ip : $recv_port failed: $!");
$socksel->add($socket[$socknum]); # add socket to select
$plugin_socket_subscribe{$socket[$socknum]} = $plugname; # subscribe plugin
return "opened Socket $socknum";
} elsif ($fh) {
my $line = <$fh>;
chomp($line);
if (!$line) { # catch empty line
return;
}
if ($debug>1) { # for debug : printout received string as hex and ascii
my $str = unpack('H*', "$line");
plugin_log($plugname, $str);
plugin_log($plugname, $line);
}
my @elem = split(/;/, $line); # separator is ;
(my $day, my $month, my $year, my $hour, my $minute) = split(/[. :]/, $elem[0]);
$year = "20" . $year;
my $calldate = DateTime->new( year => $year, month => $month, day => $day,
hour => $hour, minute => $minute, second =>0, time_zone => 'Europe/Berlin');
$calldate->set_time_zone('UTC'); # all sqlite-data is in UTC !
my $date = $calldate->strftime("%Y-%m-%d %T");
my $action = $elem[1];
my $CID = $elem[2];
given( $action ) {
when( 'CALL' ) { # outbound call
my $remotenr = $elem[5];
my $localnr = $elem[4];
my ($remote, $local);
if (exists $localnumbers{$localnr}) { #lookup local number
$local = $localnumbers{$localnr};
} else {
$local = $localnr;
}
if (exists $remotenumbers{$remotenr}) { #lookup remote number
$remote = $remotenumbers{$remotenr}{"name"};
} else {
$remote = $remotenr;
}
if ($debug>0) {
plugin_log($plugname, "outbound from $local to $remote" );
}
$plugin_info{$plugname."_CID".$CID."inbound"} = 0; #store call data
$plugin_info{$plugname."_CID".$CID."local"} = $local;
$plugin_info{$plugname."_CID".$CID."remote"} = $remotenr;
$plugin_info{$plugname."_CID".$CID."date"} = $date;
$plugin_info{$plugname."_CID".$CID."state"} = 'pending';
};
when( 'RING' ){ # inbound call
my $remotenr = $elem[3];
my $localnr = $elem[4];
my ($remote, $local);
if (exists $localnumbers{$localnr}) { #lookup local number
$local = $localnumbers{$localnr};
} else {
$local = $localnr;
}
if (exists $remotenumbers{$remotenr}) { # lookup remote number
$remote = $remotenumbers{$remotenr}{"name"};
if (exists $remotenumbers{$remotenr}{"ring"}) { # ring action defined?
knx_write($remotenumbers{$remotenr}{"ring"}{"GA"},
$remotenumbers{$remotenr}{"ring"}{"value"},
$remotenumbers{$remotenr}{"ring"}{"DPT"});
}
} else {
$remote = $remotenr;
}
$plugin_info{$plugname."_CID".$CID."inbound"} = 1; #store data
$plugin_info{$plugname."_CID".$CID."local"} = $local;
$plugin_info{$plugname."_CID".$CID."remote"} = $remotenr;
$plugin_info{$plugname."_CID".$CID."date"} = $date;
$plugin_info{$plugname."_CID".$CID."state"} = 'pending';
if ($debug>0) {
plugin_log($plugname, "$CID : inbound to $local from $remote" );
}
};
when( 'CONNECT' ){ # switch state to connected
if ($debug>0) {
plugin_log($plugname, "$CID : connected" );
}
$plugin_info{$plugname."_CID".$CID."state"} = 'connect';
};
when( 'DISCONNECT' ){ #check disconnect
my $what;
my $remotenr = $plugin_info{$plugname."_CID".$CID."remote"};
if ($plugin_info{$plugname."_CID".$CID."state"} eq 'connect') { # call was successfull
$what = "hangup";
# tba
} else { # either missed or no response
plugin_log($plugname, "missed");
if ($plugin_info{$plugname."_CID".$CID."inbound"} == 1) { # missed
$what = "missed";
if (exists $remotenumbers{$remotenr}{"missed"}) { # missed action defined?
knx_write($remotenumbers{$remotenr}{"missed"}{"GA"},
$remotenumbers{$remotenr}{"missed"}{"value"},
$remotenumbers{$remotenr}{"missed"}{"DPT"});
}
} else {
$what = "no_response";
}
}
my $remote = (exists $remotenumbers{$remotenr}{"missed"}) ?
$remotenumbers{$remotenr}{"name"} : $remotenr;
my $local = $plugin_info{$plugname."_CID".$CID."local"};
my $date = $plugin_info{$plugname."_CID".$CID."date"};
my $direction = ($plugin_info{$plugname."_CID".$CID."inbound"}==1) ?
"inbound" : "outbound";
if ($logdb ne "") { # only try to insert if defined
my $sql = "INSERT INTO Logs(content, title, tags, t) VALUES( " .
" '$local: $remote', '', 'fritzcall,phone,$direction,$what', '$date' );";
my $dbargs = {AutoCommit => 0, PrintError => 1};
my $dbh = DBI->connect("dbi:SQLite2:dbname=$logdb", "", "", $dbargs);
$dbh->do($sql);
if ($dbh->err()) {
plugin_log($plugname, "DB-Fehler: $DBI::errstr");
}
$dbh->commit();
$dbh->disconnect();
}
$plugin_info{$plugname."_CID".$CID."state"} = $what;
if ($debug>0) {
plugin_log($plugname, "$CID : disconnected ($what)" );
}
};
}
return;
}


Kommentar