Website-Icon Dein Smart Home Blog

FRITZ!Box-Anruf-Integration in das Fibaro HomeCenter 2

Wer kennt das nicht: Wenn (am Wochenende) mal lauter Musik gehört wird, entgeht einem der eine oder andere Anruf.  Dank Anrufbeantworter kann man später immer noch reagieren. Aber was, wenn die Eltern/Großeltern oder andere pflegebedürftige Verwandt dringend Hilfe benötigen? Oder der Partner beim Shoppen ist und eine „wichtige“ Frage hat….

Genau deshalb suchte ich schon länger, bzw. seit dem Kauf meines Fibaro Home Center 2 nach einer Möglichkeit, eingehende Anrufe zu erkennen und via Szenarien automatisch darauf reagieren zu können. So wollte ich zum Beispiel meine Sonos-Lautsprecher leiser stellen oder das Kingelsignal auf dem Sonos System wiedergeben. Bestimmte Anrufe will man ungern verpassen.

Auf Basis der Threads im Fibaro-Forum konnte ich nun Abhilfe schaffen. Das dort vorgestellte Virtuelle Device (VD) fragt laufend die FritzBox ab und kann demzufolge auf eingehenden Anrufe reagieren. Ich habe das VD um zwei Buttons ergänzt, um so eine automatische Ansage, welche den Namen des Anrufers über das Sonos System abspielt, optional aktivieren- und deaktiviren zu können.

Ansicht des FritzBox-VD

Da die Fritz Box von Haus aus ein- und ausgehende Anrufe gut darstellt, ist das VD für mich nur als Trigger wichtig.

Vorbereitung der FritzBox

Ich selber nutze eine FritzBox 6490 Cable. Die Funktion sollte aber unabhängig vom Model sein.

An der FritzBox muss die sog. Callmonitor-Funktion aktiviert werden. Dazu nehmt ihr euer an die FritzBox angeschlossenes Telefon und tippt #96*5* gefolgt von der (grünen) Wahltaste. Eine Bestätigung über den Erfolg der Aktion habe ich nicht bekommen - wer FRITZ!Dect Telefone verwendet wird eine positive Rückmeldung im Display eingeblendet bekommen. Der Vorgang muss nur einmalig vorgenommen werden.

VD einrichten

Das virtuelle Modul (VD) könnt Ihr euch hier herrunterladen. Nach dem Download geht Ihr in der Weboberfläche des HC2 über Module -> Module hinzufügen -> ein virtuelles Modul hinzufügen -> Datei auswählen hinzufügen. Ich habe es bei mir dem Raum „Haus“ als übergeordneten Bereich hinzugefügt.

Unter IP Adresse tragt Ihr die IP-Adresse Eurer FritzBox ein. Als TCP Port nutzt ihr den Port: „1012“.

Einrichten des FritzBox-VDs

Das VD „überwacht“ dann im Mainloop eure FRITZ!Box auf Telefonaktivitäten. Bei mir läuft das VD im Mainloop und unter der Firmware 4.090 bislang stabil. Einige Anwender haben aber wohl Probleme, weil dem Mainloop, welcher sich des öfteren verabschiedet. Das konnte ich bei mir bislang nicht beobachten.

Im Mainloop müssen wir nach Einrichtung der "Eingehender-Anruf-Szene" noch Anpassungen vornehmen. Das VD wird jetzt noch nicht richtig arbeiten, da die notwendigen globalen Variablen (GV) fehlen. Dessen Anlage erfolgt automatisch durch die folgende Szene (siehe nächster Abschnitt).

LUA Szene für eingehenden Anrufe

Über Szene hinzufügen -> LUA Szene hinzufügen habe ich mir die besagte Sezne angelegt:

Erstellen der LUA-Szene

Die ID der Szene hier im Beispiel ist „270“ - diese benötigen wir später noch einmal.

Über die lokalen Variablen wird das Script auf eure individuellen Bedürfnisse angepasst.

Die für das VD und das Script erforderlichen globalen Variablen (GV) werden nach einem Start der Szene automatisch angelegt bzw. überprüft.

„Zulaut“ ist der Wert, ab dem die Sonos-Lautsprecher auf den Wert  „Leiser“ bei einem eingehenden Anruf heruntergesetzt werden. Auf das automatische lauter stellen nach dem Auflegen haben ich verzichtet, da ich nicht immer die Musik nach dem Auflegen wieder so laut wie vorher haben mag. Über die Zeile (deviceType == 'com.fibaro.sonosSpeaker') sucht das Script alle Eure Sonos-Geräte und stellt diese leiser, wenn sie „zulaut“ sind.

Die Ansage des Anrufers nutze ich nur in der Küche. Hierzu nutze ich das VD von doonic. Unter „SonosCommander“ habe ich die ID meines virtuellen Device vom SonosCommanders eingetragen.

Die Variable „Oma“ beinhaltet die Telefonnummer von Oma (ohne Leerzeichen oder Sonderzeichen). Das Format der Nummer kann man in dem VD prüfen, wenn die Person anruft. „OmaAnsage“ beinhaltet den Pfad mit dem abzuspielenden Ansagetext, wenn Oma anruft. Den Pfad übergebe ich dann an den SonosCommander, der das Abspielen übernimmt.

In Zeile 44 habe ich noch eine zusätzliche Prüfung implementiert. Auch wenn die Ansage über das oben vorgestellte "FritzBox-VD" aktiviert ist, erfolgt die Ansage bei Omas Anruf nur am Samstag und Sonntag. Bei einem Anruf, beispielsweise von „Chris“, gibt es diese Zusatzbedingung nicht.

Sofern Ihr weitere Ansagen hinzufügen wollt, müsst Ihr nur jeweils zwei lokale Variablen (analog zu Oma und OmaAnsage) anlegen und unten eine weitere ifelse-Abfrage implementieren.

Jetzt müssen wir noch die vorher erwähnte Anpassungen im VD durchführen.

Anfangs hatte ich Probleme mit dem Starten der Szene, wenn das Telefon klingelte. Die im Header vermerkte globale Variable als Trigger hat nicht, bzw. nicht zeitnah reagiert. Also habe ich den Trigger entfernt und lasse die "Eingehender-Anruf-Szene" direkt aus dem Mainloop des FRITZ!Box VDs starten. Hierzu müsst Ihr in Zeile 34 die ID eurer "Eingehender-Anruf-Szene" eintragen (im Beispiel ist es die 270). Die ID eurer zuvor neu angelegten Szene findet Ihr, wenn Ihr die Szene aufgerufen habt unter Allgemein oder oben in der Eingabezeile eures Browsers:

FritzBox-VD und Szenen-ID

Das Testen der durch das Script ausgelösten Aktionen ist natürlich wichtig. Herausforderung dabei ist, die Mitbewohner nicht allzu sehr durch das ständige Telefon läuten zu nerven. Deswegen hat das Ganze bei mir etwas gedauert ;-)

Hier das Script:

--[[
%% properties
%% events
%% globals
--]]

--Szene wird direkt durch das Fritzbox-VD getriggert 
--Die GVs werrden durch den manuellen Start der Szene angelegt
--Folgende GV werden benötigt und automatisch angelegt: 
--FritzBoxAnsage, FritzBoxTelNr, FritzBoxStatus, 
--GV "FritzBox...." werden aus dem Fritzbox-VD befüllt 
--Standard-GV des Sonos-Commanders werden benötigt

local Zulaut = 25  --Lautstärkewert, ab den die Lauststärke reduziert wird
local Leiser = 10  --Auf diesen Wert wird die Latstärke reduziert
local SonosCommander = 206 -- ID des Sonos Commanders in der Küche

local Oma = 0401231239
local OmaAnsage = "Fritz-nas/fritz.nas/Evanescence - Lost in Paradise.mp3"
local Chris = 01511231239
local ChrisAnsage = "Fritz-nas/fritz.nas/Evanescence - Lost in Paradise.mp3" 
local currentDate = os.date("*t")

local var = {"FritzBoxAnsage", "FritzBoxTelNr", "FritzBoxStatus"} --benötigte GV
local Ansage = tonumber(fibaro:getGlobalValue("FritzBoxAnsage"))	--aktiviert die Ansage; 0 (Aus) oder 1 (Ein) 
local maxID = 1000

fibaro:debug(fibaro:getGlobalValue("FritzBoxStatus"))
fibaro:debug("Tel: "..fibaro:getGlobalValue("FritzBoxTelNr"))
fibaro:debug("Ansage-Status: "..Ansage)

if fibaro:countScenes() > 1 then
  fibaro:debug("stop scene");
  fibaro:abort();
end

if (tostring(fibaro:getGlobalValue("FritzBoxStatus")) == "RING") then
	fibaro:debug("Eingehender Anruf")
  	
 --prüft bei eingehenden Anruf die Nummer uns "sagt" Anrufernamen über Sonos an 
  	if Ansage == 1 then 
   	fibaro:debug("Ansage aktiv") 
     if (tonumber(fibaro:getGlobalValue("FritzBoxTelNr")) == Oma 
    	and (currentDate.wday == 1 or currentDate.wday == 7))  -- hier nur am Sa und So
    	then
    	fibaro:setGlobal("SONOS_MUSIC", OmaAnsage)
		fibaro:call(SonosCommander, "pressButton", "2") -- Music-Button vom Commander
     	fibaro:debug("Oma Anruf")
     elseif (tonumber(fibaro:getGlobalValue("FritzBoxTelNr"))) == Chris
    	then
    	fibaro:setGlobal("SONOS_MUSIC", ChrisAnsage)
		fibaro:call(SonosCommander, "pressButton", "2") -- Music-Button vom Commander
     	fibaro:debug("Chris Anruf")
     else fibaro:debug ("keine Nummer hinterlegt")
    end
    end     
   
 -------Sonos leiser stellen 
  	for id = 1, maxID do
    local deviceType = fibaro:getType(id)
    if (deviceType == 'com.fibaro.sonosSpeaker') then
        if (tonumber(fibaro:getValue(id, "volume")) >= Zulaut) then
    	   fibaro:debug("Telefon klngelt und "..fibaro:getName(id).." ist zu laut")  
 	       fibaro:call(id,"setVolume", tonumber(Leiser))
           fibaro:debug(fibaro:getName(id).." leiser gestellt") 
          --local room = fibaro:getRoomNameByDeviceID(id) 
        else
   		fibaro:debug("Teelfon klingelt, "..fibaro:getName(id).." ist nicht zu laut")
      	end
    end
    end
end

-- Funktion zum Anlegen einer Globalen Variablen
function globalVar(var,val)
  local http = net.HTTPClient()
  http:request("http://127.0.0.1:11111/api/globalVariables", {
    options = {
    method = 'POST',
    headers = {},
    data = '{"name":"'..var..'","value":"'..val..'"}',
    timeout = 10000
  },
  success = function(response)
            local result = response.data;
            if response.status == 200 or response.status == 201 then
              fibaro:debug('Status: ' ..response.status.. ' - Variable wurde angelegt')
            else
              fibaro:debug('Error: ' ..response.status.. ' - Zugriff verweigert')
            end
            end,
  error = function(err)
          fibaro:debug('[ERROR] ' .. err)
          end
  })
end

local trigger = fibaro:getSourceTrigger()

if (trigger['type']=='other') then
  --fibaro:debug("Script manuell gestartet; GV werden geprüft")
  for i = 1,#var do    
	if (fibaro:getGlobal(var[i]) ~= nil) then
    --fibaro:debug('Benötigte Variable ' ..var[i].. ' vorhanden.')
  		if (fibaro:getGlobal(var[i]) == 'NaN') then
    	--fibaro:debug('Inhalt: ' ..fibaro:getGlobal(var[i]).. ' erkannt. Wird korrigiert.')
    	fibaro:setGlobal(var[i], '0') end  
  	else
    	--fibaro:debug('Benötigte Variable ' ..var[i].. ' NICHT erkannt. Wird erstellt....')
    	globalVar(var[i], '0')
  	end	
 end
end

 

Weitere Möglichkeiten

Jetzt lässt sich das Script sicherlich noch um viele Dinge ergänzen oder anpassen. Das könnte sein:

Wie immer: hinterlasst eure Ideen und Anmerkungen gern in den Kommentaren. Viel Spaß beim nachbauen!

Die mobile Version verlassen