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.