Abfrage der Fritzbox Aktoren in Python?

  • Hallo,

    ich benutze ein Code mit dem ich mir über PHP den Zugang zu meiner Fritzbox verschaffe, alle Aktoren die Angeschlossen sind Anzeige lasse ( inkl. Temperatur ) und dan auf den Bildschirm ausgebe:

    [code=php]<?php
    //Anmeldedaten und SessionID Funktion einbinden

    //Anmelde- und Hostdaten
    $username=""; //eintragen wenn gesetzt
    $password="troetmich21832832h"; //anpassen!
    $loginurl="http://fritz.box/login_sid.lua"; //Host bei Bedarf anpassen
    $ahaurl="http://fritz.box/webservices/homeautoswitch.lua"; //Host bei Bedarf anpassen

    //Login-Funktion
    function get_sid ($loginurl,$username,$password) {
    //Sende initialen Request an Fritzbox
    $http_response = @file_get_contents($loginurl);
    //Parse Antwort XML
    $xml = @simplexml_load_string($http_response);
    //Antwort prüfen, ob ein xml-Object mit einem Challenge-Tag existiert
    if (!$xml || !$xml->Challenge ) {
    die ("Error: Unerwartete Antwort oder Kommunikationsfehler!\n");
    }
    //extrahiere Challange und SID Tags aus XML
    $challenge=(string)$xml->Challenge;
    $sid=(string)$xml->SID;
    if (preg_match("/^[0]+$/",$sid) && $challenge ) {
    $sid="";
    //erstelle Klartext Password String
    $pass=$challenge."-".$password;
    //UTF-16LE encoding des Passwords ist erforderlich
    $pass=mb_convert_encoding($pass, "UTF-16LE");
    //abschliessend ein md5hash über alles
    $md5 = md5($pass);
    //Erstelle Response String
    $challenge_response = $challenge."-".$md5;
    //Sende Response zur Fritzbox
    $url=$loginurl."?username=".$username."&response=".$challenge_response;
    $http_response = file_get_contents($url);
    //parse Antwort XML
    $xml = simplexml_load_string($http_response);
    $sid=(string)$xml->SID;
    if ((strlen($sid)>0) && !preg_match("/^[0]+$/",$sid)) {
    //is not null, bingo!
    return $sid;
    }
    }else {
    //nutze existierende SID wenn $sid ein hex string ist
    if ((strlen($sid)>0) && (preg_match("/^[0-9a-f]+$/",$sid))) return $sid;
    }
    return null;
    }
    //Login in Fritzbox und SID ermitteln
    $sid=get_sid($loginurl,$username,$password);
    if (!$sid ) {
    die ("Anmeldefehler, keine Session-ID erhalten!\n");
    }
    //SmarthomeURL mit SID Parameter ergänzen
    $query_url=$ahaurl.'?sid='.$sid;
    //Abfrage aller eingetragenen Geräte mit getdevicelistinfo Kommando
    $xmlstring=chop(@file_get_contents($query_url."&switchcmd=getdevicelistinfos"));
    $xml = @simplexml_load_string($xmlstring);
    //Antwort prüfen, ob ein xml-Object mit einem Device-Tag existiert
    if (!$xml || !$xml->device ) {
    die ("Error: Unerwartete Antwort oder Komunikationsfehler bei cmd=getdevicelistinfos");
    }
    //Schleife über alle gelisteten Geräte
    foreach ($xml->device as $device) {
    $attributes=$device->attributes();
    $ain=(string)$attributes['identifier']; //Lese Geräte AIN
    $name=(string)$device->name; //lese Gerätename
    $txt="AIN $ain ($name) ";

    //Check Funktionsbitmask
    $mask=(integer)$attributes['functionbitmask'];
    $has_temperatur=($mask & (1<<8))>0;
    $has_switch=($mask & (1<<9))>0;

    //Behandle Funktionen
    if ($has_temperatur) {
    //bit8=Temperatur Sensor
    $temperatur=((integer)$device->temperature->celsius)/10;
    $offset=((integer)$device->temperature->offset)/10;
    $temperatur=$temperatur+$offset;
    $txt.=sprintf (" Temperatur:(Temp:%02.1fC, Offset:%02.1f) ;",$temperatur,$offset);
    }
    if ($has_switch) {
    //bit9=schaltbare Steckdose
    $status=(string)$device->switch->state;
    $status=($status=="1");
    $txt.= " Steckdose(Status:".($status?"On":"Off")."); ";
    }
    echo "$Name $temperatur <br>";
    }
    ?>

    [/php]

    hat jemand sowas zufällig als Python Code rum zu liegen?

    würde die Daten gerne mit Python weiter verarbeiten und mein aktueller weg die Daten mit PHP zu speichern und dann wieder in Python zu öffnen ist nicht gerade sehr SDKarten schonend.

  • Super tolle Antwort. Mit diesen Suchbegriffen bin ich hier gelandet. Ich verstehe, dass man User dazu animieren will, auch mal selber was zu suchen, aber wenn der Tread dann so offen stehen bleibt, dann bringt das echt nix. Wenn man ein paar so Suchergebnisse erhalten hat, dann ist man irgendwann ganz schön gefrustet....

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!