NEWS
[Vorlage] upnp Media Player
-
In letzter Zeit sehe ich wieder Häufiger Fragen wie "mp3 auf Gerät XY Wiedergeben" und mein Sonos Adapter treibt mich in den Wahnsinn mit den Abstürzen.
Deswegen hab ich mal wieder ein altes Projekt von mir raus gekramt, ein Skript mit dem man upnp fähige Geräte zumindest rudimentär steuern kann.
Das Skript ist von 2017 und ich hab es nur so viel angepasst das es wieder läuft. Es sollte euch vor allem auch dazu dienen zu verstehen wie man mit dem upnp Adapter arbeiten kann.
Oder halt nur um eine mp3 Wieder zu gebenVorasusetzungen:
- upnp Adapter
- upnp Fähiges Gerät
Was gibt es zu beachten?
- device: Hier muss der Pfad zum "Media Renderer" angegeben werden
- control: Hier den gewünschten Pfad angeben in dem die Objekte angelegt werden sollen. Der Pfad muss existieren!
- mp3's müssen an einem Ort liegen der vom Netzwerk aus erreichbar ist.
- es funktionieren NUR mp3 oder andere vom Gerät Unterstütze Audio Fomrate, Widergabelisten wie m3u funktionieren NICHT.
- Bei manchen Geräten, in der Regel TV's, muss die Upnp Steuerung Frei gegeben bzw. bei der ersten Benutzung bestätigt werden. Einfach einmal Steuern, taucht ein Pop-up auf.
const device = "upnp.0.Büro_-_Sonos_Connect:Amp_Media_Renderer"; //Hier das upnp Gerät eintragen das gesteuert werden soll. const control = '0_userdata.0.Buero.Sonos_amp'; //Hier das Objekt eintragen wo die Steuerobjekte angelegt werden sollen let oldVol; //createState(name, initialValue, forceCreation, common, native, callback); createState(control + '.MediaControl.Play', false, {type: 'boolean', read: true, write: true, role: 'button.play'}); createState(control + '.MediaControl.Pause', false, {type: 'boolean', read: true, write: true, role: 'button.pause'}); createState(control + '.MediaControl.Stop', false, {type: 'boolean', read: true, write: true, role: 'button.stop'}); createState(control + '.AudioControl.Vol_UP', false, {type: 'boolean', read: true, write: true, role: 'button.volume_up'}); createState(control + '.AudioControl.Vol_Down', false, {type: 'boolean', read: true, write: true, role: 'button.volume_down'}); createState(control + '.AudioControl.Mute', false, {type: 'boolean', read: true, write: true, role: 'button.mute'}); createState(control + '.MediaControl.MediaURL', '', {type: 'string', read: true, write: true, role: 'media.url'}); on({id: control + '.MediaControl.Play', val: true }, function(obj) { //Wiedergabe starten setState(device + '.MediaRenderer.AVTransport.Play.InstanceID', '0'); setState(device + '.MediaRenderer.AVTransport.Play.Speed', '1'); setState(device + '.MediaRenderer.AVTransport.Play.request', true); setTimeout(function(){setState(obj.id, false);}, 150); }); on({id: control + '.MediaControl.Pause', val: true }, function(obj) { //Wiedergabe pausieren setState(device + '.MediaRenderer.AVTransport.Pause.InstanceID', '0'); setState(device + '.MediaRenderer.AVTransport.Pause.request', true); setTimeout(function(){setState(obj.id, false);}, 150); }); on({id: control + '.MediaControl.Stop', val: true }, function(obj) { //Wiedergabe stoppen setState(device + '.MediaRenderer.AVTransport.Stop.InstanceID', '0'); setState(device + '.MediaRenderer.AVTransport.Stop.request', true); setTimeout(function(){setState(obj.id, false);}, 150); }); on({id: control + '.AudioControl.Vol_UP', val: true }, async function(obj){ setState(device + '.MediaRenderer.RenderingControl.GetVolume.Channel', 'Master'); setState(device + '.MediaRenderer.RenderingControl.GetVolume.InstanceID', '0'); setState(device + '.MediaRenderer.RenderingControl.GetVolume.request', true); await wait(150); oldVol = getState(device + '.MediaRenderer.RenderingControl.Volume').val; newVol = parseInt(oldVol) + 5; //der Wert um den die Lautstärke geändert wird, kann beliebig geändert werden //neue Lautstärke senden setState(device + '.MediaRenderer.RenderingControl.SetVolume.Channel', 'Master'); setState(device + '.MediaRenderer.RenderingControl.SetVolume.DesiredVolume', newVol.toString()); setState(device + '.MediaRenderer.RenderingControl.SetVolume.InstanceID', '0'); setState(device + '.MediaRenderer.RenderingControl.SetVolume.request', true); setTimeout(function(){setState(obj.id, false);}, 150); }); on({id: control + '.AudioControl.Vol_Down', val: true }, async function(obj){ setState(device + '.MediaRenderer.RenderingControl.GetVolume.Channel', 'Master'); setState(device + '.MediaRenderer.RenderingControl.GetVolume.InstanceID', '0'); setState(device + '.MediaRenderer.RenderingControl.GetVolume.request', true); await wait(150); oldVol = getState(device + '.MediaRenderer.RenderingControl.Volume').val; newVol = parseInt(oldVol) - 5; //der Wert um den die Lautstärke geändert wird, kann beliebig geändert werden //neue Lautstärke senden setState(device + '.MediaRenderer.RenderingControl.SetVolume.Channel', 'Master'); setState(device + '.MediaRenderer.RenderingControl.SetVolume.DesiredVolume', newVol.toString()); setState(device + '.MediaRenderer.RenderingControl.SetVolume.InstanceID', '0'); setState(device + '.MediaRenderer.RenderingControl.SetVolume.request', true); setTimeout(function(){setState(obj.id, false);}, 150); }); on({id: control + '.AudioControl.Mute', val: true }, async function(obj){ setState(device + '.MediaRenderer.RenderingControl.GetMute.InstanceID', '0'); setState(device + '.MediaRenderer.RenderingControl.GetMute.Channel', 'Master'); setState(device + '.MediaRenderer.RenderingControl.GetMute.request', true); await wait(150); const oldMute = getState(device + '.MediaRenderer.RenderingControl.Mute').val; if(oldMute == '0'){ setState(device + '.MediaRenderer.RenderingControl.SetMute.InstanceID', '0'); setState(device + '.MediaRenderer.RenderingControl.SetMute.Channel', 'Master'); setState(device + '.MediaRenderer.RenderingControl.SetMute.DesiredMute', '1'); setState(device + '.MediaRenderer.RenderingControl.SetMute.request', true); //oldVol = getState(device + '.MediaRenderer.RenderingControl.Volume').val; }else{ setState(device + '.MediaRenderer.RenderingControl.SetMute.InstanceID', '0'); setState(device + '.MediaRenderer.RenderingControl.SetMute.Channel', 'Master'); setState(device + '.MediaRenderer.RenderingControl.SetMute.DesiredMute', '0'); setState(device + '.MediaRenderer.RenderingControl.SetMute.request', true); } setTimeout(function(){setState(obj.id, false);}, 150); }); on({id: control + '.MediaControl.MediaURL' }, function(obj){ setState(device + '.MediaRenderer.AVTransport.SetAVTransportURI.CurrentURI', obj.state.val); setState(device + '.MediaRenderer.AVTransport.SetAVTransportURI.InstanceID', '0'); setState(device + '.MediaRenderer.AVTransport.SetAVTransportURI.request', true); });
Wer das Skript erweitert oder verbessert darf es gerne Zeigen.
Und jetzt Viel Spaß damit. -
Danke für das Skript
Habe nun für jeden vom UPNP-Adapter gefundenen Player eingebunden in Form eines einzelnen Skriptes eingebunden.
Bei mir waren es die WLAN-Lautsprecher und ein Internetradio von Silvercrest und ein Symfonisk-Lautsprecher, den ich normalerweise mit dem SONOS-Adapter anspreche.
Die Google Home Minis und die Cromecast Audios wurden nicht gefunden, obwohl UPNP bei denen standardmäßig eingeschaltet sein sollte. Habe allerdings in der Home-App auch noch nicht die Stelle gefunden, wo ich diese Einstellung überprüfen kann.Die Menupunkte unter "0_userdata" sind erstellt und nun kommt DIE große Frage nach dem:
Wie spiele ich
eine mp3-Datei, die auf der ioBroker-Maschine in einem bestimmten Verzeichnis liegt oder
eine mp3-Datei, die auf einem an der Fritzbox angeschlossenem Stick liegt oder
eine mp3-Datei, die in einem für das Netzwerk freigegebenen Verzeichnis eines Windows-Rechners liegtab???
Wenn Du mir/uns da noch einen Schubs geben könntest, wäre ich überglücklich
-
@berchemer sagte in [Vorlage] upnp Media Player:
Die Google Home Minis und die Cromecast Audios wurden nicht gefunden, obwohl UPNP bei denen standardmäßig eingeschaltet sein sollte.
Wusste gar nicht das die upnp können, da muss ich mal bei meinen schauen.
@berchemer sagte in [Vorlage] upnp Media Player:
Wie spiele ich
eine mp3-Datei, die auf der ioBroker-Maschine in einem bestimmten Verzeichnis liegt oder
eine mp3-Datei, die auf einem an der Fritzbox angeschlossenem Stick liegt oder
eine mp3-Datei, die in einem für das Netzwerk freigegebenen Verzeichnis eines Windows-Rechners liegt
ab???Du brauchst nur die URL zur mp3 in MediaURL schreiben und dann Play auf true setzen.
Beispiel URL die im VIS abgelegt ist:
http://192.168.0.3:8082/vis.0/test.mp3
Lokal geht wie gesagt nicht, du musst die Datei in ein Verzeichnis Kopieren das im Netzwerk erreichbar ist.
-
@jey-cee
Zumindest die Home Minis sollen es angeblich können, ob es auch die Chromecast-Audios können, habe ich noch nicht nachgeschlagen. -
@jey-cee sagte in [Vorlage] upnp Media Player:
Du brauchst nur die URL zur mp3 in MediaURL schreiben und dann Play auf true setzen.
Beispiel URL die im VIS abgelegt ist:
http://192.168.0.3:8082/vis.0/test.mp3
Sorry für die vielleicht banalen Fragen, aber ich scheine eine Form der Denkblokade zu haben
Was meinst Du mit im VIS abgelegt?
Über ein Widget?
Wenn ja, über welches Widget? -
@berchemer einfach über den Dateimanager dort hochgeladen.
-
@jey-cee sagte in [Vorlage] upnp Media Player:
@berchemer einfach über den Dateimanager dort hochgeladen.
DankeKann man mit dem Aufruf des Web-Adapters eigentlich auch auf höhere Verzeichnisse der ioBroker-Installation zugreifen???
Irgendwie bekomme ich das nämlich nicht hin. Liegt aber wahrscheinlich an Restriktionen oder bestimmten Einstellungen des web-Adapters oder? -
@berchemer sagte in [Vorlage] upnp Media Player:
Kann man mit dem Aufruf des Web-Adapters eigentlich auch auf höhere Verzeichnisse der ioBroker-Installation zugreifen???
Sollte nicht möglich sein, das wäre ein Sicherheitsrisiko.
-
Kannst Du etwas mit den folgenden Meldungen anfangen?
Unexpected answer from upnp service: {"statusCode":500,"body":"<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"><s:Body><s:Fault><faultcode>s:Client</faultcode><faultstring>UPnPError</faultstring><detail><UPnPError xmlns=\"urn:schemas-upnp-org:control-1-0\"><errorCode>701</errorCode></UPnPError></detail></s:Fault></s:Body></s:Envelope>","headers":{"content-length":"347","content-type":"text/xml; charset=\"utf-8\"","ext":"","server":"Linux UPnP/1.0 Sonos/67.1-25031 (ZPS21)","connection":"close"},"request":{"uri":{"protocol":"http:","slashes":true,"auth":null,"host":"192.168.0.73:1400","port":"1400","hostname":"192.168.0.73","hash":null,"search":null,"query":null,"pathname":"/MediaRenderer/AVTransport/Control","path":"/MediaRenderer/AVTransport/Control","href":"http://192.168.0.73:1400/MediaRenderer/AVTransport/Control"},"method":"POST","headers":{"Content-Type":"text/xml; charset=\"utf-8\"","SOAPAction":"\"urn:schemas-upnp-org:service:AVTransport:1#Play\"","USER-AGENT":"UPnP/1.0, ioBroker.upnp","content-length":298}}} Sent message: {"uri":"http://192.168.0.73:1400/MediaRenderer/AVTransport/Control","headers":{"Content-Type":"text/xml; charset=\"utf-8\"","SOAPAction":"\"urn:schemas-upnp-org:service:AVTransport:1#Play\"","USER-AGENT":"UPnP/1.0, ioBroker.upnp"},"method":"POST","body":" \n <s:Envelope s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">\n <s:Body><u:Play xmlns:u=\"urn:schemas-upnp-org:service:AVTransport:1\"><InstanceID>0</InstanceID><Speed>1</Speed></u:Play></s:Body>\n </s:Envelope>"}
Unexpected answer from upnp service: {"statusCode":405,"body":"<html><head><title>405 Method Not Allowed</title></head><body><h1>Method Not Allowed</h1><p>The requested URL cannot be accessed with the requested method.</p></body></html>","headers":{"content-type":"text/html","content-length":"173"},"request":{"uri":{"protocol":"http:","slashes":true,"auth":null,"host":"192.168.0.81","port":80,"hostname":"192.168.0.81","hash":null,"search":null,"query":null,"pathname":"/:8080AVTransport/control","path":"/:8080AVTransport/control","href":"http://192.168.0.81/:8080AVTransport/control"},"method":"POST","headers":{"Content-Type":"text/xml; charset=\"utf-8\"","SOAPAction":"\"urn:schemas-upnp-org:service:AVTransport:1#SetAVTransportURI\"","USER-AGENT":"UPnP/1.0, ioBroker.upnp","content-length":431}}} Sent message: {"uri":"http://192.168.0.81:8080AVTransport/control","headers":{"Content-Type":"text/xml; charset=\"utf-8\"","SOAPAction":"\"urn:schemas-upnp-org:service:AVTransport:1#SetAVTransportURI\"","USER-AGENT":"UPnP/1.0, ioBroker.upnp"},"method":"POST","body":" \n <s:Envelope s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">\n <s:Body><u:SetAVTransportURI xmlns:u=\"urn:schemas-upnp-org:service:AVTransport:1\"><InstanceID>0</InstanceID><CurrentURI>http://192.168.0.131:8082/vis.0/Sounds01/google.tts.mp3</CurrentURI><CurrentURIMetaData></CurrentURIMetaData></u:SetAVTransportURI></s:Body>\n </s:Envelope>"}
-
Und beim Sonos (die obere der beiden o.g. Meldungen) kommt noch folgende Fehlermeldung im Log von ioBroker:
Cannot remove track: RequestFailedError: Got status 500 when invoking /MediaRenderer/AVTransport/Control
-
@berchemer sagte in [Vorlage] upnp Media Player:
könnte es damit zusammenhängen, dass der UPNP-Adapter anscheinend die URL falsch aufbaut?
http://192.168.0.81/:8080AVTransport/control
statt
http://192.168.0.81:8080/AVTransport/control
-
@berchemer Status 500 ist die Rückmeldung vom Gerät das es ein internes Problem gab. Die Sonos gibt den Fehler Code 701 als Nachricht zurück, was soweit ich das auf die schnelle herausgefunden habe auf ein Verbindungsproblem hindeutet.
https://en.community.sonos.com/troubleshooting-228999/an-error-occurred-while-adding-songs-to-the-queue-701-6795301@berchemer sagte in [Vorlage] upnp Media Player:
könnte es damit zusammenhängen, dass der UPNP-Adapter anscheinend die URL falsch aufbaut?
Ja der zweite Fehler dürfte daraus resultieren. Die Frage ist warum das falsch ist.
Kannst du mal das entsprechende Objekt AVTransport öffnen und hier posten. -
@jey-cee sagte in [Vorlage] upnp Media Player:
Ja der zweite Fehler dürfte daraus resultieren. Die Frage ist warum das falsch ist.
Kannst du mal das entsprechende Objekt AVTransport öffnen und hier posten.Gerne, aber das System sagt mir etwas von "Payload too large" und verweigert das Absenden
-
@jey-cee sagte in [Vorlage] upnp Media Player:
@berchemer Status 500 ist die Rückmeldung vom Gerät das es ein internes Problem gab. Die Sonos gibt den Fehler Code 701 als Nachricht zurück, was soweit ich das auf die schnelle herausgefunden habe auf ein Verbindungsproblem hindeutet.
https://en.community.sonos.com/troubleshooting-228999/an-error-occurred-while-adding-songs-to-the-queue-701-6795301@berchemer sagte in [Vorlage] upnp Media Player:
könnte es damit zusammenhängen, dass der UPNP-Adapter anscheinend die URL falsch aufbaut?
Ja der zweite Fehler dürfte daraus resultieren. Die Frage ist warum das falsch ist.
Kannst du mal das entsprechende Objekt AVTransport öffnen und hier posten.Habe es hier als Anhang gepostet:
https://github.com/iobroker-community-adapters/ioBroker.upnp/issues/104 -
Btw: Die Einstellung automatisch erkennen kann ich ja nachvollziehen.
Was bedeutet aber die EInstellung "Automatisch Abonnement"? -
@berchemer upnp sieht vor das ein Dienst seinen Aktuellen Zustand mitteilt wenn ein Client ihn Abonniert.
So muss er nicht immer Abfragen.
Aber was übermittelt wird hängt vom Dienst ab. Bei MediaRender war das soweit ich mich erinnere nur infos über die Wiedergabe, also was gespielt wird, play, pause, stop. -
Und weitere Frage zum Adapter:
Im Objekte-Tab von ioBroker ist unter den Einstellungen, wo man auch die History-Daten einstellen kann, auch UPNP mit der Möglichkeit "Aktiviert/Nicht aktiviert" auswählbar. Was bewirkt denn das Aktivieren??? -
@berchemer funktioniert nur bei dem dp request und bietet die Möglichkeit den Zyklisch aus zu führen.
Das wurde für die Fritzbox fraktion eingebaut die damit den Aktuellen traffic überwachen. Da die FritzBox die Werte nicht von sich aus preis gibt, auch wenn Abonniert. -
@Jey-Cee
wollte das script jetzt auch mal ausprobieren.
Ich habe in der fritzbox den upnp dienst aktiviert und dort auch eine Stream für internet Dario eingestellt.
Mit meinem Gerät kann ich so auch direkt drauf zugreifen.
Adapter läuft und finde dann auch im Objekt Baum einige pfade zu der fritzboxIst es nun möglich über das Script den Media Player zu steuern?
Du schreibt dass Widergabelisten nicht funktionieren, bin mir aber nun nicht sicher ob ein eingesteller stream als solche Widergabeliste deklariert wird -
@jensven sagte in [Vorlage] upnp Media Player:
Ist es nun möglich über das Script den Media Player zu steuern?
Welchen Media Player? Die FritzBox selber ist ja kein Media Palyer.