Fritzbox 7270/Wlan Repeater Scripts

Hallo Rainer,
sorry, auch wenn ich nerve …,
kann es sein, dass „sep=;“ automatisch erkannt und entfernt wird? Wenn ich die *.csv mit dem Editor anschaue ist’s noch drin. Gleich am Anfang der while-Schleife die die *.csv liest ist das sep auch noch da, aber im folgenden Abschnitt in der foreach-Schleife, wenn der Array $data in einen string/table gewandelt wird ist’s dann plötzlich weg.
Wie?
Kann man dann die beiden Zeilen nicht einfach weg lassen? oder hat das noch andere Gründe die nicht kenne?

Kein Problem. :slight_smile:

Dann mal nach und nach.

Das ist die Orginaldatei von der Box.

sep=;
Typ;Datum;Name;Rufnummer;Nebenstelle;Eigene Rufnummer;Dauer

Das ist die Datei nach explode welche in ein Array gesplittet wird.

Array
(
    [0] => sep=
    [1] => 
Typ;Datum;Name;Rufnummer;Nebenstelle;Eigene Rufnummer;Dauer

Das ist die Datei aus anrufliste[1]. Diese wird gespeichert und dient der weiteren Verarbeitung.

Typ;Datum;Name;Rufnummer;Nebenstelle;Eigene Rufnummer;Dauer

Wenn Du jetzt die Zeilen auskommentierst, sieht deine Tabelle wie auf dem Screenshot aus. Wenn Du das so haben möchtest, kannst Du das gerne tun. :smiley:

Ich hoffe, es war jetzt etwas verständlicher.

Das ganze sieht dann so aus.

//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);
//print_r($anrufliste); //Orginalliste
$anrufliste = explode(';', $anrufliste, 2);
//print_r($anrufliste); // Liste nach explode
$anrufliste = $anrufliste[1];
//print_r($anrufliste);  // Liste aus Array zum abspeichern
$fileHandle = @fopen($filename, 'wb+');
@fwrite($fileHandle, trim($anrufliste)); //Leerzeichen entfernen
@fclose($fileHandle);

Hallo zusammen,

ich hoffe es ist in Ordnung, wenn ich eure Konversation mit einem anderem Thema unterbreche…

Ich bin schon seit Tagen daran, aus der Fritzbox auszulesen, ob diverse WLAN Geräte online sind. Ich dachte ich lese einfach die WLAN Status Seite aus:

$fritzbox_ip = '192.168.2.1'; // Name oder IP eintragen
$password    = 'xxxx'; // Passwort eintragen

$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_close($ch);


$log = file("http://fritz.box/wlan/wlan_settings.lua?sid=".$SID); // Wlan

und versuche in der $log Variable nach dem passenden String zu suchen:

$WLAN = array_search('Mac-Notebook','1'', $log);

Mac-Notebook wäre der Name für das Gerät und die 1 das es verbunden ist. Wenn man sich das Array mit dem print Befehl anzeigen lässt, kommt der String auch vor, aber die array_search Methode findet es nicht. Auch der Versuch die Seite als String einzulesen und mit diversen Suchmethoden zu finden, schlugen fehl.
Habt ihr ein Tipp für mich, wäre dafür wirklich sehr dankbar?

Liebe Grüße

Sebastian

strpos ist bei einer String suche sehr von Vorteil. Mit deinem array_search [COLOR=Black]wirst Du hier nicht sehr weit kommen, zumindest nicht in dieser Zusammensetzung.

…und nein, ich hab nichts fertiges dafür.

[/COLOR]

Hallo Rainer,

habs gefunden. Die Zeile mit der ich nach eigenen Nummern selektiere entfernt mir die Zeile mit dem sep ebenso wie die Zeile mit den Spaltenköpfen (die ich ja vorher abfange und wieder einfüge.

if(isset($data[5]) && $data[5] == "Internet: ".$TelNrW)

Vielen Dank für Deine Mühe …

hallo sebatian,
wenns bekannte geräte sind …
geht auch
Sys_Ping: IP-Symcon :: Automatisierungssoftware

Hallo Wolfgang,

Ich habe die Woche nochmal probiert mit einigen Befehlen, aber leider hatte sich die Methode nicht als gut herausgestellt. Ich habe jetzt eine andere Idee, allerdings weiss ich überhaupt nicht wie ich die lösen soll.

Und zwar logt die Fritzbox ja die WLAN Geräte in der Logpage. Ich würde gerne die Zeilen nach den Geräten durchsuchen, welche sich angemeldet haben, die Uhrzeit extrahieren und bei einem Delta unter 15min eine Variable triggern. Das sollte weitaus zuverlässiger sein als der Ping, weil das iPhone manchmal nur 1s online ist.
Vielleicht hat ja jemand einen Ansatzpunkt dafür.

LG Sebastian

Hallo Sebastian,
ich kann leider kein php. Alles (fast) was ich bis jetzt umgesetzt habe, habe ich nur mit hilfe anderer hinbekommen. @all: vielen Dank dafür. Die Idee ist mir nur gekommen weil’s ein einfacher Code ist und ich Dir sonst nicht weiter helfen kann.
Oft werden von Helfern Tipps zur Selbsthilfe gegeben. Ist zwar oft nicht das was man erwartet hat, aber wenn man den Tipps folgt erreicht man durch learning by doing oft das gewünschte Ziel. Und wenns doch nicht alleine klappt, und die Gurus aus Deinen neuen Fragen schliessen können, du hast’s selber versucht helfen sie Dir sicher auch wieder weiter … Du kannst nur nicht erwarten, dass sie Dein IPS für dich progammieren.
Noch ein Tipp: Die Mods stehen nicht auf allgemeine Fragen. Stell konkrete Fragen (am Besten immer nur einen pro Thema) mit Script und Ergebnis/Fehler … Und im richtigen Forum. Dann wird Dir auch sicher geholfen.
Musste ich auch erst lernen.

Hiermit hast Du die letzte An/Abmeldung eines Gerätes.

$log = file("http://fritz.box/system/syslog.lua?tab=wlan&sid=".$SID); // Wlan

print_r(utf8_decode($log[176])); // Ausgabe zum weiterverarbeiten

Den ausgegebenen String kannst Du z.B. mit substr in die gewünschten Teile zerlegen.

PHP: substr - Manual

Aus verschiedenen Quellen habe ich mir folgendes Skript zusammengestoppelt, um eine in der Fritzbox vorhandene globale Rufumleitung auf den Anrufbeantworter zu (de)aktivieren (Klingelsperre). Das klappt leider nicht.

Ich habe vier Rufumleitungen in der Fritzbox eingerichtet:

  1. MSN2 auf Handy1
  2. MSN3 auf Handy2
  3. Unbekannter Anrufer sofort auf Anrufbeantworter 2
    4. Alle Anrufe sofort auf Anrufbeantworter 1

Im Skript kann ich über „Diversity0“ oder „Diversity1“ die Rufumleitungen Nr. 1 bzw. 2 problemlos schalten (merkwürdigerweise schaltet auch ein wiederholtes AUS die Rufumleitung wieder ein, aber das ist erstmal weniger wichtig).

Der Logik nach habe ich nun versucht, mit „Diversity3“ die Rufumleitung Nr. 4 zu schalten. Dabei passiert überhaupt nichts.

Schalte ich über „Diversity2“ aus, verschwindet die Rufumleitung Nr. 4 komplett aus der Fritzbox, wird also gelöscht. Anschalten bewirkt nichts. Schalte ich nochmal aus, verschwindet auch die Rufumleitung Nr. 3. Ein weiteres Ausschalten ändert dann den Status von Nr. 2, löscht diese Rufumleitung aber wenigstens nicht.

Was läuft hier verkehrt? :confused:

Grüße
galleto

<?
if ($IPS_SENDER == "WebFront")
{
    $fritzbox_ip = 'fritz.box';
    $fritzgui    = 'fritz.box/cgi-bin/webcm';
    $fritzseite  = '../html/de/menus/menu2.html';
    $password    = 'xxxxx';
    $ein         = '1';
    $aus         = '0';

    $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;
    }
}

    switch($IPS_VALUE)
    {
       case 0:
            curl_setopt($ch, CURLOPT_POSTFIELDS, "getpage={$fritzseite}&sid={$SID}&var:pagename=rulall&telcfg:settings/Diversity2/Active={$aus}");
            curl_exec($ch);
         break;

       case 1:
            curl_setopt($ch, CURLOPT_POSTFIELDS, "getpage={$fritzseite}&sid={$SID}&var:pagename=rulall&telcfg:settings/Diversity2/Active={$ein}");
            curl_exec($ch);
         break;
    }


    if (isset($matches[1]) && $matches[1]  == 1)
    {
        SetValue(53833, 1);
    }
    else
    {
        SetValue(53833, 0);
    }


    curl_close($ch);
    SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);

}

?>

Hat wirklich niemand einen hilfreichen Rat?

Ist das Skript prinzipiell fehlerfrei?
Sind Rufumleitungen auf einen AB etwas spezielles und werden gar nicht mittels „Diversity“ geschaltet?
In welcher Richtung kann ich die Ursache für das merkwürdige Verhalten suchen?

Grüße
galleto

Zumindest das habe ich mit Hilfe von Firebug herausbekommen: Die Rufumleitungen auf einen Anrufbeantworter werden im Quelltext tatsächlich nicht über „Diversity“, sondern über „Rub“ angesprochen. Wenn ich jetzt aber im Skript „Diversity0“ durch „Rub0“ oder „Rub1“ ersetze, passiert beim Schalten leider überhaupt nix.

RWN!? Hilfe! :wink:

EDIT: Eine Zwischenlösung habe ich gefunden. Wenn man die Rufumleitung auf den AB nicht für alle, sondern nur für eine bestimmte MSN einrichtet, kann man das mit „Diversity“ statt „Rub“ steuern. Immerhin. :smiley:

Grüße
galleto

Um hier nicht immer nur dumme Fragen zu stellen, mal was Produktives. :wink:

Eine Übersicht aller Schaltmöglichkeiten für diese Art „RWN-Skripte“ habe ich hier gefunden.

Wenn man etwa die Fernwartung der Fritzbox bei Bedarf mal schnell aktivieren möchte:

<?
if($_IPS['SENDER'] == "WebFront")
{
    $fritzbox_ip = 'fritz.box';
    $password    = 'xxxxx';
    $ein         = '1';
    $aus         = '0';

    $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;
        }
    }

    if($_IPS['VALUE'])
    {
        curl_setopt($ch, CURLOPT_POSTFIELDS, "sid={$SID}&remoteman:settings/enabled={$ein}");
        curl_exec($ch);
    }
    else
    {
       curl_setopt($ch, CURLOPT_POSTFIELDS, "sid={$SID}&remoteman:settings/enabled={$aus}");
       curl_exec($ch);
    }
    curl_close($ch);
    SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
}

?>

Grüße
galleto

Hallo PHP Profis,
ich bin mir nicht sicher ob ich hier im richtigen Threat bin, da ich kein Webfront benutze. Leider vestehe ich nicht nur sehr wenig PHP.
Ich möchte das WLAN meiner FB 7390 (Firmware 84.05.20) vom Dashboard aus schalten.
Dazu habe ich das Script von Rainer aus der Scriptsammlung ab Version 2.5 kopiert und Passwort und $_IPS Sender verändert. Der login scheint auch zu funktionieren, denn das Script zur Anruferliste funktioniert.
Ich wollte nun eine Variable im Dashboard entsprechend „WLAN ein“ oder „Wlan aus“ setzen. Aber wo und wie muss ich diese dem Script zuweisen?

if($_IPS['SENDER'] == "Dashboard")
{
    $fritzbox_ip = 'fritz.box';
    $password    = 'mein password';
    $ein         = '1';
    $aus         = '0';

    $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;
        }
    }

    if($_IPS['VALUE'])
    {
        curl_setopt($ch, CURLOPT_POSTFIELDS, "sid={$SID}&tam:settings/TAM1/Active={$ein}");
        curl_exec($ch);
    }
    else
    {
       curl_setopt($ch, CURLOPT_POSTFIELDS, "sid={$SID}&tam:settings/TAM1/Active={$aus}");
       curl_exec($ch);
    }
    curl_close($ch);
    SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
}

Die 5 Dateien habe ich übrigens nach ext kopiert.

Ich hoffe ihr versteht mein Problem.

Gruss Ralph

Wenn Du Wlan schalten willst, musst Du auch das entsprechende Script nehmen oder anpassen und nicht das für den AB.

Sorry Rainer, klar, ich habe das falsche script in den threat kopiert.
Aber ich stehe immernoch vor dem gleichem Problem.Ich verstehe nicht, was ich im Script noch anpasen muss, damit der Wert der Varible (z.B. Wlan an) übergeben wird. Ich habe bisher nur „IPS_Sender == Dashboard“ und mein FB Passwort im Script eingegeben.
Für einen Tip bin ich sehr dankbar,
Ralph

Wenn, muss es Designer heissen. Das Script gibt keine Rückmeldung.

Stimmt , klar.
Aber wie entscheidet das script ob wlan Ein oder Ausgeschlatet werden soll?
Sorry, ich verstehe es nicht.
Ralph

Ok jetzt bekomme ich 4 Fehlermeldungen:
undifined index Value line 38
undifined index Value line 49
Variable *0 existiert nicht
Mus ich da auch noch was am script anpassen?

Ralph

Aber wie entscheidet das script ob wlan Ein oder Ausgeschlatet werden soll?

über die bool Variable. Wie das im Designer funktioniert, kann ich dir nicht sagen.