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.
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“.
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:
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:
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
--[[ %% 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:
- Pushes auf Handy (ggf. schneller als Mail der FritzBox)
- PopUp-Benachrichtigungen
- Push-Benachrichtigungen auf den TV (siehe „So steuerst du dein VU+ mit dem Fibaro HomeCenter und andersrum“
- Fernseher leiser stellen
- ...
Wie immer: hinterlasst eure Ideen und Anmerkungen gern in den Kommentaren. Viel Spaß beim nachbauen!
super idee... aber es müsste sich auch mit musiccast umsetzen lassen, oder? (Lautsprecher WLAN Systeme von Yamaha)
Die lassen sich steuern über:
http:/IP-Receiver//YamahaExtendedControl/v1/main/setPower?power=on
über die JSON Schnittstelle:
/YamahaExtendedControl/v1/main/setPower?power=on
/YamahaExtendedControl/v1/main/setPower?power=standby
/YamahaExtendedControl/v1/main/setMute?enable=false
/YamahaExtendedControl/v1/netusb/getPlayInfo
Könnte man das Script so anpassen, "wenn ein Anruf, dann führe http:/IP-Receiver//YamahaExtendedControl/v1/main/setPower?power=off aus und beim Telefonatende http:/IP-Receiver//YamahaExtendedControl/v1/main/setPower?power=on
Hi,
klar, das funktioniert :) Würde aber eher den Musiccast über ein VD einbinden und dann den Knopf des VDs drücken.
Gruß
jetzt müsste ich nur noch dein script "verstehen", um zu wissen, wo ich was einfügen muss ;-)
Hi,
auf was genau bezieht sich Deine Frage?
Hoffte, das alles umschrieben zu haben....
VG Hoggle
ich habe noch keine ahnung, wie das script aussehen muss, damit bei einem anruf "/YamahaExtendedControl/v1/main/setPower?power=standby" ausgeführt wird ;-)
Programmier erstmal ein VD, mit dem du deine Anlage steuern kannst. In dem Skript fügst du dann ein virtuellen Klick auf den Button ein. Hast du schon ein VD?
Gruß
ja, habe ein VD erstellt... als IP die Musiccastkomponente und Port 80. 2 Button eingefügt (ON und OFF).
nur wie bekomme ich nun z.b. den Button "ON" dies zugeordnet: "http:/192.168.178.66/YamahaExtendedControl/v1/main/setPower?power=on"
Auf unserer Seite gibt es genügend Beispiele, wie du so ein VD erstellst. Schau dir am Besten mal den Artikel zum VU+ an.
Solltest du es nicht hinbekommen, dann mach ein neues Thema im Forum auf, das passt hier nicht in die Kommentare ;)
Das VD funktioniert super, der Rest vom Script ist für mich zu umfangreich. Ich möchte nur über meine VU+ am TV den Anruf anzeigen lassen.
Habe es soweit geschafft das das VU mir eine Nachricht anzeigt wenn es an der fritzbox klingelt. dazu habe ich im VD der fritzbox noch einen Call zum VU+ geschrieben.
Das ist der Aufruf im VU+ VD dort ist ein extra button.
local selfId = fibaro:getSelfId();
local ip = fibaro:get(selfId, "IPAddress")
local url = "/web/message?text=Test%20Fritzbox%20!&type=3"
local ws = Net.FHttp(ip, 80)
local resp = ws:GET(url)
fibaro:debug(resp);
Jetzt muss ja aber die Feste Nachricht "Test Fritzbox" durch die GV "FritzBoxTelNr" irgendwie ersetzt werden. Angelegt habe ich diese auch die Telefonnummern werden auch eingeschrieben.
geht das nicht mit
text="..FritzBoxTelNr.."%20!&type=3“
Leider nicht als Fehler kommt : [ERROR] 21:46:52: line getSelfId();..."]:5
Lasse ich die " Zeichen weg kommt nur die Meldung FritzBoxTelNr.
Hallo,
super Idee und genau das richtige für meine ganzen Sonos Lautsprecher. Leider bekomme ich es nur nicht zum laufen. FritzBox VD ist installiert und bei Anruf zeigt es mir auch Nummer und Uhrzeit an. Starte ich nun die Szene legt er keine GVs an (die vom SonosCommander hatte ich schon von "früher") und spuckt folgendes aus: [DEBUG] 20:48:29: line 29: attempt to concatenate a nil value
Ist es normal, dass die Nummer etc im FritzBox VD nach einer Weile verschwinden?
Danke für eure Hilfe :)
Hi,
kommentieren mal Zeile 28 und 29 jeweils mit "--" aus.
Bei mir bleibt Nummer etc im VD stehen.
VG Hoggle
Zeile 30 musste auch noch auskommentiert werden. Nachdem er die Variablen angelegt hat habe ich sie wieder reingenommen. Jetzt geht alles. Großartig! :)
Stimmt. Richtig.
Kurze Frage noch, wie bekomme ich mehrere Sonos Lautsprecher mit der Szene verbunden? Einfach nach dem ersten SonosCommander ein "," und dann die ID des zweiten?
Hi,
das wird er so nicht akzeptieren.
Da müsstest Du ein Array draus machen und dies dann in einer Schleife abarbeiten lassen.
Oder einfach nach Zeile 47 bzw. 52 ein weiteres:
fibaro:call(SonosCommander2, "pressButton", "2") -- Music-Button vom Commander
einfügen.
Entweder statt "SonosCommander2" direkt die ID eintragen oder dies als lokale Var definieren.
VG Hoggle
Hallo,
woran kann es liegen, dass meine Sonos-Lautsprecher nicht leiser gemacht werden.
Die Kopplung mit der Fritz!Box und die Ansagen funktionieren super, nur der Punkt mit "Sonos leiser" nicht.
Auch die debugs (Zeile 59-70) werden nicht angezeigt.
VG
Peter
Das hatte ich anfangs bei Sonos, die gerade nicht am Strom waren bzw. die IP falsch im PlugIn hinterlegt war.
Kannst Du die Lautstärke über das PlugIn/VD anpassen?
Danke für den Hinweis mit den Plugins.
Jetzt funktioniert alles :)
Schön zu hören.
Vielleicht kann mir ja jemand helfen...
https://www.siio.de/board/thema/firtzbox-push-hc2/
Danke schon einmal...
Hallo Hoogle,
klasse Script. Echt super.
Finde das super genial und meine Frau auch.
Gruss
Carsten :)
Mein lieber Scholli,
Ich vergucke mich immer mehr in dieses System.
Bin im Besitz von netatmo und ip Cams von Dlink. Nun bin ich auf der Suche nach dem weiteren. Ich denke fibaro ist da jetzt ganz weit vorne.
Hi Hoggle,
bin endlich dazu gekommen, Dein Script umzusetzen. Super! Vielen Dank!
Habe das Sonos VD von Krikroff verwendet und lass die Ansagen über TTS machen, da ich irgendwie immer Probleme mit den lokalen Pfaden hatte.
Dauert zwar eine Sekunde länger, dafür kann ich das TTS in vielen Szenen einsetzen. Fülle einfach je nach anrufender Nummer eine lokale Variable mit dem Text und lass das dann am Ende abspielen.
(https://www.domotique-fibaro.fr/topic/616-fibaro-hc2-vd-sonos-remote-t%C3%A3%C2%A9l%C3%A3%C2%A9commande-pour-diffuseur-sonos/)
LG TT
Gibt es eine Anleitung zu dem VD von Krikroff?! Weil bei mir läuft das nicht richtig vor allem nicht mti dem Variablen :(
Würde dann auch das Script hier gerne nutzen!
Schon mal vielne Dank.
Hast Du hier im Forum mal nach Sonos gesucht?
Hallo Hoggle,
danke für deine Antwort.
Ja habe ich, aber bin nicht wirklich fündig geworden, oder ich suche falsch :(
Ich würde gerne anstatt von MP3s, einen Text ansagen lassen, weiß leider nur nicht, wie ich das machen soll :(
Vielleicht hast du ja eine Hilfestellung :-)
@TT
Könntest du vielleicht sagen, wie du das realisiert hast?!
VG
Adam
Ich selbst nutze einen RPI 3 und Polly.
https://forum.fibaro.com/index.php?/topic/21797-tutorial-sonos-remote-vd-using-node-sonos-api/
oder:
https://www.siio.de/board/thema/sonos_remote_v1-0-1/
Was genau hast Du den bisher installiert und was genau geht nicht?
Am Besten dazu machst Du im Forum einen Beitrag auf.
Hallo,
bei mir werden die Variablen nicht erstellt?!
Zu dem erhalte ich folgende Meldung:
[DEBUG] 12:49:54: nil
[DEBUG] 12:49:54: line 29: attempt to concatenate a nil value
Die Variable wird durch die Szene angelegt, nicht durch das VD.
Gruß
Hallo,
die Szene startet jetzt und das läuft auch. Ich erhalte auch eine Push Meldung auf das Smartphone. Nur leider funktioniert die Ansage nicht :(
Ich nutze als VD das Script von Krikroff, kann es sein, das ich das dann anders programmieren muss?! Schon mal vielen Dank!
Hi,
was hast Du den bisher programmiert?
Funktioniert ansonsten das VD und TTS bei Dir?
VG Hoggle
Hallo,
also erstmal besten Dank für die Anleitung.
Habe das Skript getestet und das leiserstellen der Sonos Boxen klappt bei mir super.
Habe allerdings zwei Probleme:
1. Fehlermeldung beim debuggen: API: Not found
2. Wie muss denn die Url der NAS aussehen, wenn es in einem Unterordner ist?
Brauche ich ein Login/Passwort, oder kann ich das irgendwo abschalten?
Besten Dank schonmal!
Frank
Hallo,
Erstmal besten Dank für die Anleitung!
Bin Neuling/Wiedereinsteiger beim programmieren... und so gibt es zwei Probleme bzw. Fragen:
1. ich bekomme bei Debüt folgende Fehlermeldung beim Anruf:
API: Not found
2. irgendwie scheint was mit dem Pfad fürs fritzNAS nicht zu stimmen... wie muss der den aufgebaut sein?
Benötige ich den eine Freigabe/Nutzer/Passwort?
Besten Dank!
Hallo ich würde gerne die VD ausprobieren leider kann mann sich nicht mehr herunterladen.
Ich bitte um einen funktionieren link.
Danke
Hallo, ich habe seit langem dein VD im Einsatz,zusammen mit Sonos als "Klingel".
jetzt bin ich dabei auf das HC3 umzusteigen, und habe mich gefragt, ob es ggf. ein update gibt oder einen plan dieses VD als QA umzusetzen? Leider bin ich kein Entwickler,und tue mir mit dem neuen Lua schwer.
Ich wäre auch bereit Geld dafür zu bezahlen.