FritzBox mit SOAP auslesen und steuern

nein, nichts dergleichen - ist eigtl. völlig harmlos von der Belastung her…

<?php
$host = "192.168.1.10";

define("STATUS_VACANT", 0);
define("STATUS_OUT_RING", 1);
define("STATUS_OUT_MISSED", 2);
define("STATUS_OUT_CONNECTED", 3);
define("STATUS_OUT_DISCONNECTED", 4);
define("STATUS_IN_RING", 5);
define("STATUS_IN_MISSED", 6);
define("STATUS_IN_CONNECTED", 7);
define("STATUS_IN_DISCONNECTED", 8);

$object = IPS_GetObject($IPS_SELF);
$parentID = $object['ParentID'];

switch ($IPS_SENDER)
{
    case "Execute":
       IPS_SetHidden($IPS_SELF, true);

        $profileID = @IPS_GetVariableProfile("PhoneConnectionStatus");
        if ($profileID === false)
        {
            IPS_CreateVariableProfile("PhoneConnectionStatus", 1);
            IPS_SetVariableProfileValues("PhoneConnectionStatus", 0, 8, 0);
            IPS_SetVariableProfileIcon("PhoneConnectionStatus", "ArrowRight");
            IPS_SetVariableProfileAssociation("PhoneConnectionStatus", 0, "frei", "");
            IPS_SetVariableProfileAssociation("PhoneConnectionStatus", 1, "eingehend - klingelt", "");
            IPS_SetVariableProfileAssociation("PhoneConnectionStatus", 2, "eingehend - abgebrochen", "");
            IPS_SetVariableProfileAssociation("PhoneConnectionStatus", 3, "eingehend - verbunden", "");
            IPS_SetVariableProfileAssociation("PhoneConnectionStatus", 4, "eingehend - getrennt", "");
            IPS_SetVariableProfileAssociation("PhoneConnectionStatus", 5, "ausgehend - klingelt", "");
            IPS_SetVariableProfileAssociation("PhoneConnectionStatus", 6, "ausgehend - abwesend", "");
            IPS_SetVariableProfileAssociation("PhoneConnectionStatus", 7, "ausgehend - verbunden", "");
            IPS_SetVariableProfileAssociation("PhoneConnectionStatus", 8, "ausgehend - getrennt", "");
        }

        $parentObject = IPS_GetObject($parentID);
        if ($parentObject['ObjectType'] !== 1)
        {
            $instanceID = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");
            IPS_SetParent($instanceID, $parentID);
            $parentID = $instanceID;
            IPS_SetName($instanceID, "FRITZ!Box");
            IPS_SetParent($IPS_SELF, $parentID);
        }

        $socketID = @IPS_GetInstanceIDByName("FRITZ!Box Socket", 0);
        if ($socketID === false)
        {
           $socketID = IPS_CreateInstance("{3CFF0FD9-E306-41DB-9B5A-9D06D38576C3}");
           IPS_SetName($socketID, "FRITZ!Box Socket");
        }
       CSCK_SetHost($socketID, $host);
       CSCK_SetPort($socketID, 1012);
       CSCK_SetOpen($socketID, true);
       IPS_ApplyChanges($socketID);

        $rvID = @IPS_GetInstanceIDByName("FRITZ!Box Register Variable", $parentID);
        if ($rvID === false)
        {
         $rvID = IPS_CreateInstance("{F3855B3C-7CD6-47CA-97AB-E66D346C037F}");
            IPS_SetParent($rvID, $parentID);
            IPS_SetName($rvID, "FRITZ!Box Register Variable");
        }
        RegVar_SetRXObjectID($rvID, $IPS_SELF);
        IPS_ConnectInstance($rvID, $socketID);
        IPS_ApplyChanges($rvID);

        break;

    case "RegisterVariable":
        $data = explode(";", $IPS_VALUE);
        $ts = strtotime($data[0]);
        $connectionID = $data[2];
        
        switch ($data[1])
        {
            case "CALL":
                // Datum;CALL;ConnectionID;Nebenstelle;GenutzteNummer;AngerufeneNummer;
                $extension = $data[3];
                $internalNumber = $data[4];
                $externalNumber = $data[5];
                $line = $data[6];
                addConnection($connectionID, STATUS_OUT_RING, $ts, $internalNumber, $externalNumber, $extension, $line);
                break;

            case "RING":
                // Datum;RING;ConnectionID;Anrufer-Nr;Angerufene-Nummer;
                $externalNumber = $data[3];
                $internalNumber = $data[4];
                $line = $data[5];
                addConnection($connectionID, STATUS_IN_RING, $ts, $internalNumber, $externalNumber, "", $line);
                break;

            case "CONNECT":
                // Datum;CONNECT;ConnectionID;Nebenstelle;Nummer;
                $extension = $data[3];
                $internalNumber = $data[4];
                $externalNumber = $data[5];
                // removeConnection($connectionID);
                break;

            case "DISCONNECT":
                // Datum;DISCONNECT;ConnectionID;DauerInSekunden;
                $duration = $data[3];
                removeConnection($connectionID);
                break;
        }
        IPS_SetScriptTimer(28748, 30);
        break;
}

function addConnection ($connectionID, $status, $time, $internalNumber, $externalNumber, $extension, $line) {
    global $parentID;
    SetValue(CreateVariableByName($parentID, "Verbindung ".$connectionID." - Status", 1, "PhoneConnectionStatus"), $status);
    SetValue(CreateVariableByName($parentID, "Verbindung ".$connectionID." - Zeit", 1, "~String"), $time);
    SetValue(CreateVariableByName($parentID, "Verbindung ".$connectionID." - Nummer - Intern", 3, "~String"), $internalNumber);
    SetValue(CreateVariableByName($parentID, "Verbindung ".$connectionID." - Nummer - Extern", 3, "~String"), $externalNumber);
    SetValue(CreateVariableByName($parentID, "Verbindung ".$connectionID." - Nebenstelle", 3, "~String"), $extension);
    SetValue(CreateVariableByName($parentID, "Verbindung ".$connectionID." - Leitung", 3, "~String"), $line); }

function removeConnection ($connectionID)
  {
    global $parentID;
    IPS_DeleteVariable(IPS_GetVariableIDByName("Verbindung ".$connectionID." - Status", $parentID));
    IPS_DeleteVariable(IPS_GetVariableIDByName("Verbindung ".$connectionID." - Zeit", $parentID));
    IPS_DeleteVariable(IPS_GetVariableIDByName("Verbindung ".$connectionID." - Nummer - Intern", $parentID));
    IPS_DeleteVariable(IPS_GetVariableIDByName("Verbindung ".$connectionID." - Nummer - Extern", $parentID));
    IPS_DeleteVariable(IPS_GetVariableIDByName("Verbindung ".$connectionID." - Nebenstelle", $parentID));
    IPS_DeleteVariable(IPS_GetVariableIDByName("Verbindung ".$connectionID." - Leitung", $parentID));
   }
function CreateVariableByName($id, $name, $type, $profile = "") {
    global $IPS_SELF;
    $vid = @IPS_GetVariableIDByName($name, $id);
    if($vid === false)
    {
        $vid = IPS_CreateVariable($type);
        IPS_SetParent($vid, $id);
        IPS_SetName($vid, $name);
        IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
        if($profile !== "") { IPS_SetVariableCustomProfile($vid, $profile); }
    }
    return $vid;
}
?>



Den Aufruf der Anruf Liste sehe ich nicht ?! Wo ist der ?

IPS_SetScriptTimer(28748, 30); - der letzte Befehl im case „RegisterVariable“:

Ich meinte den Aufruf der Probleme gemacht hat :smiley:
An der Stelle ist es auch ungünstig das Script ohne Timet zu starten.
Weil der Bereich ja immer wenn Daten von der RegVar kommen (beim Ring und auch beim connect und disconnect…) durchlaufen wird.
Michael

Der Aufruf mit dem Timeout ist der GetInfo von

function FB_GetABMessageList()

also der, der auch immer zum Abbruch führte im Anruferliste-Script bis ich die FB neu gestartet habe…

Ich glaube wir reden aneinander vorbei.
Wie war der Aufruf des Anruflisten-Script in deinem Gesprächstatus-Script vor dem Umstellen auf dem Scripttimer.
Weil je nachdem wie du das gelöst hattest, wurde die FB mit mehreren Anfragen quasi parallel angesprochen, was sie wohl überlastet hat.
Michael

das war ein direkter Aufruf - also mit IPS_RunScript.
Aber selbst mit dem 30-Sekunden-Timer kann es ab und zu noch vorkommen, dass der Timeout überschritten wird :frowning:

Bau den Aufruf, auch ruhig mit RunScript, zwischen RemoveConnection und break ein.
Aktive Verbindungen wertet mein Script zur Zeit nicht aus.

Michael

Hi,

also mal funktioniert’s und mal gibt’s ein Timeout. Regelmäßigkeiten habe ich keine feststellen können. Die Fritzbox benimmt sich wie eine Diva :smiley:

Hi,

schon lange suche ich nach einer Funktion, wie man per Script eine Nachricht aus dem Anrufbeantworter der FB löschen kann. Ich habe das letzte hier veröffentlichte Skript zur Anrufbeantworter/Telefonliste mal installiert. Das Auslesen funktioniert. Das Abhören der Nachrichten funktioniert im Webfront mit Chrome Browser auch. Allerdings das Löschen der Nachricht geht nicht. Habe deshalb mal die Löschfunktion in ein Extra-Skript gelegt und getestet:

<?
define ('FB_HOST',"IP Fritzbox");
define ('FB_USER',"Nutzer");
define ('FB_PASS',"Passwort");


$client = new SoapClient(
		null,
		array(
			'location'   => "http://".FB_HOST.":49000/upnp/control/x_tam",
			'uri'        => "urn:dslforum-org:service:X_AVM-DE_TAM:1",
			'noroot'     => True,
			'login'      => FB_USER,
			'password'   => FB_PASS,
			 'trace'     =>  TRUE,
                         'exceptions'=>false
        )
    );

   
 $status= $client->DeleteMessage(new SoapParam(0, 'NewIndex'),
	                        new SoapParam(1, 'NewMessageIndex'));

     print_r($status);
?>

Habe einfach mal die Parameter NewIndex 0 und NewMessageIndex auf 1 gesetzt. Auf meiner FB sind zwei Nachrichten gespeichert. Nach Ausführung des Skriptes sind beide Nachrichten noch da und die Variable Status gibt aus:

SoapFault Object
(
    
[message:protected] => UPnPError
    
[string:Exception:private] => 
    [code:protected] => 0
   
[file:protected] => C:\IP-Symcon\webfront\user\fritz\ab.php
    
[line:protected] => 22
    [trace:Exception:private] => Array
        
(
            [0] => Array
                

(
                    [file] => C:\IP-Symcon\webfront\user\fritz\ab.php
                    [line] => 22
                    [function] => __call
                    [class] => SoapClient
                    [type] => ->
                    [args] => Array
                        (
                            [0] => DeleteMessage
                            [1] => Array
                                (
                                    [0] => SoapParam Object
                                        (
                                            [param_name] => NewIndex
                                            [param_data] => 0
                                        )

                                    [1] => SoapParam Object
                                        (
                                            [param_name] => NewMessageIndex
                                            [param_data] => 1
                                        )

                                )

                        )

                )

            [1] => Array
                (
                    [file] => C:\IP-Symcon\webfront\user\fritz\ab.php
                    [line] => 22
                    [function] => DeleteMessage
                    [class] => SoapClient
                    [type] => ->
                    [args] => Array
                        (
                            [0] => SoapParam Object
                                (
                                    [param_name] => NewIndex
                                    [param_data] => 0
                                )

                            [1] => SoapParam Object
                                (
                                    [param_name] => NewMessageIndex
                                    [param_data] => 1
                                )

                        )

                )

        )

    [previous:Exception:private] => 
    [faultstring] => UPnPError
    [faultcode] => s:Client
    [detail] => stdClass Object
        (
            [UPnPError] => stdClass Object
                (
                    [errorCode] => 713
                    [errorDescription] => SpecifiedArrayIndexInvalid
                )

        )

)


Irgendwie läuft hier was nicht richtig. Kann es sein, dass meine FB (7490) hier andere Parameter haben will? Was bedeuten die Parameter NewIndex und NewMessageIndex eigentlich?

MfG Frank

Da bist du nicht der erste wo das nicht ging, eine richtige Ursache/Lösung habe ich auch nicht gefunden :frowning:
NewIndex ist der Anrufbeantworter, NewMessageIndex die Nachricht.
Michael

Ja, das habe ich befürchtet. :mad:. Kann auch nichts mit SpecifiedArrayIndexInvalid anfangen. Scheint von Box zu Box unterschiedlich zu sein.

Gruß Frank

Den Fehler hatten wir schon mal, obwohl der Index korrekt ist. Dieser wird ja aus der XML der Box gelesen…
Ich meine Neustart der FB löste das Fehlerbild (kurzzeitig).
Michael

Nee, geht leider nicht. Nach Neustart immer noch das gleiche Problem.

Hi,

ich habe mal das erste Testscript durchlaufen lassen. Merkwürdig finde ich beim Ergebnis, dass es zwar die Kategorie x_tamSCPD.XML angelegt wurde und dort auch die uri drinn steht, allerdings gibt es keine Funktionen oder Variablen.

Keine Ahnung ob das normal ist.

Gruß Frank

Ja ist es.
Michael

Hallöchen,

der von mir beschriebe Fehler ist offenbar ein Bug. Habe dazu folgende Aussagen bei einem Anbieter einer App für die Fritzbox (CheckMy!Box) gefunden:

AVM hat mittlerweile bestätigt, dass die Funktionen MarkMessage und DeleteMessage derzeit fehlerhaft sind. Mit der nächsten FRITZ!OS Firmware soll das Problem behoben sein. Es gibt aber noch keine Aussage wann diese zur Verfügung stehen wird.

UPDATE 14.11.2014:

Der Fehler ist leider auch in der neuen AVM Laborfirmware noch enthalten. Laut AVM kann das Problem in der aktuell noch laufenden Runde des 6.2x-Labors nicht behoben werden, da es Abhängigkeiten gibt, die erst mit der nächsten Updaterunde wirksam werden dürfen. Diese Runde wird voraussichtlich erst Anfang 2015 starten können. Es ist sehr bedauerlich, dass daher das Löschen und Markieren als Abgehört von Anrufbeantworter-Nachrichten derzeit mit der CheckMy!Box App nicht möglich ist.

Na da muss ich wohl warten.

Gruß Frank

Erklärt warum es mit den Cabel-Boxen meist geht. Ich habe z.b. 6.10 auf der 6490.
Michael

Hallo,

mittlerweile läuft das ja schon ne ganze Zeit bei mir … oder leider halt auch nicht… die Erfolgsquote beim Auslesen der Anrufe liegt inzwischen weit unter 50%, weil es beim Lesen der Daten aus der Fritzbox(6360) ständig zum Timeout kommt. Wenn ich das Script dann 2-3 mal manuell laufen lasse, funktioniert es mal wieder, aber insgesamt ist es doch sehr unzuverlässig.
Was komischerweise relativ stabil läuft ist das Abhören und Löschen von Nachrichten.
@Michael: Hast du eine Idee, warum das Auslesen so lange dauert ? Selbst wenn es durchläuft, sind 16 Sekunden die durchschnittliche Laufzeit des Scripts.

chrissiboy

Bei mir ca. 16-20 Sek.
Ursachenforschung habe ich noch nicht betrieben, dürfte aber am lesen und parsen der XML liegen.
Timeouts habe ich allerdings nicht. Löschen und markieren geht mit FW kleine 6.20 fehlerfrei, welche du ja haben dürftest. Habe noch keine 6360 mit 6.2 gesehen (meine 6490 hat auch 6.1).
Habe aber auch (beruflich bedingt) kaum Zeit, und meine Family will mich auch gelegentlich sehen :wink:
Ich habe aber noch so ein paar Ideen und Verbesserungen im Kopf.
Michael