FritzBox mit SOAP auslesen und steuern

Also genau das mit der Anmeldung über die Weboberfläche wollte ich ja vermeiden. Thema ist hier Soap, bitte dann in einem anderen Thread weitermachen.
Ein Beispiel wie man Parameter über gibt ist in Post 3.
New SoapPara(‚Wert‘,NamedesParameters).
Michael

4h später, wieder zurück zum Thema :slight_smile:

Telefonbuchabfrage mit SOAP:

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

//Pfad zur Datei
   $filepath = IPS_GetKernelDir()."\\media\	elefonbuch.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){
   	    $fileHandle = @fopen($filepath, 'wb+');
	 	@fwrite($fileHandle, $phonebook);
    		@fclose($fileHandle);
    		}
	  else{
	      print_r($phonebook);
	      }

?>

Zigarettenkonsum steigt schon wieder :rolleyes:

Gruß
Manfred

Schon die Funktion für den Anrufbeantworter zum Laufen gebracht?
Daran hänge ich jetzt mal wieder fest. :confused:

Scheint so, als ob der Befehl für die Abfrage falsche wäre.

<?

	$ip = "fritz.box";
	$port = "49000";
	$user = "user";
	$pass = "password";

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

$client = new SoapClient(
    null,
    array(
        	'location'  => "http://".$ip.":".$port."/upnp/control/x_tam",
        	'uri'       => "urn:dslforum-org:service:X_AVM-DE_TAM:1",
			'SCDPURL'	=> "x_tamSCPD.xml",
        	'login'     => $user,
       	'password'  => $pass
    )
);
//$client->SetEnable(new SoapParam(true, 'NewEnable'));
$result = $client->GetInfo();
print_r($result);

?>

Fehlerausgabe:

Fatal error:  Uncaught SoapFault exception: [s:Client] UPnPError in I:\IP-Symcon\scripts\40843.ips.php:21
Stack trace:
#0 I:\IP-Symcon\scripts\40843.ips.php(21): SoapClient->__call('GetInfo', Array)
#1 I:\IP-Symcon\scripts\40843.ips.php(21): SoapClient->GetInfo()
#2 {main}
  thrown in I:\IP-Symcon\scripts\40843.ips.php on line 21

Auszug aus der .xml:

<service>
<serviceType>urn:dslforum-org:service:X_AVM-DE_TAM:1</serviceType>
<serviceId>urn:X_AVM-DE_TAM-com:serviceId:X_AVM-DE_TAM1</serviceId>
<controlURL>/upnp/control/x_tam</controlURL>
<eventSubURL>/upnp/control/x_tam</eventSubURL>
<SCPDURL>/x_tamSCPD.xml</SCPDURL>
</service>

Besten Dank
Gruß
Manfred

Schau mal in die ‚richtige‘ XML (x_tamSCPD.xml):

<name>GetInfo</name>
<argumentList>
<argument>
<name>NewIndex</name>
<direction>in</direction>
<relatedStateVariable>Index</relatedStateVariable>
</argument>
...

Du mußt hier wieder einen Parameter übergeben (NewIndex)vermutlich die ID vom AB.

Wird der SoapClient mit den Parametern trace und exceptions ergänzt, bekommt man im Fehlerfall die Fehlermeldung als Rückgabewert.


		$client = new SoapClient(null,
			array(
        		'location'   => $data["location"],
	        	'uri'        => $data["uri"],
   	     	'noroot'     => True,
      	  	'login'      => $fb_user,
        		'password'   => $fb_password,
				'trace'=>TRUE,
				'exceptions'=>false
    		)
		);

Michael
PS: Die ‚SCDPURL‘ brauchts du dem SoapClient nicht übergeben.
PPS: Habe mal das Telefonbuch im 3. Post ergänzt.

Hallo Michael,

Der Tipp hat’s mal wieder gebracht :smiley:
Bin jetzt wieder ein Stück weiter.

Ergebnisse gibt’s morgen, Zeit für’s Bett. :rolleyes:

Gruß
Manfred

Anrufbeantworter ein/aus

SCPDURL: x_tamSCPD.xml
Location: http://fritz.box:49000/upnp/control/x_tam
URI: urn:dslforum-org:service:X_AVM-DE_TAM:1
Action: SetEnable
Parameter 1: NewIndex => Nummer des Anrufbeantworters (0 - 9)
Parameter 2: NewEnable => „0“ oder „false“ für AUS, „1“ für EIN (true funktioniert nicht)

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

//AB aus
$client->SetEnable(new SoapParam(0, 'NewIndex'),
		               new SoapParam(0, 'NewEnable')
		               );

//AB ein
$client->SetEnable(new SoapParam(0, 'NewIndex'),
		               new SoapParam(1, 'NewEnable')
		               );

[HR][/HR]
Liste vom Anrufbeantworter

SCPDURL: x_tamSCPD.xml
Location: http://fritz.box:49000/upnp/control/x_tam
URI: urn:dslforum-org:service:X_AVM-DE_TAM:1
Action: GetMessageList
Parameter: NewIndex => Nummer des Anrufbeantworters (0 - 9)

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

// Gibt die Url mit SID aus
$result = $client->GetMessageList(new SoapParam(0, 'NewIndex'));
print_r($result);

/*
http://192.168.178.1:49000/tamcalllist.lua?sid=71120ab0f78ba64d&tamindex=0
*/

$xml = @simplexml_load_file($result);
print_r($xml);

/*
[Message] => Array
        (
            [0] => SimpleXMLElement Object
                (
                    [Index] => 1
                    [Tam] => 0
                    [Called] => meine Nummer
                    [Date] => 09.10.14 19:43
                    [Duration] => 0:01
                    [Inbook] => 1
                    [Name] => Manfred 
                    [New] => 1
                    [Number] => meine NUmmer
                    [Path] => /download.lua?path=/var/media/ftp/ST-4GB-01/FRITZ/voicebox/rec/rec.0.001
                )
*/

$data = @file_get_contents($result);
print_r($data);

/*
<Root>
<!-- index:0 -->
<!-- max:999 -->
<!-- tam calls:2 -->
<Message>
<Index>1</Index>
<Tam>0</Tam>
<Called>meine Nummer</Called>
<Date>09.10.14 19:43</Date>
<Duration>0:01</Duration>
<Inbook>1</Inbook>
<Name>Manfred </Name>
<New>1</New>
<Number>meine Nummer</Number>
<Path>/download.lua?path=/var/media/ftp/ST-4GB-01/FRITZ/voicebox/rec/rec.0.001</Path>
</Message>
*/

[HR][/HR]
SID auslesen

SCPDURL: deviceconfigSCPD.xml
Location: http://„fritz.bix:49000“/upnp/control/deviceconfig
URI: urn:dslforum-org:service:DeviceConfig:1
Action: {„X_AVM-DE_CreateUrlSID“}
Parameter: keine

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

$result = $client->{"X_AVM-DE_CreateUrlSID"}();

print_r($result);

/*
sid=71120ab0f78ba64d
*/

[HR][/HR]
Zeiten

Gibt die aktuelle Zeit der Friztbox aus, sowie ob Sommerzeit oder Winterzeit und Start/Ende der Winterzeit
SCPDURL: timeSCPD.xml
Location: http://„fritz.box:49000“/upnp/control/time
URI: urn:dslforum-org:service:Time:1
Action: GetInfo
Parameter: keine

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

$result = $client->GetInfo();

print_r($result);

/*
Array
(
    [NewNTPServer1] => 0.at.pool.ntp.org
    [NewNTPServer2] =>
    [NewCurrentLocalTime] => 2014-10-10T04:04:01+02:00
    [NewLocalTimeZone] =>
    [NewLocalTimeZoneName] => CET-1CEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00
    [NewDaylightSavingsUsed] => 0
    [NewDaylightSavingsStart] => 0001-01-01T00:00:00
    [NewDaylightSavingsEnd] => 0001-01-01T00:00:00
)
*/

Gruß
Manfred

PS: :loveips: :rolleyes:

Hallo zusammen,
danke für die tollen Scripts.

Ich habe jetzt mal mit dem AB Script mit

$zaehler_gesamt = count($xml->Message);

ausprobiert, um die Nachrichten zu zählen.
Funktioniert prima.

Habe jetzt im Array gesehen, das dort mit [New] => 0/1 auch nach neuen Nachrichten unterschieden wird.
Wie könnte ich damit noch nur die neuen Nachrichten zählen lassen. Blicke da bei dem Array irgenwie nicht durch.
Oder anders gefragt, wie müsste der Zähler aussehen, der das Array an der Stelle [New] durchläuft?

Danke u. Grüße,
Doc

SimpleXML Objekte können ganz simpel mit Xpath gefiltert werden.
Kann ja heute abend mal was vorbereiten. Nachdem die AB Software von AVM schon lange nicht mehr funktioniert, wollte ich das auch schon in IPS integrieren.
Michael

Hört sich gut an.
Wäre schön, so etwas dann wie z.B. die Telefonliste im Webfront abbilden zu können und evtl. auch gleich die Anrufe abhören oder löschen zu können.

Werde mir xpath jetzt mal ansehen. Möchte das auch selber etwas verstehen.

Bin gespannt.
Grüße,
Doc

ich suche schon länger nach einer Möglichkeit, den aktuellen „Telefonstatus“ auszulesen. Wenn zwei Gespräche paralell am laufen sind, meldet die Registervariable nach beenden des ersten ein Disconnect, merkt aber natürlich nicht, dass das andere Gespräch noch aktuell ist. Mit foncontrol müssten die Daten eigentlich ausgelesen werden können, jedoch finde ich nirgends eine Befehlsübersicht dafür.

In der SCPD vom foncontrol schon nachgesehen ?
Ich kann immer nur abends für 1-2 Stunden was aktiv machen. Darum dauert das bei mir immer.
Eventuell geht das ja auch per Events; habe mich damit aber noch gar nicht beschäftigt.
Das setzt ja bestimmt eine RegVar und dahinter einen SoapServer vor raus, welcher auch bei der FB aktiv registriert werden muss.
Ist ja eh alles Upnp like
Michael

Hallo,
das 2.4 GHz WLAN schaltet man wie folgt.

2.4 GHz WLAN schalten:

// WLAN 2.4 GHz
$client = new SoapClient(
    null,
    array(
        'location'   => "http://".$fritzbox_ip.":49000/upnp/control/wlanconfig1",
        'uri'        => "urn:dslforum-org:service:WLANConfiguration:1",
        'noroot'     => True,
        'login'      => $fritzbox_Username,
        'password'   => $fritzbox_Password
    )
);

$client->SetEnable(new SoapParam($wert,'NewEnable'));

Aber wie schaltet man das 5.0 GHz WLAN?

Wow, wenn das in dem Tempo weitergeht komme ich zu gar nichts mehr :smiley:
Ansonsten habe ich im Wiki jetzt eine Kategorie für die FritzBox eingerichtet
und dort können gerne auch die Scripte eingestellt werden. Zumindest wenn nicht
noch Rückfragen sind.
Ist vielleicht sinnvoller dort den Code zu pflegen und sich hier darüber auszutauschen.
Sonst verliere ich glaube ich den Überblick.

@Broving
Ich kann das leider nicht testen, aber vielleicht ist das diese Action ?


<action>
<name>X_SetHighFrequencyBand</name>
<argumentList>
<argument>
<name>NewEnableHighFrequency</name>
<direction>in</direction>
<relatedStateVariable>EnableHighFrequency</relatedStateVariable>
</argument>
</argumentList>
</action>

Michael

Es funktioniert mit der 2. Gastzugang ist dann die 3. Hatte immer die 0 probiert…
5.0 GHz WLAN schalten:

// WLAN 5.0 GHz
$client = new SoapClient(
    null,
    array(
        'location'   => "http://".$fritzbox_ip.":49000/upnp/control/wlanconfig2",
        'uri'        => "urn:dslforum-org:service:WLANConfiguration:2",
        'noroot'     => True,
        'login'      => $fritzbox_Username,
        'password'   => $fritzbox_Password
    )
);

$client->SetEnable(new SoapParam($wert,'NewEnable'));

Gäste WLAN schalten (wenn 5 GHz WLAN in verwendetem Fritzbox-Modell verfügbar):

// Gäste-WLAN aktivieren/deaktivieren
$client = new SoapClient(
    null,
    array(
        'location'   => "http://".$fritzbox_ip.":49000/upnp/control/wlanconfig3",
        'uri'        => "urn:dslforum-org:service:WLANConfiguration:3",
        'noroot'     => True,
        'login'      => $fritzbox_Username,
        'password'   => $fritzbox_Password
    )
);

$client->SetEnable(new SoapParam($wert,'NewEnable'));

Ah cool.
Dann muss der Dienst ja auch in einer desc.xml stehen.
Ich habe dort nur 1 und 2.
Wäre gut wenn du dann noch ergänzt um welche Box es sich handelt. Am besten die Bezeichnung aus DeviceInfo (habe die Uri und location jetzt nicht im Kopf).
Da es, wie schon vermutet, Unterschiede bei den Modellen gibt.
Michael

Also die Anzeige kannst du gerne Testen, habe die Anrufliste mal etwas modifiziert :smiley:
http://www.ip-symcon.de/wiki/FritzBox_Anrufbeantworter_auslesen
Abhören habe ich nicht geschafft… wenn ich die in der XML genannte URL aufrufe (mit http://<IP>:49000 davor)
bekomme ich immer das hier:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<s:Body>
<s:Fault>
<faultcode>s:Client</faultcode>
<faultstring>UPnPError</faultstring>
<detail>
<UPnPError xmlns="urn:dslforum-org:control-1-0">
<errorCode>606</errorCode>
<errorDescription>Action Not Authorized</errorDescription>
</UPnPError>
</detail>
</s:Fault>
</s:Body>
</s:Envelope>

Und ohne Möglichkeiten die Nachricht abzuhören, macht es glaube ich keinen Sinn aus dem Webfront die Nachrichten zu löschen bzw. als abgehört zu makieren :frowning:

Was ich aber noch ergänzen werde sind die zwei Summenzähler für alle Nachrichten und neue Nachrichten.

[EDIT]: Eben Änderung im WIKI durchgeführt.


$vid = CreateVariableByName($parentID, 'Messages', 1);
SetValueInteger($vid, count($anruflistexml->Message)); // Alle Nachrichten);
$vid = CreateVariableByName($parentID, 'NewMessages', 1);
SetValueInteger($vid, count($anruflistexml->xpath("//Message[New ='1']"))); // Neue Nachrichten

Und nun mal wieder ein Bild :smiley:


Michael

Es handelt sich um die 7390.

Wo finde ich diese?

Seite 1 Erster Post:

SCPDURL: deviceinfoSCPD.xml
Location: http://fritz.box:49000/upnp/control/deviceinfo
URI: urn:dslforum-org:service:DeviceInfo:1
Action: GetInfo

Am besten den Wert [NewDescription] da dieser nicht nur das Model sondern auch die Firmware enthält:
Bei mir => FRITZ!Box 6360 Cable (kdg) 85.06.05

Michael

FRITZ!Box Fon WLAN 7390 84.06.04

Habe einfach dein Komplett-Auslese-Skript verwendet und in IPS abgelesen.

Verbindungsgeschwindigkeit und Zwangstrennungszeit:

// Reconnect-Zeit ermitteln
$client = new SoapClient(
    null,
    array(
			'location'            => "http://".$fritzbox_ip.":49000/upnp/control/time",
         'uri'        => "urn:dslforum-org:service:Time:1",
			'noroot'          => True,
			'login'      => $fritzbox_Username,
			'password'   => $fritzbox_Password
    )
);

$result = $client->GetInfo();

$client = new SoapClient(
    null,
    array(
        'location'   => "http://".$fritzbox_ip.":49000/igdupnp/control/WANIPConn1",
        'uri'        => "urn:schemas-upnp-org:service:WANIPConnection:1",
        'noroot'     => True
    )
);
$status = $client->GetStatusInfo();

$tag = date('d.m.Y, H:i', strtotime($result['NewCurrentLocalTime']) - $status['NewUptime'])." Uhr";
SetValue(20163 /*[Fritzbox/Zwangstrennung]*/, "Verbunden seit " . $tag);

// Up-/Down-Loadrate ermitteln
$client = new SoapClient(
    null,
    array(
        'location'   => "http://".$fritzbox_ip.":49000/igdupnp/control/WANCommonIFC1",
        'uri'        => "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1",
        'noroot'     => True
    )
);
$result = $client->GetCommonLinkProperties();

$tag = round($result['NewLayer1DownstreamMaxBitRate']/1000000, 1)." Mbit/s Down, ".round($result['NewLayer1UpstreamMaxBitRate']/1000000, 1)." Mbit/s Up";
SetValue(31787 /*[Fritzbox/Verbindungsgeschwindigkeit]*/  , $tag);