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

Es ist ja nicht das Script das den Anruf signalisiert, sondern ein Endgerät.
Also müßte man das dem Endgerät faken und das wird schwierig bis unmöglich.
Was aber vielleicht ein Ansatz wäre ist 2 Rufnummern für die "Klingenanlage" zuzuweisen
und diese Rufnummern als Kontakt anzulegen und vom Tor von einer anderen Rufnummer
aus anrufen als von der Tür.
Ansonsten liesse sich mit viel Programmiererei sicher auch eine andere Lösung realisieren,
aber ich glaube das möchte hier keiner ;)
 
... 2 Rufnummern :confused:
in der fritzbox_ring_phone.php wird ja nur angegeben welches phone angerufen werden soll - und dass Klingelt dann mit dem Klingelton "Intern"
Wie meinst du dass mit den zwei Rufnummern ? - ich möchte ja immer dass gleiche Phone klingeln lassen nur halt mit unterschiedlichen Tönen.

Gruß Frank
 
Ausgehend natürlich

P.s. das Script muss natürlich dahin gehend erweitert werden oder ein eigenes erstellt werden. Die fertigen vorlagen kann man dafür natürlich nicht verwenden.
 
Zuletzt bearbeitet:
... dass das Script geändert werden muss ist mir klar - aber ich verstehe den logischen zusammenhang nicht - wie soll das mit zwei Rufnummern funktionieren ?
Ich muss der FB ja irgendwie mitteilen das ich von Rufnummer 1 anrufe und das Ziel '**610' soll klingeln mit Ton A und bei Rufnummer 2 soll dass Ziel '**610' mit Ton B klingeln
Meinst du dass so ??

Gruß Frank
 
Huch, da habe ich ja einiges verpasst.

Zum Thema Github: Ich sehe das in der Tat auch so, dass die API nach Github gehört und ich finde es gut, dass sich schon jemand darum gekümmert hat. Da bitte weiter machen. Die API ist Open-Source im freiestmöglichen Sinne und ich habe momentan leider weder Muße noch Zeit, mich um irgendwelche Weiterentwicklungen oder Support zu kümmern. Aber es spricht in meinen Augen auch nichts dagegen, dass hier diskutiert wird. Codepflege auf Github und Diskussion an anderen Stellen schließen sich ja nicht aus.

Dann war da noch das Thema Lizenz: Mir ist die Lizenz im Grunde egal. Ich hatte seinerzeit CC gewählt, weil ich CC recht überschaubar finde. Aber eine duale Lizenzierung auch unter MIT oder was auch immer ist mir durchaus recht. Wenn mir das jemand so weit vorbereitet (also eine entsprechende Readme und so formuliert), dass ich das nur noch offiziell verkünden muss, dann mache ich das gerne. Die API existiert, damit Leute daran anknüpfen könne und weil ich die brauchte. Dass sie so weite Kreise zieht, freut mich sehr. Deswegen möchte ich der Weiterentwicklung nicht mit irgendwelchen Lizenzschwierigkeiten im Wege stehen.


Dann war da noch das Problem eines Users, der sich nicht über remote anmelden konnte und keine gültige XML-Antwort zurück bekommen hat. Ich habe das nur überflogen, aber wenn ich das richtig gesehen habe, hat er die lokalen Zugangsdaten nicht auf false gesetzt, was nicht weiter schlimm wäre, wenn er nicht versäumt hätte, enable_remote_config auf true zu setzen:

PHP:
# if needed, enable remote config here
$this->config->setItem('enable_remote_config', true);
$this->config->setItem('remote_config_user', 'remoteuserXY');
$this->config->setItem('remote_config_password', 'remoteuserpasswordXY');

# set to your Fritz!Box username, if login with username is enabled (will be ignored, when remote config is enabled)
$this->config->setItem('username', false);

# set to your Fritz!Box password (defaults to no password, will be ignored, when remote config is enabled)
$this->config->setItem('password', false);

Habe ich das richtig gesehen? Wenn man das nicht auf true setzt, versucht die API, sich über die lokale Oberfläche der Box einzuloggen und wird keine gültige XML-Antwort bekommen, weil die Box an der Remote-Schnittstelle ein HTML-basiertes Login benutzt.

Liebe Grüße,
Gregor
 
Zuletzt bearbeitet:
Ach so, und zur aktuellen Frage habe ich auch noch was zu sagen: Die Wählhilfe bietet in der Weboberfläche keine offensichtliche Möglichkeit, verschiedene Klingeltöne anzuwählen. Vielleicht gibt es geheime Parameter, die die Box an der Stelle annimmt, das müsste man ausprobieren.

Man kann aber, wenn man sich die mühe macht, anderswo schauen, ob man Telefone mit einer bestimmten Melodie zum klingeln bringen kann. Wenn das über das Webinterface funktioniert, sollte man das auch mit der API hinbekommen können. Die Konfigurationsseiten der Telefoniegeräte sind leider relativ kompliziert, weil sie über mehrere Tabs verteilt sind. Da müsste man viel herumprobieren. Aber die API simuliert ja letztlich nur einen Browser auf niedrigem Level und kann im Prinzip das meiste, was ohne JavaScript funktioniert.

EIn anderer vielversprechender Ansatz wäre es, einen dieser Testing-Browser zu benutzen und Skripte dafür zu schreiben. Da wird tatsächlich mit einer Browserengine die Seite gerendert und JavaScript ausgeführt, nur dass man eine Skriptingschnittstelle hat, wo Klickevents und Formulareingaben gemacht werden. Wer sowas ausprobieren will, sollte sich mal http://phantomjs.org/ ansehen.
 
Nabend, tolle API, Telefonliste abrufen klappt hier schon einwandfrei.

Nun wollte ich mich mal ans Telefonbuch machen (Ziel ist ein XML-formatiertes Telefonbuch für die Cisco IP Phone 79xx Reihe). Leider macht die Fritzbox 7490 (wie auch die 7390) beim Post der Seite an die Box (wenn man Telefonbuch "Sichern" drückt) einen Multipart-Post an http://fritz.box/cgi-bin/firmwarecfg:

Code:
POSTDATA =-----------------------------1115724223387
Content-Disposition: form-data; name="sid"

978636bc40491c6c
-----------------------------1115724223387
Content-Disposition: form-data; name="PhonebookId"

0
-----------------------------1115724223387
Content-Disposition: form-data; name="PhonebookExportName"

Telefonbuch
-----------------------------1115724223387
Content-Disposition: form-data; name="PhonebookExport"


-----------------------------1115724223387--

So wie ich das sehe, ist die API dafür nicht vorbereitet, oder? Möchte nur vermeiden, das Rad mehrfach zu erfinden...


Grüße!
 
Zuletzt bearbeitet:
Hmm, gute Frage, habe noch nie ein Multipart-POST mit CURL gesendet, aber vorbereitet ist die API dafür erst mal nicht. Frage mich auch, warum AVM das so macht. Aber die werden ihre Gründe haben. Und wenn es nur das Verkomplizieren von Drittanbieter-Zugriff geht...
 
Hallo zusammen,

ich habe diese API samt php auf meinem RasPi, auf dem FHEM läuft, installiert. Ich möchte mittels der API meine Telefone klingeln lassen. Meine user.conf sieht so aus
Code:
<?php
if ( !isset($this->config) )
{
  die(__FILE__ . ' must not be called directly');
}

####################### central API config ########################
# notice: you only have to set values differing from the defaults #
###################################################################

# use the new .lua login method in current (end 2012) labor and newer firmwares (Fritz!OS 5.50 and up)
$this->config->setItem('use_lua_login_method', true);
#$this->config->setItem('use_lua_login_method', false);
# set to your Fritz!Box IP address or DNS name (defaults to fritz.box), for remote config mode, use the dyndns-name like example.dyndns.org
$this->config->setItem('fritzbox_ip', '192.168.0.1');

# if needed, enable remote config here
#$this->config->setItem('enable_remote_config', true);
#$this->config->setItem('remote_config_user', 'test');
#$this->config->setItem('remote_config_password', 'test123');

# set to your Fritz!Box username, if login with username is enabled (will be ignored, when remote config is enabled)
$this->config->setItem('username', 'name');

# set to your Fritz!Box password (defaults to no password, will be ignored, when remote config is enabled)
#$this->config->setItem('password', false);
$this->config->setItem('password', 'xxxxxx');

# set the logging mechanism (defaults to console logging)
$this->config->setItem('logging', 'console'); // output to the console
#$this->config->setItem('logging', 'silent');  // do not output anything, be careful with this logging mode
#$this->config->setItem('logging', 'tam.log'); // the path to a writeable logfile

# the newline character for the logfile (does not need to be changed in most cases)
$this->config->setItem('newline', (PHP_OS == 'WINNT') ? "\r\n" : "\n");


############## module specific config ###############

# set the path for the call list for the foncalls module
$this->config->setItem('foncallslist_path', __DIR__ . '\foncallsdaten.csv');

Leider klappt das nicht. Ich erhalte auf der RasPi-Konsole die Fehlermeldung
PHP Fatal error: Call to undefined funktion curl_init() in /opt/fhem/fritzbox_api/fritzbox_api.class.php on line 180

Ich habe schon Login, user und password variiert, aber ohne Erfolg. kann mir jemand sagen, was ich da falsch mache?

Vielen Dank im Voraus und viele Grüße

DK9JH
 
Zuletzt bearbeitet:
Hallo DK9JH,

Dir fehlt das CURL-Modul für PHP. Ich weiß gerade nicht, was da für eine Distribution üblich ist, aber wenn das ein Raspbian ist, musst Du das entsprechende Pakete über die Paketverwaltung installieren. Bei Ubuntu heißt das php5-curl.

Liebe Grüße,
spackmat
 
Hallo spackmat,

nach einem erforderlichen Update des RasPi und Installation von php5-curl klappt alles. Jetzt kann ich meine 6360 direkt ansprechen und die Telefone klingeln lassen :D. Nun kann ich daran gehen, meine 7170 zu deaktivieren.

Vielen Dank für die Hilfe und schönen Abend noch

DK9JH
 
Hallo zusammen,

kann man mittels der API auch den Callmonitor ein/aus schalten und vielleicht auch den HANGON-Befehl übermitteln?
Die Telefone klingeln mittels ring_phone bzw. call-phone, wenn die Hausklingel betätigt wird. Nun möchte ich das Klingeln verkürzen, indem ich den Befehl HANGON hinterher schicke.
Mannchmal funktioniert das Klingeln aber nicht, weil in der Box der CallMonitor nicht aktiviert ist. Dann muss ich dies erst mittels Telefon #96*5* durchführen. Gerne würde ich das vorsorglich 1x am Tag bzw. beim Start der fhem.cfg automatisch machen.

Ich würde mich freuen, wenn mir jemand einen Tipp geben würde. Vielen Dank im Voraus

DK9JH
 
Zuletzt bearbeitet:
Ich vermute, dazu muss man die Box über SIP ansprechen, das kann die API meines Wissens nach nicht. Meines Wissens nach, weil es durchaus sein kann, dass man solche SIP-Spezifika auch irgendwie über das Webinterface machen kann, aber das glaube ich eher nicht.
 
Danke spackmat,

Ich hatte nämlich gesucht und nichts gefunden. mr.smiley hat im Beitrag #106 etwas vorgestellt, was er in "autoit" programmiert hat und das auch HANGON beinhaltet. Deshalb dachte ich, dass es evtl. sowas auch in php gäbe.

Herzlichen Dank jedenfalls für die Antwort und schönen Sonntag noch

DK9JH
 
Habe mir den Code davon nicht angesehen. Aber wenn das da geht, geht es vermutlich auch mit PHP. Das müsstest Du entsprechend portieren.
 
So, ich hab's geschafft. :DIch habe das Skript fritzbox_ring_phone.php zu fritzbox_ring+hangon_phone.php umgebaut. Damit kann man das (die) Telefon(e) für eine bestimmte Zeit klingeln lassen. Nach dieser Zeit wird der Befehl ATH0 = HangOn gesendet.
Code:
<?php
$dial = '**9'; // set to the number to dial
// init the output message
$message = date('Y-m-d H:i') . ' ';
try
{ 
  // load the fritzbox_api class
  require_once(__DIR__ . '/fritzbox_api.class.php');
  $fritz = new fritzbox_api();
  
  // update the setting Tel-Nr
  $formfields = array(
    'telcfg:command/Dial'      => $dial,
  );
  $fritz->doPostForm($formfields);
  $message .= 'Phone Nr ' . $dial . ' ringed ';
  
   // 10 Sek. warten
  sleep (10);

 $dial = 'ATH0'; // set to HangOn to dial
  
  // update the setting HangOn
  $formfields = array(
    'telcfg:command/Dial'      => $dial,
  );
  $fritz->doPostForm($formfields);
  $message .= 'and HangOn';
}
	
catch (Exception $e)
{
  $message .= $e->getMessage();
}

// log the result
if ( isset($fritz) && is_object($fritz) && get_class($fritz) == 'fritzbox_api' )
{
  $fritz->logMessage($message);
}
else
{
  echo($message);
}
$fritz = null; // destroy the object to log out
?>

Die gerufene Telefon-Nr. und die Klingelzeit können nicht als Parameter übergeben, sondern nur innerhalb des Skripts eingetragen werden.

Falls jemand Verbesserungsvorschläge hat, immer her damit oder selbst einfügen ;) Bitte nicht verhauen, das ist mein erstes und auch nur geändertes php-Skript.

Viele Grüße

DK9JH
So, jetzt hab ich's auch geschafft, die Datei anzuhängen. Die Endung .txt muss natürlich in .php geändert werden.
 

Anhänge

  • fritzbox_ring+hangon_phone.txt
    989 Bytes · Aufrufe: 62
Zuletzt bearbeitet:
Sieht ja schon mal sinnvoll aus.
 
gibt es die Möglichkeit mit der API einen Reconnect zum Internet durchzuführen?
 
Ja, das kann man machen. Es gibt in der Oberfläche einen Knopf dafür (bei FRITZ!OS 6 im Online-Monitor). Offenbar löst das mehrere Requests aus, muss man mal schauen, ob man das so ohne Tricks hinbekommt. Der erste AJAX-Request nack Klick auf den Button lautet

GET /internet/inetstat_monitor.lua?sid=AKTUELLESID&useajax=1&action=disconnect&xhr=1&t1385741568156=nocache

Ich vermute mal, dass das auch ohne AJAX irgendwie geht. Reconnect-Scripte für die fritz-box gibt es einige, ich vermute, da kann man sich den genauen Weg einfach abgucken. Gehen tut das auf jeden Fall, der jDownloader zum Beispiel reconnectet meine Box problemlos.

Liebe Grüße,
spackmat
 
Hallo,

zu Thema Türklingel habe ich nun folgendes realisiert:

1. Türklingel hat einen eigenen Klingelton
2. die zu Klingelnden Telefone können frei gewählt werden.


Punkt 1 der Klingelton.
Auf der Fritzbox unter Telefonie -> Telefoniegeräte das DECT Gerät bearbeiten und dann auf Klingeltöne
Der Klingelton für interner Anruf ist der Klingelton für die Klingel
Der Klingelton für wichtige Person ist der Klingelton für interne Gespräche

Nun muss das erste Telefonbuch mit der Standardbezeichnung Telefonbuch bearbeitet werden.
Hier tragen wir nun nocheinmal unsere internen Nummern z.B. **610 **611 ... u.s.w. ein und kennzeichnen die einträge als "wichtige Person"

Wenn wir nun intern telefonieren klingelt dass Telefon des internen Teilnehmers immer mit dem Klingelton der als wichtige Person festgelegt worden ist.
Interne Anrufe - also von unserem Skript klingerln mit dem Klingelton den wir für unsere Klingel definiert haben (interner Klingelton)

Punkt 2

im Skript haben wir folgende Zeile

$dial = '**9'; // set to the number to dial

hier können wir nun folgendes festlegen:
bekannt ist **9 ruft alle internen Teilnehmer oder **610 z.B. das erste DECT Mobielteil
Ich wollte nun aber dass nur zwei meiner 5 Mobilteile klingeln.
Dann sieht die Zeile folgendermaßen aus:

$dial = '**614#613'; // set to the number to dial

Nun klingeln bei mir nur diese zwei Mobilteile .

Ich hoffe es kann jemand gebrauchen.

Gruß Frank
 

Zurzeit aktive Besucher

Neueste Beiträge

Statistik des Forums

Themen
244,948
Beiträge
2,221,401
Mitglieder
371,720
Neuestes Mitglied
thefirsttimeforme
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.