Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. [Vorlage] upnp Media Player

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [Vorlage] upnp Media Player

    This topic has been deleted. Only users with topic management privileges can see it.
    • Jey Cee
      Jey Cee Developer last edited by Jey Cee

      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 geben 😁

      Vorasusetzungen:

      • 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.

      B 1 Reply Last reply Reply Quote 1
      • B
        Berchemer @Jey Cee last edited by

        @jey-cee

        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 liegt

        ab???

        Wenn Du mir/uns da noch einen Schubs geben könntest, wäre ich überglücklich 😉

        Jey Cee 1 Reply Last reply Reply Quote 0
        • Jey Cee
          Jey Cee Developer @Berchemer last edited by Jey Cee

          @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.

          B 2 Replies Last reply Reply Quote 0
          • B
            Berchemer @Jey Cee last edited by

            @jey-cee
            Zumindest die Home Minis sollen es angeblich können, ob es auch die Chromecast-Audios können, habe ich noch nicht nachgeschlagen.

            1 Reply Last reply Reply Quote 0
            • B
              Berchemer @Jey Cee last edited by

              @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?

              Jey Cee 1 Reply Last reply Reply Quote 0
              • Jey Cee
                Jey Cee Developer @Berchemer last edited by

                @berchemer einfach über den Dateimanager dort hochgeladen.

                B 1 Reply Last reply Reply Quote 0
                • B
                  Berchemer @Jey Cee last edited by

                  @jey-cee sagte in [Vorlage] upnp Media Player:

                  @berchemer einfach über den Dateimanager dort hochgeladen.

                  🤦 🤦 🤦
                  Danke 👍

                  Kann 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?

                  Jey Cee 1 Reply Last reply Reply Quote 0
                  • Jey Cee
                    Jey Cee Developer @Berchemer last edited by

                    @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.

                    B 2 Replies Last reply Reply Quote 0
                    • B
                      Berchemer @Jey Cee last edited by Berchemer

                      @jey-cee

                      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>"}
                      
                      B 1 Reply Last reply Reply Quote 0
                      • B
                        Berchemer @Jey Cee last edited by Berchemer

                        @jey-cee

                        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
                        
                        Jey Cee 1 Reply Last reply Reply Quote 0
                        • B
                          Berchemer @Berchemer last edited by

                          @berchemer sagte in [Vorlage] upnp Media Player:

                          http://192.168.0.73:1400/MediaRenderer/AVTransport/Control

                          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
                          
                          1 Reply Last reply Reply Quote 0
                          • Jey Cee
                            Jey Cee Developer @Berchemer last edited by

                            @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.

                            B 2 Replies Last reply Reply Quote 0
                            • B
                              Berchemer @Jey Cee last edited by

                              @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 😞

                              1 Reply Last reply Reply Quote 0
                              • B
                                Berchemer @Jey Cee last edited by

                                @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

                                Berchemer created this issue in iobroker-community-adapters/ioBroker.upnp

                                open [Bug]: Adapter seems to create wrong url #104

                                1 Reply Last reply Reply Quote 0
                                • B
                                  Berchemer last edited by

                                  Btw: Die Einstellung automatisch erkennen kann ich ja nachvollziehen.
                                  Was bedeutet aber die EInstellung "Automatisch Abonnement"?

                                  Jey Cee 1 Reply Last reply Reply Quote 0
                                  • Jey Cee
                                    Jey Cee Developer @Berchemer last edited by

                                    @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.

                                    1 Reply Last reply Reply Quote 1
                                    • B
                                      Berchemer last edited by Berchemer

                                      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???

                                      1 Reply Last reply Reply Quote 0
                                      • Jey Cee
                                        Jey Cee Developer last edited by

                                        @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.

                                        1 Reply Last reply Reply Quote 1
                                        • J
                                          jensven last edited by

                                          @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 fritzbox

                                          Ist 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

                                          Jey Cee 1 Reply Last reply Reply Quote 0
                                          • Jey Cee
                                            Jey Cee Developer @jensven last edited by

                                            @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.

                                            J 1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            485
                                            Online

                                            31.6k
                                            Users

                                            79.6k
                                            Topics

                                            1.3m
                                            Posts

                                            javascript template
                                            3
                                            21
                                            1395
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo