[Info] Converter FRITZ!Box zu IP Phone Telefonbücher (Cisco, Grandstream, snom, Yealink) sowie jFritz

Black Senator

Mitglied
Mitglied seit
13 Jul 2007
Beiträge
418
Punkte für Reaktionen
69
Punkte
28
Hallo,

wie ich hier schon geschrieben habe, ist diese Funktionalität nun Teil von carddav2fb.
Da aber nicht jeder den ganzen Weg vom CardDAV-Server über die FRITZ!Box bis zum IP Phone gehen will, habe ich den letzten Teil als separates Programm veröffentlicht:
fbcontactconv

1633376995214.png

Das Tool liest das angegebene FRITZ!Box Telefonbuch aus und konvertiert das XML mit Hilfe von XSL-Transformation in beliebig viele unterschiedliche XML Formate der gängigen IP Telefone.

Ich selbst habe keines der Zielgeräte im Einsatz! Ich konnte also nicht das Ergebnis integrativ testen!
Die Zielformate wurden anhand veröffentlicher Beispiele der Hersteller ausgeprägt.
Wenn etwas nicht passen sollte oder fehlehaft sein, dann meldet das bitte in GitHub als Issue!


Die XSL Dateien im Verzeichnis /lib/ können unter Beachtung der MIT-Lizenz angepasst werden. Damit können auch evtl. erforderliche individuelle Ausprägungen für unterschiedliche Modelle der Hersteller realisiert werden.

Würde mich freuen, wenn jemand davon profitiert.

Beste Grüße

Black Senator
 
Zuletzt bearbeitet:
Moinsen


Hier...
Rich (BBCode):
$ git clone https://github.com/blacksenator/fbconvertconv.git
Klone nach 'fbconvertconv' ...
Username for 'https://github.com':
(Oder gibt es da etwas, was Alle wissen nur ich nicht?)
...komme ich nicht weiter.
Das Dollarzeichenprompt bedeutet übrigens normaler User, nicht root.
 
Hehe, Dankeschön.
Code:
$ git clone https://github.com/blacksenator/fbcontactconv.git
Klone nach 'fbcontactconv' ...
remote: Enumerating objects: 32, done.
remote: Counting objects: 100% (32/32), done.
remote: Compressing objects: 100% (25/25), done.
remote: Total 32 (delta 9), reused 25 (delta 6), pack-reused 0
Entpacke Objekte: 100% (32/32), Fertig.
Das habe ich nun davon, dass ich den Installations Anweisungen...
...unter Installation gefolgt bin.

Dann @Black Senator, steht wohl eine klitzekleine Korrektur an?
Vielleicht wäre auch ein kleiner Hinweis angebracht, welche Befehle als root ( composer Installation ) ausgeführt werden müssten?

Und weiter gehts...
Nachdem composer seine Arbeit verrichtet hat (~/fbcontactconv$ composer install --no-dev)
Und eine Konfigurationsdatei nach Beispiel erstellt wurde,...
config
PHP:
<?php

$config = [
    'fritzbox' => [
        'url'      => 'fritz.box',    // your Fritz!Box IP
        'user'     => 'jfritz',       // your Fritz!Box user
        'password' => '****************', // your Fritz!Box user password
        'phonebook' => [0, ],         // phonebooks to cconvert (first tab = 0!)
    ],

    'ipPhonebooks' => [                         // uncomment your desired export(s)
        'jfritz' => [                           // name is just for informational purposes
            'xsl' => 'jfritz.xsl',              // XSL transformation file in .\lib\
            'path' => '',                       // the converted phone book is saved there
            'file' => 'jfritz.phonebook.xml',
        ],
        'Yealink' => [
            'xsl' => 'Yealink.xsl',
            'path' => '',
            'file' => 'LocalPhonebook.xml',
        ],
        'snom' => [
            'xsl' => 'snom.xsl',
            'path' => '',
            'file' => 'phonebook.xml',
        ],
        'Grandstream' => [
            'xsl' => 'grandstream.xsl',
            'path' => '',
            'file' => 'gs_phonebook.xml',
        ],
        'Cisco' => [
            'xsl' => 'Cisco.xsl',
            'path' => '',
            'file' => 'Phonebook.xml',
        ],
    ],
];
...die ich mit -c config angebe...
Code:
~/fbcontactconv$ php fbcontactconv run -c config
Converting FRITZ!Box ccontacts
PHP Notice:  Array to string conversion in /home/knoppix/fbcontactconv/vendor/blacksenator/fritzsoap/src/x_contact.php on line 315
Error: 713 (SpecifiedArrayIndexInvalid)! Could not get the phonebook Array
Converting into a jfritz phonebook: jfritz.phonebook.xml
PHP Fatal error:  Uncaught TypeError: Argument 1 passed to blacksenator\IPphones\ipphones::getIPPhonebook() must be an instance of SimpleXMLElement, bool given, called in /home/knoppix/fbcontactconv/src/functions.php on line 49 and defined in /home/knoppix/fbcontactconv/src/Phonebooks/IPphones.php:95
Stack trace:
#0 /home/knoppix/fbcontactconv/src/functions.php(49): blacksenator\IPphones\ipphones->getIPPhonebook(false)
#1 /home/knoppix/fbcontactconv/src/functions.php(57): blacksenator\getIPPhonebook(false, Array)
#2 /home/knoppix/fbcontactconv/src/RunCommand.php(27): blacksenator\convertFBphonebook(Array)
#3 /home/knoppix/fbcontactconv/vendor/symfony/console/Command/Command.php(255): blacksenator\RunCommand->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#4 /home/knoppix/fbcontactconv/vendor/symfony/console/Application.php(992): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Ou in /home/knoppix/fbcontactconv/src/Phonebooks/IPphones.php on line 95
...wird das hier rausgehauen.

Hab auch mal in der config das "Array" phonebook mit verschiedenen Kombinationen ausprobiert ( z.B. [0,1,2] [0] [1] ) was auch nicht erfolgreich war.
Das Login zur FRITZ!Box funktioniert schonmal...
Code:
Anmeldung einer App des Benutzers jfritz von IP-Adresse 192.168.188.100
Benutzer jfritz hat folgende Rechte...
Bildschirmfoto vom 2021-10-05 12-53-22.png

Ach ja, PHP Version...
Code:
php -v
PHP 7.3.11-1~deb10u1 (cli) (built: Oct 26 2019 14:14:18) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.11, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.11-1~deb10u1, Copyright (c) 1999-2018, by Zend Technologies
 
Zuletzt bearbeitet:
@koyaanisqatsi

Danke für das engagierte testen!

Sorry, war gestern schon spät, ich wollte das noch unbedingt raushauen und dann haben sich doch ein paar Flüchtigkeitsfehler eingeschlichen.

Der Fehler in der README.md ist bereits korrigiert und geht gleich auf GitHub.

Wenn du die Konfiguration in einer Datei mit der Bezeichnung config.php gespeichert hast, dann brauchst Du den -c Parameter nicht anzugeben! Den braucht es nur, wenn die Konfiguration RAZUPALTUFF.php oder ähnlich heißt. Damit kann man unterschiedliche Konfigurationen vorhalten (ist bei carddav2fb genauso).

Zu dem tatsächlichen Fehler in deinem letzten Post: das ist leider auch ein Flüchtigkeitsfehler: das Array für Telefonbücher war noch gar nicht vorgesehen - war so eine Idee, deren Rest ich in der config.example.php vergessen habe.
Also einfach nur 'phonebook' => 0 oder 'phonebook' => 1 oder ... und dann sollte es gehen.
Das ist bereits korrigiert und geht gleich auf GitHub.


Grüße

Black Senator
 
  • Like
Reaktionen: koyaanisqatsi
Yup - So...
PHP:
'phonebook' => 0         // phonebooks to cconvert (first tab = 0!)
...schwubbt es dann auch durch...
Code:
~/fbcontactconv$ php fbcontactconv run
Converting FRITZ!Box ccontacts
Converting into a jfritz phonebook: jfritz.phonebook.xml
Converting into a snom phonebook: phonebook.xml

Das SNOM Telefonbuch sieht auf den ersten Blick etwas komisch aus (<tbook>).
Soweit ich weiss, muss das provisioniert werden, moment...
Lies mal:

Für Minibrowser XML hab ich...
...genutzt, da es viel flexibler ist.
Aber meine SNOMs haben sich eh verabschiedet, so daß ich das persönlich nicht testen kann.

Das jfritz XML teste ich noch ( Java, unter Linux X ) und berichte dann kurz wie es lief.
...
Funktioniert.
Also, vor dem Start von jfritz mit: cat jfritz.phonebook.xml >~/.jfritz/jfritz.phonebook.xml
...oder während jfritz läuft mit den Downloadbutton (Telefonbuch importieren (XML Datei)), damit sich das aktualisieren kann.
Bildschirmfoto vom 2021-10-05 22-14-59.png
^--> Beides produziert keine Auffälligkeiten im Debug Fenster von JFritz.
 
Zuletzt bearbeitet:
Hallo Black Senator,

vielen Dank für für das Skript!!!
Ich konnte damit meine Kontakte aus der FB 7590 in unsere Grandstream WP820 und GXV3240 importieren.

Ich musste allerdings folgende 2 Zeichen in der lib/grandstream.xsl ergänzen, damit der Import des erzeugten xml funktioniert hat:

<AddressBook>
<version>1</version>
<xsl:apply-templates select="contact" />
</AddressBook>

Vielleicht macht es Sinn, das im Github zu korrigieren.

Vielen Dank & Viele Grüße

mischmit
 
  • Like
Reaktionen: Black Senator
@mischmit

Danke für das Feedback - ist bereits korrigiert und auf GitHub. Überraschenderweise ist der Fehler in der XSL in carddav2fb nicht enthalten.

Beste Grüße

Black Senator
 
  • Like
Reaktionen: mischmit
Hallo @Black Senator,

durch Zufall bin ich auf deine Projekte zum Konvertieren des FB Telefonbuchs in Richtung Yealink gestoßen.
Leider wird das konvertierte Ergebnis der Yealink.xsl vom Telefon nicht angenommen
Der Export der Yealink_2.xsl wird hingegen angenommen, aber hier scheint beim Konvertieren etwas schief zu laufen, hier einmal das Ergebnis:

Code:
<?xml version="1.0" encoding="utf-8"?>
 

<YealinkIPPhoneBook>
  <Title>Yealink</Title>
  <Menu Name="FRITZ!Box Telefonbuch">
    <Unit Name="" Phone3="" default_photo="Resource:"/>
    <Unit Name="" Phone1="" default_photo="Resource:"/>
    <Unit Name="" Phone2="" default_photo="Resource:"/>
    <Unit Name="" Phone1="" default_photo="Resource:"/>
    <Unit Name="" Phone1="" default_photo="Resource:"/>
    <Unit Name="" Phone1="" default_photo="Resource:"/>
    <Unit Name="" Phone2="" default_photo="Resource:"/>
    <Unit Name="" Phone3="" default_photo="Resource:"/>
    <Unit Name="" Phone3="" default_photo="Resource:"/>
    <Unit Name="" Phone3="" default_photo="Resource:"/>
    <Unit Name="" Phone1="" default_photo="Resource:"/>
    <Unit Name="" Phone1="" Phone2="" default_photo="Resource:"/>
    <Unit Name="" Phone1="" Phone2="" default_photo="Resource:"/>
    <Unit Name="" Phone3="" default_photo="Resource:"/>
    <Unit Name="" Phone3="" default_photo="Resource:"/>
    <Unit Name="" Phone3="" default_photo="Resource:"/>
    <Unit Name="" Phone3="" default_photo="Resource:"/>
    <Unit Name="" Phone3="" default_photo="Resource:"/>
    <Unit Name="" Phone3="" default_photo="Resource:"/>
    <Unit Name="" Phone3="" default_photo="Resource:"/>
    <Unit Name="" Phone1="" default_photo="Resource:"/>
    <Unit Name="" Phone2="" default_photo="Resource:"/>
    <Unit Name="" Phone3="" default_photo="Resource:"/>
    <Unit Name="" Phone3="" default_photo="Resource:"/>
    <Unit Name="" Phone3="" default_photo="Resource:"/>
    <Unit Name="" Phone1="" default_photo="Resource:"/>
    <Unit Name="" Phone1="" default_photo="Resource:"/>
    <Unit Name="" Phone3="" default_photo="Resource:"/>
    <Unit Name="" Phone3="" default_photo="Resource:"/>
    <Unit Name="" Phone3="" default_photo="Resource:"/>
    <Unit Name="" Phone3="" default_photo="Resource:"/>
    <Unit Name="" Phone3="" default_photo="Resource:"/>
    <Unit Name="" Phone3="" default_photo="Resource:"/>
    <Unit Name="" Phone3="" default_photo="Resource:"/>
    <Unit Name="" Phone3="" default_photo="Resource:"/>
    <Unit Name="" Phone1="" default_photo="Resource:"/>
    <Unit Name="" Phone3="" default_photo="Resource:"/>
    <Unit Name="" Phone3="" default_photo="Resource:"/>
    <Unit Name="" Phone3="" default_photo="Resource:"/>
    <Unit Name="" Phone3="" default_photo="Resource:"/>
    <Unit Name="" Phone1="" default_photo="Resource:"/>
    <Unit Name="" Phone1="" default_photo="Resource:"/>
    <Unit Name="" Phone1="" default_photo="Resource:"/>
    <Unit Name="" Phone1="" default_photo="Resource:"/>
    <Unit Name="" Phone1="" default_photo="Resource:"/>
    <Unit Name="" Phone1="" default_photo="Resource:"/>
    <Unit Name="" Phone1="" default_photo="Resource:"/>
    <Unit Name="" Phone1="" default_photo="Resource:"/>
    <Unit Name="" Phone1="" default_photo="Resource:"/>
    <Unit Name="" Phone3="" default_photo="Resource:"/>
    <Unit Name="" Phone1="" default_photo="Resource:"/>
    <Unit Name="" Phone2="" default_photo="Resource:"/>
    <Unit Name="" Phone1="" default_photo="Resource:"/>
    <Unit Name="" Phone1="" default_photo="Resource:"/>
    <Unit Name="" Phone3="" Phone2="" default_photo="Resource:"/>
    <Unit Name="" Phone1="" Phone2="" default_photo="Resource:"/>
    <Unit Name="" Phone3="" default_photo="Resource:"/>
    <Unit Name="" Phone2="" default_photo="Resource:"/>
    <Unit Name="" Phone1="" default_photo="Resource:"/>
    <Unit Name="" Phone1="" default_photo="Resource:"/>
    <Unit Name="" Phone1="" default_photo="Resource:"/>
    <Unit Name="" Phone1="" default_photo="Resource:"/>
    <Unit Name="" Phone3="" default_photo="Resource:"/>

Der Output der yealink.xsl ist hingegen vollständig.


Hast du eine Idee woran das liegen könnte?

Beste Grüße
 
Leider liest das Snom D385 nur CSV Telefonbücher, obwohl es nur XSL speichert.
Kann man die Snom-Telefonbücher mit der Fritzbox oder wenigstens Snom-Telefonbücher untereinander ohne komplizierten Server synchronisieren?
 
Hast du eine Idee woran das liegen könnte?
Hallo,

ich bin gerade noch bis Sonntag unterwegs und kann es mir erst dann in Ruhe ansehen.

Vorab sowiel: die XSL-Dateien stellen „nur“ Konvertierungsvorschriften bereit, um aus einer XML eine andere XML zu generieren. Die Idee ist gerade, dass jeder Nutzer durch Anpassung der XSL die Konvertierung selbst beeinflussen kann - sei es weil meine Templates Fehler enthalten oder für neue Versionen andere oder mehr Daten enthalten kann. Meine ausgelieferten XSL sind also nicht statisch sondern nur „Vorschläge“ und nach bestem Wissen erstellt.

Mit freundlichen Grüßen

Black Senator
 
Hallo Black Senator,

ja, die XSL Datei habe ich mir in der Zwischenzeit einmal angepasst, sodass diese bei mir nun funktioniert. Ich kann dir hier gern einen PR erstellen oder, falls gewünscht, auch hier rein kopieren.
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.