[HowTo] Anrufliste der Fritz!Box mit einem Mitel SIP Telefon nutzen

D

Deleted member 273463

Guest
Dieser Beitrag hat mich auf die Idee gebracht, die Anrufliste der Fritz!Box an einem Mitel Telefon (6800, 6900) nutzbar zu machen.

Einleitung und Voraussetzungen:

  • Mitel SIP Telefon der Serie 6800i bzw. 6900i (6867i, 6869i, 6873i, 6920i, 6930i, 6940i, teilw. auch 67xx Serie, hier aber nicht berücksichtigt)
  • Linux Server mit Webserver (z.B. nginx) und PHP.
  • Gewisses Grundwissen in Linux/Web (wie installiere ich was, wie editiere ich was, Zuordnung Webpfad->lokaler Pfad)
  • Die fb_tools von https://www.mengelke.de/Projekte/FritzBox-Tools
Über einen CronJob wird durch die fb_tools die Anrufliste der Fritz!Box regelmäßig abgefragt und als csv Datei auf dem Server abgelegt. Das Telefon fragt dann über ein PHP Script die CSV Datei ab und zeigt die jeweilige Anrufliste (angenommen, angerufene oder verpasst) an.

Erläuterungen:

Werte in eckigen Klammern [] sind Platzhalter und müssen durch eigene, sinnvolle Werte ersetzt werden. Das betrifft insbesondere IP Adressen bzw. URL.
Ich gehe im Fall des Webservers davon aus, dass dieser extra für dieses Howto installiert wurde. Der 3. Punkt geht daher nur von der Existenz der default Seite aus.


Durchführung:

1. Provisionierungsdatei erweitern

In der Datei [macadresse].cfg folgende Zeilen einfügen:

Code:
topsoftkey1 type: xml
topsoftkey1 label: Anrufliste
topsoftkey1 value: http://[ip-oder-url-vom-webserver]/liste.php

Wer will, kann auch direkt die verpassten Anrufe anzeigen:

Code:
topsoftkey1 type: xml
topsoftkey1 label: Wahlwiederholung
topsoftkey1 value: http://[ip-oder-url-vom-webserver]/liste.php?l=v

Mit topsoftkey1 ist die erste Taste, oben links neben dem Display gemeint und lässt sich natürlich beliebig abändern. Wenn kein Provisionierungsserver genutzt wird, kann die Taste auch über das Webinterface des Telefons angelegt werden.

Sofern das Telefon über eigene Tasten für Anruflisten bzw. Wahlwiederwiederholung verfügt, können diese auch belegt werden:

Code:
callers list script: http://[ip-oder-url-vom-webserver]/liste.php
redial script: http://[ip-oder-url-vom-webserver]/liste.php?l=a

Speichern und das Telefon neu starten

2. Cron Job anlegen:

Die Datei /etc/cronjob editieren:

Code:
*/5 * * * * www-data php [pfad-zu-fb_tools]/fb_tools.php http://[benutzername]:[kennwort]@fritz.box mode:anrufliste file:[/pfad/zum/html/root]/anrufe.csv -cs:","

Damit wird alle 5 Minuten die Anrufliste in die Datei anrufe.csv gespeichert.

3. PHP Script für das Telefon auf dem Webserver erstellen:

Folgende Datei erstellen und im DocRoot des Webservers (z.B. /var/www/html/) als liste.php abspeichern.

PHP:
<?php

if (isset($_GET['l'])) {
  $l = $_GET['l'];
  switch ($l) {
    case 'e':
      $call = 'in';
      $head = 'ankommende Anrufe';
      break;
    case 'a':
      $call = 'out';
      $head = 'ausgehende Anrufe';
      break;
    case 'v':
      $call = 'ring';
      $head = 'verpasste Anrufe';
      break;
  }

  if (($handle = fopen("anrufe.csv", "r")) !== FALSE) {
    echo '<AastraIPPhoneTextMenu fontMono="no"><TopTitle>'.$head.'</TopTitle>';
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
      $anrufe[] = $data;
    }
    $anrufe = array_reverse($anrufe);
    $num = count($anrufe);
    for ($c=0; $c < $num; $c++) {
      if ($anrufe[$c][0] == $call) {
        if(is_numeric($anrufe[$c][3])) {
          if($anrufe[$c][2] == '') {
            $name = $anrufe[$c][3];
          } else {
            $name = htmlspecialchars($anrufe[$c][2]);
          }
          $number = $anrufe[$c][3];
        } else {
          $name = htmlspecialchars($anrufe[$c][2]).', '.htmlspecialchars($anrufe[$c][3]);
          $number = $anrufe[$c][4];
        }
        echo '<MenuItem><Prompt>'.$name.', '.$anrufe[$c][1].'</Prompt><URI>SoftKey:Dial2</URI><Dial>'.$number.'</Dial></MenuItem>';
      }
    }
    fclose($handle);
  }

 echo '<SoftKey index = "1">
        <Label>Anrufen</Label>
        <URI>SoftKey:Dial2</URI>
        </SoftKey>
        <SoftKey index = "3">
        <Label>Verlassen</Label>
        <URI>SoftKey:Exit</URI>
        </SoftKey>
        </AastraIPPhoneTextMenu>';

    } else {

  echo '<AastraIPPhoneTextMenu fontMono="no">
        <TopTitle>Anruflisten</TopTitle>
        <MenuItem>
        <Prompt>ankommende Anrufe</Prompt>
        <URI>http://[ip-oder-url-vom-webserver]/liste.php?l=e</URI>
        </MenuItem>
        <MenuItem>
        <Prompt>ausgehende Anrufe</Prompt>
        <URI>http://[ip-oder-url-vom-webserver]/liste.php?l=a</URI>
        </MenuItem>
        <MenuItem>
        <Prompt>verpasste Anrufe</Prompt>
        <URI>http://[ip-oder-url-vom-webserver]/liste.php?l=v</URI>
        </MenuItem>
        <SoftKey index = "1">
        <Label>Verlassen</Label>
        <URI>SoftKey:Exit</URI>
        </SoftKey>
        </AastraIPPhoneTextMenu>';
  }

?>

Das Script lässt sich natürlich beliebig erweitern. Z.B. könnte noch ein zusätzlicher Filter eingebaut werden, sodass nur die Anrufliste des jeweiligen IP Telefons angezeigt wird. Den Spaghetti-Code bitte ich zu entschuldigen, ich bin kein Informatiker.
 
Wer sich die fb_tools und den Umweg über den Export sparen möchte, kann die Fritz!Box auch direkt abfragen (Punkt 2 entfällt damit vollständig):

PHP:
<?php

// Config
$fb_url = ''; // Url oder IP der Fritz!Box, ohne http
$fb_user = 'fritz47110815';
$fb_pass = '';

$webserver_url = 'http://192.168.178.10/fritzbox';

// Config Ende

if (isset($_GET['l'])) {
  $l = $_GET['l'];
  switch ($l) {
    case 'e':
      $type = 1;
      $title = 'ankommende Anrufe';
    break;
    case 'a':
      $type = 3;
      $title = 'ausgehende Anrufe';
      break;
    case 'v':
      $type = 2;
      $title = 'verpasste Anrufe';
    break;
  }

$client = new SoapClient(
    null,
    array(
      'location' => "http://$fb_url:49000/upnp/control/x_contact",
      'uri'      => "urn:dslforum-org:service:X_AVM-DE_OnTel:1",
      'noroot'   => False,
      'login'    => $fb_user,
      'password' => $fb_pass
    )
);

$result = $client->GetCallList();
$xml = simplexml_load_file($result);

  echo '<AastraIPPhoneTextMenu fontMono="no"><TopTitle>'.$title.'</TopTitle>';
 
    foreach ($xml->Call as $call) {

       if($call->Type == $type) {
           switch ($type) {
            case 1:
              if($call->Name != '') { $name = htmlspecialchars($call->Name). ', '; } else { $name = '';}
              echo '<MenuItem><Prompt>'.$name.$call->Caller.', '.$call->Date.'</Prompt><URI>SoftKey:Dial2</URI><Dial>'.$call->Caller.'</Dial></MenuItem>';
              break;
            case 3:
              if($call->Name != '') { $name = htmlspecialchars($call->Name). ', '; } else { $name = '';}
              echo '<MenuItem><Prompt>'.$name.$call->Called.', '.$call->Date.'</Prompt><URI>SoftKey:Dial2</URI><Dial>'.$call->Called.'</Dial></MenuItem>';
              break;
            case 2:
              if($call->Name != '') { $name = htmlspecialchars($call->Name). ', '; } else { $name = '';}
              echo '<MenuItem><Prompt>'.$name.$call->Caller.', '.$call->Date.'</Prompt><URI>SoftKey:Dial2</URI><Dial>'.$call->Caller.'</Dial></MenuItem>';
              break;
             }
           }
    }

  echo '<SoftKey index = "1">
        <Label>Anrufen</Label>
        <URI>SoftKey:Dial2</URI>
        </SoftKey>
        <SoftKey index = "3">
        <Label>Verlassen</Label>
        <URI>SoftKey:Exit</URI>
        </SoftKey>
        </AastraIPPhoneTextMenu>';

  } else {
 
   echo '<AastraIPPhoneTextMenu fontMono="no">
        <TopTitle>Anruflisten</TopTitle>
        <MenuItem>
        <Prompt>ankommende Anrufe</Prompt>
        <URI>'.$webserver_url.'/liste.php?l=e</URI>
        </MenuItem>
        <MenuItem>
        <Prompt>ausgehende Anrufe</Prompt>
        <URI>'.$webserver_url.'/liste.php?l=a</URI>
        </MenuItem>
        <MenuItem>
        <Prompt>verpasste Anrufe</Prompt>
        <URI>'.$webserver_url.'/liste.php?l=v</URI>
        </MenuItem>
        <SoftKey index = "1">
        <Label>Verlassen</Label>
        <URI>SoftKey:Exit</URI>
        </SoftKey>
        </AastraIPPhoneTextMenu>';
  }

?>
 
  • Like
Reaktionen: Rangierdraht
Kostenlos!

Statistik des Forums

Themen
248,897
Beiträge
2,303,588
Mitglieder
378,535
Neuestes Mitglied
Richbrothers brotherhood