Downstream/Upstream Geschwindigkeit der FritzBox auslesen

Hallo,

ist vielleicht etwas abwegig, aber beim AVM Support steht etwas von Anbieter EWE und man muss bei Anfragen unten auf den Aufkleber nachschauen ob man die EWE Fritzbox hat, den diese hat eine Angepasste OS Version.

@dumbo hast du mal mein Script schnipsel probiert, funktioniert dieser?

Schöne Grüße
Thomas

Hallo zuammen und herzlichen Dank für die Anregungen,

komme leider übers WE nicht nach Hause, deshalb wird es eine kleine Stagnation geben. Hier eine kurze Antwort zu den offenen Fragen:

  • Die Fritzbox ist NICHT Standard-Gateway aus dem internen Netz. Gleichwohl denke ich dass die Verbindung ok ist, da ich z.B. eingehende Telefonate zeitnah über die Dreambox (Internes Netz) auf dem Fernseher anzeigen lasse (das funzt)

  • Der Code Schnipsel von Thomas hat NICHT funktioniert. (Error 500 Internal Server Error ERR_NO_MEMORY)

  • Dieser hier schon

<?
 //Fügen Sie hier Ihren Skriptquellcode ein
$fp = fsockopen("172.31.xx.yy", 49000 /*[Objekt #49000 existiert nicht]*/, $errno, $errstr, 20); // IP Adresse anpassen
if(!$fp)
{
    echo "ERROR: $errno - $errstr<br />
";
}
else
{
    echo "OK";
}
?>

Alles in allem glaube ich aber nach euren Beiträgen jetzt zu wissen wo ich suchen muß.

Nochmals herzlichen Dank

Dumbo

Hallo zusammen,

ich habe auch das gleiche Problem und ich komme keine Rückmeldung von meiner Fritzbox 7490 FRITZ!OS 6.20.

Das Beispielscript von ThomasD bringt mir die Rückmeldung. Nur leider im Script laufe ich auf den 30 sec Timeout.

Die XML meldet mir auch den anderen Daemon (igdupnp) zurück welchen ich dann im Script an den zwei Stellen eingestellt habe:

<serviceType>urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1</serviceType>

<serviceId>urn:upnp-org:serviceId:WANCommonIFC1</serviceId>

<controlURL>/igdupnp/control/WANCommonIFC1</controlURL>

<eventSubURL>/igdupnp/control/WANCommonIFC1</eventSubURL>

<SCPDURL>/igdicfgSCPD.xml</SCPDURL>

Dies sind die zwei angepassten Zeilen:

$contentRecv = 'POST /igdupnp/control/WANCommonIFC1 HTTP/1.1
$contentSent = 'POST /igdupnp/control/WANCommonIFC1 HTTP/1.1

In meiner Fritzbox steht aber auch explizit drin, das man sich per User jetzt authentifizieren muss:

Für den Zugriff muss die Anwendung sich an der FRITZ!Box anmelden. Unter „System / FRITZ!Box-Benutzer“ verwalten Sie die zugehörigen Anmeldedaten. Um eine Anwendung über das Internet anzumelden, muss ein FRITZ!Box-Benutzer mit Erlaubnis für den Zugang aus dem Internet genutzt werden.

Liegt es wirklich an der Authentifizierung oder ist es noch ein anderes Problem?

VG

Thorsten

Hallo,

wenn der Codeschnippsel funktioniert, ist aber mit der Fritzbox alles ok.
Mehr braucht man nicht, der Rest ist Rechnen in IPS.
Was kommt den als Rückgabe?

Schöne Grüße
Thomas

Hallo ThomasD,

als Rückgabe bekomme ich folgendes:

HTTP/1.1 200 OK
DATE: Sun, 21 Sep 2014 08:28:25 GMT
SERVER: FRITZ!Box 7490 UPnP/1.0 AVM FRITZ!Box 7490 113.06.20
CONNECTION: close
CONTENT-LENGTH: 388
CONTENT-TYPE: text/xml; charset="utf-8"
EXT:





403617321



Jetzt bin ich einen Schritt weiter.

Beim „Testscript“ hatte ich „fritz.box“ benutzt und beim "Auslesescript die IP Adresse. Ja die IP hatte ich an die richtige IP angepasst. :wink:

Nun bekomme ich die Werte zurück und bekomme eine Anzeige. Jetzt habe ich noch zwei Fragen:

[ul]
[li]Die Anzeige scheint um den Faktor 10 zu klein zu sein, kann man das anpassen?
[/li][li]Wie kann man die Variablen loggen, sodass man hier eine Langzeitauswertung erhält?
[/li][/ul]

Vielen Dank schon mal für das tolle Script!

VG

Thorsten

Hallo,

dann ist alles bestens, das sind deine erhaltenen Bytes.
Das Script macht jetzt nur folgendes.
403617321 Bytes um 12:23:10 // Merken
403627321 Bytes um 12:24:15 // Daten ein weiteres mal aus der Fritzbox holen.

Erhaltene Bytes = 10000 Bytes.
In Zeitraum = 65 sec.
Macht in der Sec. = 153,8 B/sec oder 0,15 KB/sec.

Wenn du jetzt etwas mit Faktor 10 solltest du schauen wo etwas in der Berechnung nicht stimmt.

Schöne Grüße
Thomas

Hhhm dann hatte ich ein Verständnisproblem. Die Daten werden richtig angezeigt.

Ich dachte mi wird angezeigt wie Hoch die maximale Down-/Upload Verbindung ist. Gibt es hierzu auch ein Script?

VG

Thorsten

Heute ein Firmwareupdate gemacht auf 6.20 Fritzbox 7390.
War immer auf der aktuellen Firmware und das Script lief vorher.
Danach Fehler

 Debug: Invalid Response:[HTTP/1.1 500 Internal Server Error
DATE: Wed, 01 Oct 2014 21:59:58 GMT
SERVER: FRITZ!Box Fon WLAN 7390 UPnP/1.0 AVM FRITZ!Box Fon WLAN 7390 84.06.20
CONNECTION: close
CONTENT-LENGTH: 433
CONTENT-TYPE: text/xml; charset="utf-8"

<?xml version="1.0"?>
<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:schemas-upnp-org:control-1-0">
<errorCode>401</errorCode>
<errorDescription>Invalid Action</errorDescription>
</UPnPError>
</detail>
</s:Fault>
</s:Body>
</s:Envelope>]

Der Tip von http://www.ip-symcon.de/forum/threads/11741-Downstream-Upstream-Geschwindigkeit-der-FritzBox-auslesen?p=230910#post230910 hat geholfen.
Danke

Bei mir hat es auch geholfen! Danke!

Ich bin gerade dabei alle meine FritzBox abfragen auf Soap umzustellen, dabei habe ich auch diese Werte gefunden.
Ich versuche das die Tage mal fertig umzusetzen.
Allerdings habe ich noch Probleme mit SoapFunktionen welche ein Bindestrich im Namen haben.
Da wird nur immer invalid action zurück gemeldet :mad:
Sogar an das Telefonbuch, aktive Netzwerkgeräte, Wlan-Daten inkl Gastzugang und die Anrufliste kommt man dort ohne das parsen der lua Webseiten. Somit wohl auch etwas Firmware-Upgrade fester als bisher.
Michael
PS: Und setzen von Werten sollte auch gehen, also Gastzugang einschalten, Wecker stellen, Rufumleitung setzen etc…

Hallo,

im Falle meiner FB 6360 liest das Script zwar die Werte aus, aber die sind nochmal um dem Faktor 100 falsch, das musste ich noch eine kleine Korrektur machen.

Ich habe die Werte einfach mit den Trafficmessungen meines Switches vergliechen, der Echtzeitdaten pro Port rausgibt.

Versuche mal die direkten Werte der Box-eigenen Traffic-Messung auszulesen
Findest du jetzt hier gleich im ersten Post http://www.ip-symcon.de/forum/threads/25745-FritzBox-mit-SOAP-auslesen-und-steuern?p=235989#post235989

Ja auch hier, aber im dritten Post.
Allerdings ist das ganze ein ‚Bausatz‘. Also Infos raussuchen aus Post 3 und eins der Scripte aus Post 2 übertragen und Attacke :smiley:
http://www.ip-symcon.de/forum/threads/25745-FritzBox-mit-SOAP-auslesen-und-steuern?p=235991#post235991

Michael
PS: Habe ja auch eine 6360 und bei mir sind die berechneten Up / Down -Werte von den (mit ohne dem unterstützen microtime) Script hier und die nativen Werte der Box unter „NewByteSendRate“ & „NewByteReceiveRate“ fast identisch. Auf keinen Fall um den Faktor 10 oder gar 100 falsch. Und stimmen mit der WebUI der FB und den Daten meines Switch überein. Schon sehr merkwürdig.

Habe versucht, so wie es in diesem Post steht http://www.ip-symcon.de/forum/thread…910#post230910, das entsprechend zu ändern doch hat es nicht funktioniert, ich habe eine 7390.

-<service>

<serviceType>urn:schemas-upnp-org:service:WANDSLLinkConfig:1</serviceType>

<serviceId>urn:upnp-org:serviceId:WANDSLLinkC1</serviceId>

<controlURL>/igdupnp/control/WANDSLLinkC1</controlURL>

<eventSubURL>/igdupnp/control/WANDSLLinkC1</eventSubURL>

<SCPDURL>/igddslSCPD.xml</SCPDURL>

</service>

so sieht der Eintrag in meiner XML-Datei aus.

Gruß

Ich glaub das ist der falsche Abschnitt in der XML.
Geht das hier ?
WAN Up-/Download Speed – IP-Symcon
Michael

Ich verwende dieses Skript…


$address = "192.168.3.1";

//Ab hier nichts mehr ändern
$object = IPS_GetObject($IPS_SELF);
$parentID = $object['ParentID'];

$contentRecv = 'POST /igdupnp/control/WANDSLLinkC1  HTTP/1.1
Cache-Control: no-cache
Connection: Close
Pragma: no-cache
Content-Type: text/xml; charset="utf-8"
User-Agent: Microsoft-Windows/6.1 UPnP/1.0
SOAPAction: "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1#GetTotalBytesReceived"
Content-Length: '.(302+strlen($address)).'
Host: '.$address.':49000

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><m:GetTotalBytesReceived xmlns:m="urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1"/></SOAP-ENV:Body></SOAP-ENV:Envelope>
';

$contentSent = 'POST /igdupnp/control/WANDSLLinkC1  HTTP/1.1
Cache-Control: no-cache
Connection: Close
Pragma: no-cache
Content-Type: text/xml; charset="utf-8"
User-Agent: Microsoft-Windows/6.1 UPnP/1.0
SOAPAction: "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1#GetTotalBytesSent"
Content-Length: '.(298+strlen($address)).'
Host: '.$address.':49000

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><m:GetTotalBytesSent xmlns:m="urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1"/></SOAP-ENV:Body></SOAP-ENV:Envelope>
';

//Installer
if ($IPS_SENDER == "Execute")
{
    IPS_SetHidden($IPS_SELF, true);
    IPS_SetName($IPS_SELF, "Auslese-Skript");
    $parentObject = IPS_GetObject($parentID);
    if ($parentObject['ObjectType'] !== 1)
    {
        $instanceID = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");
        IPS_SetParent($instanceID, $parentID);
        $parentID = $instanceID;
        IPS_SetParent($IPS_SELF, $parentID);
        IPS_SetName($instanceID, "FritzBox-Auslastung");
        IPS_SetIcon($instanceID, "Gauge");
    }
    IPS_SetScriptTimer($IPS_SELF, 10);

    if(!IPS_VariableProfileExists("InternetSpeed_kbs")) {
       IPS_CreateVariableProfile("InternetSpeed_kbs", 2);
       IPS_SetVariableProfileText("InternetSpeed_kbs", "", " kb/s");
       IPS_SetVariableProfileDigits("InternetSpeed_kbs", 2);
    }
}

$totalRecv = GetTextBetween(SendPacket($contentRecv), "<NewTotalBytesReceived>", "<\/NewTotalBytesReceived>");
$totalSent = GetTextBetween(SendPacket($contentSent), "<NewTotalBytesSent>", "<\/NewTotalBytesSent>");
$vidRecv = CreateVariableByName($parentID, "TotalRecv", 2, 1, "", true);
$vidSent = CreateVariableByName($parentID, "TotalSent", 2, 2, "", true);

$varRecv = IPS_GetVariable($vidRecv);
$varSent = IPS_GetVariable($vidSent);

SetValue($vidRecv, $totalRecv);
SetValue($vidSent, $totalSent);

$time = microtime(true);

$vidDn = CreateVariableByName($parentID, "Downstream", 2, 3, "InternetSpeed_kbs");
$vidUp = CreateVariableByName($parentID, "Upstream", 2, 4, "InternetSpeed_kbs");

SetValue($vidDn, max(0, ($totalRecv - $varRecv['VariableValue']['ValueFloat']) / (($time - $varRecv['VariableUpdated'])) / 1024));
SetValue($vidUp, max(0, ($totalSent - $varSent['VariableValue']['ValueFloat']) / (($time - $varSent['VariableUpdated'])) / 1024));

function SendPacket($content) {
    global $address;
    $port = 49000 /*[Objekt #49000 existiert nicht]*/;

    $fp = fsockopen ($address, $port, $errno, $errstr, 10);
    if (!$fp) {
        echo "$errstr ($errno)<br />
";
    } else {
        fputs ($fp, $content);
        $ret = "";
        while (!feof($fp)) {
            $ret.= fgets($fp,128);
        }
        fclose($fp);
    }
    if(!(strpos($ret, "200 OK") === false)) {
       return $ret;
    } else {
       die("Invalid Response: ".$ret);
    }
}

function GetTextBetween($string, $start, $end){
    preg_match_all( "/$start(.*)$end/U", $string, $match );
    return $match[1][0];
}

function CreateVariableByName($id, $name, $type, $position, $profile="", $hidden=false)
{
    global $IPS_SELF;
    $vid = @IPS_GetVariableIDByName($name, $id);
    if($vid === false)
    {
        $vid = IPS_CreateVariable($type);
        IPS_SetParent($vid, $id);
        IPS_SetName($vid, $name);
        IPS_SetPosition($vid, $position);
        IPS_SetHidden($vid, $hidden);
        IPS_SetVariableCustomProfile($vid, $profile);
        IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
    }
    return $vid;
}

?>

Gruß

Eben noch mal nachgesehen.
WANDSLLinkC1 ist falsch, du bist zu weit unten in der XML.
WANCommonIFC1 brauchst du.

Davon abgesehen ist es sinnvoller die SOAP-Requests nicht mehr per Hand nachzubauen.
Darum ja der Link zum Wiki.
Wichtig ist auch immer die Firmware der Box. Da hier häufiger mal Änderungen durchgeführt werden.

Michael

Super Danke dir, jetzt geht’s wieder, das mit der Firmware habe ich gemerkt.
Werde das wenn ich das andere so weit habe mal in angriff nehmen.

Gruß

Nach so langer Zeit der Unwissenheit, will ich es jetzt endlich wissen…

…die Variablen „TotalRecv“ und „TotalSent“. Was verbirgt sich dahinter? Ich finde in der Fritzbox, beim Online-Zähler, keinen auch nur annähernd passenden Wert :confused:

Danke und Grüße,
Chris

Bei funktioniert alles soweit.
Bis auf die Werte(siehe Bild), ich habe eine 100er Telekom Leitung.
Kann das stimmen?

<?

$address = "Fritz.box";

//Ab hier nichts mehr ändern
$object = IPS_GetObject($IPS_SELF);
$parentID = $object['ParentID'];

//$contentRecv = 'POST /upnp/control/WANCommonIFC1 HTTP/1.1
$contentRecv = 'POST /igdupnp/control/WANCommonIFC1 HTTP/1.1
Cache-Control: no-cache
Connection: Close
Pragma: no-cache
Content-Type: text/xml; charset="utf-8"
User-Agent: Microsoft-Windows/6.1 UPnP/1.0
SOAPAction: "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1#GetTotalBytesReceived"
Content-Length: '.(302+strlen($address)).'
Host: '.$address.':49000

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><m:GetTotalBytesReceived xmlns:m="urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1"/></SOAP-ENV:Body></SOAP-ENV:Envelope>
';

//$contentSent = 'POST /upnp/control/WANCommonIFC1 HTTP/1.1
$contentSent = 'POST /igdupnp/control/WANCommonIFC1 HTTP/1.1
Cache-Control: no-cache
Connection: Close
Pragma: no-cache
Content-Type: text/xml; charset="utf-8"
User-Agent: Microsoft-Windows/6.1 UPnP/1.0
SOAPAction: "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1#GetTotalBytesSent"
Content-Length: '.(298+strlen($address)).'
Host: '.$address.':49000

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><m:GetTotalBytesSent xmlns:m="urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1"/></SOAP-ENV:Body></SOAP-ENV:Envelope>
';

//Installer
if ($IPS_SENDER == "Execute")
{
    IPS_SetHidden($IPS_SELF, true);
    IPS_SetName($IPS_SELF, "Auslese-Skript");
    $parentObject = IPS_GetObject($parentID);
    if ($parentObject['ObjectType'] !== 1)
    {
        $instanceID = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");
        IPS_SetParent($instanceID, $parentID);
        $parentID = $instanceID;
        IPS_SetParent($IPS_SELF, $parentID);
        IPS_SetName($instanceID, "FritzBox-Auslastung");
        IPS_SetIcon($instanceID, "Gauge");
    }
    IPS_SetScriptTimer($IPS_SELF, 10);
    
    if(!IPS_VariableProfileExists("InternetSpeed_kbs")) {
       IPS_CreateVariableProfile("InternetSpeed_kbs", 2);
       IPS_SetVariableProfileText("InternetSpeed_kbs", "", " kb/s");
       IPS_SetVariableProfileDigits("InternetSpeed_kbs", 2);
    }
}

$totalRecv = GetTextBetween(SendPacket($contentRecv), "<NewTotalBytesReceived>", "<\/NewTotalBytesReceived>");
$totalSent = GetTextBetween(SendPacket($contentSent), "<NewTotalBytesSent>", "<\/NewTotalBytesSent>");
$vidRecv = CreateVariableByName($parentID, "TotalRecv", 2, 1, "", true);
$vidSent = CreateVariableByName($parentID, "TotalSent", 2, 2, "", true);

$varRecv = IPS_GetVariable($vidRecv);
$varSent = IPS_GetVariable($vidSent);

SetValue($vidRecv, $totalRecv);
SetValue($vidSent, $totalSent);

$time = microtime(true);

$vidDn = CreateVariableByName($parentID, "Downstream", 2, 3, "InternetSpeed_kbs");
$vidUp = CreateVariableByName($parentID, "Upstream", 2, 4, "InternetSpeed_kbs");

SetValue($vidDn, max(0, ($totalRecv - $varRecv['VariableValue']['ValueFloat']) / (($time - $varRecv['VariableUpdated'])) / 1024));
SetValue($vidUp, max(0, ($totalSent - $varSent['VariableValue']['ValueFloat']) / (($time - $varSent['VariableUpdated'])) / 1024));

function SendPacket($content) {
    global $address;
    $port = 49000;

    $fp = fsockopen ($address, $port, $errno, $errstr, 10);
    if (!$fp) {
        echo "$errstr ($errno)<br />
";
    } else {
        fputs ($fp, $content);
        $ret = "";
        while (!feof($fp)) {
            $ret.= fgets($fp,128);
        }
        fclose($fp);
    }
    if(!(strpos($ret, "200 OK") === false)) {
       return $ret;
    } else {
       die("Invalid Response: ".$ret);
    }
}

function GetTextBetween($string, $start, $end){
    preg_match_all( "/$start(.*)$end/U", $string, $match );
    return $match[1][0];
}

function CreateVariableByName($id, $name, $type, $position, $profile="", $hidden=false)
{
    global $IPS_SELF;
    $vid = @IPS_GetVariableIDByName($name, $id);
    if($vid === false)
    {
        $vid = IPS_CreateVariable($type);
        IPS_SetParent($vid, $id);
        IPS_SetName($vid, $name);
        IPS_SetPosition($vid, $position);
        IPS_SetHidden($vid, $hidden);
        IPS_SetVariableCustomProfile($vid, $profile);
        IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
    }
    return $vid;
}

?>