Anrufname und Radiolautstärke mit Fritzbox

sorry, kann dir grad nicht folgen. :confused:

war eigentlich nur ein Riesenkompliment und Lob, weil die Antwort von Dir fast gleichzeitig mit meinem „klick auf den Antwort-Button“ kam. :slight_smile:

gerade drängt sich noch eine Frage auf: kann ich aus IPS die Anrufliste in eine txt-Datei speichern?

Du meinst jetzt die Anrufliste, nicht das Telefonbuch.

Die Anrufliste liegt als csv auf der Box vor.

Abholen und speichern kannst du hiermit.

<?
//IPS_SetScriptTimer(40694 /*[Fritzbox\Anruferliste]*/, 20);

$fritzbox = 'fritz.box';
$fritzseite  = '../html/de/menus/menu2.html';
$filename    = IPS_GetKernelDir()."\\webfront\\user\\Fritzbox\\Anrufliste.csv";// anpassen
$password    = 'xxxxx';

$ch = curl_init('http://' . $fritzbox . '/cgi-bin/webcm?getpage=../html/login_sid.xml');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$login = curl_exec($ch);
$session_status_simplexml = simplexml_load_string($login);

if ($session_status_simplexml->iswriteaccess == 1)
{
   $SID = $session_status_simplexml->SID;
}
else
{
   $challenge = $session_status_simplexml->Challenge;
   $response = $challenge . '-' . md5(mb_convert_encoding($challenge . '-' . $password, "UCS-2LE", "UTF-8"));
    curl_setopt($ch, CURLOPT_POSTFIELDS, "login:command/response={$response}&getpage=../html/de/menus/menu2.html");
    preg_match('/name="sid" value="([0-9a-f]*)"/', curl_exec($ch), $matches);
   if (isset($matches[1]) && $matches[1] != '0000000000000000')
   {
      $SID = $matches[1];
   }
   else
   {
      echo "Fehler: Login fehlgeschlagen";
      return;
    }
}

//Anrufliste aktualisieren
curl_setopt($ch, CURLOPT_POSTFIELDS, "getpage={$fritzseite}&sid={$SID}&var:menu=home&var:pagename=foncalls");
curl_exec($ch);

curl_setopt($ch, CURLOPT_POSTFIELDS, "getpage=../html/de/FRITZ!Box_Anrufliste.csv&sid={$SID}");
$anrufliste = curl_exec($ch);
$anrufliste = explode(';', $anrufliste, 4);
$anrufliste = $anrufliste[3];
//print_r($anrufliste);
$fileHandle = @fopen($filename, 'wb+');
@fwrite($fileHandle, $anrufliste);
@fclose($fileHandle);

curl_close($ch);

?>

und schon wieder ein fettes Dankeschön.:slight_smile:

Vielen Dank erst einmal für das super Script, Rainer! Funktioniert soweit super bei mir, der einzige Wermutstropfen ist, dass die Abfrage von der Fritzbox leider immer 2-3 sec dauert. Schöner wäre natürlich, wenn der Anrufername auch in dem Moment wo das Telefon klingelt schon verfügbar wäre. Meine Idee war jetzt folgende: Wäre es vielleicht möglich mit einem Script was z.B. einmal die Woche getriggert wird das Telefonbuch der Fritzbox in eine lokale auf dem IPS-Rechner befindliche CSV-Datei oder vergleichbares zu schreiben und diese dann zu nutzen für die Namenssuche? Ich nehme zumindest stark an, dass es die Verbindung zur Fritzbox und nicht der eigentliche Auslesevorgang ist, der so lange dauert …
Ich habe nun nur leider keine Ahnung, wie man oben genannte Idee umsetzen könnte, habt ihr da vielleicht Ideen? :slight_smile:

Fröhliche Weihnachten!

Hallo Sketch,

Ich hab dir das mal umgebaut. :slight_smile: Kannst ja mal selber testen. Braucht dann anstatt 2-3 sec. ca 25ms.

Script zum abholen des Telefonbuches von der Box und speichern unter einem Ordner. Trigger nach Wahl oder per Execute.

ini_set("max_execution_time", 15);


    $fritzbox_ip = 'fritz.box'; // Name oder IP eingeben
    $fritzCfg    = 'http://fritz.box/cgi-bin/firmwarecfg';
    $filename    = IPS_GetKernelDir()."\\webfront\\user\\Fritzbox\	elefonbuch.xml";// anpassen
    $telefonbuch = 2; // Auswahl des Telefonbuches
    $password    = 'xxxxx'; // PW anpassen

    $ch = curl_init('http://' . $fritzbox_ip . '/cgi-bin/webcm?getpage=../html/login_sid.xml');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $login = curl_exec($ch);
    $session_status_simplexml = simplexml_load_string($login);

    if ($session_status_simplexml->iswriteaccess == 1)
    {
       $SID = $session_status_simplexml->SID;
    }
    else
    {
       $challenge = $session_status_simplexml->Challenge;
       $response = $challenge . '-' . md5(mb_convert_encoding($challenge . '-' . $password, "UCS-2LE", "UTF-8"));
        curl_setopt($ch, CURLOPT_POSTFIELDS, "login:command/response={$response}&getpage=../html/de/menus/menu2.html");
        preg_match('/name="sid" value="([0-9a-f]*)"/', curl_exec($ch), $matches);
       if (isset($matches[1]) && $matches[1] != '0000000000000000')
       {
          $SID = $matches[1];
       }
       else
       {
          echo "Fehler: Login fehlgeschlagen";
          return;
        }
    }

    curl_setopt($ch, CURLOPT_URL, $fritzCfg);
    curl_setopt($ch, CURLOPT_POSTFIELDS, array("sid" => $SID, "PhonebookId" => $telefonbuch, "PhonebookExportName" => "Telefonbuch", "PhonebookExport" => ""));
    $book = curl_exec($ch);
   curl_close($ch);


$fileHandle = @fopen($filename, 'wb+');
@fwrite($fileHandle, $book);
@fclose($fileHandle);

Script zum abholen des Buches aus dem Ordner. Funktion wie gehabt.

$xml = simplexml_load_file(IPS_GetKernelDir()."\\webfront\\user\\Fritzbox\	elefonbuch.xml");
//print_r($xml);

foreach($xml->phonebook->contact as $nummer => $value)
{
    $nummer0 = $value->telephony->number[0]."
";
   $nummer1 = $value->telephony->number[1]."
";
   $nummer2 = $value->telephony->number[2]."
";
    $namen = $value->person->realName."
";
    $daten[] = array(trim($nummer0),trim($nummer1),trim($nummer2),trim($namen));
}
//print_r($daten);
$rufnummer = GetValue(30553 /*[Fritzbox\Anrufe\Anruf]*/); // Nummer vom Anrufer, Variable z.B. mit GetValue und Trigger auf das Script
if($rufnummer == "") {return;}
else
{
    for($i=0; $i<count($daten); $i++)
    {
        if(($daten[$i][0] == $rufnummer) || ($daten[$i][1] == $rufnummer) || ($daten[$i][2] == $rufnummer))
        {
            SetValue(10528 /*[Fritzbox\Anrufe\Name]*/, utf8_decode($daten[$i][3])); // Ausgabe des Namen, z.B in Variable schreiben mit SetValue(xxxxx, utf8_decode($daten[$i][3]));
            echo utf8_decode($daten[$i][3]);
        }
    }
}

Wow - das ging aber schnell! Vielen herzlichen Dank, es funktioniert perfekt. Genau so hatte ich mir das vorgestellt! :slight_smile: :slight_smile: :slight_smile:

Seit der Umstellung auf SBS 2011 holt es mir das Telefonbuch ohne zu meckern ab, speichert aber nur ein leeres File im Verzeichnis. Habe nichts im Bezug auf Berechtigungen oder so gefunden. Kopieren geht, Auf Server über direkte Anmeldung an Fritzbox und speichern geht. Nur über das Script nicht mehr.

Was könnte das sein?

das heisst, die XML ist leer ?

genau. Wird auch mit 0KB angezeigt.

Wie lange läuft denn das Script. Da die Datei ja wohl vorhanden ist muss ja irgendwo der Inhalt geblieben sein. Sie heisst auch wirklich xxx.XML Mach sie doch einfach mal auf.

Script läuft ca. 4 Sekunden. Die Datei heisst xml. Wenn ich sie öffne, ist sie leer.

mal ersetzen!

curl_setopt($ch, CURLOPT_URL, $fritzCfg);
curl_setopt($ch, CURLOPT_POSTFIELDS, array("sid" => $SID, "PhonebookId" => $telefonbuch, "PhonebookExportName" => "Telefonbuch", "PhonebookExport" => ""));
$book = curl_exec($ch);
print_r($book);

Sieh mal was in der Scriptausgabe raus kommt.

kommt nichts raus. Bleibt alles wie vorher.

Ein leeres Telefonbuch liest aber nicht aus. Bei mir funktioniert es einwandfrei.

Seit der Umstellung auf SBS 2011 holt es mir das Telefonbuch ohne zu meckern ab

Was soll das heissen, ohne zu meckern. Was hat er denn vorher gemacht.!?

Nein, hab ich zuerst auch gedacht. Bei mir hat’s ja auch einwandfrei funktioniert bis zum Umzug.

Dann hast Du irgendwas verbockt, nur was, keine Ahnung.

Dann hast Du irgendwas verbockt, nur was, keine Ahnung.

Weiss inzwischen, dass ich nichts verbockt habe. Alles was mit „xml“ zu tun hat kommt nicht an. Deshalb Frage an die SBS 2011-Profis:

Habt Ihr gewisse Einstellungen verändert (konkret- Sicherheitstufen runtergeschraubt- wenn ja welche?)

Bei uns läuft Avira Server-Version. Gibt’s da was besonderes zu beachten?

Läuft bei mir auch auf SBS 2011 E.

Dann schnappt dein Virenscanner die Datei. Also hast doch was verbockt. :smiley: