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
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.
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
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: :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
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
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
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
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);