Hausautomatisierung

Anrufername am Lautsprecher ausgeben

Anrufername über Rückwärtssuche der Telefonnummer am Lautsprecher ausgeben

Um diese wirklich praktische Funktionalität zu bewerkstelligen bedarf es einiger Vorbereitungen. Ich beschreibe hier, wie das System bei mir aufgebaut ist. Grundsätzlich gibt es mehrere Möglichkeiten, das Vorhaben durchzuführen. Die einfachste Variante wäre, direkt am Raspberry Pi für die Haussteuerung einen Lautsprecher per Kabel dranzuhängen und die Ansage dort auszugeben. Jedoch hat dies den Nachteil, dass der Lautsprecher fest verkabelt in der Nähe des Raspberry Pi stehen muss. Sofern das ein Problem darstellt, könnten wir bestimmte Lautsprecher auch per Bluetooth mit dem Raspberry Pi koppeln, wir bräuchten aber dann einen Bluetooth-Dongle. Nicht jeder Bluetooth-Dongle wird am Raspberry erkannt. Gute Erfahrungen habe ich mit diesem hier gemacht:

Demgemäß müssen wir auch überdenken, ob der Bluetooth-Lautsprecher nah genug am Raspberry Pi steht. Falls eine Wand dazwischen wäre oder die Entfernung mehr als 10m beträgt, kommt es definitiv zu Verbindungsproblemen. Deshalb hatte ich diesen ersten Ansatz dann auch verworfen.

Hard-und Software-Voraussetzungen

Zuerst brauchen wir eine Fritzbox. Siehe dazu meinen Artikel.
Desweiteren benötigen wir einen oder zwei Raspberry Pi mit entsprechenden Netzteilen. Hierzu habe ich auch entsprechende Empfehlungen gegeben.
Genauso sollte man sich über die Vernetzung Gedanken machen, ob man die Raspberry Pis per Netzkabel oder per WLAN anbinden möchte. Dafür habe ich hier in meinen Artikeln über die Grundkonfiguration Tipps gegeben:

Ortsunabhängiges Szenario

Mein System zur Sprach- und Soundausgabe besteht aus zwei Raspberry Pi. Mein Haupt-Raspberry, der für meine gesamte Haussteuerung zuständig ist, koppelt sich per Remote-Verbindung über WLAN an einen zweiten Raspberry Pi, der nur die Aufgabe hat, Sprachnachrichten und Soundfiles auszugeben.

Somit brauche ich für den Aufbau meines Szenarios eine Fritzbox, die das Anrufersignal an den Haupt-Raspberry überträgt. Desweiteren habe ich einen zweiten Raspberry Pi, der per Stereokabel an einen kleinen Lautsprecher angeschlossen ist. Im Grunde genommen funktioniert ein jeder Lautsprecher, der nicht zu auffällig platziert werden kann und einen guten WAF hat. Beispielsweise kann ich folgenden, auch per Bluetooth koppelbaren Lautsprecher empfehlen, der auch noch einen ganz ansprechenden Sound hat:

Wenngleich sich dieser Lautsprecher sehr gut per Bluetooth koppeln läßt, habe ich ihn trotzdem mit einem Stereokabel an den zweiten Raspberry Pi gekoppelt. Da der Lautsprecher sehr nah am zweiten Raspberry steht reicht auch ein sehr kurzes Audiokabel wie folgendes:

Vorbereitungen an der Fritzbox

Damit mein mit der Haupt-Raspberry überhaupt Informationen über den Anrufer mitgeteilt bekommt, müssen wir auf der Fritzbox den Callmonitor aktivieren. Wenn dieser noch nicht aktiviert ist, wählen wir mit einem in der Fritzbox bekannten Telefon die Nummer #96*5*.
Desweiteren brauchen wir die IP-Adresse unserer Fritzbox, da wir diese zur Konfiguration des FHEM-Moduls FB_CALLMONITOR benötigen. Falls man diese gerade nicht parat hat,  meldet man sich an der Fritzbox an und wählt den Reiter Heimnetz -> Heimnetzübersicht. Ganz oben findet sich der Eintrag fritz.box und rechts daneben sieht man die IP-Adresse.

IP-Adresse der Fritzbox

Daraufhin können wir uns um die Einstellungen an unserem Haupt-Raspberry kümmern.

Vorbereitungen am Haupt-Raspberry

Nun müssen wir das FHEM-Hilfsmodul FB_CALLMONITOR in die fhem.cfg einbinden und entsprechend konfigurieren. Folglich ergänzen wir die Konfigurationsdatei des Raspberry Pi um folgende Einträge:

define FBTel FB_CALLMONITOR 192.168.188.1
attr FBTel local-area-code 089
attr FBTel reverse-search textfile,klicktel.de,dasoertliche.de
attr FBTel reverse-search-cache 1
attr FBTel reverse-search-cache-file ./reverse-cache
attr FBTel reverse-search-text-file ./reverse-search
attr FBTel room FritzBox
attr FBTel unique-call-ids 1

Überdies ersetzen wir  im define der ersten Zeile durch die zuvor gemerkte IP-Adresse. Des weiteren müssen wir noch die richtige Vorwahl in der zweiten Zeile angeben. Als Beispiel ist hier die Vorwahl von München angegeben. Der Rest der Einträge kann so bleiben, wie er ist.

Die Rückwärtssuche

Damit die Rückwärtssuche zur vom Callmonitor der Fritzbox übertragenen Telefonnummer funktioniert, müssen wir die Vorwahl und in der darauffolgenden Zeile die Suchreihenfolge pflegen. Im konfigurierten Beispiel durchsucht das Hilfsmodul FB_CALLMONITOR zuerst das Rückwärtssuche-File reverse-search. Mit jeder erfolgreichen Rückwärtssuche wird dieses File ergänzt. Danach werden die Dienste von klicktel.de und dasoertliche.de in Anspruch genommen. Weiterhin wird ein Cache benutzt, um wiederholte Anfragen der gleichen Rufnummer zu beschleunigen.

Sprachausgabe mit FHEM

Um individuelle Texte sprechen zu lassen, benötigen wir das Text-to-Speech-Modul. Dafür müssen wir dieses Modul noch in die Konfigurationsdatei einbinden und konfigurieren. Zuerst sollten wir noch sicherstellen, dass die Soundkarte des Raspberry Pi auf den Audioausgang gestellt ist. Jedenfalls ist der Standardausgang des Raspberry Pi normalerweise auf den HDMI-Ausgang gestellt. Dementsprechend müssen wir die Ausgabe auf den analogen 3,5mm  Audioausgang umstellen. Hierfür geben wir auf der Konsole ein:

amixer cset numid=3 1

Entsprechend der letzten Zahl stellen wir den Ausgang von 0 (=automatisch) oder 2 (=HDMI) auf 1 (=Analog).

Schließlich können wir mit ein paar Zeilen Code in der fhem.cfg das Sprachausgabemodul einbinden:

define MyTTS Text2Speech default
attr MyTTS TTS_UseMP3Wrap 1
attr MyTTS icon audio_volume_high
attr MyTTS room Text2Speech
attr MyTTS verbose 3

Sobald wir diese Einträge in die Konfigurationsdatei gebracht haben, starten wir FHEM mit dem bekannten shutdown restart durch. Schließlich sollten wir die Sprachausgabe einmal ausprobieren. Hierzu klicken wir auf die neue Rubrik Text2Speech und öffnen das Device myTTS. Dort geben wir in der zweiten Zeile einen Text ein und drücken auf Return.

Text-2-Speech

Infolgedessen sollten wir auf dem über die Klinke angesteckten Lautsprecher unseren Text gesprochen hören!

FHEM-Funktion für Sprachausgabe definieren

Nichtsdestotrotz wollen wir die Sprachausgabe über TTS anstossen, sobald das Klingeln an der Fritzbox registriert wird. Deshalb schreiben wir eine entsprechende Aufbereitung der von der Rückwärtssuche zurückgegebenen Informationen selbst. Hierzu erstellen wir ein neues Include, das wir im Verzeichnis /opt/fhem/FHEM erstellen. Dementsprechend kopieren wir uns den unten aufgelisteten Code in eine leere Datei namens 99_FritzboxCallUtils.pm. Hierfür können wir den kleinen Editor nano benutzen und die neue Datei mit

cd /opt/fhem/FHEM
nano 99_FritzboxCallUtils.pm

erstellen. Weiters kopieren wir den unten stehenden Code in den geöffneten Editor und speichern ihn mit STRG+O ab. Schließlich beenden wir den Editor mit STRG+X.
Im Anschluß der Code:

##############################################
# $Id: 99_FritzboxCallUtils.pm 2691 2016-12-23 martin koch $
package main;

use strict;
use warnings;
use Digest::MD5 "md5_hex";
use HttpUtils;

sub
FritzBoxCallUtils_Initialize($$)
{
 my ($hash) = @_;
}

sub
FBAnrufer_vorlesen() {
 my $extNr = ReadingsVal("FBTel", "external_number", "none");
 my $extName = ReadingsVal("FBTel", "external_name", "none"); 
 my $event = ReadingsVal("FBTel", "event", "none");
 my $jetzt = strftime("%R", localtime(time)); 
 my $ausgabe = "Anruf von";

 if($event eq "ring") {
 if($extName eq "unknown" || $extName eq "" || $extName eq "unbekannt") {
 if($extNr eq "") { $ausgabe = "Anrufer ohne Rufnummernübertragung"; }
 elsif($extNr eq "unknown") { $ausgabe = "Anrufer ohne Rufnummernübertragung"; }
 else { $ausgabe .= " Nummer $extNr"; }
 }
 else { $ausgabe .= " $extName"; }
 
 if($jetzt ge "06:30" && $jetzt le "22:00") {
 Log 3, ("Lautsprecher vorlesen normal: $ausgabe");
 fhem("set MyTTS volume 75");
 fhem("set MyTTS tts $ausgabe");
 }
 else {
 Log 3, ("Lautsprecher vorlesen ohne Ton, da nachts: $ausgabe");
 }
 }
}

1;

FHEM-Aktion beim Klingeln auslösen

Nachdem wir nun ein neues Include für FHEM gebastelt haben, müssen wir die neue Funktion FBAnrufer_vorlesen() nur noch aufrufen, sobald es klingelt. Im Folgenden brauchen wir nur noch zwei Zeilen in die fhem.cfg einfügen.

define FB_Anruf_Vorlesen notify FBTel:event.*ring.* {FBAnrufer_vorlesen()}
attr FB_Anruf_Vorlesen room FritzBox

Zusammenfassend funktioniert das wie folgt: Die Fritzbox stellt einen eingehenden Anruf fest. Dadurch wird der Callmonitor in der Fritzbox aufgerufen, der mit dem Raspberry gekoppelt ist. Durch die Kopplung werden sowohl die Events als auch die Anrufernummer übertragen. Über einen Notify in FHEM auf das Event ring wird die von uns geschriebene Funktion FBAnrufer_vorlesen() ausgeführt . Diese ruft die TTS-Funktion des FHEM auf und gibt über die Audio-Schnittstelle den in Sound umgewandelten Anrufername auf dem angeschlossenen Lautsprecher aus.

Nächtliche Stummschaltung

Damit der Lautsprecher bei nächtlichen Anrufen stumm bleibt, wird in der Methode die Uhrzeit mit dem Bereich von 06:30 Uhr bis 22:00 Uhr verglichen. Dementsprechend können wir die Zeiten in der Funktion nach Belieben anpassen. Falls die Rückwärtssuche der Telefonnummer erfolglos blieb, gibt der Raspberry einfach die Nummer aus. Im Gegensatz dazu gibt der Raspberry einen Hinweis aus, falls die Rufnummer nicht übertragen wurde.

Audioausgabe am Remote-Raspberry

Bisher haben wir die Konfiguration so aufgebaut, dass die Tonausgabe direkt auf dem Master-Raspberry erfolgt. Andererseits wollen wir aber die Tonausgabe auf dem zweiten, dem Remote-Raspberry ausführen. Im Grunde genommen ist das gar nicht so schwer. Zuerst bauen wir dazu einen weiteren Raspberry Pi auf und statten ihn mit der Grundkonfiguration incl. FHEM aus. Im Gegensatz zu unserem Master-Raspberry brauchen wir hier aber keinen CUL. Schließlich soll dieser weitere Raspberry Pi ja lediglich über den an ihn angeschlossenen Lautsprecher Sound ausgeben. Dazu stellen wir die Audioausgabe auch bei diesem Raspberry wieder auf Ausgabe über die Audiobuchse.
In der Grundkonfiguration für den Remote-Raspberry fügen wir dann ebenso wie oben beschrieben folgende Zeilen ein:

define MyTTS Text2Speech default
attr MyTTS TTS_UseMP3Wrap 1
attr MyTTS icon audio_volume_high
attr MyTTS room Text2Speech
attr MyTTS verbose 3

Im Gegensatz dazu ändern wir jetzt diesen Eintrag auf unserem Master-Raspberry leicht ab. Folglich ändert sich der Eintrag so, dass wir die IP-Adresse des Remote-Raspberry, den Telnet-Port und das Telnetpasswort angeben:

define MyTTS Text2Speech 192.168.188.101:7072 telnetpasswort
attr MyTTS icon audio_volume_high
attr MyTTS room Text2Speech

Wichtig ist, dass die Namen der beiden defines auf beiden Raspberrys identisch sind.

Schließlich erfolgt nun die Tonausgabe auf dem Remote-Raspberry.

 

Zuletzt aktualisiert am 23.12.2016.

7 Gedanken zu „Anrufername am Lautsprecher ausgeben“

  1. I appreciate, cause I discovered just what I used to be looking for. You have ended my four day long hunt! God Bless you man. Have a nice day. Bye aaeggdebddcd

    1. Thx for your feedback! Although my blog is written and maintained in German, it seems to me that you got the information you desired… I was thinking quite a long time about providing my articles in 2 languages simultaneously, but tbh I’m too lazy to maintain my blog in that way. Though I’m glad I could help a little bit! Best regards, Martin

  2. kann man nicht das Fritz Telefonbuch für die Ansage benutzen? So macht es doch Fritz-to-go auch. Nicht jeder hat einen Eintrag im öffentlichen Telefonverzeichnis.

    1. Doch, sollte möglich sein! Standardmässig nutzt das von mir verwendete Modul FB_CALLMONITOR (ich bin hier nur Anwender des Moduls) allerdings nicht das Fritz Telefonbuch, es gibt aber ein Attribut fritzbox-remote-phonebook, über das man das einschalten kann.
      Dann kann man das Fritzbox Telefonbuch über verschiedene Kommunikationswege (telnet,web,TR064) anzapfen.
      Im Attribut reverse-search fügt man dann als erste Suchoption einfach phonebook vorne an. Dann sollte er zunächst im Fritz Telefonbuch suchen.

      Ich habe das nur nicht gemacht, da das Verhältnis zwischen Telefonnummern in meinem Fritzbox Telefonbuch zu den Nummern, die mich anrufen, verschwindend gering ist.
      Hierfür habe ich die fehlende Telefonnummer einfach im File gepflegt, das sich über das Attribut reverse-search-text-file angeben lässt.

      Siehe hierzu auch die command reference des Moduls FB_CALLMONITOR.
      https://fhem.de/commandref.html#FB_CALLMONITOR

      Gruß
      Martin

      1. Hallo Martin,
        ich habe beides ausprobiert, phonebook als xml abspeichern und von der Box holen, geht beides gut. Auf dem UI vom FHEM werden Anrufername und Nummer angezeigt, allerdings wird nur die Nummer vorgelesen, nicht der Name. Eventuell in winziger Fehler in der 99_FritzBoxCallUtils. Hat irgendjemand auch diesen Fehler gefunden?

        1. Hallo Werner,

          mein Skript in der 99_FritzBoxCallUtils.pm holt sich die Information über den Anrufer nicht selbst vom Phonebook der Fritzbox.
          Ich benutze nur den FB_CALLMONITOR. Und in meinem Falle ist das so konfiguriert, dass er ausschließlich das Textfile durchsucht
          und dann klicktel.de und dasoertliche.de
          Siehe hier:
          attr FBTel reverse-search textfile,klicktel.de,dasoertliche.de
          attr FBTel reverse-search-cache 1

          Wenn also nur die Nummer vorgelesen wird, war die Rückwärtssuche über o.g. Quellen nicht erfolgreich.
          Wo in der UI von FHEM wird denn das richtige Pärchen von Anrufername und Nummer angezeigt?
          Meinst Du im FBTel?

          Und Du schreibst vom phonebook als xml – sowohl die Datei reverse-search als auch reverse-cache
          sollten eine ganz einfache Textform haben in der Form
          08912345678|Hans Mustermann
          017123456789|Maria Mustermann Handy

          Mit diesem Format sollte das klappen.

          Was sagt denn der Lautsprecher?
          Anruf von Rufnummer 08912345678
          oder
          Anruf von 08912345678

          Fakt ist, dass wenn der Lautsprecher spricht, dann liegt es wohl daran, dass das Reading
          ReadingsVal(„FBTel“, „external_name“, „none“);
          wohl nichts bzw. keinen Namen zurückliefert.

          Vielleicht kannst Du das etwas eingrenzen.

          Gruß
          Martin

          1. Hallo Martin, sorry für die Verspätung, ich wollte nur mitteilen, daß ich einfach das phonebook.xml ab und zu importiere, und daraus liest FHEM korrekt vor. Da sowieso meistens die gleichen Leute anrufen, ist das OK, und ansonsten wird ja die Nummer vorgelesen.
            Jetzt tüftele ich, wie mir FHEM beim Nachhausekommen ansagen kann „Sie haben Anrufe von….“

Schreibe einen Kommentar

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