SID erstellen

rabbit10

New member
Hallo,

ich will eine Schaltsteckdose FRITZ!Smart Energy 200 von einem raspberrypi aus abfragen und habe dazu ein Script in php zusammengebastelt. Das funktioniert im Prinzip. Jedoch kommt in vielen Fällen die Meldung "Fehler: Login fehlgeschlagen". Ich rufe das Script per crontab in jeder Minute auf und die erfolgreiche Rückgabe der gewünschten Daten kommt zwischen 3 und 35 Minuten.
Ha da jemand eine Idee?
Fritzbox 7590 Version 8.25

<?php

ob_start();

// Welche Abfrage soll ausgeführt werden

$ahaurl = 'http://fritz.box/webservices/homeautoswitch.lua';
$cmdtmp='gettemperature'; // Abfrage der Temperatur am AVM Heizkörper
$cmdsoll='gethkrtsoll'; // Abfrage der soll Temperatur vom AVM Heizkörper
$cmdtag='gethkrkomfort'; // Abfrage der Komforttemperatur vom AVM Heizkörper
$cmdnacht='gethkrabsenk'; // Abfrage der Temperatur Absenktemperatur am AVM Heizkörper
$cmdonoff='getswitchstate'; //Abruf Status Steckdose
$cmdenergie='getswitchenergy'; //Abruf Energie Steckdose

$ainHeizk7="xxxxxxxxxxxxx"; // Schuppen Heizung

$fritz_url = "Fritz.box"; // IP-Adresse der FRITZ!Box
$fritz_user = "xxxx"; // Benutzername (optional, oft leer)
$fritz_pwd = "xxxx"; // Passwort der FRITZ!Box

// 1. Challenge abrufen
$ch = curl_init('http://' . $fritz_url . '/login_sid.lua');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$login = curl_exec($ch);
curl_close($ch);

$session_status = simplexml_load_string($login);

// 2. Prüfen, ob bereits eine SID vorhanden ist
if ($session_status->SID != '0000000000000000') {
$SID = $session_status->SID;
} else {
// 3. SID berechnen (Challenge + MD5-Hash)
$challenge = $session_status->Challenge;
// Konvertierung nach UCS-2LE für MD5-Hashing
$response = $challenge . '-' . md5(mb_convert_encoding($challenge . '-' . $fritz_pwd, "UCS-2LE", "UTF-8"));

// 4. Login-Anfrage senden
$ch = curl_init('http://' . $fritz_url . '/login_sid.lua');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, "response={$response}&page=/login_sid.lua");
$sendlogin = curl_exec($ch);
curl_close($ch);

$session_status = simplexml_load_string($sendlogin);

if ($session_status->SID != '0000000000000000') {
$sid = $session_status->SID;
} else {
die("Fehler: Login fehlgeschlagen.");
}
}

echo "Erfolgreich erhaltene SID: " . $sid;

// Aktuelle Zeit
$timestamp = time();
$datum = "\n". date("d.m.Y");
$uhrzeit = date("H:i");
$zeitstempel = "" . $datum ." " . $uhrzeit;
echo $datum," - ",$uhrzeit," Uhr \n";

// Abfrage der Temperatur von AVM Steckdose Schuppen

$urltmp=$ahaurl."?sid=$sid"."&ain=".rawurlencode($ainHeizk7).'&switchcmd='.$cmdtmp;
$wertHK07 = file_get_contents($urltmp); // Abspeichern der Temperatur in einer Variable
$ainHeizk7a = (int)$wertHK07 /10;
$ainHeizk7k = str_replace(".",",",$ainHeizk7a);

//Abfrage Schaltzustand von AVM Steckdose Schuppen

$urlstatus=$ahaurl."?sid=$sid"."&ain=".rawurlencode($ainHeizk7).'&switchcmd='.$cmdonoff;
$wertHeizk7k = file_get_contents($urlstatus);

//Abfrage Energie von AVM Steckdose Schuppen

$urlstatus=$ahaurl."?sid=$sid"."&ain=".rawurlencode($ainHeizk7).'&switchcmd='.$cmdenergie;
$wertHeizk7ka = file_get_contents($urlstatus);
echo "Steckdose Schuppen: " . $ainHeizk7k ."°C \n";
echo "Steckdose Schuppen ist: " . $wertHeizk7k ;
echo "Steckdose Schuppen Energie: " . $wertHeizk7ka . "Watt \n";

$inhalt = ob_get_clean(); // Pufferinhalt holen und löschen
file_put_contents("/home/pi/python/von100/Schuppen/datei.txt", $inhalt, FILE_APPEND);

?>
Danke und Grüße
 
Versuch es mal so:
PHP:
<?php

ob_start();

// FRITZ!Box Einstellungen
$fritz_url  = "fritz.box";
$fritz_user = "xxxx";
$fritz_pwd  = "xxxx";

$ahaurl = "http://" . $fritz_url . "/webservices/homeautoswitch.lua";

// Befehle
$cmdtmp     = "gettemperature";
$cmdonoff   = "getswitchstate";
$cmdenergie = "getswitchenergy";

// AIN Heizkörper Schuppen
$ainHeizk7 = "xxxxxxxxxxxxx";

// ------------------------------------
// 1. Challenge abrufen
// ------------------------------------

$loginurl = "http://" . $fritz_url . "/login_sid.lua";

$ch = curl_init($loginurl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$login = curl_exec($ch);

if ($login === false) {
    die("Fehler beim Abrufen der Challenge: " . curl_error($ch));
}

curl_close($ch);

$session_status = simplexml_load_string($login);

if ($session_status === false) {
    die("Fehler: Ungültige Login-Antwort.");
}

// ------------------------------------
// 2. SID prüfen bzw. Login durchführen
// ------------------------------------

$sid = (string)$session_status->SID;

if ($sid == "0000000000000000") {

    $challenge = (string)$session_status->Challenge;

    $response = $challenge . "-" .
        md5(mb_convert_encoding(
            $challenge . "-" . $fritz_pwd,
            "UCS-2LE",
            "UTF-8"
        ));

    $ch = curl_init($loginurl);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
        "response" => $response,
        "page" => "/login_sid.lua"
    ]));

    $sendlogin = curl_exec($ch);

    if ($sendlogin === false) {
        die("Login-Fehler: " . curl_error($ch));
    }

    curl_close($ch);

    $session_status = simplexml_load_string($sendlogin);

    if ($session_status === false) {
        die("Fehler: Ungültige Login-Antwort.");
    }

    $sid = (string)$session_status->SID;

    if ($sid == "0000000000000000" || $sid == "") {
        die("Fehler: Login fehlgeschlagen.");
    }
}

echo "Erfolgreich erhaltene SID: " . $sid . "\n";

// ------------------------------------
// 3. Datum und Uhrzeit
// ------------------------------------

$datum = date("d.m.Y");
$uhrzeit = date("H:i");

echo $datum . " - " . $uhrzeit . " Uhr\n";

// ------------------------------------
// 4. Temperatur abfragen
// ------------------------------------

$parameter = [
    "sid" => $sid,
    "ain" => $ainHeizk7,
    "switchcmd" => $cmdtmp
];

$urltmp = $ahaurl . "?" . http_build_query($parameter);

$wertHK07 = file_get_contents($urltmp);

if ($wertHK07 !== false && is_numeric(trim($wertHK07))) {
    $ainHeizk7a = (float)trim($wertHK07) / 10;
    $ainHeizk7k = number_format($ainHeizk7a, 1, ",", "");
} else {
    $ainHeizk7k = "Fehler";
}

// ------------------------------------
// 5. Schaltzustand abfragen
// ------------------------------------

$parameter["switchcmd"] = $cmdonoff;

$urlstatus = $ahaurl . "?" . http_build_query($parameter);

$wertHeizk7k = file_get_contents($urlstatus);

// ------------------------------------
// 6. Energie abfragen
// ------------------------------------

$parameter["switchcmd"] = $cmdenergie;

$urlenergie = $ahaurl . "?" . http_build_query($parameter);

$wertHeizk7ka = file_get_contents($urlenergie);

// ------------------------------------
// 7. Ausgabe
// ------------------------------------

echo "Steckdose Schuppen: " . $ainHeizk7k . "°C\n";

echo "Steckdose Schuppen ist: " .
    ($wertHeizk7k !== false ? $wertHeizk7k : "Fehler") . "\n";

echo "Steckdose Schuppen Energie: " .
    ($wertHeizk7ka !== false ? $wertHeizk7ka : "Fehler") . " Watt\n";

// ------------------------------------
// 8. In Datei schreiben
// ------------------------------------

$inhalt = ob_get_clean();

file_put_contents(
    "/home/pi/python/von100/Schuppen/datei.txt",
    $inhalt,
    FILE_APPEND | LOCK_EX
);

?>
 
Hallo,

ich kann Euch beiden ( @Loxley & @rabbit10 ) nur empfehlen mal die offizielle API-Dokumentation von Fritz zu konsultieren.
Das war Ihr da macht geht noch, aber die AHA-Schnittstelle ist "deprecated" und wird nicht mehr entwickelt bzw. ist "frozen".
Ihr solltet das besser per REST API machen, das ist auch stabiler und wird weiter entwickelt.

HIer findet Ihr die offizielle API-Dokumentaion von Fritz: https://fritz.com/de/pages/interfaces
 
Hallo,

in dieser Nacht wurde die FB auf Version 8.51 aktualisieert. Ich hab mir mal die Ereignisse angeschaut und festgestellt dass die Anmeldung eines anderen Scripts (fragt Heizkörperthermostate ab), welches eigentlich seit Jahren läuft, auch immer mal wieder abgelehnt wird (falsches Passwort), aber meistens wird die Anmeldung akzeptiert. Ich werde wohl mal dem Rat von @Barungar folgen und neuere Verfahren nutzen.

Ich danke euch.
 

Letzte Anleitungen

Statistik des Forums

Themen
8.377
Beiträge
83.602
Mitglieder
9.121
Neuestes Mitglied
witti99
Zurück
Oben