NEWS
[Projekt] Google Home steuert Denon AV-Receiver
-
Hallo,
nachdem meine erste Tests mit Alexa nicht besonders zufriedenstellend ausgefallen sind, habe ich mir einen Google-Home mini angeschafft. Dieser musste natürlich sofort mit ioBroker gekoppelt werden
Ein Ziel war es, meinen Denon AV-Receiver mit Sprachkommandos zu steuern.
Dabei sollte eine gewisse Flexibilität bei den Sprachkommandos möglich sein.
Da sich die http-Kommandos des Denon als am zuverlässigsten herausgestellt haben, habe ich diese zur Steuerung verwendet.
Man kann das auch über Telnet (TCP Port 23) machen, wenn man Rückmeldungen vom Receiver benötigt. Ich habe darauf verzichtet.
Die Realisierung nutzt den bekannten Weg über IFTTT.
Dazu habe ich in IFTTT 2 Applets angelegt. Diese dienen zur Übergabe der Kommandos an ioBroker.
Applet 1 dient zur übergabe einen Kommandos ohne Parameter.
Applet 2 dient zur Übergabe eines Kommandos mit Parameter.
Diese sehen wie folgt aus:
!
Gemein ist beiden Applets, dass diese aus dem Befehlswort "Kommando" und den Platzhaltern bestehen.Beim Applet 2 mit Parameter muss der Parameter mit dem Schlüsselwort "auf" abgetrennt werden.
Z.B. "Kommando Receiver Lautstärke Küche auf 50"
Man kann aber auch sagen: "Kommando Setze die Lautstärke des Receivers in der Küche auf 50".
"Kommando" ist das Erkennungswort, damit der gesprochene Text von IFTTT an ioBroker übermittelt wird.
Dort kommt dann der Rest ohne "Kommando" unter der Variablen cloud.x.services.ifttt an.
Wenn irgendwo die Phrase "auf x" verwendet wird, nutzt IFTTT automatisch das 2. Applet und der übergebene Text besteht aus dem Sprachbefehl (ohne "Kommando") und abgetrennt mit ":" dem Parameterwert.
Der Parameter muss numerisch sein, sonst wird Applet 1 verwendet!
Das ":" dient zum späteren Separieren des Parameters im ioBroker Script.
Ich habe keine JSON-Variante gewählt, da ich die übergebenen Texte manuell parsen möchte.
Dazu dient ein Javascript (s.u.), das auch den optionalen Parameter erkennt und an die Auswertefunktion übergibt.
Zuerst wird der Text auf Kleinbuchstaben geändert und gegebenenfalls der Parameter ermittelt.
Damit diese auch noch für andere Geräte genutzt werden kann, habe ich in der Auswertung vorgesehen, das in allen Sprachbefehlen das Wort
"Receiver" vorkommen muss. Solange man nur den Receiver über IFTTT steuern möchte, kann man diese Prüfung auch weglassen.
Ein Sprachbefehl setzt sich also immer wie folgt zusammen:
"Kommando" + "Receiver" + gewünschter Befehl" ( + optional "auf xx")
Der Befehl wird auf das Vorkommen von Schlüsselwörtern wie "Eingang", "Lautstärke" oder die zusätzliche
Zonenangabe "Küche" untersucht. Die Reihenfolge oder zusätzliche Füllwörter spielen dabei keine Rolle.
Wenn das Wort "Küche" irgendwo vorkommt, wirken die Komandos auf Zone 2, ansonsten auf die Main-Zone.
Bei der Lautstärkesteuerung habe ich eine Begrenzung eingebaut, die verhindert, dass es zu laut werden kann
Dadurch ist die Spracherkennung etwas flexibler, als wenn man alle Kommandos direkt in IFTTT erstellen würde.
Und IFTTT muss man bei zusätzlichen Sprachbefehlen nicht ändern
Das Script "umgeht" zwar den vorhandenen Denon-Adapter und nutzt auch keine weiteren Variablen, aber für mich
funktioniert es so schon recht gut.
Zur Nutzung mit dem eigenen Receiver muss auf jeden Fall oben im Script die IP-Adresse angepasst werden.
Aktuell ist möglich:
-
Ein-/Ausschalten für 2 Zonen
-
Ändern der Lautstärke in Stufen oder absolut
-
Abrufen von Standardwerten "laut", "normal" und "leise"
-
Aktivieren der MUTE-Funktion mit Lautstärke "stumm"
-
Umschalten der Eingänge pro Zone zwischen "Netzwerk", "SAT", "TV-Ton" und "Blueray/DVD"
-
Aufrufen der "Favoriten1..3"
Tschau
Uwe
Hier das Script:
! ````
//Kontakt: uweklatt@aol.com
//ioBroker Forum: uweklatt
var net = require('net');
var request= require('request');
! var ip = '192.168.178.11'; // Denon Receiver IP-Adresse
! function work(command, val)
{
var zone = 'ZM'; // Master-Zone
var zonevol = 'MV'; // Lautstärke-Prefix Masterzone
var zoneinp = 'SI'; // Eingang-Prefix Masterzone// Receiver if(command.search("receiver") >= 0) { // Favoriten - Globale Kommandos if(command.search("favorit") >= 0) { if(command.search("1") >= 0 || val.search("1") >= 0) request('http://'+ip+'/goform/formiPhoneAppDirect.xml?ZMFAVORITE1'); else if(command.search("2") >= 0 || val.search("2") >= 0) request('http://'+ip+'/goform/formiPhoneAppDirect.xml?ZMFAVORITE2'); else if(command.search("3") >= 0 || val.search("3") >= 0) request('http://'+ip+'/goform/formiPhoneAppDirect.xml?ZMFAVORITE3'); return; } // Küche - Kommando für Zone 2 if(command.search("küche") >= 0) zone = zonevol = zoneinp = 'Z2';
! // Eingang wählen
if(command.search("eingang") >= 0)
{
if(zone == 'Z2')
incmd = 'SI';if(command.search("net") >= 0) request('http://'+ip+'/goform/formiPhoneAppDirect.xml?'+zoneinp+'NET'); else if(command.search("tv") >= 0 || command.search("fernseh") >= 0) request('http://'+ip+'/goform/formiPhoneAppDirect.xml?'+zoneinp+'TV'); else if(command.search("cd") >= 0 || command.search("dvd") >= 0 || command.search("ray") >= 0) request('http://'+ip+'/goform/formiPhoneAppDirect.xml?'+zoneinp+'BD'); else if(command.search("sat") >= 0) request('http://'+ip+'/goform/formiPhoneAppDirect.xml?'+zoneinp+'SAT/CBL'); } // Lautstärke ändern else if(command.search("lautstärke") >= 0) { if(command.search("lauter") >= 0) request('http://'+ip+'/goform/formiPhoneAppDirect.xml?'+zonevol+'UP'); else if(command.search("leiser") >= 0) request('http://'+ip+'/goform/formiPhoneAppDirect.xml?'+zonevol+'DOWN'); else if(command.search("leise") >= 0) request('http://'+ip+'/goform/formiPhoneAppDirect.xml?'+zonevol+'30'); else if(command.search("laut") >= 0) request('http://'+ip+'/goform/formiPhoneAppDirect.xml?'+zonevol+'55'); else if(command.search("normal") >= 0) request('http://'+ip+'/goform/formiPhoneAppDirect.xml?'+zonevol+'40'); else if(command.search(" stu") >= 0) // MUTE { if(zone == 'ZM') // Master-Zone request('http://'+ip+'/goform/formiPhoneAppDirect.xml?MUON'); else request('http://'+ip+'/goform/formiPhoneAppDirect.xml?'+zone+'MUON'); } else if (val >= 0) { var laut = parseInt(val*8/10); laut = Math.max(0, Math.min(laut, 70)); // Begrenzung! request('http://'+ip+'/goform/formiPhoneAppDirect.xml?'+zonevol+laut); } }
! // Power
else if(command.search(" ein") >= 0) // Zone Einschalten
request('http://'+ip+'/goform/formiPhoneAppDirect.xml?'+zone+'ON');
else if(command.search(" aus") >= 0) // Zone Ausschalten
request('http://'+ip+'/goform/formiPhoneAppDirect.xml?'+zone+'OFF');}
}
! on({id:"cloud.0.services.ifttt"}, function (obj){
var text = getState('cloud.0.services.ifttt').val.toLowerCase();
var command = text;
var hasval = text.search(":");
var val = -1;
if(hasval>=0)
command = text.slice(0,hasval);
if(hasval > 0)
val = text.slice(hasval+1)
console.log(command+'['+val+']');
work(command, val);
}
); -
-
Ich habe das Thema, auf Anregung des Erstellers, hierher verschoben - passt besser.
Gruß,
Eric
-
Hallo Uwe,
genau so etwas habe ich gesucht, also erst mal vielen dank für die Arbeit.
Schade nur ist, bei mir läuft es nicht.
Ich habe im Script die IP-Adresse meines Denon AVR-x3400h eingetragen, im Receiver ist die Netzwerksteuerung angelegt. Ich denke auch, dass in der Cloud beim IObroker alles stimmt, der Befehl kommt auf jeden Fall an. unter Objekte/servicesIifttt erscheint "Text Field" wenn ich den Befehl sprechen (über Google Home).
Nur leider passiert dann nichts.
Was könnte noch falsch sein?
-
Hallo jsoentgen,
Was erscheint in der Debugausgabe des Scriptes, wenn Du das Script startest und dann ein Kommando schickst/sprichst?
Uwe
-
Aber es ist nicht möglich einfach die Musikausgabe auf einen Denon zu verlagern?
Z.b. "Google, spiele charts"
dann startet Google direkt spotify und die charts playlist.
Schön wäre, wenn er spotify startet, dass er dass auf dem denon tut.
-
Hallo maxpd,
Du kannst Musik z.B. über DLNA an den Denon streamen. Dazu gibt es auch diverse Apps.
Ich nutze einen zusätzlichen Google Chromecast am HDMI-Anschluss eines Denon X4000.
Darüber kann man aus fast allen Apps (auch Youtube) direkt Videos oder reines Audio streamen.
Zusammen mit Google Home auch sprachgesteuert.
Wenn ich z.B. Yello von Spotify hören möchte, schalte ich den Receiver mit passendem Eingang über ein Sprachkommando ein.
Dann sage ich "OK Google, spiele Spotify Yello" und die Wiedergabe startet… Auch die Lautstärke kann man über Sprachkommando steuern.
Der Chromecast am Denon ist dazu unter Google Home als Standard Audiogerät eingerichtet.
Tschau
Uwe
-
Hallo Uwe,
denke ich habe das Problem gefunden, die neueren Denon Receiver hören nicht mehr auf http Kommandos und können nur noch per Telnet oder RS232 angesprochen werden.
-
Danke für die Info.
Tschau
Uwe
-
An und Ausschalten des receivers habe ich damit hinbekommen per Google Home über IFTTT
on({id: 'cloud.0.services.ifttt', change: "any"}, function (obj) {
var value = obj.state.val;
var oldValue = obj.oldState.val;
if (getState("cloud.0.services.ifttt").val == 'receiver power an') {
setState("denon.0.settings.powerSystem"/System Power State/, true);
} else if (getState("cloud.0.services.ifttt").val == 'receiver power aus') {
setState("denon.0.settings.powerSystem"/System Power State/, false);
}
});
für mehr reichen meine Grundkenntnisse leider noch nicht. Wollte den Eingang in der Mainzone noch per Sprachbefehl auf Internetradio ändern können, klappt aber leider nicht.
on({id: 'cloud.0.services.ifttt', change: "ne"}, function (obj) {
var value = obj.state.val;
var oldValue = obj.oldState.val;
if (getState("cloud.0.services.ifttt").val == 'internetradio an') {
setState("denon.0.zoneMain.selectInput"/Select input/, 'IRADIO');
}
});
-
Hallo maxpd,
Du kannst Musik z.B. über DLNA an den Denon streamen. Dazu gibt es auch diverse Apps.
Ich nutze einen zusätzlichen Google Chromecast am HDMI-Anschluss eines Denon X4000.
Darüber kann man aus fast allen Apps (auch Youtube) direkt Videos oder reines Audio streamen.
Zusammen mit Google Home auch sprachgesteuert.
Wenn ich z.B. Yello von Spotify hören möchte, schalte ich den Receiver mit passendem Eingang über ein Sprachkommando ein.
Dann sage ich "OK Google, spiele Spotify Yello" und die Wiedergabe startet… Auch die Lautstärke kann man über Sprachkommando steuern.
Der Chromecast am Denon ist dazu unter Google Home als Standard Audiogerät eingerichtet.
Tschau
Uwe `
Danke für die Rückmeldung.
Ja ich hatte schon vermutet, dass man dies am besten über einen Chromecast Audio löst. Der Receiver schaltet sich hier bei einem Eingangssignal vermutlich nicht von alleine an, weil es nur einen "lauschenden" HDMI Port gibt und dieser schon für den TV belegt ist.
-
Hallo maxpd,
wenn man die Multi-Room Funktion nicht benötigt, würde ich einen "normalen "Chromecast und keinen vom Typ "Audio" nehmen, da der "normale" auch Videos streamen kann.
Tschau
Uwe
-
Danke! Teste ich, wenn er noch funktioniert. Hat mehrere Monate an einem 2A Netzteil gehangen und war glühend heiß und hat nur noch Lila Streifen gestreamt..
-
Hallo UweKlatt,
ich bin mir nicht sicher, ob ich mit meinem Anliegen hier genau richtig bin, und erhoffe Nachsehen, falls nicht.
Da ich im Netz nicht genau fündig wurde, möchte ich mir die Frage gestatten, ob es möglich ist, einen Google Chromecast (welchen ?)
an einen Denon AVR -X 2500H so anzuschliessen, das dieser die Musik in den Chromecast leitet ( über Multiroom Zone 2 ), und der Chrome cast diese streamt, so das die Multiroom Zone über den Chromecast aufgebaut werden kann.
Ziel wäre es, die vom Denon AVR integrierte Heos Multiroom funktion zu umgehen, da die Lautsprecher erheblich teurer sind, als z.B. Google Chromcast unterstützende Lautsprecher von Pioneer.
Vielen Dank im Voraus
-
Hallo Naphtalin,
Du kannst den Google Chromecast über HDMI an den AV-Receiver anschliessen und alles , was auf diesem Chromecast abgespielt wird, über Zone 2 ausgeben. Der benutze HDMI Eingang muss einem Eingang zugeordnet werden, dann kann man den Eingang für Zone 2 nutzen. Der "normale" Chromecast kann Audio und Video ausgeben.
Alternativ kann auch ein Chromecast Audio verwendet werden. Der wird am besten über ein optisches Kabel angeschlossen, kann aber nur Audio ausgeben.
Tschau
Uwe
-
UweKlatt, hab vielen Dank für Deine ausführliche Ausführung
ich bin mal gespannt für welche Möglichkeit ( Heos / Chrome ) ich mich entscheiden werde.
Bisher wäre für mich die Audio Möglichkeit wohl ausreichend, um ein wenig Musik in Küche und Bad zu haben.
Muss mich mal schlau machen, was die Geräte so ausmachen, bzw. die Möglichkeiten des Machbaren.
Der Denon AVR ist ja Alexa kompatibel und sprachbedienbar (zumindest Musikwünsche),
wäre das mit einem angeschlossenem Chromecast ebenso möglich ?
Und was wäre mit dem Chromcast wohl alles machbar ?
Ist ja schon eine interessante Sache, sofern sie problemlos funktioniert