AVM-Fritzbox meldet Anrufe über Alexa

Alexa macht’s möglich: Sprachunterstützung bei der Telefonie mit der Fritzbox

"Anruf von Mutti!" Alexa teilt bei einem Festnetzanruf sofort mit, wer sich dort meldet. Ist doch praktisch! Vielleicht kann man sich den Gang zum Telefon sparen oder sich schon mal freuen über den Anruf, oder man weiß gleich, wer zum Telefon gehen sollte.

Einen ersten Vorgeschmack auf Sprachunterstützung bei der Telefonie mit der AVM-Fritz.box bietet ein kleines Projekt, das sich mit ioBroker leicht umsetzen lässt.

Die Ansage des Anrufernamens ist übrigens eine Funktion, die sich auch mit dem Zusatzgerät Echo Connect von Amazon realisieren lässt. Das Gerät kann natürlich noch viel mehr, aber es kostet extra. Dabei hat es den Nachteil, dass man seine Kontaktdaten offenlegen muss. Bei der hier vorgestellten Lösung braucht man Amazon nicht mehr den Zugriff auf das eigene Telefonbuch zu überlassen. Die Kontaktdaten bleiben im eigenen Netzwerk.

Voraussetzungen

Es geht nur mit Festnetztelefonie über die AVM-Fritzbox und natürlich Amazon Alexa im heimischen Netz. Als Bindeglied wird ioBroker eingesetzt. ioBroker kann auf vielen Geräten installiert werden. Empfehlenswert ist ein Raspberry Pi (vor allem wegen des Stromverbrauchs, wenn das Gerät in Vollzeit eingesetzt wird). Zum Testen geht’s aber auch mit dem eigenen Desktop (mit Windows, macOS, diversen Linux-Systeme).

Mehr zu ioBroker

Neben den standardmäßig eingerichteten ioBroker-Adaptern müssen auch Instanzen des ioBroker-Adapters TR 064 für die Unterstützung der Fritzbox und des Adapters Alexa2 für das Echo-Gerät eingerichtet werden. Für unsere kleinen Javascript-Programme muss natürlich auch eine Instanz des Adapters der Script-Engine angelegt sein. Alle genannten Adapter werden bei der Standard-Installation von ioBroker mitgeliefert.

Der Adapter TR 064 ist strait forward einzurichten. Im Konfigurations-Fenster sind zunächst die Logindaten für den Zugriff auf die Fritzbox anzugegeben. Außerdem müssen die Checkboxen für "Anrufmonitor aktivieren" und "Verwende Telefonbuch (Namensauflösung)" ausgewählt sein.

Auf der AVM-Fritzbox muss noch der Callmonitor eingeschaltet und der Port 1012 freigeschaltet werden. Das geschieht durch Wählen von #96*5* auf einem angeschlossenen Telefon.

Mehr zu dem ioBroker Adapter TR 064 für die Fritzbox

Die Einrichtung des Adapters Alexa2 ist wegen des Session-Cookies etwas tricky, aber bei mir hat es mit der YouTube-Anleitung von SchimmerMediaHD geklappt.

Mehr zu dem ioBroker-Adapter Alexa2 für Amazon-Echo-Geräte

Los geht’s

Nachdem die Voraussetzungen vorhanden sind, erstellen wir im ioBroker unter dem Tab "Skripte" ein neues Javascript-Programm "jsFritzboxTelefonie".

Ein Unterverzeichnis von "common" oder "common" selbst auswählen und "+" anklicken. Als Typ "Javascript" auswählen.

Schauen wir uns den TR-0654-Adapter an:

Alle relevanten Daten für einen eingehenden Anruf finden sich in
"tr-064.0.callmonitor.inbound.json" (blauer Balken).

In der Objekteigenschaft "tr-064.0.callmonitor.inbound.json" ist die String-Darstellung des Inbound-Objektes enthalten:

{"caller":"0123456789", "callee":"9876543", "_type":"inbound", "callerName":"Falko", "calleeName":""}

Der Adapter liefert also – durch einen internen Zugriff auf das Fritzbox-Telefonbuch – direkt den Namen des Anrufers, und zwar im Feld "callerName". Nun brauchen wir nur noch Alexa zur Sprachausgabe zu bewegen.

Mit unserem Javascript erstellen wir eine Subskription, die auf einen Anruf, d.h. eine Änderung der o.g. Objekteigenschaft wartet.

on({id: 'tr-064.0.callmonitor.inbound.json'/*json*/, change : "any"}, function(json) { 

Um auf den Inhalt des Inbound-Objekts einfach zuzugreifen, wandeln wir den übergebenen JSON-String in ein Objekt um:

        var jsonObj = JSON.parse(json.state.val); 

Wir erhalten den Anrufernamen aus unserem Telefonbuch:

        var callerName = jsonObj.callerName;

Wenn der Anrufername leer ist, konnte er nicht ermittelt werden. Das heißt, entweder steht der Anrufer nicht im Telefonbuch steht oder er hat keine Telefonnummer mitgesendet.

        if (callerName === "") {
callerName = "Unbekannt";
}

Nun braucht nur noch der gewünschte Text ausgegeben zu werden. Dazu wird in der ioBroker-Objektansicht der Alexa2-Instanz die Liste der Echo-Devices aufgeklappt. Hier lesen wir nun die "AlexaId" ab, das heißt, die Id, des für die Sprachausgabe zu verwendenden Echo-Gerätsn. Das Ausführen einer Sprachausgabe auf dem Geräte erfolgt durch Setzen von "Commands.speak"

    setState(
"alexa2.0.Echo-Devices.<alexaId>.Commands.speak",
"Anruf von " + callerName
);
});

Hier noch mal das Javascript-Programm vollständig. Für <alexaId> ist natürlich die tatsächliche Alexa-Id einzusetzen.

/************* Anruf ansagen ***************/

on({id: 'tr-064.0.callmonitor.inbound.json'/*json*/, change : "any"}, function(obj) {
var jsonObj = JSON.parse(obj.state.val);
if (jsonObj.callee.endsWith("9876543")) {
var callerName = jsonObj.callerName;
if (callerName === "") {
callerName = "Unbekannt";
}
setState(
"alexa2.0.Echo-Devices.<alexaId>.Commands.speak",
"Anruf von " + callerName
);
}
});

Falls man mehrere Telefonnummern hat, kann es Sinn machen, nach den Telefonnummern zu unterscheiden und nur bei bestimmten Telefonnummern den Anrufer anzusagen. So ist es oben umgesetzt.

Vor dem ersten Test nicht vergessen, im Skript-Editor von ioBroker das neue Programm durch Betätigen von "Skript ausführen" (rotes Dreieck) zu aktivieren. Dann wird das Programm sofort nach jedem Speichern ausgeführt.

Wenn dir dieser Artikel geholfen hat,
deine eigene Lösung zu verwirklichen,
dann lass' es mich wissen.
Schreibe einen kurzen Kommentar.
Vielen Dank!

Auf den nächsten Seiten findest du die Updates "Anrufernamen wiederholen" und "Gesperrte Rufnummern nicht ansagen".

Autor: Rai

jahrelanger Homematic-Benutzer, öffnet sich mit Hilfe von Raspberry Pi und ioBroker für Neues im Internet of Things

16 Gedanken zu „AVM-Fritzbox meldet Anrufe über Alexa“

  1. Kann es sein das dieses Skript nur bei Amazon Devices funktioniert. Habe eine Bose Soundbar mit Alexa, diese reagiert aber leider nicht auf den Anruf, im iobroker bekomme ich unter dem Device aber die Ausgabe angezeigt.

    Vllt hat ja jemand eine Lösung für mich.

    Danke

  2. Hallo, vielen Dank für das tolle Skript und vor allem für die Ausfühliche Erläuterung. Leider erhalte ich im Log folgende Fehlermeldung und es kommt nicht zu einer Sprachausgabe beim ausgewählten Echo-Gerät. Ich habe im Skript die ID des Gerätes anepasst.
    [39m: javascript.0 (18793) script.js.common.Alexa.Ausgabe_von_Name_wenn_Anruf_auf_Festnetz: setForeignState(id=alexa2.0.Echo-Devices.XXXX.Commands.speak, state="Anruf von XXX XXXX") – wurde nicht ausgeführt, während der Debug-Modus aktiv ist

    Woran kann das liegen?

  3. Script No.1 läuft auf Anhieb, aber Script No. 2 und No. 3 wird die Variable CallerName nicht mehr modifiziert, sodass die Ausgabe auf der Alexa lediglich als "Anruf von" ertönt . Ich suche mir einen Wolf, aber finde den Fehler nicht. Bitte um Hilfe.

  4. Hallo,
    damit Alexa wieder den Anrufernamen ansagt, musste ich bei dem Script auf der zweite Seite folgendes ändern.

    Alt: var callerName = jsonObj.callerName;
    Neu: callerName = jsonObj.callerName;

    Wenn man möchte das bei übetragener, aber unbekannter Nummer, die Nummer angesagt wird.
    Kann man noch folgende Änderung durchführen.

    if (callerName === "") {
    callerName = jsonObj.caller;
    }

    Danke für den tollen Artikel hat prima funktioniert.

    Gruß Sven

  5. Ich habe es auch ausprobiert und es ist easy in das System einzupflegen – vielen Dank dafür.

    Was cool wäre, wenn es Zeitgesteuert wäre, oder die Ansage nur kommt, wenn jemand zuhause wäre, oder die Ansage nur bei bestimmten Anrufern kommt, also nicht bei jedem Anruf.

  6. Hallo,
    ich habe das Programm etwas auf meine Ansprüche angepasst. Vielleicht hilft es dem einem oder anderem weiter. hier mein Code:
    (Bereiche mit ********* müssen mit den eigenen Werten ersetzt werden.)

    /* Anruf ansagen */
    var callerName = "";
    var caller = "";
    var counter = 0;

    on({id: 'tr-064.0.callmonitor.inbound.json’/*json*/, change : "any"}, function(obj) {
    var jsonObj = JSON.parse(obj.state.val);
    if (jsonObj.callee.endsWith("*******")) { //nur Anrufe, die Aufdiese nummer eingehen werden angesagt
    callerName = jsonObj.callerName;
    if (callerName === "") { //Hat ein Anrufer keinen "Namen", dann ist er nicht im Telefonbuch
    callerName = "unbekannter Nummer"; //also wird der Name mit "unbekannter Nummer" ersetzt
    }
    caller = jsonObj.caller; //Telefonnumer laden
    counter = 0; //counter vorm Aufruf der Funktion auf 0 setzen, damit der counter nicht "überläuft"
    setState( "alexa2.0.Echo-Devices..*****************..Commands.speak-volume", 50 ); //Lautstärke von Alexa auf 5 setzen
    anruferAnsagen() ; //Aufruf der Funktion
    }
    });

    function anruferAnsagen() {
    if (getState('tr-064.0.callmonitor.ringing’/*ringing*/).val && counter++ < 3) {

    if (caller === "") { //Hat der Anrufer keinen Name, dann ist es ein unterdrückter Anrufer
    setState(
    "alexa2.0.Echo-Devices.*****************.Commands.speak",
    "Unterdrückter Anruf" );
    }
    else{ //Hat der Anrufer einen Namen, so wird dieser vorgelesen
    setState(
    "alexa2.0.Echo-Devices..*****************..Commands.speak",
    "Anruf von " + callerName );
    }

    setTimeout(anruferAnsagen, 6000); //Timeout aufrufen
    }
    }

    1. Hallo Maik, die AlexaID findet du am einfachsten in der ioBroker-Objektansicht der Alexa2-Instanz, wenn du die Liste der Echo-Devices aufgeklappst. Ich habe den Text oben etwas angepassst. Ist dann hoffentlich verständlicher. Grüße Rai

      1. Danke für die schnelle Antwort und das gute Programm. Damit hast du mir echt viel "try and error – Arbeit" erspart. Danke! 🙂
        Ich musste allerdings noch eine paar Änderungen vornehmen, da es bei mir nicht direkt lief.
        Der Counter für die wiederholte Ansage wird nur bei Skript neustart zurück gesetzt. Wenn ich zwei mal nacheinander mit der selben Nummer angerufen hatte und die drei Ansagen vom Counter durchgelaufen waren, schwieg meine Alexa beim nächsten Anruf. Hierfür habe ich den Counter vorm Funktionsaufruf zurückgesetzt.
        Zudem kam mein ioBroker mit dem zweiten mal "var" vor der Variable "callerName" nicht zurecht. Das habe ich raus genommen.

        Als kleine Erweiterung habe ich die Lautstärke des Echos für die Ansage auf 60% festgesetzt. So hört man die Ansage auch wenn zuvor die Lautstärke auf einem kleinem Level eingestellt war.

        Hier der abgeänderte Code:

        /************* Anruf ansagen ***************/
        var callerName = "";
        var counter = 0;

        on({id: 'tr-064.0.callmonitor.inbound.json’/*json*/, change : "any"}, function(obj) {
        var jsonObj = JSON.parse(obj.state.val);
        if (jsonObj.callee.endsWith("9876543")) {
        callerName = jsonObj.callerName;
        if (callerName === "") {
        callerName = "Unbekannt";
        }
        counter = 0;
        setState( "alexa2.0.Echo-Devices.ABCDEFG123456.Commands.speak-volume", 60 );
        anruferAnsagen() ;
        }
        });

        function anruferAnsagen() {
        if (getState('tr-064.0.callmonitor.ringing’/*ringing*/).val && counter++ < 3) {
        setState(
        "alexa2.0.Echo-Devices.ABCDEFG123456.Commands.speak",
        "Anruf von " + callerName
        );
        setTimeout(anruferAnsagen, 6000);
        }
        }

    1. Hallo Sven, schön, dass dir der Artikel gefällt. Wenn du das umgesetzt hast, bitte schreib mal, wie es war, ob Probleme aufgetreten sind usw. Gruß Rai

  7. Hallo, die Idee ist nicht schlecht. Funktioniert wie beschrieben.
    Prob bei mir: In der Fritze gesperrte Anrufer werden auch angesagt. Kann man da was machen???

    1. Danke für den Hinweis. Ich habe den Artikel ergänzt. Jetzt können gesperrte Anrufer herausgefiltert werden. Bin gespannt auf deine Rückmeldung!

Schreibe einen Kommentar zu Maik Antworten abbrechen

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