Fritz!Box API für PHP (inkl. Login-Sessions)

Ja, wenn ich diese Sprache jetzt auch noch könnte :)

Das Problem haben sehr viele FHEM user, wie ich das gesehen habe.

Eine Anwesenheitserkennung wird oft mit einem Ping umgesetzt. Allerdings schaltet das iPhone irgendwann im Sperrbildschirm auf eine Art "eco-Modus"...
Was wiederum bedeutet, dass das Gerät nicht mehr anpingbar ist :-(

Deshalb wäre die Abfrage auf der Fritzbox eine feine Sache! *zwinker*

Ingo
 
Na dann sollte Dir das Skript hier sicher helfen, Letztlich ist es so simpel wie vorhin beschrieben, spannend sind eigentlich nur die Zeilen 50 und 55.

fritzbox_check_network_device_online_status.php:
PHP:
<?php
/**
 * Fritz!Box PHP tools CLI script to check the online status of a network device
 *
 * Must be called via a command line, shows a help message if called without any or an invalid argument
 *
 * check, whether a network device is listed as online in the network list
 *
 * Check the config file fritzbox.conf.php!
 * 
 * @author   Gregor Nathanael Meyer <gregor [at] der-meyer.de>
 * @license  http://creativecommons.org/licenses/by-sa/3.0/de/ Creative Commons cc-by-sa
 * @version  0.1.0 2014-10-22
 * @package  Fritz!Box PHP tools
 */

try
{
  // load the fritzbox_api class
  require_once('fritzbox_api.class.php');
  $fritz = new fritzbox_api();
  
  // handle the CLI arguments or give a help message
  if ( !isset($argv[1]) )
  {
    if ( $fritz->config->getItem('logging') == 'console' )
    {
      echo '
  Check the online status of a network device
  
  Usage on UNIX systems:
    /path/to/php ' .  $argv[0] . ' deviceString
  
  Usage on Windows systems:
    c:\path\to\php.exe ' .  $argv[0] . ' deviceString
  
  The deviceString can be any information in the network list that identifies the device to look up (i.e. Name, IP-Address, MAC-Address)
  ';
    }
    else
    {
      $fritz->logMessage('ERROR: Script was called without or with an invalid argument');
    }
    exit;
  }
  $deviceString = $argv[1];
  
  // read the current leases list
  $formfields = array(
    'getpage' => '/net/network_user_devices.lua',
  );
  $output = $fritz->doGetRequest($formfields);
  
  // look up the given deviceString inside the active connections table
  if ( preg_match('/<table id="uiLanActive".*?' . preg_quote($deviceString) . '.*?<\/table>/is', $output, $matches) )
  {
    $fritz->logMessage('Device "' . $deviceString . '" is listed as active');
  }
  else
  {
    $fritz->logMessage('Device "' . $deviceString . '" is not listed as active');
  }
}
catch (Exception $e)
{
  if ( isset($fritz) && is_object($fritz) && get_class($fritz) == 'fritzbox_api' )
  {
    $fritz->logMessage($e->getMessage());
  }
  else
  {
    echo(date('Y-m-d H:i') . ' ' . $e->getMessage());
  }
}
$fritz = null; // destroy the object to log out
 
Hallo spackmat,

Vielen Dank für die schnelle Umsetzung!!

Hab es gerade eben ausprobiert. Bekomme leider als Status immer "active" zurück.

Kann ich das irgendwie debuggen?

Ingo
 
Hab mir das jetzt noch mal ein bischen angesehen.
Eigentlich "sollte" es funktionieren. Zumindest existiert der table "<table id="uiLanActive""

Und darin befindet sich das abgefragte Gerät NICHT.
Als Status bekomme ich dennoch "active" zurück.

Mir scheint es so, als ob er IMMER in den If Fall reinspringt.
 
Du kannst den $output mal extrahieren (oder den Quelltext der Seite kopieren) und den regulären Ausdruck gegentesten, etwa mit regexr.com (vorsicht, da sucht der . nicht über Zeilenenden hinweg, also vorher alle Zeilenenden rauswerfen):

<table id="uiLanActive".*?GESUCHTERNAME.*?<\/table>

Ich habe zufällig gerade eine 7270 mit Fritz!OS 6.05 vor der Nase, da ist der HTML-Code der Seite ganz anders aufgebaut, ein billiger Trick, um hier im richtigen Bereich zu suchen, wäre dann folgende RegEx:

PHP:
if ( preg_match('/<table id="uiViewDevTable.*?' . preg_quote($deviceString) . '.*?Ungenutzte Verbindungen/is', $output, $matches) )

Puh, wie immer immer alles anders.
 
Hi spackmat,
muss doch mal nachfragen.

Ich bin ursprünglich davon ausgegangen: wenn ich GastLAN ausschalte bekommt ein 2. Router hinter LAN4 kein Internet mehr (GastLAN aus). Allerdings ist es dann so, dass der Router hinter LAN 4 ungefiltert in das interne Netz kommt, da LAN4 dann ohne Restriktionen wie die 3 anderen behandelt wird.

Ich hätte eher so was gebraucht, dass ich die Zeitsteuerung im Gastnetz fernsteuern kann, also Zeitraum immer/nie/eingeschränkt setzen.

access.jpg

Wie bekomme ich das denn hin? Würde das analog zu den anderen Beispielen funktionieren?

Gruß
Torchwood
 
Der Gastzugang an LAN4 ist so gedacht, wie von Dir beschrieben. Also Gastzugang an = LAN4 vom restlichen Netzwerk getrennt, Gastzugang aus = LAN4 ganz normal im Netzwerk.

Mir ist nicht ganz klar, was Du suchst. Wenn ich Dich richtig verstanden habe, möchtest Du, dass ein zweiter Router (mit eigenem NAT bzw. IP-Adressbereich) hinter LAN4 nur ins Internet darf und das auch nur zu bestimmten Zeiten. Das sollte ohne API-Tricks gehen, indem Du diesem 2. Router ein Filterprofil zuweist, das zeitbeschränkt ist. Das ist dann aber kein Thema für diesen Thread, sondern was eigenes.
 
Ok, der Punkt ist folgender.

Der Gastzugang soll unabhängig von irgendwelchen in der Fritzbox einstellbaren Zeitplänen per Script/API ein und ausschaltbar sein, also z.B. abhängig von Anwesenheitsprofilen oder aus der Ferne oder wie auch immer, ohne dass dafür die Oberfläche der Fritzbox (übrigens 7490) bemüht werden muss/soll. Dummerweise geht beim Ein-/Ausschalten der fritzboxinternen Zeittabelle immer auch der aktuelle Stand dieser Tabelle verloren und wird auf Default gesetzt (unschön und meines Erachtens ein Fehler der Fritzbox). Über chron oder z.B. FHEM könnte man die Internetnutzung also ganz variabel gestalten. Schade ist, dass LAN-Port 4 eben nicht komplett deaktiviert werden kann. (Ein/Aus/Gast).

Sorry, dass ich mich vorher so missverständlich ausgedrückt habe

Grüße
Torchwood
 
Ah, verstehe. Da würde es sich doch anbieten, das Filterprofil nach Bedarf zu wechseln. Filterprofile kann man zwar nicht pro LAN-Port ändern, sondern nur für die angeschlossenen Geräte, aber wenn das ein Router mit NAT ist, dann reicht es ja, dem das Internet zu verbieten oder freizugeben. Die URL für einzelne Geräte lautet http://fritz.box/internet/kids_useredit.lua?sid=123456789&edit=landevice1234, da sind Radiobuttons für das jeweilige Profil, die sich mit einem passenden Skript vermutlich leicht umschalten lassen.

Liebe Grüße,
Gregor
 
Anfängerfrage: :)

Wie führe ich denn jetzt "fritzbox_guestwlan_on_off.php" per URL im Browser genau aus?

Per Konsole klappt es:
/usr/bin/php -f /volume1/web/gast/fritzbox_guestwlan_on_off.php 1
 
Hast Du einen Webserver am Laufen?
 
Ja. Die Dateien liegen auf meiner Synology DS413J.

Wenn ich die Datei aufrufe kommt auch
Enables or disables the WLAN guest access of a Fritz!Box Usage...
und auf der Fritz Box sehe ich das sich eingeloggt worden ist.

Wie gebe ich jetzt die entsprechende Variable weiter, sodass ich das WLAN ein oder ausschalten kann? Hab schon vieles probiert. Domain.de?1 usw.
 
ok, einen Schritt zurück... (hatte mir das Skript nicht angesehen)

Das funktioniert ootb nur über die Windows oder Unix Kommandozeile, da die Übergabe mittels $argv erfolgt. Da müsstest Du das Skript ein bisschen umschreiben, damit Du die Daten über $_SERVER bekommst.
 
Schade, ich glaube das überschreitet meine Fähigkeiten. :(

Bräuchte eigentlich nur ein Script, welches bei Aufruf das Gast-WLAN aktiviert. Die restlichen Einstellungen brauch ich nicht per Script. Blöd das AVM für das Gast-WLAN keinen Telefoncode zur Verfügung stellt. Das verstehe ich nicht.
 
Also nur für das Aktivieren? Kein Ausschalten?
 
@Kognitiv: Kopiere das Script einmal. Benenne es in einmal ...on.php und einmal off.php um. Editiere das Script und suche nach $argv[1] und ersetze das im ...on.php mit 1 und im off.php mit 0 und je nachdem ob du nun fritzbox_guestwlan_on.php oder fritzbox_guestwlan_off.php aufrufst, wirds ein oder ausgeschaltet. Nachtrag: Ah, da muss auch noch die blöde Variablenprüfung raus.

Noch komfortabler: Editiere eine Kopie des Scripts und ändere überall in Script $argv[1] in $_GET["schalte"]. Wenn du nun das Script im Broswer aufrufst benutze: fritzbox_guestwlan_on_off.php?schalte=1 für an oder 0 für aus.
 
Zuletzt bearbeitet:
Hallo
gibt es die Möglichkeit über Autoit oder einem andrenen Script die Daten von einer Fritz DECT 200 Steckdose auszulesen ? Ich würde diese gerne in eine Siemens S7 verwenden.
Als Visus verwende ich Wincc flexibe das mit VB scripten Arbeitet. Über Autioi Programme kann ich eine Komunikation zur S7 aufbauen. Eine weiter Möglichkeit wäre eine SQL Datenbank.
 
Zuletzt bearbeitet:
Hallo, ich habe nun erfolgreich die API eingebunden und lasse mich anrufen. Das funktioniert soweit sehr gut.
Besteht die Möglichkeit, dass wenn ich angerufen werde eine wav Datei abgespielt wird?
 

Statistik des Forums

Themen
246,195
Beiträge
2,247,819
Mitglieder
373,748
Neuestes Mitglied
fanti88
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.