FritzBox mit SOAP auslesen und steuern

Nachdem ich mich auch regelmäßig ärgere wenn eins der FritzBox Scripte nach einen FW-Update nicht mehr läuft, habe ich versucht einen Weg zu finden, welcher ‚vielleicht‘ etwas weniger anfällig für Firmware , Weboberfläche, Lua-Script Änderungen seitens des Herstellers ist.

Kurzer Rückblick:
Auf die Idee bin ich durch Paresy’s Script gekommen :http://www.ip-symcon.de/forum/threads/11741-Downstream-Upstream-Geschwindigkeit-der-FritzBox-auslesen

Hier wird ein SOAP-Request zur Box gesendet und die Rückmeldung ausgewertet.

Inzwischen geht das ganze recht komfortable.
Einfache Abfrage


$client = new SoapClient(
    null,
    array(
        'location'   => "http://fritz.box:49000/igdupnp/control/WANCommonIFC1",
        'uri'        => "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1",
        'noroot'     => True
    )
);
$status = $client->GetAddonInfos();

So erhält hat man ein assoziertes Array (hier $status) welches u.a. „NewByteSendRate“ & „NewByteReceiveRate“ enthält.

Es gibt auch Dienste (das ist im Beispiel unter ‚uri‘ zu finden) welche eine Authentifizierung benötigen.
Hier ergänzt man das übergebende Array des SoapClient um die Felder ‚login‘ = Benutzername und ‚password‘ = passwort.

Nun steht es jedem natürlich frei alle Werte für seine Box manuell in x Scripte regelmässig abzufragen.
Dabei gibt es aber zwei Probleme, das ermitteln der möglichen Dienste und Funktionen (oben z.B. GetAddonInfos() ) und dass es auf den zig Modellen der Fritten nicht jeden Dienst geben muss.

Test-Script
Für das ermitteln der vorhandenen Dienste und Funktionen habe ich ein Testscript geschrieben, welche das Alles automatisch ermittelt, ausließt und in IPS als Struktur abbildet.

Warnung
Einsatz auf eigene Gefahr.
Das Script ist rein zum Auslesen /Prüfen aller Dienste gedacht.
Es sollte niemals automatisch zyklisch ausgeführt werden, da es einfach zu viel Last auf die FritzBox bringt und locker 1-3 Minuten Laufzeit hat.
Es erhebt keinen Anspruch darauf Fehlerfrei zu sein. Wenn also eure Box anfängt zu fliegen, reden oder einfach die Werkseinstellungen lädt (und ja das geht wirklich über SOAP !) macht mich dafür nicht verantwortlich.

Bevor der Code folgt, noch ein paar Infos wie Ihr eure Dienste selbst ermitteln könnt, bzw. wie es auch das Script macht:

[ol]
[li]Es werden die XML Dateien mit xxxxxdesc.xml geladen und nach den Diensten (SCPD, URI und Location) durchsucht[/li][li]Die dazugehörige SCPD-Datei wird geladen und nach allen Funktionen für diesen Dienst durchsucht.[/li][li]Die Abschnitte der Funktionen enthalten Informationen darüber welche Daten als Parameter übergeben werden müssen (direction=in) oder welche Daten als Ergebnis zurück geliefert werden (direction=out).[/li][li]Das Testscript nimmt nur Funktionen ohne Parameter (also alles was mindesten ein out-Parameter und keinen in-Parameter hat) und führt einen SOAPRequest durch. Das Ergebnis wird angezeigt und im Baum abgebildet.[/li][/ol]

Um also jetzt zu Fuss einen SOAPRequest zusammen zu bauen, müßt Ihr euch die Dateien von Punkt 1 und 2 ansehen (im Browser als http://:49000/ aufrufen) und dann anhand der Parameter der 2.Datei ‚raten‘ welche Funktion ihr haben wollt.

Im zweiten Post folgen dann noch ein paar Beispiele für direkte Abfragen und ein paar Funktionen, welche euch das Leben etwas einfach machen sollten (um nicht alles statisch im PHP-Code zu codieren).

Im dritten Post gibt es dann noch Beispiele wie man Daten per SOAP schreibt (z.B. Nachtschaltung, Reboot auslösen). Aber das wird erst die Tage etwas, leide gerade etwas unter Zeitmangel…

Diese beiden Post werde ich gerne immer mal wieder mit Beispielen ergänzen und auch versuchen etwa in Schuss zu halten. Dazu wären natürlich Rückmeldungen von Euch nötig (mit Angabe der Typenbezeichnung und Firmware Eurer Box) welche Abfragen funktionieren.


<?
set_time_limit(240);
$fbroot ='http://fritz.box:49000';
$fb_user='asdf@asdf.asdf';
$fb_password='secret';

$descXMLs = array(
"tr64desc.xml",
"igddesc.xml",
//"MediaServerDevDesc.xml", //gibt es bei mir nicht
//"onlinestoredesc.xml", //gibt es bei mir nicht
//"fboxdesc.xml", //gibt es bei mir nicht
"usbdesc.xml"
);

// ab hier nichts ändern
foreach ($descXMLs as $descXML)
{
	$xml = @simplexml_load_file($fbroot.'/'.$descXML);
	if ($xml === false)
	{
	   echo "Not found:".$descXML.PHP_EOL;
		continue;
	}
	$xml->registerXPathNamespace('fritzbox', $xml->getNameSpaces(false)[""]);
	$xmlservices = $xml->xpath('//fritzbox:service');
	foreach ($xmlservices as $service)
	{
		$serviceIdent=str_replace(array(".",":","-","_"),array("","","",""),(string)$service->serviceId);
		if (!ctype_alnum($serviceIdent))
		{
			echo "ERROR: Konnte Dienst nicht hinzufügen. Name kann nicht als Ident verwendet werden:".(string)$service->serviceId.PHP_EOL;
			continue;
		}
		$services[$serviceIdent]['descXML'] = $descXML;
		$services[$serviceIdent]['uri'] = (string)$service->serviceType;
		$services[$serviceIdent]['location'] =$fbroot.(string)$service->controlURL;
		$services[$serviceIdent]['SCPDURL'] =trim((string)$service->SCPDURL,"/");
	}
}
$parent = IPS_GetParent($_IPS['SELF']);
foreach ($services as $serviceIdent=>$data)
{
	$StateVariables = array();
	$service_id = @IPS_GetObjectIDByIdent($serviceIdent,$parent);
	if ($service_id===false)
	{
	   $service_id = IPS_CreateCategory();
	   IPS_SetIdent($service_id, $serviceIdent);
	   IPS_SetParent($service_id, $parent);
	   IPS_SetName($service_id,$data['SCPDURL']);
	   IPS_SetInfo($service_id,$data['uri']);
	}
	$xmlDesc = @simplexml_load_file($fbroot.'/'.$data['SCPDURL']);
	if ($xmlDesc === false)
	{
	   echo "Not found:".$data['SCPDURL'].PHP_EOL;
		continue;
	}
	$xmlDesc->registerXPathNamespace('fritzbox', $xmlDesc->getNameSpaces(false)[""]);
	$xmlActionList = $xmlDesc->xpath("//fritzbox:action[fritzbox:argumentList/fritzbox:argument/fritzbox:direction ='out']");
	$xmlStateVariable = $xmlDesc->xpath('//fritzbox:stateVariable');
	foreach ($xmlStateVariable as $StateVariable)
	{
		$StateVariables[(string)$StateVariable->name] = (string)$StateVariable->dataType;
	}
	foreach ($xmlActionList as $ActionList)
	{

		foreach ($ActionList->argumentList->argument as $Argument)
		{
			if ((string)$Argument->direction == "in") continue 2;
		  $relatedStateVariable[(string)$Argument->name]=(string)$Argument->relatedStateVariable;
		}
		$client = new SoapClient(null,
			array(
        		'location'   => $data["location"],
	        	'uri'        => $data["uri"],
   	     	'noroot'     => True,
      	  	'login'      => $fb_user,
        		'password'   => $fb_password,
				'trace'=>TRUE,
				'exceptions'=>false
    		)
		);
		$status = $client->{(string)$ActionList->name}();
		if (is_soap_fault($status))
		{
		   echo "--------------ERROR START----------------".PHP_EOL;
			echo " descXML: ".$data['descXML'].PHP_EOL;
			echo " SCPDURL: ".$data['SCPDURL'].PHP_EOL;
			echo " Location: ".$data["location"].PHP_EOL;
			echo " URI: ".$data["uri"].PHP_EOL;
			echo " Action: ".(string)$ActionList->name.PHP_EOL;
	   	echo "--------------ERROR END------------------".PHP_EOL.PHP_EOL;;
			continue;
		} else {
			echo " descXML: ".$data['descXML'].PHP_EOL;
			echo " SCPDURL: ".$data['SCPDURL'].PHP_EOL;
			echo " Location: ".$data["location"].PHP_EOL;
			echo " URI: ".$data["uri"].PHP_EOL;
			echo " Action: ".(string)$ActionList->name.PHP_EOL;
			print_r($status);
			echo PHP_EOL.PHP_EOL;
		}
		$actionIdent=str_replace(array(".",":","-","_"),array("","","",""),(string)$ActionList->name);
		if (!ctype_alnum($actionIdent))
		{
			echo "ERROR: Konnte Action nicht hinzufügen. Name kann nicht als Ident verwendet werden:".(string)$ActionList->name.PHP_EOL;
			continue;
		}
		$action_id = @ IPS_GetObjectIDByIdent($actionIdent,$service_id);
		if ($action_id===false)
		{
		   $action_id = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");
		   IPS_SetIdent($action_id, $actionIdent);
	   	IPS_SetParent($action_id, $service_id);
		   IPS_SetName($action_id,(string)$ActionList->name);
		}
		if	(count($ActionList->argumentList->argument) == 1)
		{
			UpdateIPSvar($action_id,(string)$ActionList->argumentList->argument->relatedStateVariable,$status,$StateVariables[(string)$ActionList->argumentList->argument->relatedStateVariable]);
		}
		else
		{
			foreach ($status as $key=>$value)
			{
				UpdateIPSvar($action_id,$relatedStateVariable[$key],$value,$StateVariables[$relatedStateVariable[$key]]);
			}
		}
	}
}

function UpdateIPSvar($parent,$ident,$value,$type)
{
	$ident=str_replace(array(".",":","-","_"),array("","","",""),$ident);
	if (!ctype_alnum($ident))
	{
		echo "ERROR: Konnte Variable nicht hinzufügen. Name kann nicht als Ident verwendet werden:".$ident.PHP_EOL;
		return;
	}
	switch ($type)
	{
		case "i1":
		case "i2":
		case "i4":
		case "ui1":
		case "ui2":
		case "ui4":
			$ips_type=1;
			break;
		case "boolean":
			$ips_type=0;
			break;
		case "uuid":
		case "dateTime":
		case "string":
			$ips_type=3;
			break;
		default:
			echo "Unbekannt:".$type.PHP_EOL;
			return;
			break;
	}
	$var_id = @IPS_GetObjectIDByIdent($ident,$parent);
	if ($var_id === false)
	{
		$var_id = IPS_CreateVariable($ips_type);
		IPS_SetName($var_id,$ident);
		IPS_SetIdent($var_id,$ident);
		IPS_SetParent($var_id,$parent);
	}
	switch ($ips_type)
	{
		case 0:
		   if (GetValueBoolean($var_id) <> (bool)$value)
		   {
		      SetValueBoolean($var_id,(bool)$value);
		   }
			break;
		case 1:
			if (GetValueInteger($var_id) <> (int)$value)
			{
	   		SetValueInteger($var_id,(int)$value);
			}
			break;
		case 2:
			if (GetValueFloat($var_id) <> round((float)$value,2))
			{
	   		SetValueFloat($var_id,round((float)$value,2));
			}
			break;
		case 3:
			if (GetValueString($var_id) <> $value)
			{
	   		SetValueString($var_id,$value);
			}
			break;
	}
}
?>

Ihr erhaltet einen Ausgabe die in für jede Aktion folgendes enthält:


 SCPDURL: deviceinfoSCPD.xml
 Location: http://fritz.box:49000/upnp/control/deviceinfo
 URI: urn:dslforum-org:service:DeviceInfo:1
 Action: GetInfo
Array
(
    [NewManufacturerName] => AVM
    [NewManufacturerOUI] => 00040E
    [NewModelName] => FRITZ!Box 6360 Cable (kdg)
    [NewDescription] => FRITZ!Box 6360 Cable (kdg) 85.06.05
    [NewProductClass] => FRITZ!Box
.....

Die ersten 4 Zeilen zeigen welcher Dienst mit welcher Funktion aufgerufen wurde.
Ab der 5. Zeile kommen die von der Box gemeldeten Werte.

Sollte die Abfrage fehlgeschlagen sein sieht das so aus:


--------------ERROR START----------------
 SCPDURL: deviceconfigSCPD.xml
 Location: http://fritz.box:49000/upnp/control/deviceconfig
 URI: urn:dslforum-org:service:DeviceConfig:1
 Action: ConfigurationFinished
--------------ERROR END------------------

Außerdem können erfolgreichen Abfragen aus dem Objektbaum rekonstruiert werden.
Dazu jetzt mal ein Bild :slight_smile:

Michael

Kleines Helferlein
Hier mal ein Script welches 4 Hilfsfunktionen enthält um Abfragen nicht ganz Statisch im Script zu haben.
Die XML-Dateien liegen immer im ‚root‘ also http://<fritz-ip>/igddesc.xml und sollten Updatefest sein (der Inhalt vermutlich nicht :smiley: )

Erklärungen im Quellcode


<?
$fbroot ='http://fritz.box:49000'; //Adresse + Port (immer 49000)
$desc = "igddesc.xml"; //Hier sind die Infos über die Dienste enthalten
$SCPD = "igdicfgSCPD.xml";  // Hier sind die Infos über die Funktionen und Parameter/Variablen enthalten, sowie die Definition der Variablen Typen.
$action="GetAddonInfos";  //Diese Funktion soll ausgeführt werden

// FB_getServiceData holt alle benötigten Daten aus der $desc XML
$service = FB_getServiceData($fbroot,$desc,$SCPD,$action);
//$service =
/*array(3) {
  ["uri"]=>
  string(55) "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1"
  ["location"]=>
  string(52) "http://fritz.box:49000/igdupnp/control/WANCommonIFC1"
  ["SCPDURL"]=>
  string(15) "igdicfgSCPD.xml"
}
*/
// FB_getStateVars holt die Definition der Variablen aus der SCPD XML für die gewählte Aktion
// Wen die die Typen kennt/manuell die IPS-Variablen befüllt, braucht Ihr diese Funktion nicht ausführen.
$StateVars = FB_getStateVars ($fbroot,$service,$action);
/*
$StateVars = (Beispiel)
array(14) {
  ["NewByteSendRate"]=>
  string(3) "ui4"
  ["NewByteReceiveRate"]=>
  string(3) "ui4"
  ["NewPacketSendRate"]=>
  string(3) "ui4"
  ["NewPacketReceiveRate"]=>
  string(3) "ui4"
  ["NewTotalBytesSent"]=>
  string(3) "ui4"
  ["NewTotalBytesReceived"]=>
  string(3) "ui4"
  ["NewAutoDisconnectTime"]=>
  string(3) "ui4"
  ["NewIdleDisconnectTime"]=>
  string(3) "ui4"
  ["NewDNSServer1"]=>
  string(6) "string"
  ["NewDNSServer2"]=>
  string(6) "string"
  ["NewVoipDNSServer1"]=>
  string(6) "string"
  ["NewVoipDNSServer2"]=>
  string(6) "string"
  ["NewUpnpControlEnabled"]=>
  string(7) "boolean"
  ["NewRoutedBridgedModeBoth"]=>
  string(7) "boolean"
}
*/

// FB_SoapAction($service,$action,$user = false,$pass = false) führt den SOAP Request aus. Variablen wie oben beschrieben. $service könnt ihr auch manuell befüllen, dann wird FB_getServiceData auch nicht benötigt.
$result =  FB_SoapAction($service,$action);
/*
$result = (Beispiel)
array(14) {
  ["NewByteSendRate"]=>
  string(5) "14380"
  ["NewByteReceiveRate"]=>
  string(6) "900533"
  ["NewPacketSendRate"]=>
  string(3) "209"
  ["NewPacketReceiveRate"]=>
  string(3) "605"
  ["NewTotalBytesSent"]=>
  string(8) "27991885"
  ["NewTotalBytesReceived"]=>
  string(10) "1116689220"
  ["NewAutoDisconnectTime"]=>
  string(1) "0"
  ["NewIdleDisconnectTime"]=>
  string(1) "0"
  ["NewDNSServer1"]=>
  string(14) "111.111.111"
  ["NewDNSServer2"]=>
  string(14) "111.111.111"
  ["NewVoipDNSServer1"]=>
  string(14) "111.111.111"
  ["NewVoipDNSServer2"]=>
  string(14) "111.111.111"
  ["NewUpnpControlEnabled"]=>
  string(1) "0"
  ["NewRoutedBridgedModeBoth"]=>
  string(1) "0"
}
*/

// UpdateIPSvar($parent,$ident,$value,$type) ist eine 'typische' Hilfsfunktion, welche eine Variable erstellt wenn sie nicht vorhanden ist und sie mit den aktuellen Daten (bei Änderung) befüllt.
// $parent = IPS_ID welche der Parent der Variable ist /wird
// $ident = IDENT der Variable zum wiederfinden (wird beim anlegen auch als Name genutzt; Name kann jederzeit geändert werden im Objektbaum)
// $value = Neuer Wert der Variable
// $type = String welcher den Type der Variable im FritzBox-Format enthält. Oder als int den Typ in IPS-Format (0 = bool, 1 = int, 2 = float, 3 = string)
UpdateIPSvar(IPS_GetParent($_IPS['SELF']),'KByteSendRate',$result['NewByteSendRate']/1024,2);
UpdateIPSvar(IPS_GetParent($_IPS['SELF']),'KByteReceiveRate',$result['NewByteReceiveRate']/1024,2);


function FB_getServiceData($fbroot,$desc,$SCPD,$action)
{
	$xml = @simplexml_load_file($fbroot.'/'.$desc);
	if ($xml === false)
	{
	   echo "Not found:".$descXML.PHP_EOL;
		return false;
	}
	$xml->registerXPathNamespace('fb', $xml->getNameSpaces(false)[""]);
	$xmlservice = $xml->xpath("//fb:service[fb:SCPDURL='/".$SCPD."']");
	$service['uri'] = (string)$xmlservice[0]->serviceType;
	$service['location'] =$fbroot.(string)$xmlservice[0]->controlURL;
	$service['SCPDURL'] =trim((string)$xmlservice[0]->SCPDURL,"/");
	return $service;
}

function FB_getStateVars ($fbroot,$service,$action)
{
	$xmlDesc = @simplexml_load_file($fbroot.'/'.$service['SCPDURL']);
	if ($xmlDesc === false)
	{
	   echo "Not found:".$service['SCPDURL'].PHP_EOL;
		return false;
	}
	$xmlDesc->registerXPathNamespace('fritzbox', $xmlDesc->getNameSpaces(false)[""]);
	$xmlArgumentList = $xmlDesc->xpath("//fritzbox:actionList/fritzbox:action[fritzbox:name='".$action."']/fritzbox:argumentList/fritzbox:argument");
	$StateVariables=false;
	foreach ($xmlArgumentList as $xmlArgument)
	{
		$xmlStateVariable = $xmlDesc->xpath("//fritzbox:stateVariable[fritzbox:name='".(string)$xmlArgument->relatedStateVariable."']");
		$StateVariables[(string)$xmlArgument->name] =  (string)$xmlStateVariable[0]->dataType;
	}
	return $StateVariables;
}

function FB_SoapAction($service,$action,$user = false,$pass = false)
{
	$service['noroot'] = true;
	$service['trace'] = false;
	$service['exceptions'] = false;
	if (!($user === false))
	{
		$service['login'] = $user;
		$service['password'] = $pass;
	}
	$client = new SoapClient(null,$service);
	$status = $client->{$action}();
	if (is_soap_fault($status))
	{
	   return false;
	}
	return $status;
}

function UpdateIPSvar($parent,$ident,$value,$type)
{
	$ident=str_replace(array("_","-"),array("",""),$ident);
	if (is_int($type))
	{
		$ips_type=$type;
	} else {
		switch ($type)
		{
         		case "i1":
	         	case "i2":
          		case "i4":
			case "ui1":
			case "ui2":
			case "ui4":
				$ips_type=1;
				break;
			case "boolean":
				$ips_type=0;
				break;
			case "uuid":
			case "dateTime":
			case "string":
				$ips_type=3;
				break;
			default:
				echo "Unbekannter Datentyp:".$type.PHP_EOL;
				return;
				break;
		}
	}
	$var_id = @IPS_GetObjectIDByIdent($ident,$parent);
	if ($var_id === false)
	{
		$var_id = IPS_CreateVariable($ips_type);
		IPS_SetName($var_id,$ident);
		IPS_SetIdent($var_id,$ident);
		IPS_SetParent($var_id,$parent);
	}
	switch ($ips_type)
	{
		case 0:
		   if (GetValueBoolean($var_id) <> (bool)$value)
		   {
		      SetValueBoolean($var_id,(bool)$value);
		   }
			break;
		case 1:
			if (GetValueInteger($var_id) <> (int)$value)
			{
	   		SetValueInteger($var_id,(int)$value);
			}
			break;
		case 2:
			if (GetValueFloat($var_id) <> round((float)$value,2))
			{
	   		SetValueFloat($var_id,round((float)$value,2));
			}
			break;
		case 3:
			if (GetValueString($var_id) <> $value)
			{
	   		SetValueString($var_id,$value);
			}
			break;
	}
}
?>

Das ganze gestrafft
Wenn AVM dann mal in einer Firmware den Dienst umbenennt, läuft das ganze nicht mehr.


<?
$service = array(
  "uri"=>"urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1",
  "location"=>"http://fritz.box:49000/igdupnp/control/WANCommonIFC1",
  "SCPDURL"=>"igdicfgSCPD.xml"
  );

$action="GetAddonInfos";  //Diese Funktion soll ausgeführt werden

$result =  FB_SoapAction($service,$action);

UpdateIPSvar(IPS_GetParent($_IPS['SELF']),'KByteSendRate',$result['NewByteSendRate']/1024,2);
UpdateIPSvar(IPS_GetParent($_IPS['SELF']),'KByteReceiveRate',$result['NewByteReceiveRate']/1024,2);

function FB_SoapAction($service,$action,$user = false,$pass = false)
{
   // Siehe oben
}

function UpdateIPSvar($parent,$ident,$value,$type)
{
   // Siehe oben
}
?>

PS: Das letzte Script ist sogar etwas schneller in der Laufzeit als das von Paresy’s Upload/ Download Auswertung. ca. 17ms zu ca. 30ms :smiley: :smiley:

So hier mal ein Beispiel wie man Werte auch setzen kann.

Gäste-WLAN Einschalten
Hier wird das WLAN2 (also das Gäste-WLAN) eingeschaltet
SCPDURL: wlanconfigSCPD.xml
Location: http://fritz.box:49000/upnp/control/wlanconfig2
URI: urn:dslforum-org:service:WLANConfiguration:2
Action:SetEnable
Parameter: bool


$client = new SoapClient(
    null,
    array(
        'location'   => "http://fritz.box:49000/upnp/control/wlanconfig2",
        'uri'        => "urn:dslforum-org:service:WLANConfiguration:2",
        'noroot'     => True,
        'login'      => "asdf@asdf.asdf",
        'password'   => 'blabla'
    )
);

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

Leider gibt es für die Spezielle Funktion des Gast-WLAN keinen Befehl um z.B. das Timeout zu setzen. Es wird also immer der ‚alte‘ Wert übernommen.
(Lesen dieser Werte geht aber mit $result = $client->{„X_AVM-DE_GetWLANExtInfo“}(); )
Außerdem kann es sein dass euer Gäste WLAN nicht unter
Location: http://fritz.box:49000/upnp/control/wlanconfig2
URI: urn:dslforum-org:service:WLANConfiguration:2
sonder unter
Location: http://fritz.box:49000/upnp/control/wlanconfig3
URI: urn:dslforum-org:service:WLANConfiguration:3
zu finden ist.
z.B. Wenn eure Box Dual-WLAN hat, also das 2,5Ghz & 5Ghz Band gleichzeitig unterstützt (Meine nicht :frowning: ) wie hier bei Broving und seiner 7390.
[HR][/HR]
DSL Reconnect
SCPDURL: igdconnSCPD.xml
Location: http://fritz.box:49000/igdupnp/control/WANIPConn1
URI: urn:schemas-upnp-org:service:WANIPConnection:1
Action: ForceTermination


$client = new SoapClient(
    null,
    array(
        'location'   => "http://fritz.box:49000/igdupnp/control/WANIPConn1",
        'uri'        => "urn:schemas-upnp-org:service:WANIPConnection:1",
        'noroot'     => True,
        'login'      => "asdf@asdf.asdf",
        'password'   => 'blabla'
    )
);

$client->ForceTermination();

[HR][/HR]
Bandbreite der WAN-Verbindung
SCPDURL: igdicfgSCPD.xml
Location: http://fritz.box:49000/igdupnp/control/WANCommonIFC1
URI: urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1
Action: GetCommonLinkProperties


$client = new SoapClient(
    null,
    array(
        'location'   => "http://fritz.box:49000/igdupnp/control/WANCommonIFC1",
        'uri'        => "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1",
        'noroot'     => True
    )
);
$result = $client->GetCommonLinkProperties();
/*
array(4) {
  ["NewWANAccessType"]=>
  string(3) "DSL"
  ["NewLayer1UpstreamMaxBitRate"]=>
  string(7) "6360000"
  ["NewLayer1DownstreamMaxBitRate"]=>
  string(9) "106000000"
  ["NewPhysicalLinkStatus"]=>
  string(2) "Up"
}
*/

[HR][/HR]
WAN-Verbindungsstatus
SCPDURL: wanipconnSCPD.xml
Location: http://fritz.box:49000/upnp/control/wanipconnection1
URI: urn:dslforum-org:service:WANIPConnection:1
Action: GetStatusInfo (Kurzfassung)
Action: GetInfo (Langfassung)


$client = new SoapClient(
    null,
    array(
        'location'   => "http://fritz.box:49000/igdupnp/control/WANIPConn1",
        'uri'        => "urn:schemas-upnp-org:service:WANIPConnection:1",
        'noroot'     => True
    )
);
$status = $client->GetStatusInfo();
/*
array(3) {
  ["NewConnectionStatus"]=>
  string(9) "Connected"
  ["NewLastConnectionError"]=>
  string(10) "ERROR_NONE"
  ["NewUptime"]=>
  string(4) "5533"
}
*/

[HR][/HR]
Reboot / Factory Reset
SCPDURL: deviceconfigSCPD.xml
Location: http://fritz.box:49000/upnp/control/deviceconfig
URI: urn:dslforum-org:service:DeviceConfig:1
Action: FactoryReset
Action: Reboot


$client = new SoapClient(
    null,
    array(
        'location'   => "http://fritz.box:49000/upnp/control/deviceconfig",
        'uri'        => "urn:dslforum-org:service:DeviceConfig:1",
        'noroot'     => True,
        'login'      => "asdf@asdf.asdf",
        'password'   => 'blabla'
    )
);
$client->Reboot();

[HR][/HR]
Anrufliste als XML-File
Besonders schön, da die Anmeldung über SOAP erfolgt, wird gleich eine SID mit zurückgegeben :slight_smile:
SCPDURL: x_contactSCPD.xml
Location: http://fritz.box:49000/upnp/control/x_contact
URI: urn:dslforum-org:service:X_AVM-DE_OnTel:1
Action: GetCallList


$client = new SoapClient(
    null,
    array(
        'location'   => "http://fritz.box:49000/upnp/control/x_contact",
        'uri'        => "urn:dslforum-org:service:X_AVM-DE_OnTel:1",
        'noroot'     => True,
        'login'      => "asdf@asdf.as",
        'password'   => 'blabla'
    )
);
$result = $client->GetCallList();
/*
String()
http://<Fritz-IP>:49000/calllist.lua?sid=fbb2d4418ad49efd
*/
$xml = @simplexml_load_file($result);
/*
Auschnitt:
 ["Call"]=>
  array(400) {
    [0]=>
    object(SimpleXMLElement)#8 (12) {
      ["Id"]=>
      string(4) "5808"
      ["Type"]=>
      string(1) "1"
      ["Caller"]=>
      string(11) "04545454545"
      ["Called"]=>
      string(16) "SIP: 04545454591"
      ["Name"]=>
      string(5) "Jonas"
      ["Numbertype"]=>
      string(3) "sip"
      ["Device"]=>
      string(5) "Micha"
      ["Port"]=>
      string(2) "13"
      ["Date"]=>
      string(14) "07.10.14 16:47"
      ["Duration"]=>
      string(4) "0:03"
*/

[HR][/HR]
Telefonbücher als XML-File
Besonders schön, da die Anmeldung über SOAP erfolgt, wird gleich eine SID mit zurückgegeben :slight_smile:
SCPDURL: x_contactSCPD.xml
Location: http://fritz.box:49000/upnp/control/x_contact
URI: urn:dslforum-org:service:X_AVM-DE_OnTel:1
Action: GetPhonebook
Parameter: NewPhonebookID => Nummer des Telefonbuches


$client = new SoapClient(
    null,
    array(
        'location'   => "http://fritz.box:49000/upnp/control/x_contact",
        'uri'        => "urn:dslforum-org:service:X_AVM-DE_OnTel:1",
        'noroot'     => True,
        'login'      => "213",
        'password'   => "123"
    )
);
$result = $client->GetPhonebook(new SoapParam(0,"NewPhonebookID"));
$xml = @simplexml_load_file($result['NewPhonebookURL']);
var_dump($xml);
/*
 ["phonebook"]=>
  object(SimpleXMLElement)#4 (4) {
    ["@attributes"]=>
    array(2) {
      ["owner"]=>
      string(1) "0"
      ["name"]=>
      string(11) "Telefonbuch"
    }
    ["timestamp"]=>
    string(2) "68"
    ["comment"]=>
    object(SimpleXMLElement)#5 (0) {
    }
    ["contact"]=>
    array(97) {
      [0]=>
      object(SimpleXMLElement)#6 (4) {
        ["category"]=>
        string(1) "0"
        ["person"]=>
        object(SimpleXMLElement)#103 (1) {
          ["realName"]=>
          string(8) "AB Fenja"
        }
        ["uniqueid"]=>
        string(2) "68"
        ["telephony"]=>
        object(SimpleXMLElement)#104 (3) {
          ["services"]=>
          object(SimpleXMLElement)#105 (0) {
          }
          ["comment"]=>
          array(3) {
            [0]=>
            object(SimpleXMLElement)#106 (0) {
            }
            [1]=>
            object(SimpleXMLElement)#107 (0) {
            }
            [2]=>
            object(SimpleXMLElement)#108 (0) {
            }
          }
          ["number"]=>
          array(2) {
            [0]=>
            string(5) "**601"
            [1]=>
            string(5) "**606"
          }
        }
      }
.......
*/

[HR][/HR]
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
)
*/

[HR][/HR]
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);

Man, man ist ja ne super Sache und was das an Arbeit gibt. Hab zwar keine Fritzbox aber die Soap-Abfrage kann man sich auch für andere Geraete abgucken. Einfach super und Klasse! Merci

Da kann ich mich nur anschließen.
Funktioniert einwandfrei. Endlich eine Ende mit ständiger Skriptanpassung in Sicht :slight_smile:
Vielen Dank dafür.
Gruß
Manfred

Das sieht in der Tat super aus. Ich frage mich, wie ich wohl das Telefonbuch herunterladen kann. Ein einfaches Einfügen von „GetPhonebook“ führt leider nicht zum Erfolg.

Ich bin leider nicht fit mit Soap. Wäre toll, wenn einer helfen könnte :rolleyes:

Viele Grüße
Florian

Noch unterwegs. Aber du musst die ID ( 0 für das interne Telefonbuch) als Parameter übergeben.
Dann gibt es einen Link zurück mit SID, welche auf ein XML mit allen Kontaktdaten zeigt.
Michael
PS: Habe das ja extra ausführlich dokumentiert, damit ihr euch selbst helfen könnt. SOAP ist auch für mich Neuland, aber mit PHP wirklich sehr simpel.

Ich schlage vor die folgende Prüfung

     

if(ctype_alnum ( $ident ))     


in die Funktion UpdateIPSvar einzubauen um Fehler bei nicht alphanumerischen Zeichen auszuschließen :

Hallo,

bei mir klappt das mit dem Telefonbuch herunterladen leider noch nicht. Ich habe zunächst folgendes versucht:


$client = new SoapClient(
    null,
    array(
        'location'   => "http://fritz.box:49000/upnp/control/x_contact",
        'uri'        => "urn:dslforum-org:service:X_AVM-DE_OnTel:1",
        'noroot'     => True,
        'login'      => "",
        'password'   => 'xxx'
    )
);
$result = $client->GetPhonebook();
echo $result;

Ich bin nicht sicher, wie man die ID des Telefonbuchs übergeben muss. Mit


$result = $client->GetPhonebook(0);

funktioniert es leider nicht.

Was mache ich falsch?

Viele Grüße
Florian

Out off Topic …

Das würde mir auch helfen. Wo finde ich denn die Include-Datei für den Login?

Vielen Dank
Florian

Gib mir mal 30min, bin gerade am Weg ins Hotel. Der Verkehr in Bangkok ist nicht normal.

Bis den,
Gruß Manfred

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