FritzBox mit SOAP auslesen und steuern

Das geht nicht, es gibt nur SetPhonebookEntry und dann musst du jeden Eintrag einzeln in das zuvor neu erstellte Telefonbuch schreiben.
Michael

Hallo Michael,

danke für die Antwort - aber ich muss da doch noch einmal - zu meiner Beruhigung - nachfragen:
Woran kann man den ableiten welche der von AVM aufgeführten actions gar nicht gehen?

Für den interssierten Laien ist das ja nicht ersichtlich - oder ich habe das aus der schauderlich dünnen Beschreibung von AVM nicht ablesen können. Hast Du da eine bessere Doku bzw. „Insiderwissen“?

Grüße

Volker

AddPhonebook funktioniert.
Es erzeugt ein neues leeres Telefonbuch mit dem übergeben Namen.
Aber es gibt keine Möglichkeit des Uploads.
Michael

Hallo,

der Ansatz ist gut und die Nachtschaltung für Fon 1 u. 2 sowie die ISDN Rufnummer funktionieren mit den bekannten Telefoncodes gut. Leider lassen sich über #81nn nicht die DECT Geräte mit dreistelliger internen Nummer darüber schalten. Auch der Telefoncode #810 bzw #816 wirken sich nicht auf die Schnurlostelefone aus. Besteht die Möglichkeit die Klingelsperre wie beim Gast Wlan zu schalten ( SetEnable(new SoapParam(0, ‚NewEnable‘)).

Leider finde ich kein Parameter, wie bei WLAN (wlanconfig) für den Aufruf der Klingelsperre mit X_AVM-DE_Dect bin ich nicht weitergekommen.

Hallo Michael,

besteht irgendeine Möglichkeit per SOAP einen Internen Anruf auszulösen und so zu tun als wenn es die konfigurierte Türsprechstelle ist ?
Wir haben auf die Fritz Fon Mobilteile umgestellt (C5), die ja unter anderem ein Kamera Livebild unterstützen und bei der Nebenstelle in der Fritzbox lässt sich auch eine Live URL einrichten, die dann angezeigt wird wenn die TFE „anruft“. Eine reale TFE gibt es allerdings nicht.
Daher der Gedanke den Klingeltaster abzufragen und dann per IPS Script den Anruf auszulösen um zum einen ein Mobilteil klingeln zu lassen und zum anderen das Bild der Hofcam anzuzeigen.
Ich war mir sicher so etwas ähnliches (Anruf simulieren) hätte ich schon mal irgendwo gelesen, finde es aber nicht wieder und da ich die Soap Lösung eh schon einsetze dachte ich, ich frag mal nach :wink:

Gruß
Jens

Anruf simulieren steht hier:
FritzBox mit SOAP auslesen und steuern - Seite 32

Ob das aber auch eine TFE emulieren kann, keine Ahnung :wink:
Michael

Ok, danke für den Hinweis, habe ich tatsächlich übersehen :frowning: … blicke da allerdings noch nicht so richtig durch wie das weiter helfen könnte. :confused:

Meine TFE hat intern die **622 , die Klingeltaste ist als 11 konfiguriert und wird an das Mobilteil 1 (intern **610) weitergeleitet.
Irgendeine Idee wie man das umsetzen könnte ? :rolleyes:

edit
Kann man das umsetzen? Da lässt sich scheinbar die Absendekennung vorgeben
http://www.wehavemorefun.de/fritzbox/Erweitertes_Wählskript
Gruß
Jens

Nicht wirklich, nutze diese Funktion selber auch gar nicht.
Michael

Hi. Ich nutze folgendes von Nall-Chan inspirierte Script, um diverse Parameter aus meiner FritzBox 6490 auszulesen:

 //Parameter Array bilden
 $parameter1 = array("location" => "http://".$fqdn.":".$socket."/igdupnp/control/WANCommonIFC1","uri" => "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1","noroot" => true);
 $parameter2 = array("location" => "http://".$fqdn.":".$socket."/igdupnp/control/WANIPConn1","uri" => "urn:schemas-upnp-org:service:WANIPConnection:1","noroot" => true);
 //Werte auslesen
 $box1 = new SoapClient(null,$parameter1);
 $box2 = new SoapClient(null,$parameter2);
 $result1 = $box1->GetCommonLinkProperties();
 $result2 = $box2->GetStatusInfo();
 $result3 = $box1->GetAddonInfos();
 
 //Werte formatieren
 $maxBitRateDown = round($result1["NewLayer1DownstreamMaxBitRate"] / 1000000,1); //Umrechnung in MBit/s
 $maxBitRateUp = round($result1["NewLayer1UpstreamMaxBitRate"] / 1000000,1); //Umrechnung in MBit/s
 $physicalLink = $result1["NewPhysicalLinkStatus"]; //Up oder Down
 $logicalLink = $result2["NewConnectionStatus"]; //Connected oder Disconnected
 $currentBitRateDown = round($result3["NewByteReceiveRate"] / 1024 / 1024 * 8,1); //Umrechnung in MBit/s
 $currentBitRateUp = round($result3["NewByteSendRate"] / 1024 / 1024 * 8,1); //Umrechnung in MBit/s
 $totalGigaByteDown = round($result3["NewTotalBytesReceived"] / 1024 / 1024 / 1024,2); //Umrechnung in GByte
 $totalGigaByteUp = round($result3["NewTotalBytesSent"] / 1024 / 1024 / 1024,2); //Umrechnung in GByte

Seit dem 25.07.2018 kommen in den Variablen $totalGigaByteDown und $totalGigaByteUp keine Werte mehr rein. In $physicalLink und $logicalLink gibt es nur noch ein „Unconfigured“. Die restlichen Parameter passen aber noch. Wenn man sich z.B. das Array zu $result3 anschaut, sieht man, dass die entsprechenden Werte auf 0 stehen.

Array
(
    [NewByteSendRate] => 57344
    [NewByteReceiveRate] => 55163
    [NewPacketSendRate] => 0
    [NewPacketReceiveRate] => 0
    [NewTotalBytesSent] => 0
    [NewTotalBytesReceived] => 0
    [NewAutoDisconnectTime] => 0
    [NewIdleDisconnectTime] => 0
    [NewDNSServer1] => 80.69.96.12
    [NewDNSServer2] => 81.210.129.4
    [NewVoipDNSServer1] => 80.69.99.112
    [NewVoipDNSServer2] => 80.69.97.232
    [NewUpnpControlEnabled] => 0
    [NewRoutedBridgedModeBoth] => 1
)

Das ganze kam bestimmt mit einem Firmware Update der FritzBox von Unitymedia. Weiß jemand von Euch, was da passiert ist?

Danke und viele Grüße …

Leider verändert AVM häufig die Location wo welche Daten stehen.
Das Test-Script im ersten Post sollte alle Dienste und Locations ermitteln anhand der von der Box bereitgestellten XML Dateien.
Damit solltest du deine Werte finden können um dann dein Script anzupassen.
Michael

Hi Michael. Danke Dir … habe ich gerade gemacht. Der entsprechende Teil ist erwartungsgemäß mit 0 definiert, so, wie es auch im Script ankommt:

 descXML: igddesc.xml
 SCPDURL: igdicfgSCPD.xml
 Location: http://fritz.box:49000/igdupnp/control/WANCommonIFC1
 URI: urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1
 Action: GetAddonInfos
Array
(
    [NewByteSendRate] => 74365
    [NewByteReceiveRate] => 950909
    [NewPacketSendRate] => 0
    [NewPacketReceiveRate] => 0
    [NewTotalBytesSent] => 0
    [NewTotalBytesReceived] => 0
    [NewAutoDisconnectTime] => 0
    [NewIdleDisconnectTime] => 0
    [NewDNSServer1] => 80.69.96.12
    [NewDNSServer2] => 81.210.129.4
    [NewVoipDNSServer1] => 80.69.99.112
    [NewVoipDNSServer2] => 80.69.97.232
    [NewUpnpControlEnabled] => 0
    [NewRoutedBridgedModeBoth] => 1
)

Ich habe mal die Ausgabe Deines Test-Scripts nach „TotalBytesSent“ und „TotalBytesReceived“ durchsucht, und dies hier gefunden:

 descXML: tr64desc.xml
 SCPDURL: wancommonifconfigSCPD.xml
 Location: http://fritz.box:49000/upnp/control/wancommonifconfig1
 URI: urn:dslforum-org:service:WANCommonInterfaceConfig:1
 Action: GetCommonLinkProperties
Array
(
    [NewWANAccessType] => X_AVM-DE_Cable
    [NewLayer1UpstreamMaxBitRate] => 5248000
    [NewLayer1DownstreamMaxBitRate] => 112640000
    [NewPhysicalLinkStatus] => Up
)

 descXML: tr64desc.xml
 SCPDURL: wancommonifconfigSCPD.xml
 Location: http://fritz.box:49000/upnp/control/wancommonifconfig1
 URI: urn:dslforum-org:service:WANCommonInterfaceConfig:1
 Action: GetTotalBytesSent
0
 descXML: tr64desc.xml
 SCPDURL: wancommonifconfigSCPD.xml
 Location: http://fritz.box:49000/upnp/control/wancommonifconfig1
 URI: urn:dslforum-org:service:WANCommonInterfaceConfig:1
 Action: GetTotalBytesReceived
0


Dort scheint aber - im Gegensatz zu anderen Get-Actions - kein Array zu kommen. Hast Du noch einen Tipp?

Sieht eher so aus als wenn diese Funktion komplett deaktiviert wurde.
Da die einzelnen Abfragen auch nur 0 liefert.
Sonst auf der Entwickler Website von AVM einfach anschreiben.
Gerät Firmware angeben und fragen warum bei dieser Abfrage nur noch 0 ankommt.
Könnte ja auch ein Bug sein :wink:
Michael

Mach ich … danke Dir für Deine Hilfe … wenn ich was von AVM höre, werde ich berichten :wink:

Hallo zusammen, bin eher zufällig auf diesen Thread gestoßen :slight_smile:

Hat schon mal jemand Kontakte der FritzBox per SOAP synchronisiert? Bzw. hat vielleicht schon jemand ein paar Codeschnipsel wie ich hier vorgehen könnte? (mit PHP kenne ich mich aus und bekomm das meiste auch hin, aber in Bezug auf SAOP / FritzBox bin ich Neuling)

Beste Grüße Marco

Hallo Marco,

Ehrlicherweise ist das trotz der tollen Hinweise auch echt ein Gewürge. Die Dokus von AVM sind dermaßen grottig dokumentiert, dass zumindest ich an einigen Stellen nur mit trail&error weiter gekommen bin.

Tatsächlich bin ich auch kein Symcon-Anwender, aber dieser Thread ist immer noch eine der ergiebigsten Quellen zu dem Thema. Daher schaue ich auch gerade zufällig hier wieder vorbei und will Dir gerne von meinem gewonnen Wissen etwas abgeben:

Aus einem gerade fertigen Projekt (Coding simplifiziert & null error handling!):

Erst einmal brauchst Du einen SOPA-Client:


/**
     * delivers a new SOAP client
     *
     * @param   string $url       Fritz!Box IP
     * @param   string $location  TR-064 area (https://avm.de/service/schnittstellen/)
     * @param   string $service   TR-064 service (https://avm.de/service/schnittstellen/)
     * @param   string $user      Fritz!Box user
     * @param   string $password  Fritz!Box password
     * @return                    SOAP client
     */

    function getclient ($url, $location, $service, $user, $password) {

        $client = new SoapClient(
                        null,
                        array (
                            'location'   => "http://".$url.":49000/upnp/control/".$location,
                            'uri'        => "urn:dslforum-org:service:".$service,
                            'noroot'     => True,
                            'login'      => $user,
                            'password'   => $password
                        )
                    );
        return $client;
    }

// get SOAP client for phonebook operations
$contactClient = getClient ('192.168.178.1', 'x_contact', 'X_AVM-DE_OnTel:1', 'dslf_config', [password]);

Dann z.B. zum Auslesen des Telefonbuchs:


// load current phonebook
$result = $contactClient->GetPhonebook(new SoapParam(0, 'NewPhonebookID')); // first = 0!
$phoneBook = @simplexml_load_file($result['NewPhonebookURL']);
$phoneBook->asXML();

Um einen Eintrag zu ändern oder hinzuzufügen musst Du die Daten in einen schönen XML-Envelop packen (hat mich einen Tag und zig Web recherchen gekostet, bis ich den richtigen Aufbau hatte. Also nicht die Datenstruktur - die ist wie im Telefonbuch easy zu erstellen, sondern den SOAP Envelop ringsrum…:

    /**
     * delivers a minimal contact structure for AVMs TR-064 interface
     *
     * @param   string $number  phone number
     * @param   string $caller  callers name or alias
     * @param   string $type    phone type (home, work, fax etc.)
     * @return  xml             SOAP envelope:
     *                          <?xml version="1.0"?>
     *                          <Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope">
     *                              <contact>
     *                                  <person>
     *                                      <realName>$caller</realName>
     *                                  </person>
     *                                  <telephony>
     *                                      <number id="0" type=$type>$number</number>
     *                                  </telephony>
     *                              </contact>
     *                          </Envelope>
     */

    function newEntry ($number, $caller, $type) : SimpleXMLElement {

        $envelope = new simpleXMLElement('<Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"></Envelope>');

        $contact = $envelope->addChild('contact');

        $person = $contact->addChild('person');
        $person->addChild('realName', $caller);

        $telephony = $contact->addChild('telephony');

        $phone = $telephony->addChild('number', $number);
        $phone->addAttribute('id', 0);
        $phone->addAttribute('type', $type);

        return $envelope;
    }


So und nun rein ins Telefonbuch:


                    // assamble minimal contact structure
                    $xmlEntry = newEntry([Nummer],[Name], [phonetype]);    // phonetype -> home, work, fax_work, mobil
                    // add the spam call as new phonebook entry
                    $contactClient->SetPhonebookEntry(
                                        new SoapParam($config['setPhonebook'], 'NewPhonebookID'),
                                        new SoapParam(null, 'NewPhonebookEntryID'),  // null -> new or int of designated Index!
                                        new SoapParam($xmlEntry, 'NewPhonebookEntryData')
                                        );

Don´t have too much fun!

So und nun zu der Frage warum ich hier wieder auf der suche nach Infos bin:

Ich versuche per script einen eingehenden Anruf zu killen (nicht anzunehmen → erweiterte Rufnummernbehandlung für Spezialfälle).
Meine letzten Versuche waren:


                    # pick up call
                    $phoneClient->{'X_AVM-DE_DialNumber'}(new SoapParam('*09',"NewX_AVM-DE_PhoneNumber"));
                    // sleep(4);                        habe es mit und ohne wartezeiten probiert
                    # disconnect call
                    $phoneClient->{'X_AVM-DE_DialHangup'}();

Hat jemand mit so etwas etwas Zustande gebracht?

Black Senator

@mastermind1: Deine Anfrage ist zwar schon dreinhalb Jahre alt - aber ich hoffe die Antwort erreicht dich trotzdem. Erst seit diesem Sommer gibt es seitens AVM eine action im TR-064 Set, welches einzelne Ergänzungen in den Telefonbüchern erlaubt.

Unter https://github.com/BlackSenator/fbcallrouter/blob/master/fbcallrouter.php habe ich ein script veröffentlicht, welches genau das macht was Du (vermutlich) möchtest.

War übrigens nur Dank der hier reichlich vorhandenen (und verstreuten) Infos und Anregungen möglich.

Das script läuft bei mir auf einem RaspberryPi im Hintergrund -> hat also nix mit Symcon zu tun. Die Anleitung für den Hintergrundbetrieb findest Du dort auch.

Viel Spaß damit und schöne Weihnachten

Black Senator

Hi. Irgendwann zwischen den Jahren kam von Unitymedia eine neue Firmware (07.01) für die 6490. Seit dem kommt bei jedem SOAP-Request folgende Fehlermeldung:

Fatal error: Uncaught SoapFault exception: [HTTP] Bad Request in C:\IP-Symcon\scripts\37959.ips.php:25
Stack trace:
#0 [internal function]: SoapClient->__doRequest(’<?xml version="…’, ‚http://fritzbox…‘, ‚urn:dslforum-or…‘, 1, 0)
#1 C:\IP-Symcon\scripts\37959.ips.php(25): SoapClient->__call(‚GetInfo‘, Array)
#2 {main}
thrown in C:\IP-Symcon\scripts\37959.ips.php on line 25

Hat jemand eine Idee oder hat AVM SOAP komplett eingestellt?

Hi squeeezer!

Hängt das zufällig damit zusammen?
>> Fritzbox Anmeldung funktioniert nicht mehr

Grüße,
Chris

Leider nicht. Ich gebe User+Passwort mit, das Anmelden funktioniert scheinbar auch (SOAP-Client). Hier mal ein Teil des Script:

 //Anmeldeinformationen
 $fqdn = "fritz.box";
 $socket = 49000;
 $login = base64_decode(GetValue(37718 /*[System\Systemvariablen\NET_FritzBoxLogin]*/));
 $password = base64_decode(GetValue(51782 /*[System\Systemvariablen\NET_FritzBoxPassword]*/)); //Werte auslesen
 $parameterSet1 = new SoapClient(null,array("location" => "http://".$fqdn.":".$socket."/upnp/control/deviceinfo","uri" => "urn:dslforum-org:service:DeviceInfo:1","login" => $login, "password" => $password,"noroot" => true));
 $parameterSet2 = new SoapClient(null,array("location" => "http://".$fqdn.":".$socket."/upnp/control/wancommonifconfig1","uri" => "urn:dslforum-org:service:WANCommonInterfaceConfig:1","login" => $login, "password" => $password,"noroot" => true));
 $parameterSet3 = new SoapClient(null,array("location" => "http://".$fqdn.":".$socket."/igdupnp/control/wancommonifc1","uri" => "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1","noroot" => true));
 $parameterSet4 = new SoapClient(null,array("location" => "http://".$fqdn.":".$socket."/upnp/control/wanipconnection1","uri" => "urn:dslforum-org:service:WANIPConnection:1","login" => $login, "password" => $password,"noroot" => true));
 $parameterSet5 = new SoapClient(null,array("location" => "http://".$fqdn.":".$socket."/upnp/control/wlanconfig1","uri" => "urn:dslforum-org:service:WLANConfiguration:1","login" => $login, "password" => $password,"noroot" => true));
 $parameterSet6 = new SoapClient(null,array("location" => "http://".$fqdn.":".$socket."/upnp/control/wlanconfig2","uri" => "urn:dslforum-org:service:WLANConfiguration:2","login" => $login, "password" => $password,"noroot" => true));
 $parameterSet7 = new SoapClient(null,array("location" => "http://".$fqdn.":".$socket."/upnp/control/wlanconfig3","uri" => "urn:dslforum-org:service:WLANConfiguration:3","login" => $login, "password" => $password,"noroot" => true)); //Methoden aufrufen und auslesen
 $result1 = $parameterSet1->GetInfo();
 $result2 = $parameterSet2->GetCommonLinkProperties();
 $result3 = $parameterSet3->GetAddonInfos();
 $result4 = $parameterSet4->GetInfo();
 $result5 = $parameterSet5->GetInfo();
 $result6 = $parameterSet6->GetInfo();
 $result7 = $parameterSet7->GetInfo(); 

Die o.g. Meldung kommt ab den Zeilen [LEFT] $result1 = $parameterSet1->GetInfo();[/LEFT]