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

?>
 

Letzte Anleitungen

Statistik des Forums

Themen
8.377
Beiträge
83.595
Mitglieder
9.120
Neuestes Mitglied
FootStark
Zurück
Oben