Ankündigung

Einklappen
Keine Ankündigung bisher.

callmonitor.pl mit Nutzung FB-Telefonbuch

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

    callmonitor.pl mit Nutzung FB-Telefonbuch

    Da ich das für mich sehr nützlich code-schnipsel von JNK (callmonitor.pl und calllist.php) schon einige Zeit nutze wollte ich evtl. mal versuchen das "Problem" mit der Nutzung des Telefonbuches der FB anzugehen:
    Zitat von mfd Beitrag anzeigen
    Jep, auf "3" umgestellt, funktioniert sehr gut.
    Vielen Dank für das praktische Plugin.

    In der Tat wäre es noch das i-Tüpfelchen wenn auch die Anrufer-Namen aus dem Telefonbuch angezeigt würden, aber ich bin mir nicht sicher ob das die Fritzbox überhaupt hergeben würde.
    Bei der Fritz!App Ticker die das kann ist dazu IMHO ein vollständiger Login an der FB notwendig um das auszulesen. Allerdings ist das schon sehr übel als WG-Plugin was die Ausführungsdauer angeht (siehe FB-Plugin an anderer Stelle im Forum).

    Edit: Was natürlich funktionieren könnte aber keine wirklich elegante Lösung ist, das Telefonbuch aus der FB exportieren (xml) und dem php-Script zur Seite zu stellen.
    Also habe ich ein kleines php-script, welches unter /var/www liegt und mir per cron regelmäßig das Telefonbuch der FB herunterlädt (als fb_telefonbuch.xml)

    PHP-Code:
    <?php
    // Fritzbox Telefonbuch auslesen und abspeichern
    // -----------------------------------------------------------------------------
    // Fritzbox User und Password
        
    $user "HIER_BITTE_ERSETZEN";
        
    $pass "HIER_BITTE_ERSETZEN";
        
    // Telefonbuch in Datei speichern
        
    $save true;
        
    // ID des Telefonbuches
        
    $id 0;

    //Pfad zur Datei
       
    $filepath "fb_telefonbuch.xml";

    // -----------------------------------------------------------------------------


    $client = new SoapClient(
        
    null,
        array(
            
    'location'      => "http://fritz.box:49000/upnp/control/x_contact",
            
    'uri'           => "urn:dslforum-org:service:X_AVM-DE_OnTel:1",
            
    'login'         => $user,
            
    'password'       => $pass
        
    )
    );

    $result $client->GetPhonebook(new SoapParam($id'NewPhonebookID'));

    $phonebook = @file_get_contents($result['NewPhonebookURL']);


    // Datei schreiben
        
    if($save == true){
            
    // Datei öffnen, wenn nicht vorhanden dann wird die Datei erstellt.
            
    $handler fopen($filepath"wb+");
            
    // Dateiinhalt in die Datei schreiben
            
    fwrite($handler $phonebook);
            
    // Datei schließen
            
    fclose($handler);             
                }
          else{
              
    print_r($phonebook);
              }

    ?>
    Dann habe ich im callmonitor.pl den hash %remotenumbers mit den Daten dieses Telefonbuches gefüttert:

    Code:
    use XML::Simple;
    my $xml = new XML::Simple ;
    my $data = $xml->XMLin("/var/www/fb_telefonbuch.xml" , ForceArray => ['number']);
    
    my %remotenumbers;
        for my $e ( @{$data->{phonebook}->{contact}} ) {
        my $name=    $e->{person}->{realName};
            for my $f ( @{$e->{telephony}->{number}} ) {
            my $number=    $f->{content};
            my $type=        $f->{type};
            $remotenumbers{$number}={ name => $name."(".$type.")"};
            }
        }
    Damit bekomme ich Namen und Typ des Anrufers / des Angerufenen (falls zu einer Person mehrere Telfonnummern bestehen wie privat, mobil, Arbeit ...)
    Ergebnis sieht so aus:
    snapshot.jpg

    Vielleicht kann es ja jemand gebrauchen.
    Viele Grüße Jens

    #2
    Super Idee! - läuft nur leider bei mir nicht...

    Soweit ich das verstehe, kommt PHP mit der Soap-Abfrage nicht zurecht; ich weiß aber nicht, ob das an der PHP-Seite oder an der (fehlenden?) Antwort liegt... kannst du damit was anfangen?

    Code:
    PHP Fatal error: Uncaught SoapFault exception: [s:Client] UPnPError in /srv/www/comet-visu/fb/get_phonebook.php:32
    Stack trace:
    #0 /srv/www/comet-visu/fb/get_phonebook.php(32): SoapClient->__call('GetPhonebook', Array)
    #1 /srv/www/comet-visu/fb/get_phonebook.php(32): SoapClient->GetPhonebook(Object(SoapParam))
    #2 {main}
    thrown in /srv/www/comet-visu/fb/get_phonebook.php on line 32

    Kommentar


      #3
      Hast Du den callmonitor auf der Firtzbox aktiviert? Per Telfon #96*5* wählen.
      sieht so aus, als ob kein Zugriff auf das TB der Firtzbox besteht.
      Viele Grüße Jens

      Kommentar


        #4
        Nee, der callmonitor läuft. Aber ich habe keinen Benutzernamen angegeben, weil das nur mit Passwort konfiguriert ist, das mag er offensichtlich nicht. Ich muss nur irgendwas angeben, zB "1", jetzt geht es...

        Kommentar


          #5
          Na, da hab ich ja gleich noch was gelernt - schön dass es funktioniert.
          Viele Grüße Jens

          Kommentar


            #6
            Das finde ich klasse!
            Das Skript funktioniert soweit auch, allerdings ist mir unklar wie ich das in meine visu_config.xml integriere. Bin für jeden Hinweis dankbar.

            Kommentar


              #7
              Coole Startseite...

              Kommentar


                #8
                Habe in letzter Zeit etwas viel um, die Ohren und eine Weile hier nicht mehr reingeschaut.

                @hipohop:

                so sieht es in meiner visu_config aus:

                Code:
                    <group name="Anrufliste">
                      <layout colspan="4" rowspan="4"/>
                      <web src="http://192.168.0.114/calllist.php" frameborder="false" refresh="60">
                        <layout rowspan="4" colspan="4"/>
                      </web>
                    </group>
                Viele Grüße Jens

                Kommentar


                  #9
                  Hallo zusammen,

                  ich muss das mal wieder ausgraben.
                  Ich versuche grad, die Calllist von meiner FB7170 runterzubekommen.
                  Das Plugin "callmonitor.pl" läuft soweit. Log:
                  Code:
                   
                   2017-01-09 19:23:01.123,callmonitor,opened Socket 29  2017-01-09 19:23:01.131,callmonitor,Init,3.6s,
                  Die Datenbank aber scheint dann leer zu sein.

                  Die calllist.php bringt im Browser auch nichts - alles leer, genauso in der CV !? Auch keine Fehlermeldung.

                  Hat da jemand einen Ansatz für mich?

                  Gruß,
                  Dennis

                  Kommentar


                    #10
                    Ich hab nach langem suchen und probieren genau 1x meine Anrufliste auf der Visu gesehen.
                    Dies hat geholfen:
                    https://knx-user-forum.de/forum/supp...685#post823685
                    Mhm. Ich sags nicht gerne, aber das Problem kenne ich. Ich de- und aktiviere dann den socat für diesen Socket und zähle die Socket-Nummer im Plugin um eins hoch. Danach geht es wieder. Was der eigentliche Grund ist, weiss ich nicht. Ich vermute es hängt irgendwie an der Socket-Verbindung.



                    Nachdem ich nochmal das Plugin angesehen habe und aus versehen mit "speichern" raus bin, wars geschehen - keine Anzeige mehr - alles leer.

                    Es wurden mir zwar die Nummerns angezeigt, jedoch keine Namen aus der "fb_telefonbuch.xml" - diese wurde angelegt und das Plugin entsprechend erweitert.
                    Die Formatierung von Datum/Uhrzeit habe ich auch noch nicht hinbekommen.

                    Gibt es hier bereits eine Lösung? Oder möchte vielleicht einer seinen Code zur Verfügung stellen?

                    Gruß,
                    Dennis

                    Kommentar


                      #11
                      Es ist ja ziemlich ruhig hier.

                      Ich berichte trotzdem mal von meinen Erfahrungen:

                      - Das Problem mit dem Socat: Sobald alles wieder läuft, wird in der Calllist trotzdem nichts angezeigt. Erst neue Anrufe werden geladen. Also immer einen Testanruf starten.
                      - Formatierung Datum/Uhrzeit .... ist ja doch ganz einfach im Plugin zu finden
                      Code:
                        my $date = $calldate->strftime("%d.%m.  %H:%M Uhr");
                      Folgende Sachen gehen noch nicht:
                      - Icons farbig rot/grün - dafür fehlen mir leider die Kenntnisse - vieleicht kann mir jensgulow ja einen Hinweis geben.
                      - Anzeige der Namen aus der fb_telefonbuch.xml: Das Telefonbuch wird ausgelesen und liegt im Verzeichnis /var/www - eine Anzeige des Namens erfolgt jedoch nicht
                      Hier mal ein Auszug aus der fb_telefonbuch.xml:
                      Code:
                      <?xml version="1.0" ?>
                      <phonebooks>
                      <phonebook owner="0" name="Telefonbuch">
                      <!-- number of contacts 96 -->
                      <contact>
                      <!-- numbers 1 -->
                      <category></category>
                      <person>
                      <realName>Alle (Rundruf)</realName>
                      </person>
                      <telephony>
                      <services>
                      <!-- emails 0 -->
                      </services>
                      <number type="intern" quickdial="" vanity="" prio="0" >**9</number>
                      </telephony>
                      </contact>
                      <contact>
                      <!-- numbers 1 -->
                      <category></category>
                      <person>
                      <realName>Anrufbeantworter 1</realName>
                      </person>
                      <telephony>
                      <services>
                      <!-- emails 0 -->
                      </services>
                      <number type="intern" quickdial="" vanity="" prio="0" >**600</number>
                      </telephony>
                      </contact>
                      <contact>
                      <!-- numbers 1 -->
                      <category></category>
                      <person>
                      <realName>Antje</realName>
                      </person>
                      <telephony>
                      <services>
                      <!-- emails 0 -->
                      </services>
                      <number type="home" quickdial="49" vanity="" prio="0" >0xxxxxxxxx</number>
                      </telephony>
                      </contact>
                      <contact>
                      <!-- numbers 1 -->
                      <category></category>
                      <person>
                      <realName>Antje</realName>
                      </person>
                      <telephony>
                      <services>
                      <!-- emails 0 -->
                      </services>
                      <number type="home" quickdial="79" vanity="" prio="0" >7xxxxx</number>
                      </telephony>
                      </contact>
                      <contact>
                      <!-- numbers 1 -->
                      <category></category>
                      <person>
                      <realName>AVM Ansage (HD)</realName>
                      </person>
                      <telephony>
                      <services>
                      <!-- emails 0 -->
                      </services>
                      <number type="work" quickdial="99" vanity="" prio="0" >500@hd-telefonie.avm.de</number>
                      </telephony>
                      </contact>
                      calllist.pl - wurde so von hier übernommen
                      Code:
                      use XML::Simple;
                      my $xml = new XML::Simple ;
                      my $data = $xml->XMLin("/var/www/fb_telefonbuch.xml" , ForceArray => ['number']);
                      
                      my %remotenumbers;
                          for my $e ( @{$data->{phonebook}->{contact}} ) {
                          my $name=    $e->{person}->{realName};
                              for my $f ( @{$e->{telephony}->{number}} ) {
                              my $number=    $f->{content};
                              my $type=        $f->{type};
                              $remotenumbers{$number}={ name => $name."(".$type.")"};
                              }
                          }
                      
                      
                      # path to call database
                      my $logdb = '/var/local/callmonitor.db';
                      an der calllist.php habe ich nichts geändert.

                      visu:
                      Code:
                      <group name="Anrufliste">
                            <layout colspan="2.8" rowspan="6"/>
                            <web src="http://192.168.0.xx/calllist.php" height="302px" frameborder="false" refresh="60">
                              <layout rowspan="6" colspan="8"/>
                            </web>
                          </group>
                      Die Dateien sind alle da - keine Fehlermeldung oder ähnliches.Wenn es so aussieht wie bei jensgulow, bin ich glücklich.

                      Gruß,
                      Dennis


                      Startpage.jpg

                      Kommentar


                        #12
                        Hallo Dennis,

                        also bei mir tuts das schon eine ganze Weile recht gut. ab und zu muss halt der socat neu gestartet werden (aber gefühlt vllt. 1x/Jahr). Ich habe noch einmal die Dateien von mit callmonitor.pl (leicht angepasste Version im Vergleich zu der im git) und calllist.php angehängt. Damit sollte eigentlich das Ergebnis wie bei mir aussehen.
                        callllist.php liegt in /var/www und callmonitor .pl in /etc/wiregate/plugin/generic.
                        fb_telefonbuch.xml sieht bei mir auch so aus. Ich kann mir eigentlich nur vorstellen, das es an dieser Anpassung der Callmonitor.pl liegt .... hast Du die bei Dir drin???

                        Code:
                        use XML::Simple;
                        
                        my $xml = new XML::Simple ;
                        my $data = $xml->XMLin("/var/www/fb_telefonbuch.xml" , ForceArray => ['number']);
                        
                        my %remotenumbers;
                            for my $e ( @{$data->{phonebook}->{contact}} ) {
                            my $name=    $e->{person}->{realName};
                                for my $f ( @{$e->{telephony}->{number}} ) {
                                my $number=    $f->{content};
                                my $type=        $f->{type};
                                $remotenumbers{$number}={ name => $name." (".$type.")"};
                                }
                            }
                        Angehängte Dateien
                        Viele Grüße Jens

                        Kommentar


                          #13
                          Erstmal Danke für die Dateien. Ich schau mir das am Wochenende mal an.
                          Die Anpassung des Plugins hatte ich ja vorgenommen (siehe letzte Nachricht).

                          Gruß,
                          Dennis

                          Kommentar


                            #14
                            Hallo Jens,

                            ich habe das mal implementiert. Die Unterschiede im Plugin habe ich jetzt nicht gesucht. Aber mit Deinem aktuellen Plugin kommen auch die Namen aus der Datenbank.
                            Leider fehlt mir Deine "calllist.css" - Bei mir werden Sonderzeichen nicht korrekt angezeigt. Wahrscheinlich die Schriftart.

                            Die Anzeige mit der Faxnummer ist mir auch noch nicht ganz klar. Ich trage meine Faxnummer mit Vorwahl ein, jedoch erfolgt keine Anzeige bei Faxanrufen.
                            Genauso haben meine "localnumbers" auch keine Auswirkung auf die Visu.

                            Gruß,
                            Dennis

                            calllist.php
                            PHP-Code:
                            <!-- Fritzbox Callmonitor v2.0
                                 Copyright 2015: JNK (http://knx-user-forum.de/members/jnk.html)
                                 latest version available on https://github.com/J-N-K/wgplugin
                            -->

                            <?php

                            // look where to store DB
                            $dbfile '/var/local/callmonitor.db';
                            $iconpath '/cometvisu/icon/knx-uf-iconset/128x128_white/';
                            //$iconpath = './visu_git_svn/trunk/src/icon/knx-uf-iconset/raw_svg/';
                            $fax '0xyxyxyxf'# number of fax machibe

                            //check if the database is readable by the webserver
                            $dbfile_dir dirname($dbfile);
                            if (! 
                            is_readable($dbfile_dir))
                                die (
                            "Database $dbfile not readable! make sure the file AND " .
                                    
                            "the directory are readable by the webserver!");

                            // create database connection
                            $db sqlite_open($dbfile0666$error);
                            if (!
                            $db) die ($error);

                            $sql="SELECT * FROM calldata WHERE NOT (what='no_response') ORDER BY id DESC LIMIT 7";
                            $result sqlite_query($db$sqlSQLITE_ASSOC);

                            ?>
                            <html>
                              <head>
                                <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
                                <style type="text/css">
                                  @font-face {
                                    font-family: "Dosis";
                                    font-style: normal;
                                    font-weight: 400;
                                    src: url("/cometvisu/fonts/Dosis-Medium.ttf");
                                  }
                                  body {
                                    //background: #000;
                                    color: #fff;
                                    font-family: Dosis,Helvetica,Arial,sans-serif;
                                    font-size: 3.5mm;
                                    margin: 0;
                                    overflow: hidden;
                                    text-shadow: 0 1px 1px #111;
                                  }
                                  img {
                                    height: 2em;
                                  }
                                  div {
                                    line-height: 1em;
                                    padding: 0.3em 0.3em 0.3em 1em;
                                  }
                                  td {
                                    padding: 0.3em 0.3em 0.3em 1em;
                                    line-height: 1em;
                                  }
                                  td + td {
                                    padding-left: 1.5em;
                                  }
                                </style>
                              </head>
                              <body>
                              <table>

                              <?php
                              
                            while( sqlite_has_more($result) )
                              { 
                            // local, remote, direction, what, date
                                
                            $row sqlite_fetch_array($resultSQLITE_ASSOC );
                                if (
                            strcmp($row['what'], 'no_response')) {
                                  echo 
                            '<tr>';
                                  if (!
                            strcmp($row['local'], $fax)) {
                                    echo 
                            '<td><img src="' $iconpath 'it_fax.png" style= "background-color: #070095"/></td>'# darkblue laut custom.css
                            #        echo '<td><img id="fax" class="svg blue" src="' . $iconpath . 'it_fax.svg"/></td>'; # darkblue laut custom.css
                                  
                            } elseif (!strcmp($row['what'], 'responder')) {
                                    echo 
                            '<td><img src="' $iconpath 'phone_answersing.png" style= "background-color: #070095"/></td>'# darkblue laut custom.css
                            #        echo '<td><img id="answering" class="svg blue" src="' . $iconpath . 'phone_answering.svg"/></td>'; # darkblue laut custom.css
                                  
                            } else {
                                    echo 
                            '<td></td>';
                                  }
                                  if (!
                            strcmp($row['what'], 'missed')) {
                                    echo 
                            '<td><img src="' $iconpath 'phone_missed_in.png" style= "background-color: #9A0000" /></td>'# darkred laut custom.css
                            #        echo '<td><img id="missed_in" class="svg red"  src="' . $iconpath . 'phone_missed_in.svg"/></td>'; # darkred laut custom.css
                                  
                            } elseif (!strcmp($row['direction'], 'inbound')) {
                                    echo 
                            '<td><img src="' $iconpath 'phone_call_in.png" style= "background-color: #070095; opacity:1" /></td>'# darkblue laut custom.css
                            #        echo '<td><img id="call_in" class="svg blue" src="' . $iconpath . 'phone_call_in.svg"/></td>'; # darkblue laut custom.css
                                  
                            } else {
                                    echo 
                            '<td><img src="' $iconpath 'phone_call_out.png" style= "background-color: #005100"/></td>'# darkgreen laut custom.css
                            #        echo '<td><img id="call_out" class="svg green" src="' . $iconpath . 'phone_call_out.svg"/></td>'; # darkgreen laut custom.css
                                  
                            }
                                  echo 
                            '<td>' $row['date'] . ' Uhr</td>';
                            #      echo '<td>' . preg_replace('/[^0-9]/', '', $row['remote']) . '</td>'; # ersetzt alles ausser Zahlen durch ''
                            #      echo '<td>' . preg_replace('/[0-9]/', '', $row['remote']) . '</td>'; # ersetzt alle Zahlen durch ''
                                  
                            echo '<td>' $row['remote'] . '</td>';
                                  echo 
                            "</tr>\n";
                                }
                              }
                              
                            ?>
                            </table>
                            </body>
                                <script>
                                /*
                                 * Replace all SVG images with inline SVG
                                 */
                                    jQuery('img.svg').each(function(){
                                        var $img = jQuery(this);
                                        var imgID = $img.attr('id');
                                        var imgClass = $img.attr('class');
                                        var imgURL = $img.attr('src');

                                        jQuery.get(imgURL, function(data) {
                                            // Get the SVG tag, ignore the rest
                                            var $svg = jQuery(data).find('svg');

                                            // Add replaced image's ID to the new SVG
                                            if(typeof imgID !== 'undefined') {
                                                $svg = $svg.attr('id', imgID);
                                            }
                                            // Add replaced image's classes to the new SVG
                                            if(typeof imgClass !== 'undefined') {
                                                $svg = $svg.attr('class', imgClass+' replaced-svg');
                                            }

                                            // Remove any invalid XML tags as per http://validator.w3.org
                                            $svg = $svg.removeAttr('xmlns:a');

                                            // Replace image with new SVG
                                            $img.replaceWith($svg);

                                        }, 'xml');

                                    });
                                </script>
                            </html>
                            <?php
                            sqlite_close
                            ($db);
                            ?>
                            Angehängte Dateien

                            Kommentar

                            Lädt...
                            X