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