Fritz!Box Anrufe auswerten

Die Fritz!Box ist ein Wunderding der Technik und fast genauso toll wie digitalSTROM. Da liegt es nahe, beide Welten miteinander zu verbinden. In meinem Zuhause werden Telefonanrufe optisch signalisiert. Und akustisch: Meine SONOS sagt mir direkt, wer gerade anruft – ohne auf das Display des Telefons schauen zu müssen. Leider kann der digitalSTROM Server die Verbindung zur Fritz!Box noch nicht direkt herstellen, es ist weitere Serverhardware nötig.

Achtung: Ab dSS Version 1.10.4 wurde ein neues Sicherheitsfeature integriert. Die nachfolgende Anleitung funktioniert daher nur bis 1.10.3. Ich passe die Anleitung in Kürze an! Eine erste Lösung gibt es unten in den Kommentaren.

Ich brauche

Zunächst ein Hinweis: Dieser Artikel ist keine Schritt-für-Schritt Anleitung für absolute Laien. Man sollte schon wissen, wie man auf Linuxsystemen Software installiert und Dateien editiert.

Als Server kann ein beliebiges linuxbasiertes System verwendet werden, zum Beispiel ein kleiner Raspberry Pi wie dieser für 29,99 EUR. Auf diesem Server muss dann listen2fritz installiert werden. Dieses Tool verbindet sich mit der Fritz!Box und wertet fortan alle Anrufe aus.

Konfiguration

Damit das funktioniert, muss auf der Fritz!Box zunächst der Port freigeschaltet werden, welcher die Anrufe signalisiert. Das erfolgt etwas unkonventionell mit einem klassischen Analogtelefon, welches an der FON Buchse der Fritz!Box angeschlossen wird. Damit muss man dann folgende Folge wählen: #96*5*. Zum Deaktivieren (der Vollständigkeit halber, man wird es nie tun) wählt man #96*4*.

Nun wird listen2fritz konfiguriert. Eine Standardkonfiguration findet sich unter /etc/listen2fritz.conf. In dieser Datei ist folgende Minimalkonfiguration nötig, um ein Skript bei jedem Anruf aufzurufen:

[fritzboxfon]
        host=192.168.178.1
        port=1012

[phonenumber]
        prefix_city=030
        prefix_state=+49
        nonumber=KEINE NUMMER

[notify:script]
        script=/dS/fritzcall.sh
        parameters=%T %c
        call=ring

[log:file]
        file=/var/log/listen2fritz.log
        format=%W;%T;%P;%l;%D;%c;%a\n

Bei prefix_city bitte die eigene Ortsvorwahl eintragen. Bei einem Anruf wird das Skript /dS/fritzcall.sh aufgerufen.

Verbindung zu digitalSTROM

Das Skript /dS/fritzcall.sh muss nun noch angelegt werden. Das Skript kann in der einfachsten Version so aussehen:

#!/bin/sh
if [ $1 = "L2F_EVENT_TYPE_RING" ] ; then
   wget --user=dssadmin --password=dssadmin --no-check-certificate -O - -q "https://192.168.178.10/json/apartment/callScene?sceneNumber=73"
   echo `date` $2 >> /var/log/anrufliste.log
fi
sleep 2

Hier muss das dSS-Passwort richtig eingetragen und die IP Adresse des dSS angepasst werden. Das Tool wget sorgt dann für den passenden Aufruf. Erfolgt nun ein Anruf, wird im digitalSTROM die Aktivität “Klingeln” (Scene 73) aufgerufen. Damit können zur optischen Signalisierung die Leuchten blinken. Das kann man bequem über den Konfigurator einstellen.

Schwiegermama oder Schwester?

Noch interessanter wird es, wenn man die Nummer des Anrufers auswertet. Damit kann sogar die SONOS sagen, wer gerade anruft. Um das zu lösen, werden verschiedene benutzerdefinierte Handlungen angelegt:

UDA Anrufer

Wichtig ist, dass auch die Handlung für “Telefonanruf unbekannt” angelegt wird. Als Auszuführende Aktivität wird ein URL-Aufruf mit http:// (also leerer Adresse) eingestellt. Damit dient diese Handlung nur als Platzhalter ohne weitere Funktion. Sie kann jedoch zur Verknüpfung in den anderen Apps verwendet werden.

Zum Aufrufen der Handlungen aus unserem Skript benötigen wir die IDs der Handlungen. Diese sind einfach über den Browser zu ermitteln. Eine Handlung bitte anklicken, dann im Firefox oder Google Chrome STRG+I (großes i) drücken und anschließend Netzwerkanalyse (Firefox) oder Network (Chrome) auswählen. Nun klickt man auf Handlung testen. Der Webaufruf dafür wird ausgeführt und in der Netzwerkanalyse angezeigt, inklusive der ID:

UDA ID

Die ermittelten IDs aller Handlungen bitte notieren.
Das Skript /dS/fritzcall.sh wird nun etwas erweitert, so dass es so aussieht:

#!/bin/sh
if [ $1 = "L2F_EVENT_TYPE_RING" ] ; then
   wget --user=dssadmin --password=dssadmin --no-check-certificate -O - -q "https://192.168.178.10/json/apartment/callScene?sceneNumber=73"
   Handlung=1406470919;  #Unbekannte Rufnummer
   case $2 in
      "030123456")  Handlung=1406471544;;  #Schwiegermutter
      "030987654")  Handlung=1406471613;;  #Schwester
   esac
   echo `date` $2 $Handlung >> /var/log/anrufliste.log
   wget --user=dssadmin --password=dssadmin --no-check-certificate -O - -q "https://192.168.178.10/json/event/raise?name=highlevelevent&parameter=id%3D$Handlung"
fi
sleep 2

Auch hier bitte Passwort, IP-Adressen, Telefonnummern und Handlung IDs anpassen. Die Liste der Handlungen kann beliebig erweitert werden.

SONOS

Nun muss SONOS noch passend eingestellt werden. Dazu in der SONOS dSS-App im Tab Aktivitäten eine neue Aktivität anlegen. Auslöser ist jeweils die benutzerdefinierte Handlung, bei Was wird gespielt kann man eine Sprachausgabe definieren. Damit sich die Sprachausgabe nicht mit dem Klingelsignal überlagert, welches in unserem Skript zuallererst ausgelöst wird, bitte das Aktiv-Häkchen für die Klingel-Aktivität in der SONOS App entfernen, oder den wget-Aufruf für die Klingel-Szene aus dem Skript entfernen.

Logdateien und Grenzen

Da bei den obigen Beispielen keine dSS Sessions verwaltet werden, können bei zu häufigem Aufruf die Sessions ausgehen, das Kommando wird dann nicht ausgeführt. Der dSS verwaltet etwa 30 Sessions (einige werden intern verwendet) und jeder wget Aufruf erzeugt eine neue Session. Jede Session ist 3 Minuten gültig. Werden also innerhalb von 3 Minuten viele Anrufe verarbeitet, stößt der Mechanismus an seine Grenzen.

Es gibt zwei relevante Logdateien, welche die Anrufe protokollieren: /var/log/listen2fritz.log wird direkt von dem listen2fritz Tool angelegt, sowie /var/log/anrufliste.log, welches die verarbeiteten Anrufe aus unserem Skript mitprotokolliert.

Erfolgreich?

Ich wünsche viel Erfolg. Wenn Sie das Skript erfolgreich eingerichtet haben, bitte ich um einen Kommentar unter diesem Artikel. Danke.

21 Gedanken zu „Fritz!Box Anrufe auswerten

  1. Klingt toll und nach viel Bastelei! Meine Erfahrung mit DS und Sonos ist, dass gerade bei benutzerdefinierten Handlungen eine ziemliche Verzögerung gegeben ist, bis Sonos zur Sprachausgabe kommt.
    Nicht, dass der Anrufer schon aufgelegt hat, bis Sonos meldet…. , dann hätten wir eher eine Ansage für Anrufe in Abwesenheit. 🙂

    PS: hoffe immer noch, dass Sonos mir mal meldet wenn die Waschmaschine fertig ist. (Parameter Zwischenstecker ?)

    • Hallo Ingo, in Kürze erscheint die neue SONOS-App mit deutlich schnellerer Ausführungszeit. Prinzipiell sind benutzerdefinierte Handlungen das schnellste was es gibt 😉
      Bei mir zu Hause funktioniert die Ansage prima.

      SONOS und Waschmaschine: Der aktuelle Zwischenstecker kann die starken Stromaufnahmeschwankungen von Waschmaschinen leider nicht sinnvoll auswerten. Eventuell hilft da ein Trick, ich mache mir mal Gedanken.

      • Hallo,

        habe da eine Lösung, wenn auch auf den ersten Blick etwas kompliziert aber ohne besondere Script-Programmierkenntnisse:
        Grundsätzlich interessiert mich der Stromverbrauch von Waschmaschine und Trockner, daher habe ich von der Firma Eltako kleine Stromzähler (1 TE breit) mit S0-Port eingebaut. Dies habe ich für insgesamt 4 Stromkreise gemacht (zusätzlich Treppenhaus und Heizung). Zur Auswertung habe ich eine Siemens Logo verbaut. Nun werte ich die S0 Signale mittels Programm auf der Logo so aus, das mir die Logo zum einen die Zählerstände wiedergeben kann auch über das Netzwerk und sie erkennt anhand des aktuellen Stromverbrauchs, wann die Waschmaschine gestartet wurde, bzw. wann der Stromverbrauch so gering ist, das die Maschine fertig ist. Das habe ich ebenso für den Trockner gemacht und auf die Ausgänge der Logo gelegt, an der eine Tasterklemme 4fach Ihren Dienst tut. Theoretisch kann die Logo so 16 Zustände an dS übergeben. Praktisch habe ich nur die Waschmaschine/Trockner fertig Meldung realisiert und bekomme eine Push Nachricht, wenn die Heizungspumpe aus ist.

  2. Hallo
    ich weiss, es steht da, das es keine schritt für schritt Anleitungen für Anfänger ist.
    Ein blutiger Anfänger bin ich eigentlich auch nicht, aber, da es listen2fritz nicht als paket gibt, bin ich total aufgeschmissen.
    Könntest du mir vielleicht doch eine Hilfestellung geben.
    die listen2fritz-0.9.6.tar.gz habe ich bereits runter geladen und auf den Raspi übertragen. Doch nun verliessen sie mich.

    • Hallo Farmer,
      ja, ok. Also
      Entpacken geht mit: gzip -dc listen2fritz-0.9.6.tar.gz | tar xfv –
      Anschließend in das Verzeichnis wechseln. Dann das übliche:
      ./configure
      make
      make install

      Aber das steht auch auf der Webseite beschrieben.

      Ein bisschen aufpassen muss man später, wenn man möchte, dass der Dienst zuverlässig gestartet wird, wenn der Raspi startet. Dafür gibt es die rc Startup Skripte, die man – je nach System – eventuell noch anpassen muss.

      • Hallo
        Danke
        Dann hab ich mich eigentlich gar nicht so blöd gestellt.
        entpackt habe ich es,
        ./configure hat auch noch funktioniert
        aber bei make kommt die Fehlermeldung:
        keine Targets angegeben und keine >>make<<Steuerdatei gefunden. Schluss

          • Servus
            das war der nötige Wink mit der Zaunlatte.
            Jetzt funzt die Installation.
            So gings:
            tar xzf ~/listen2fritz-m424-0.9.6.tar.gz
            $ apt-get install libreadline6-dev
            $ ./configure
            $ make

            Kann es sein das in deiner Anleitung für die listen2fritz.conf ein fehler gehuscht ist:
            du beschreibst folgende änderung:
            [notify:script]
            script=/dS/push.sh
            parameters=%T %c
            call=ring

            das aufzurufende script ist doch /ds/fritzcall.sh und nicht /ds/push.sh

            ausserdem musste ich in script fritzcall.sh die telefonnummern mit +49 angeben, obwohl im listen2fritz.con die landeswahl angegeben habe.

            jetzt geht es.

            Danke Dir für die Hilfe

          • Super, freut mich, dass es bei Dir nun funktioniert! Du hast recht, ich hatte den falschen Dateinamen angegeben. Ist korrigiert. Das mit der Landesvorwahl wundert mich etwas. Ist das denn in der Fritz!Box auch richtig eingetragen?

          • ist in der Fritz!Box richtig eingetragen, zumindest so wie es laut Hilfe eingetragen werden soll (0049).

            Kann die SONOS-App eigentlich Just in Time Text in Sprache, wäre ja gut, wenn die im Telefonbuch gespeichernden Namen direkt ausgegeben werden könnten..

            Ist aber auch so schon ein absolutes Cooles Gimik, da guckt jeder Besuch dumm aus der Wäsche.

          • Nein, Just in time kann SONOS nicht, das spielt nur Audiodateien ab. Diese werden in unserer Cloud erzeugt, wenn man über unsere App Texte eingibt.

  3. Hallo noch mal.
    in der nächsten Firmware der Fritz!Box soll es nicht mehr möglich sein, den Telnetport aktiv zu schalten. Dieser wird aber doch gebraucht, damit der Raspi auf die FB zugreifen kann, gibt es da trotzdem eine möglichkeit??

    • Ja, das ist richtig, habe ich bisher nicht bedacht 😉
      Ich werde die Anleitung so anpassen, dass ein Application-Token und Port 8080 verwendet wird. Ich bitte um ein paar Tage Geduld.

      • Hallo,

        ich habe mich als blutiger Raspberry Pi Anfänger mal an die Problematik rangetraut und bin nach einer Tagesarbeit zur Lösung gekommen. Puh was für ein Erfolgserlebnis. Und so geht’s:

        Folgendes Script als Datei gettoken.sh im Verzeichnis /dS erstellt: (dssip, RaspberryPI und password entsprechend ersetzten)

        #!/bin/sh
        antwort=$(wget –no-check-certificate -qO – “https://dssip:8080/json/system/requestApplicationToken?applicationName=RaspberryPI”)
        antwortr=${antwort##*\:\”}
        apptoken=${antwortr%%\”\}*}
        antwort=$(wget –no-check-certificate -qO – “https://dssip:8080/json/system/login?user=dssadmin&password=password”)
        antwortr=${antwort##*\:\”}
        sestoken=${antwortr%%\”\}*}
        antwort=$(wget –no-check-certificate -qO – “https://dssip:8080/json/system/enableToken?applicationToken=$apptoken&token=$sestoken”)
        echo $apptoken > /var/log/dssapptoken.log
        echo “Apptoken=” $apptoken
        echo “Sestoken=” $sestoken
        echo “Antwort= ” $antwort
        sleep 2

        Das Script muß nur einmalig direkt aus dem Terminal gestartet werden und schon hat der Raspberry ein AppToken zugewiesen bekommen. Als Ausgabe im Terminal sollte der AppToken, darunter der SessionToken und zum Abschluß {OK, true} erscheinen, dann war es erfolgreich. Der Apptoken wird unter /var/log/dssapptoken.log gespeichert.

        Dann muß noch das fritzcall.sh Script angepaßt werden: (auch hier wieder dssip und Rufnummern, sowie EventIDs entsprechend ändern)

        #!/bin/sh
        if [ $1 = “L2F_EVENT_TYPE_RING” ] ; then
        apptoken=$(cat /var/log/dssapptoken.log)
        antwort=$(wget –no-check-certificate -qO – “https://dssip:8080/json/system/loginApplication?loginToken=$apptoken”)
        antwortr=${antwort##*\:\”}
        sestoken=${antwortr%%\”\}*}
        antwortk=$(wget –no-check-certificate -qO – “https://dssip:8080/json/apartment/callScene?token=$sestoken&sceneNumber=73”)
        Handlung=1454528500; #Unbekannte Rufnummer
        case $2 in
        “+49xxxxxxx”) Handlung=1454528434;; #Rufnummer mobil
        “+49xxxxxxx”) Handlung=1454528470;; #Schwiegermutter
        esac
        antwort=$(wget –no-check-certificate -qO – “https://dssip:8080/json/event/raise?token=$sestoken&name=highlevelevent&parameter=id%3D$Handlung”)
        echo `date` $2 $Handlung $antwortk $antwort >> /var/log/anrufliste.log
        fi
        sleep 2

        Das Script meldet sich im Falle eines eingehenden Anrufs am Server an, löst die KlingelScene aus und schaut dann nach den Rufnummern um eine entsprechende Handlung auszuführen. Zusätzlich werden im Logfile die Antworten des dSS auf die Scenenaufrufe gespeichert, im normal Fall also 2xmal {OK,true}
        Wer die Zeile mit der KlingelScene entfernen will muß auch dran denken die Variable $antwortk im echo befehl zu entfernen!

        Bestimmt gibt es noch eine bessere Lösung, aber bei mir funktioniert sie gut.

        Viel Spaß damit!

          • Kannst Du gerne übernehmen oder auch verbessern.
            Was ich noch nicht hinbekommen habe ist, das listen2fritz beim Neustart des Raspberry automatisch gestartet wird, hab schon vieles probiert (rcconf, in den rcX Ordnern Datei aktivieren, etc.) aber es will nicht klappen….

            Bei nächster Gelegenheit schaue ich noch ob ich die Anrufe nach MSN unterscheiden kann, denn ich habe einen ISDN Anschluß mit mehreren Nummern und momentan spielt es keine Rolle auf welcher Nummer jemand anruft. So wie ich das gesehen habe übergibt listen2Fritz auch die angerufene Nummer. Für mich würde zu Beispiel eine Meldung reichen bei Anrufen auf einer bestimmten Nummer, während ich bei der privaten Nummer die Anrufer unterscheiden würde. Man könnte auch noch eine separate Datei anlegen wo man die Handlungs IDs und Rufnummern unterscheidet.
            Es gäbe dann auch noch die Möglichkeit einen Handlungsaufruf für die Aktion, das man ein Telefonat beginnt oder beendet, auszuführen.

            Eine Frage habe ich noch: Könnte man sich den Aufruf der KlingelScene im Script nicht sparen und statt dessen die Benutzer definierten Handlungen für die unterschiedlichen Rufnummern auf die Aktion Klingel laufen lassen? Dann könnte man im dSS sogar bestimmen ob bei bestimmten Rufnummern die KlingelScene startet oder nicht.

  4. Hallo Christoph,
    Anbindung der Fritzbox ist eine coole Sache. Würde mir sehr helfen.
    Gibt es denn eine Möglichkeit, dS über die Fritzbox bzw über die dect phones zu steuern ?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Eingabe leider nötig: Time limit is exhausted. Please reload the CAPTCHA.