openHAB :: Einbinden einer FritzBox

openhabfritzboxWer eine FritzBox der Firma AVM sein eigen nennt, kann sich darüber freuen, dass es auch hierfür ein openHAB-Binding gibt. Mit diesem Binding lässt sich die FritzBox in openHAB einbinden, so dass wir beispielsweise über einen eingehenden Anruf oder die Rufnummer des Anrufenden informiert werden können. Die Einrichtung und Einbindung in openHAB zeigt dieser Artikel.

 

 

Verfügbare Artikel zu openHAB

little_blue_dot Einleitunglittle_blue_dot Einbinden der Internetgeschwindigkeitlittle_blue_dot RFID-Lesegerät einbinden
little_blue_dot Installationlittle_blue_dot Präsenzerkennung via Bluetooth und Pinglittle_blue_dot Einbinden von DS18B20-Sensoren
little_blue_dot Konfigurationlittle_blue_dot Kleines Netzwerkmonitoringlittle_blue_dot ical-Abfallkalender einbinden
little_blue_dot Reverse-Proxy für OpenHABlittle_blue_dot Einbinden von LG-Fernsehern [Update]little_blue_dot openHAB als Wecker
little_blue_dot Datenspeicherung und Statistikenlittle_blue_dot Einbinden Schaltern und Kontaktenlittle_blue_dot Einbinden von Bewegungssensoren
little_blue_dot Regeln planen und konfigurierenlittle_blue_dot Einbinden von Funksteckdosen (433 MHz)little_blue_dot Einbinden einer FritzBox
little_blue_dot Einbinden von USB-Steckdosenleisten (SIS-PMS)little_blue_dot Infrarotgesteuerte Geräte einbindenlittle_blue_dot Sprachausgabe auf einem Raspberry
little_blue_dot Einbinden von Temperatursensorenlittle_blue_dot Steuerung mit NFC-Tagslittle_blue_dot Schaltbare Steckdosenleiste mit Relais
little_blue_dot Externer Zugriff mit my.openhab

 

[themify_box style=”rounded” ]In diesem Artikel verwendetes Zubehör

[/themify_box]

 

 

FritzBox vorbereiten

Zunächst müssen wir an unserer FritzBox den sogenannten “CallMonitor” aktivieren. Dazu rufen wir mit einem an der FritzBox angeschlossenen Telefon (DECT funktioniert ebenso) die folgende “Telefonnummer” an:

#96*5*

 

Addon installieren

Um das Binding bzw. Addon nutzen zu können, installieren wir dieses mittels apt-Paketverwaltung:

apt-get install openhab-addon-binding-fritzbox

 

Grundkonfiguration

Nun müssen wir die grundlegende Konfiguration in der Datei “/etc/openhab/configurations/openhab.cfg” durchführen. Dazu ändern wir die folgende Zeile und passen diese, im Abschnitt “Fritz!Box Binding“, auf unsere eigenen Gegebenheiten an:

fritzbox:ip=192.168.178.1

 

Möchten wir aus openHAB heraus das WLAN aktivieren und deaktivieren, müssen wir das Administrationspasswort der FritzBox angeben. Dieser Schritt ist jedoch optional.

fritzbox:password=sEhRgEhEiM

 

Wurde auf der FritzBox das Usermanagement aktiviert, muss der entsprechende Nutzer zum oben angegebenen Passwort konfiguriert werden:

fritzbox:user=adminuser

 

 

Items definieren

Nun definieren wir in der Datei “/etc/openhab/configurations/default.items” oder vielleicht sogar in der seperaten .items-Datei die FritzBox-Items:

//FritzBox
Call Incoming_Call_No "Anrufende Nummer [%2$s]" { fritzbox="inbound" }
Switch Incoming_Call "Ringing" { fritzbox="inbound" }
Call Active_Call "Connected to [%1$s from %2$s]" { fritzbox="active" }
Call Letzter_Anrufer "Letzter Anrufer: [%2$s]"

 

Nun stehen uns in openHAB folgende Werte zur Verfügung:

  • Ein Schalter, der aktiv wird, wenn jemand anruft
  • Die anrufende Nummer als String
  • Einen aktiven Anruf mit der Rufnummer als String
  • Die Rufnummer des letzten Anrufers als String (Regel erforderlich)

 

Falls wir Nutzer und ggf. Passwort in der “/etc/openhab/configurations/openhab.cfg” angegeben haben, können wir mit folgenden Items einige Punkte wie WLAN, DECT, Gäste-WLAN oder den Anrufbeantworter ein- und ausschalten:

Switch DECT_ANAUS {fritzbox="dect"}
Switch WLAN_ANAUS {fritzbox="wlan"}
Switch GWLAN_ANAUS {fritzbox="Gast-WLAN"}
Switch AB_ANAUS {fritzbox="tam0"}

 

Sitemap ergänzen

Die Anzeige in der Sitemap lässt sich nun einfach realisieren. Möchten wir beispielsweise die Nummer des letzten Anrufenden anzeigen lassen, binden wir das entsprechende Item wie folgt in die Sitemap ein:

Text item=Letzter_Anrufer icon="phone"

Für das Befüllen des Items “Letzter_Anrufer” ist jedoch eine Regel erforderlich, die im nächsten Schritt erläutert wird. Das Symbol “phone” gehört nicht zum Standardumfang von openHAB und wurde nachträglich in den Ordner “/usr/share/openhab/webapps/images/” hinterlegt.

 

3

 

Möchte man, wie oben einleitend gezeigt, sein WLAN, DECT und Anrufbeantworter steuern, ergänzen wir die Sitemap an gewünschter Stelle mit folgenden Einträgen:

Switch item=DECT_ANAUS icon="dect" label="DECT schalten" mappings=[ON="An", OFF="Aus"]
Switch item=WLAN_ANAUS icon="wlan" label="WLAN schalten" mappings=[ON="An", OFF="Aus"]
Switch item=GWLAN_ANAUS icon="wlan" label="Gäste-WLAN schalten" mappings=[ON="An", OFF="Aus"]
Switch item=AB_ANAUS icon="ab" label="Anrufbeantworter schalten" mappings=[ON="An", OFF="Aus"]

 

 

Verwendung in Regeln

Natürlich können wir die neuen Items auch in Regeln verwenden. Beispielsweise möchte ich, dass alle multimedialen Geräte im Haus pausieren und/oder auf Stumm schalten, wenn ein Anruf eingeht:

import org.openhab.library.tel.types.CallType
import org.openhab.core.library.types.*

rule "Jemand ruft an"
when
    Item Incoming_Call changed from OFF to ON
then
    //Letze Nummer aktualisieren
    val CallType call = Incoming_Call_No.state as CallType
    postUpdate(Letzter_Anrufer, Incoming_Call_No.state)

    //XBMC pausieren
    var String mmc63play = MMC63_STATE.state.toString()
    if (mmc63play == "Play") {
        postUpdate(MMC63_PLAY_TEMP, ON)
        sendCommand(MMC63_PLAY, OFF)
    }
    if (mmc63play == "Pause") {
        postUpdate(MMC63_PLAY_TEMP, OFF)
    }
    executeCommandLine("/scripts/xbmcnotify.sh@@192.168.1.63@@NUTZER@@PASSWORD@@Eingehender Anruf@@Anruf von: " + call.origNum + "@@", 2000)

    //LG-TV Ton aus
    if(TVC65.state == ON) {
        sendCommand(TVC65_TON, OFF)
    }

    //Squeezebox pausieren
    if(RDO61_POWER.state == ON) {
        if (RDO61_PLAY.state == ON) {
            postUpdate(RDO61_PLAY_TEMP, ON)
        }
        if (RDO61_PLAY.state == OFF) {
            postUpdate(RDO61_PLAY_TEMP, OFF)
        }
        sendCommand(RDO61_PLAY, OFF)
    }

    //Tischlampe einschalten
    if (TISCHLAMPE_WZ.state == ON) {
        postUpdate(TISCHLAMPE_WZ_TEMP, ON)
    }
    if (TISCHLAMPE_WZ.state == OFF) {
        postUpdate(TISCHLAMPE_WZ_TEMP, OFF)
        sendCommand(TISCHLAMPE_WZ, ON)
    }
end

rule "Anruf beendet"
when
    Item Active_Call changed from ON to OFF or
    Item Incoming_Call changed from ON to OFF
then
    //XBMC starten
    if (MMC63_PLAY_TEMP.state == ON) {
        sendCommand(MMC63_PLAY, ON)
    }

    //LG-TV ton an
    if(TVC65.state == ON) {
        sendCommand(TVC65_TON, ON)
    }

//Squeezebox an
    if(RDO61_POWER.state == ON) {
        if (RDO61_PLAY_TEMP.state == ON) {
            sendCommand(RDO61_PLAY, ON)
        }
    }

    //Tischlampe aus
    if (TISCHLAMPE_WZ_TEMP.state == OFF) {
        sendCommand(TISCHLAMPE_WZ, OFF)
    }
end

 

In dieser Regel werden eine XBMC-Instanz, ein LG-Fernseher und eine Squeezebox pausiert bzw. stumm geschaltet. Zudem wird der vorherige Status in ein Dummy-Item kopiert, damit der Zustand, der vor dem Anruf herrschte, nach Abschluss des Anrufes wiederhergestellt werden kann. Dazu ist natürlich vorab eine Definition der Dummy-Items in einer .items-Datei notwendig. Für die hier gezeigten Geräte bräuchten wir folgende Dummys:

Switch MMC63_PLAY_TEMP
Switch RDO61_PLAY_TEMP
Switch TISCHLAMPE_WZ_TEMP

Die Einbindung dieser Geräte wird jeweils in einem seperaten Artikel beschrieben.

 

Von einem eingehenden Anruf können weitere Details extrahiert und verwendet werden. Die folgende Regel entnimmt dem Item “Incoming_Call_No” die anrufende sowie angerufene Nummer und versendet eine Mail mit den Nummern als Textkörper:

import org.openhab.library.tel.types.CallType

rule "Mail bei Anruf"
    when Item Incoming_Call_No received update
then 
    var CallType call = Incoming_Call_No.state as CallType
    var String mailContent = "Anruf von " + call.origNum + " an " + call.destNum
    sendMail( "deinemail@adresse.de" , "Eingehender Anruf", mailContent);
end