Beispiel Fritzbox
Im Fernseher anzeigen, wer anruft… die Lautstärke absenken, wenn ein Anruf angenommen wird… All das und noch vieles mehr ist mit FHEM und einer AVM Fritzbox möglich.
Nachfolgend ein Beispiel wie die Steuerung der Fritzbox bei mir in FHEM aussieht:
80_fritzbox.cfg
#########################################################################
##
## 80_FRITZBOX
##
## Stand.........: 22.12.2014
## Zweck.........: Überwacht eingehende Anrufe auf der FritzBox
## Besonderheiten: Sprachausgabe über RaspberryPi,
## Anzeige im Fernseher über Enigma2-Receiver
##
#########################################################################
##
## Init
##
#########################################################################
define fritzbox FB_CALLMONITOR x.x.x.x
attr fritzbox alias FritzBox
attr fritzbox group PlugIns
attr fritzbox reverse-search phonebook
attr fritzbox reverse-search-phonebook-file ./FRITZ.Box_Telefonbuch.xml
attr fritzbox room System
#########################################################################
##
## Notifications
##
#########################################################################
define fritzbox_notify notify fritzbox:event:.* { dkRouteFritzBox() }
attr fritzbox_notify group Notifiers
attr fritzbox_notify room System
#########################################################################
## EOF
Was macht diese Datei?
Zunächst wird das Plugin FB_CALLMONITOR initialisiert (IP Eurer Box bitte anpassen)
Es wird ein Telefonbuch geladen FRITZ.Box_Telefonbuch.xml, das man einfach aus der Fritzbox exportieren kann (bitte entsprechend umbenennen).
Anschließend wir ein NOTIFY definiert, der bei allen events (event:.*) die Funktion dkRouteFritzbox() aufruft. Da man die Events direkt bei der Fritzbox auslesen kann, ist eine Übergabe des events als Parameter nicht erforderlich. Normalerweise wäre der Aufruf dkRouteFunktionsname($NAME, $EVENT), um Gerätename und Event zu übergeben.
99_dkHandleFritzbox.pm
##############################################
## Stand: 28.07.2015 - V0001
##############################################
# $Id$
package main;
use strict;
use warnings;
use POSIX;
use Time::Local;
sub dkHandleFritzbox_Initialize($$) {
my ($hash) = @_;
}
#######################################
##
##
## ROUTES
##
##
#######################################
sub dkRouteFritzBox() {
my $event = ReadingsVal("fritzbox", "event", "none");
if ($event eq "ring") { dkPhoneRing(); }
if ($event eq "connect") { dkPhoneConnect(); }
if ($event eq "disconnect") { dkPhoneDisconnect(); }
if ($event eq "call") { dkPhoneCall(); }
}
#######################################
##
##
## ACTIONS
##
##
#######################################
sub dkPhoneCall() {
}
sub dkPhoneRing() {
my $number = ReadingsVal("fritzbox", "external_number", "unknown");
my $telname = ReadingsVal("fritzbox", "external_name", "unknown");
if (Value("rr_Dennis") ne "home") {
if ($telname eq "unknown") {
dkPush("call", "Ein Anruf von $number");
} else {
dkPush("call", "Ein Anruf von $telname");
}
}
if ($telname eq "unknown") {
dkTalk("Ein Anruf von $number");
dkDisplayText("Anruf von $number");
} else {
dkTalk("$telname ruft an");
dkDisplayText("Anruf von $telname");
}
}
sub dkPhoneConnect() {
my $internal_number = ReadingsVal("fritzbox", "internal_number", "unknown");
dkStoreAVRVolume();
dkSetAVRVolume('32');
}
sub dkPhoneDisconnect() {
dkRestoreAVRVolume();
}
1;
Was macht diese Datei?
Die Hauptfunktion ist in diesem Script ist dkRouteFritzBox(). Hier werden abhängig vom aufgetretenen Event die weiteren Methoden aufgerufen.
In meinem Fall wird bei einem eingehenden Anruf überprüft, ob ich zuhause bin. Ist dies nicht der Fall erhalte ich eine Push-Nachricht mit der Telefonnummer bzw. dem Anrufernamen. Zudem erfolgt eine Sprachausgabe (dkTalk) sowie die Anzeige im Fernseher (dkDisplayText). Diese Methoden überprüfen intern, ob die jeweiligen Geräte angeschaltet sind und sorgen dann für eine Ausgabe.
Wird der Anruf angenommen bzw. kommt eine Verbindung zu Stande (dkPhoneConnect()) so wird der aktuelle Lautstärke-Wert des AV-Receivers gespeichert und die Lautstärke reduziert.
Wird wieder aufgelegt (dkPhoneDisconnect) wird die Lautstärke am AV-Receiver wieder auf den zuvor gespeicherten Wert zurückgesetzt.
Hallo, schön das du wieder etwas mehr von deiner Konfiguration preis gibst. Habe wieder was interessantes gesehen bei dir. Eine Nachricht zum Fernseher senden 😉 … Muss der Fernseher dafür geroutet werden? Welches Modell hast du? Könnte man ein Blick in die „dkDisplayText“ werfen?
Freue mich über deine Antwort.
LG Ben
Hi Ben,
um eine Nachricht im TV anzeigen zu können, gehe ich einen Umweg über meine VU-Plus Sat-Box. Diese läuft mit Enigma2 und kann prima in FHEM eingebunden werden.
Die Einblendung erfolgt dann über ein Plugin bzw. Skin namens myMetrix. Hier habe ich ein wenig den Skin modifiziert, so dass die Einblendung bei mir perfekt passt.
Die dkDisplayText ist in der dkUtils enthalten.
Ich versuche das ganze mal zu dokumentieren, irgendwie weiß ich selbst nicht mehr so richtig, wie das mit myMetrix funktioniert.
Viele Grüße,
Dennis