PHP Fatal error: Uncaught TypeError: Return value of "Andig\RunCommand::execute()" must be of the type int, NULL returned.

Vor zwei Tagen ist diese Änderung (Commit) erfolgt. Hast Du das Update evtl. vorher gezogen?
Wenn ja, dann bitte das Update noch einmal wiederholen.
Ansonsten die Fehlermeldung als Issue hier einstellen.

Viel Erfolg

Black Senator
 
Also nach einem erneuten Update kommen trotzdem noch Fehler:
Code:
PHP Fatal error:  Uncaught TypeError: Return value of "Andig\RunCommand::execute()" must be of the type int, NULL returned. in /home/pi/carddav2fb/vendor/symfony/console/Command/Command.php:258
Stack trace:
#0 /home/pi/carddav2fb/vendor/symfony/console/Application.php(924): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#1 /home/pi/carddav2fb/vendor/symfony/console/Application.php(265): Symfony\Component\Console\Application->doRunCommand(Object(Andig\RunCommand), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#2 /home/pi/carddav2fb/vendor/symfony/console/Application.php(141): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#3 /home/pi/carddav2fb/carddav2fb(20): Symfony\Component\Console\Application->run()
#4 {main}
  thrown in /home/pi/carddav2fb/vendor/symfony/console/Command/Command.php on line 258

Die Werte die oben stehen (return 1;) sind bei mir schon richtig eingetragen.
 
So, habe noch einmal das Update gemacht mit:
git pull https://github.com/andig/carddav2fb
composer update --no-dev

Beim Syncronisieren mit
php -f /home/pi/carddav2fb/carddav2fb run -i

Es kommen jetzt keine Fehler mehr, dass Problem scheint nun behoben zu sein. Vielen Dank.
 
Moin,

Habe mir endlich 'mal Zeit genommen die Synchronisierung Owncloud -> FB7490 anzugehen.
iPhone <-> Owncloud geht schon länger.

Habe die Anleitung zum Offiziellen Release 2.0 von Black Senator nachvollzogen --klappte bis auf Kleinigkeiten (zunächst fehlendes Modul php-gd führte zu crashes bei PNGs) sehr gut.

Einziges Problem scheinen die realName conversions zu sein:

- Bei Owncloud gibt's die Felder Vorname, Name und Organisation --beim iPhone ebenfalls.
- Ich benutze das Organisations-Feld um im iPhone Firmen oder auch Hotels zu identifizieren.
- Auf der FB gibt's keine Organisations-Feld. Naheliegend wäre dies zu ignorieren und nur Vorname / Nachname zuzuordnen.

Mit dem Standardsetting aus config.example.php klappts manchmal, manchmal jedoch nicht:
- bei manchen Einträgen
wird Vorname / Nachname wie naheliegend zugeordnet.
- bei anderen wird nur die Organisation zugeordnet.
Das hat den unschönen Effekt, daß auf dem FritzFon C6 eine ganze Reihe von Einträgen nur 'Hotel' heißen.

Vermutlich sind die realName conversions der richtige Ansatzpunkt --das System verstehe ich allerdings nicht.

Hat jemand einen Tip?

Danke schon 'mal im voraus,
Thomas
 
Hallo Thomas,

mit deiner Bemerkung
...manchmal jedoch nicht...
deutest Du an, dass Programm würde "willkürlich" die Namen konvertieren - das ist natürlich nicht so. carddavfb konvertiert straight forward! Oder anders gesagt (so leid es mir tut): es liegt an den Umsetzungsregeln oder mehr noch an Deinen Daten aus OwnCloud.

Ich will das mal bei dieser Gelegenheit ausführlicher erklären:
vCards (3.0) haben vier Felder (properties) mit Namensbezug:
  • FN: fullname - idealerweise mit einem String, welcher dem ausgesprochenem/-geschrieben Namen entspricht
    gute CardDAV-Clients übernehmen entweder den Inhalt aus ORG oder aber (in der richtigen Reihenfolge) die Teile aus N hier hinein.
  • N: Namensteile mit Semikolon getrennt: NACHNAME;VORNAME;WEITERE_VORNAMEN(INITIALEN);PREFIXE;SUFFIXE
  • NICKNAME
  • ORG
Randbemerkung: Beim Einlesen vom CardDAV-Server nehmen wir die Namensbestandteile von N in eigene Felder. Das findest du in der Backend.php (und dient nur dem einfacheren Handling im weiteren Programmverlauf).

Nun zur config.php:
PHP:
        /**
         * 'realName' conversions are processed consecutively. Order decides!
         */
        'realName' => [
            '{lastname}, {prefix} {nickname}',
            '{lastname}, {prefix} {firstname}',
            '{lastname}, {nickname}',
            '{lastname}, {firstname}',
            '{org}',
            '{fullname}'
        ],

Die Programmlogik, um das XML-Feld <realName> zu füllen macht genau das, was im Kommentar steht:
carddav2fb prüft der Reihe nach, ob Inhalte der vorgegebenen properies (zwischen den {}) vorhanden sind. Wenn ja, wird es entsprechend dem Muster in <realName> übernommen.

Also, wenn deine vCard z.B. so aussieht:
Code:
BEDIN:VCARD
...
FN:Erika Mustermann
N:Mustermann;Erika;Hildegunst;;
NICKNAME:Rike
ORG:Bundesdruckerei
...
END:VCARD

Dann wird "Mustermann, Rike" in <realName> übernommen, weil das dritte Muster von oben passt.

Wenn z.B. aus dem property N kein Vor- und Nachname extrahiert werden konnte (weil die ersten beiden Semikolon-getrennten Segmente ganz oder teilweise fehlen), dann wird der Wert aus ORG übernommen, wenn auch dort nichts drin steht, dann wird der Inhalt aus FN übernommen (und wenn da auch nix steht, dann gibts ´ne Fehlermeldung).

Meine Empfehlung ist daher, dass du die Kontakte, welche nicht wie gewünscht in der FRITZ!Box ankommen, dir einmal kritisch in der OwnCloud ansiehst, und ggf. dort korrigierst.

+++Ergänzung;+++
Wenn Du Dir die Kontakte in VCF-Format ansehen möchtest: mit ./carddav2fb download -fd owncloud.vcf schreibt carddav2fb die heruntergeladenen Daten in owncloud.vcf.

Grüße

Black Senator
 
Zuletzt bearbeitet:
  • Like
Reaktionen: tzieg
Hallo Black Senator,

Vielen Dank für die superschnelle und ausführliche Erläuterung.

Die vCards (3.0)-Definition war der Schlüssel --damit kann ich entweder die Zuordung per realName conversion anpassen --oder meine Datenbank ;-).

Von einen nicht-deterministischen Verhalten von PHP bin ich nicht ausgegangen ;-). Mir ist schon aufgefallen, daß in der owncloud.vcf --übrigens ein Super-Feature die einzeln Schritte separat auszuführen-- die N: Zeilen differierten, hatte das Format eben nicht verstanden.

Beispiel meiner Hotel-Einträge:
N:Albergo La Perla;;;;
FN:Albergo La Perla
ORG:Hotel;


Nachdem's in der default realName conversion keine Zeile mit '{lastname}' alleine gibt, wurde jeweils ORG übernommen.

Die schnelle Lösung war ein entsprechendes lastname-Pattern oberhalb des ORG-Pattern einzutragen.

Vielen Dank nochmals,
Thomas
 
Hallo Thomas,

schön, dass ich Dir helfen konnte (wenn du magst, freue ich mich über ein like).

Nach meinem Verständnis der RFC6350 sollten zur fehlerlosen Interoperabilität mit beliebigen CardDAV-Clients Deine Kontakte für Unternehmen (Hotel-Einträge) in ownCloud besser so aussehen:
Code:
N:;;;;
FN:Hotel Albergo La Perla
ORG:Hotel Albergo La Perla
Wenn Du z.B. Hotels oder andere Unternehmen clustern möchtest, dann solltest Du dazu das property CATEGORIES nutzen, oder aber innerhalb iOS alternativ Gruppen*. Beim mir z.B. haben Hotels, Mitwagenanbieter, Airlines etc. die Kategorie "Reisen". Kategorien können mehrfach und überschneidend sein (gilt auch für Gruppen).
Dann muss man nur aufpassen, man was in der config.php als Filter setzt:
Code:
    'filters' => [
        'include' => [                                          // if empty include all by default
            /*
            'categories' => [],
            'groups' => [],
            */
        ],

        'exclude' => [
            /*
            'categories' => [],
            'groups' => [],
            */
        ],
    ],

* Gruppen sind eine Apple-Sonderlösung. Ich glaube, das muss ich ´mal in einem Wiki-Eintrag beschreiben.

Grüße

Black Senator
 
Zuletzt bearbeitet:
  • Like
Reaktionen: tzieg
Braucht man carddav2fb eigentlich noch?

Telefonie: Unterstützung für Online-Telefonbücher von Apple (iCloud), Telekom (MagentaCLOUD) sowie von CardDAV-Anbietern

... bietet die aktuelle FRITZ! Labor und damit auch die kommende Firmware.

carddav2fb ist zugegeben mein Baby (auch wenn Andig den Kernel [neu] programmiert hat). Paradoxerweise ist es gerade deshalb vor etwa drei Jahren (noch einmal neu) entstanden, weil z.B. iCloud damals nicht als Online Telefonbuch unterstützt wurde.
Mein erster Gedanke war daher auch, dass carddav2fb nun überflüssig geworden ist bzw. sein wird. Nach einigem Überlegen sehe ich das nun differenzierter und stelle hier ´mal die Vor- und Nachteile zusammen*:

FeatureFRITZ!OScarddav2fb (andig)carddav2fb (mein Fork)
Ausführungauf der FRITZ!Boxzusätzliches Device im Netzwerk (NAS, RasbPi, ...)zusätzliches Device im Netzwerk (NAS, RasbPi, ...)
Synchronisierungsrichtungbidirektional
(beim Namen wird nur das Attribut FN berücksichtigt, also haben Anpassungen hier keine Auswirkungen auf die Attribute N und ORG)
unidirektional
(nur download)
unidirektional
(nur download)
Synchronisierungszeitpunkt1x 24h oder manuell in der FRITZ!Box GUIbeliebigbeliebig
vCard Version3.0, ?3.0, 4.03.0, 4.0
Mehrere Quellen (Server) zu einem Telefonbuch zusammenführenneinjaja
lokale VCF verwendenneinjaja
Google Kontaktejanein
(und kommt auch nicht)
nein
(und kommt auch nicht)
Ein- und Auschluss von Kategorien (CATEGORIES)neinjaja
Ein- und Auschluss von Gruppen (iCloud)neinjaja
Namenskonvertierung konfigurierbarnein
(keine alphabetische Sortierung z.B. nach [Nachnamen, Vornamen], da nur das Attribut FN berücksichtigt wird)
ja
(nach diversen Regeln unter Berücksichtigung von FN, N, NICKNAME und ORG)
ja
(nach diversen Regeln unter Berücksichtigung von FN, N, NICKNAME und ORG)
Rufnummernkonvertierung konfigurierbarneinjaja
Rufnummerntype-Konvertierung konfigurierbarneinjaja
Zieltelefonbuchnicht das erste (?)beliebig (bis zu 10)beliebig (bis zu 10)
Übernahme Kontaktbilder vom Server für FRITZ!Fonnur GoogleJPEG, PNGJPEG, PNG
Übernahme Kontaktbilder aus VCF für FRITZ!Fonentfällt (s.o.)JPEG, PNGJPEG, PNG
Berücksichtigung von Kurzwahl, Vanity & internen Nummernnein,
weil nicht das erste Telefonbuch verwendet wird
jaja
Sicherung und Wiederherstellung von Kurzwahl, Vanity & internen Nummernnicht erforderlich, da das Telefonbuch nicht überschrieben wird und weil nicht das erste Telefonbuch verwendet wirdjaja
Reihenfolge der Rufnummern(-typen) im Kontakt konfigurierbarneinjaja
Kurzwahlnummern 2 - 9 als Hintergrundbild im FRITZ!Fonneinjaja
zusätzliche Wildcard-Nummern mit Stern an Stelle der Durchwahlneinneinja
Rückkanal für neue/geänderte Telefonbucheinträgebidirektionale Synchronisierung (s.o.)neinE-Mail mit geänderter/neuer Rufnummer als vCard-File (VCF)
Synchronisierung FRITZ!adr (FRITZ!fax)neinneinja
Sicherung in vCard-File (VCF) inkl. Kontaktbilderneinneinja
Konvertierung in andere Formate
(nachgelagerte Telefonbuchformate basierend auf dem FRITZ!Box Telefonbuch)
neinnein

Wenn jemand nur die Kontakte von einem CardDAV-Server 1:1 mit einem Telefonbuch der FRITZ!Box synchronisieren möchte und keine weiteren Eingriffsmöglichkeiten braucht, ist mit dem neuen Feature von AVM gut bedient. Für alle anderen ist carddav2fb auch weiterhin eine stabile Alternative.

Grüße

Black Senator

P.S. * wenn jemand einen Fehler in der Auflistung findet, dann bitte kurze PM an mich und ich korrigiere oder ergänze das dann. So können wir unnötiges Thread-Ping-Pong hier vermeiden
 
Zuletzt bearbeitet:
Ganz ehrlich?
Gott sei dank, hatte das Gefühl dass man für carddav2fb einen Studium braucht...

Aber: Ich habe einen Spezialanwendungsfall für den ich evtl doch carddav2fb brauche:
Ich möchte gerne aus 2 Carddavtelefonbüchern ein Fritz!Box Telefonbuch machen...
 
Ganz ehrlich?
... dass man für carddav2fb einen Studium braucht...
Was meinst Du mit "Ganz ehrlich?".
Zugegeben es ist jetzt nicht eine out-of-the-box-soluton, aber das Tool auf einem RasbPi zum Laufen zu bringen ist kein Hexenwerk.
Wenn Dir etwas unklar ist, dann frag doch hier einfach.
Schildere was Du erreichen möchtest und was dafür die Ausgangslage ist, dann ist das relativ flott erklärt. Aber auch, wenn Du Ideen hast, was verbessert werden müsste, damit man auch ohne Studium zum Ziel kommt ist hilfreich.

Um zwei CardDAV-Quellen in ein Telefonbuch zu sammenzuführen ist kein "Spezialfall", du musst einfach nur in der config.php folgendes eintragen:

PHP:
    'server' => [
        [
            'url'      => 'https://your/carddav/server/no1',
            'user'     => 'user.#[email protected]',
            'password' => 'your-pass-word-no1',
            ],
        [
            'url'      => 'https://your/carddav/server/no2',
            'user'     => 'user.#[email protected]',
            'password' => 'your-pass-word-no2',
            ],
    ],

Grüße

Black Senator
 
Was meinst Du mit "Ganz ehrlich?".
Zugegeben es ist jetzt nicht eine out-of-the-box-soluton, aber das Tool auf einem RasbPi zum Laufen zu bringen ist kein Hexenwerk.
Wenn Dir etwas unklar ist, dann frag doch hier einfach.
Schildere was Du erreichen möchtest und was dafür die Ausgangslage ist, dann ist das relativ flott erklärt. Aber auch, wenn Du Ideen hast, was verbessert werden müsste, damit man auch ohne Studium zum Ziel kommt ist hilfreich.

Ich wollte eigentlich nicht groß kritisieren, da ich eure Arbeit toll finde und wenn man selber nichts zu beiträgt braucht man sich eigentlich auch nicht zu beschweren.
Vielleicht stelle ich mich auch nur zu doof an...
Ein Traum wäre z.B. eine Nextcloud-App, sodass man eine Gui hat...


@meine Configdatei:
Habe ich jetzt schon mehrfach vor mir her geschoben, es ist die 3. heruntergeladene github version...
@Ausgangslage:
Fritz!Box 7590 mit Freetz
Ein Ubuntu 18.04 Server mit Nextcloud (Da sind auch die Kontakte drin)
Einer der Benutzer hat dank Whatsapp 2 Adressbücher die in der Fritzbox zu einem zusammengefasst werden müsste.
Einer der Benutzer hat ein Adressbuch das als 2. Telefonbuch auf der Fritzbox erscheinen sollte.

@Probleme:
1.@Telefonbücher:
1.1
Code:
'imagepath' => 'file:///var/InternerSpeicher/[YOURUSBSTICK]/FRITZ/fonpix/'
Ich habe keinen USB-Stick an die Fritzbox angeschlossen, sie sollte doch aber auch genug Speicher ohne USB-Stick haben?!? Was gebe ich an wenn ich keinen USB-Stick verwende?
1.2 Es erscheint mir irgendwie nicht als könnte ich mehrere Telefonbücher mit einer Datei abfertigen. Also lasse mache ich eine 2. Config Datei für das 2. Telefonbuch?

2. Server:
Eigentlich würde ich alle 3 Adressbücher eintragen, aber ich glaube es ist eine config datei Pro Telefonbuch auf der Fritz!Box, oder?
Code:
'server' => [
        [
            'url' => 'https://nas.XXXX.myfritz.net/remote.php/dav/addressbooks/users/User1/contacts/',
            'user' => 'User1',
            'password' => 'Geheim',
            'http' => [           // http client options are directly passed to Guzzle http client
                // 'verify' => false, // uncomment to disable certificate check
                // 'auth' => 'digest', // uncomment for digest auth
            ]
        ],
/* add as many as you need*/
       
[
            'url' => 'https://nas.XXXX.myfritz.net/remote.php/dav/addressbooks/users/User1/whatsapp/',
            'user' => 'User1',
            'password' => 'Geheim',
            'http' => [           // http client options are directly passed to Guzzle http client
                // 'verify' => false, // uncomment to disable certificate check
                // 'auth' => 'digest', // uncomment for digest auth
            ],
[
            'url' => 'https://nas.XXXX.myfritz.net/remote.php/dav/addressbooks/users/User2/contacts/',
            'user' => 'User2',
            'password' => 'Geheim',
            'http' => [           // http client options are directly passed to Guzzle http client
                // 'verify' => false, // uncomment to disable certificate check
                // 'auth' => 'digest', // uncomment for digest auth
            ],
    ],

Was hat es mit dem HTTP auf sich? irritierend
 
Hallo JokerGermany,

ich komme jetzt erst dazu Dir zu antworten:

sodass man eine Gui hat
Über ein Web-Frontend (GUI) denke ich schon eine ganze Zeit selbst nach. Ich bin nur kein Web-Programmierer und denke, dass es dann ziemlch komplex wird (ist ein Webserver auf dem Device? Welchen Port soll man dann nehmen, ...)

als 2. Telefonbuch auf der Fritzbox erscheinen soll
Dafür musst Du - wie von Dir richtig gedacht - zwei Konfigurationen definieren, die dann z.B. von einem Cron-Job mit etwas zeitlichem Abstand von ein paar Minuten laufen. Also z.B. config1.php und config2.php:
Code:
0 4 * * * php /carddav2fb/carddav2fb run -c config1.php
5 4 * * * php /carddav2fb/carddav2fb run -c config2.php

In config1.php steht dann z.B.:
PHP:
    'phonebook' => [
        'id'           => 0,            // only '0' can store quick dial and vanity numbers
        'name'         => 'Telefonbuch',
        'imagepath'    => 'file:///var/InternerSpeicher/FRITZSTICK/FRITZ/fonpix/',
    ],
und in config2.php:
PHP:
    'phonebook' => [
        'id'           => 1,            // only '0' can store quick dial and vanity numbers
        'name'         => 'Ein_anderer_Telefonbuchname',
        'imagepath'    => 'file:///var/InternerSpeicher/FRITZSTICK/FRITZ/fonpix/',
    ],

Damit
2 Adressbücher ... in der Fritzbox zu einem zusammengefasst werden
habe ich ja schon beschrieben.

Was gebe ich an wenn ich keinen USB-Stick verwende?
Ich habe keine 7590, und kann das nicht testen. Aber der Speicher ist wohl mit 512MB ausreichend groß, um auf einen USB-Stick zu verzichten.
Am einfachsten ist es im Telefonbuch zu einem Kontakt ein beliebiges Bild per FRITZ!Box GUI einzufügen. Anschließend sicherst du das Telefonbuch lokal und öffnest die XML-Datei mit einem beliebigen Editor. Suche nach dem String <imageURL. In dem Tag findest du den Pfad, den Du so 1:1 in der Konfiguration als
'imagepath' => 'file:///var/InternerSpeicher/FRITZSTICK/FRITZ/fonpix/',
einträgst. Dann musst Du nur den Link-Pfad entsprechend kürzen
und als
'fonpix' => '/FRITZSTICK/FRITZ/fonpix', // the storage for uploading images
eintragen.
Wahrscheinlich könnten wir per Programm aus einem der beiden (oder ganz automatisch) die Pfade ermitteln - aber: wir wissen leider nicht, ob alle FRITZ!Boxen bzw. deren OS was das angeht gleich ticken. Da ist es einfacher der User ermittelt selbst, was er vor sich hat...

Kommst Du damit weiter?

Grüße

Black Senator
 
Zuletzt bearbeitet:
Hi.

Habe carddav2fb auf einer Synology NAS in einem Docker Container zum Laufen gebracht.
Das Fritzbox Telefonbuch wird wunderbar aktualisiert.

Eine Frage bzgl. des Updates mehrerer Telefonbücher in Verbindung mit Docker:
In diesem Szenario müsste pro carddav2fb Konfiguration ein Docker Container laufen.
Ist das korrekt oder übersehe ich da eine Konfigurationsmöglichkeit in der jetzigen carddav2fb-Version?

... könnte man das evtl über eine angepasste "docker-entrypoint" regeln? .... dann müssten dort die Cronjobs aus der config.php-Datei gestartet werden .... nur so eine Idee

Gruß
molfi
 
Hallo,

sorry aber von Docker habe ich null Plan.
Ich würde empfehlen in andigs Repo die PRs rekursiv durchsehen: den Contributor, der die Docker-Erweiterung eingebracht hat, herausfinden und dann direkt kontaktieren.

Grüße

Black Senator
 
Ja, habe es gesehen.

Viel Glück

Black Senator
 
Hallo zusammen,
ich habe leider ein Problem, mein Telefonbuch in die Fritzbox zu bekommen. Ich erhalte immer die Fehlermeldung "String could not be parsed as XML". Das Telefonbuch ist unter https://spica.t-online.de/spica-con...ls/[email protected]/addressBooks/default/ zu finden. Benutzername und Passwort sind korrekt.
Zu diesem Fehler habe ich im GitHub ein Issue gefunden (Error retrieving addressbook from Kerio (String could not be parsed as XML) #149), das geschlossen wurde, da Infos fehlten. Ich nutze Carddav2fb auf meinem Raspberry Pi mit folgender PHP Version: 7.4.5.
Ich bin für jede Hilfe dankbar.
Gruß
 
@OL_1973
Wenn Dein Fehler gleichartig aussieht, dann mach bitte folgendes:
  1. Leg parallel zu deinem produktiven Adressbuch ein Adressbuch an, welches wir testen können: zwei drei Datensätze anonymisiert reichen (die DB sollte aber natürlich bei Dir den gleichen Fehler zeigen!)
  2. Geh in das Issue #149 und schildere dein Problem (kurz - keine unendlichen Fehlerlistings)
  3. sende andig und mir die Credentials für das Testadressbuch
Dann können wir das debuggen und schauen warum die CardDAV-DB rumzickt.

Grüße

Black Senator
 
Zuletzt bearbeitet:
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.