Ankündigung

Einklappen
Keine Ankündigung bisher.

Fritzbox Call-Monitor

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [WireGate-Plugin] Fritzbox Call-Monitor

    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.

    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;
    }
    Edit 15/08/2012: RSSLog-Anbindung
    Angehängte Dateien
    KNX, DMX over E1.31, DALI, 1W, OpenHAB, MQTT

    #2
    Hi JNK

    Feine Sache!
    Aber könntest Du die Socket Einstellungen noch verlinken oder gleich genau die benötigten Werte hier einfügen? Dann tut man sich leichter und hat alles zusammen ohne noch extra suchen zu müssen.

    Gruß, Martin

    Kommentar


      #3
      Falls das reale Rufnummern sind, solltest du da eventuell nacharbeiten.
      cu
      Andreas


      Aus dem Norden? Schau mal rein, Stammtisch-Nord!

      Kommentar


        #4
        Beides erledigt :-) Danke für die Rückmeldung.

        Gruss,

        der Jan
        KNX, DMX over E1.31, DALI, 1W, OpenHAB, MQTT

        Kommentar

        Lädt...
        X