98_DLNARenderer.pm (UPnP) (zuvor 98_DLNAClient.pm)

Begonnen von dominik, 04 August 2015, 20:23:38

Vorheriges Thema - Nächstes Thema

Jack_n

Hallo Dominik,

die von Hand getaggte Datei per PLEX auf den Denon geschoben ergibt das erwünschte Ergebnis.

Jetzt würde ich um Eure Hilfe bitten:

Ich habe FHEM auf einem Raspberry laufen, die MP3 würde ich unter /home/Music/Denon_Info.mp3 ablegen.

Wie würde dann der Aufruf für den DLNA Renderer aussehen?

So ?
set Denon_AVR-X4000 stream http://localhost/home/Music/Denon_Info.mp3

Viele Grüße
Joachim



Jack_n

Also ich bin ein wenig weiter....

mit set DLNA_0005cd37ae6d stream http://127.0.0.1/opt/fhem/www/pgm2/Info.mp3 komme ich leider nicht wie erhofft an meine dort abgelegte Info.mp3.

Mit dem SWR stream klappt es.

Wie kann ich denn eine Datei die lokal auf dem system liegt streamen ?

LG

Joachim

dominik

Hallo Joachim,
ich hab selber noch keine Datei über einen DLNA Server abgespielt. Mach mal folgendes:
1. Lade dir eine UPnP Controller App runter
2. Wähle dort deinen DLNARenderer als Render Device aus
3. Wähle dann das mp3 File aus welches abgespielt werden soll
4. Prüfe dann das Reading currentTrackURI, den Link kannst du dann wahrscheinlich bei "stream ..." verwenden

@oxident, kannst du das gleiche Log nochmals mit verbose = 5 posten?

Gruß
Dominik
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik

martins

Hallo Joachim,
ich habe das schon einmal getestet und es hat funktioniert.
Speicher die Datei in /opt/fhem/www/info.mp3
und mit dem Aufruf: set DLNA_0005cd37ae6d stream http://<ip-addresse/fhem/info.mp3 sollte es dann funktionieren.
Wichtig ermittel die Richtige IP-Adresse von deinem fhem server, also nicht localhost oder 127.0.0.1, damit wird es nie funktionieren.

Alternativ kannst du den Link auch einmal in den Browser eingeben, dann weist du ob überhaupt etwas erkannt wird.

Jack_n

Hallo,

das war es !

Ich habe bei der IP die richtige Adresse angegeben, jetzt geht's.

Vielen Dank !

MichaelT

Hallo Dominik,

hab bei mir noch ein Problem gefunden, welches aber wahrscheinlich an BubbleUPNPServer liegt.
Ich habe ein Google Chromecast-Audio über den BubbleUPNPServer als DLNA-Device bereit gestellt.
Leider schickt Bubble den Volume-Event so:
2016.07.12 18:30:11 4: DLNARenderer: $VAR1 = {
          'Event' => {
                     'xmlns' => 'urn:schemas-upnp-org:metadata-1-0/RCS',
                     'InstanceID' => {
                                     'val' => '0',
                                     'Volume' => [
                                                 {
                                                   'channel' => 'Master',
                                                   'val' => '2'
                                                 }
                                               ]
                                   }
                   }
        };


Es fehlt der Slash am Ende von xmlns. Ist der Slash am Ende so spezifiziert oder kann ein Device den Slash optional schicken.

Ich hab's bei mir so geändert, dass in Zeile 976 auf beides reagiert wird.
} elsif (index($xml->{Event}{xmlns},"urn:schemas-upnp-org:metadata-1-0/RCS")==0) {

Grüße Michael


Großes Mischmasch aus HM, Philips, WLAN und Eigenprojekte.
ABER alles mit FHEM.

Brockmann

Gibt es eigentlich eine Möglichkeit, die Vergabe der Devicenamen zu beeinflussen? Derzeit wird ja wohl eine ID des Gerätes verwendet, was dann zu recht kryptischen Device-Namen führt.
Man kann die Devices zwar umbenennen (rename), aber das führt dann bei jedem Neustart zu einer langen Liste von "Please define ... first"-Meldungen.
Wie wäre es, wenn man alternativ den "friendly name", also den am Gerät eingestellten Eigenname, auch in FHEM als Gerätename verwenden kann, ggf. mit einem vorgegebenen Präfix "DLNA_", um Überschneidungen zu vermeiden?
Solange man sich in FHEM bewegt, spricht nichts gegen die derzeitigen Namen (bzw. da gäbe es ja auch alias). Aber ich steuere meine Geräte auch vom Tablet bzw.Tasker aus via FHEM und muss bei den Aufrufen dazu immer den Devicename verwenden.

Und noch ein kleiner Feature-Wunsch, falls das machbar ist: Wäre es möglich, dlnadevices ein Attribut "default_room" oderso zu spendieren. Wenn das definiert ist, werden alle erkannten Geräte in diesem Raum angelegt und stehen dann nicht mehr unter "Unsorted"?

dominik

Hallo,

sorry für die späte Rückmeldung. Habe im Moment aber ziemlich viel zu tun...

@MichaelT
Danke dir! Patch folgt im nächsten Update...wahrscheinlich gleich im offiziellen Repository.

@Brockmann
Den "friendlyName" habe ich nicht verwendet, da es sonst zu leicht vorkommen kann, dass Devices den gleichen Namen haben. Da der Device Name in FHEM eindeutig sein muss, kann ich das leider nicht anpassen, da das Risiko von Fehlern zu groß ist. Die "Please define ... first" Meldungen müsstest du durch Löschen der Einträge in der fhem.save Datei beseitigt bekommen.
Die Idee mit dem "defaultRoom" nehme ich gerne auf - folgt im nächsten Update :)

Gruß,
Dominik
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik

Brockmann

Hallo Dominik,

Zitat von: dominik am 18 Juli 2016, 21:18:39
Den "friendlyName" habe ich nicht verwendet, da es sonst zu leicht vorkommen kann, dass Devices den gleichen Namen haben. Da der Device Name in FHEM eindeutig sein muss, kann ich das leider nicht anpassen, da das Risiko von Fehlern zu groß ist.
Das verstehe ich. Deshalb die Idee, analog zum DefaultRoom einen DefaultPrefix angeben zu können. Wenn der definiert ist, bekommen die Geräte als device name DefaultPrefix+friendlyname. Wenn nichts definiert ist, bleibt es wie bisher. Dann liegt es in der Verantwortung des Nutzers, den Prefix so zu wählen, dass es keine Kollisionen gibt. Ist aber nur ein frommer Wunsch. Ich kann auch mit dem Ist-Zustand leben.

Zitat
Die "Please define ... first" Meldungen müsstest du durch Löschen der Einträge in der fhem.save Datei beseitigt bekommen.
Danke für den guten Hinweis. werde ich mir anschauen.

MichaelT

Zitat von: dominik am 18 Juli 2016, 21:18:39
...
@MichaelT
Danke dir! Patch folgt im nächsten Update...wahrscheinlich gleich im offiziellen Repository.
...

Gruß,
Dominik

Danke für die Übernahme. Hab Update gemacht, läuft alles.
Gruß Michael
Großes Mischmasch aus HM, Philips, WLAN und Eigenprojekte.
ABER alles mit FHEM.

michael.winkler

Hallo,

auch ich nutze dein Modul. Leider habe ich das Problem dass das Modul jedes mal meine XBOX neu anlegt. Bei jedem XBOX start wird ein neues Device in FEHM angelegt. Gibt es hierzu eine Lösung?

Gruß
Michael

dominik

Das Modul ist nun im offiziellen FHEM Repository.

Ideen, Bugs, Anregungen, etc. bitte weiterhin hier posten.
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik

Weissbrotgrill

Hallo,

heute beim FHEM Update ist mir dann dieses neue Modul aufgefallen. Ich wünsche mir schon länger einern Weg mittels FHEM das Internatradio meines Yamaha RX-773 zu steuern und mit dem FHEM Modul YAMAHA_AVR funktioniert dies leider nicht. Also habe ich das neue Modul sofort ausprobiert.

Meine bisherigen Erkenntnisse:

Perl Abhängigkeiten
Auf meinem Systeme fehlte zusätzlich zu den drei benannten Perl Voraussetzungen noch XML::Parser::Lite (Debian Paket libxml-parser-lite-perl)
Can't locate XML/Parser/Lite.pm in @INC (you may need to install the XML::Parser::Lite module

Erster Erfolg
Der Yamaha tauchte unmittelbar nach dem Anlegen des DLNARenderes als neues Device auf.
Statusinformationen sind alle verfügbar, Lautstärkeregelung, Stop, Play, ... gingen auch sofort.

Ersters Problem
Der entscheidende Befehl funktioniert(e) leider nicht:
Eine URL mit "set stream ..." setzen. Weder di.fm, noch SLAY Radio noch SWR3 wollte er akzeptieren. Es passiert jeweils nichts.

Lösung
Da ich bisher immer BubbleUPnP unter Android dazu nutze weiß ich das es geht. Also habe ich mittels TCP Dump nachgesehen was BubbleUPnP da an den Receiver sendet. Der sendet beim SetAVTransportURI auch noch CurrentURIMetaData. Dabei handelt es sich um eine DIDL-Lite XML Struktur.
<DIDL-Lite xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dlna="urn:schemas-dlna-org:metadata-1-0/" xmlns:sec="http://www.sec.co.kr/">
  <item id="4d821dd7-75d0-4642-9760-15aff003bbda" parentID="parent" restricted="1">
    <upnp:class>object.item.audioItem.musicTrack</upnp:class>
    <dc:title>SLAY Radio</dc:title>
    <upnp:album>SLAY Radio</upnp:album>
    <res protocolInfo="http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01700000000000000000000000000000">http://relay3.slayradio.org:8080/</res>
  </item>
</DIDL-Lite>


Ich habe mir daher das Modul angesehen um diese Metadaten ebenfalls zu übertragen.
Ja, es geht, sogar recht einfach. Ich habe nur vier Stellen leicht angepasst. Nun kann ich in den FHEM Attributen channel_01 bis channel_10 entweder eine URL wie bisher oder eine DID-Lite XML eintragen. Diese wird dann ausgewertet und die URL daraus extrahiert.

Die Lösung funktioniert, ist aber noch nicht sonderlich schön. Hier denoch meine Änderungen:
--- FHEM/98_DLNARenderer.pm.org 2016-07-22 18:18:54.071052434 +0200
+++ FHEM/98_DLNARenderer.pm 2016-07-22 19:31:29.888090049 +0200
@@ -310,7 +310,7 @@
   my $ttsLang = AttrVal($hash->{NAME}, "ttsLanguage", "en");
   return "DLNARenderer: Maximum text length is 100 characters." if(length($ttsText) > 100);
   
-  DLNARenderer_stream($hash, "http://translate.google.com/translate_tts?tl=$ttsLang&client=tw-ob&q=$ttsText");
+  DLNARenderer_stream($hash, "http://translate.google.com/translate_tts?tl=$ttsLang&client=tw-ob&q=$ttsText", "");
}

sub DLNARenderer_channel {
@@ -319,13 +319,20 @@
   if($stream eq "") {
     return "DLNARenderer: Set channel_XX attribute first.";
   }
-  DLNARenderer_stream($hash, $stream);
+  my $meta = "";
+  if (substr($stream,0,10) eq "<DIDL-Lite") {
+    my $xml = XMLin($stream);
+    $meta = $stream;
+    $stream = $xml->{"item"}{"res"}{"content"};
+  }
+  DLNARenderer_stream($hash, $stream, $meta);
   readingsSingleUpdate($hash, "channel", $channelNr, 1);
}

sub DLNARenderer_stream {
-  my ($hash, $stream) = @_;
-  DLNARenderer_upnpSetAVTransportURI($hash, $stream);
+  my ($hash, $stream, $meta) = @_;
+  if (!defined($meta)) { $meta = ""; }
+  DLNARenderer_upnpSetAVTransportURI($hash, $stream, $meta);
   DLNARenderer_play($hash);
   readingsSingleUpdate($hash, "stream", $stream, 1);
}
@@ -767,8 +774,9 @@
}

sub DLNARenderer_upnpSetAVTransportURI {
-  my ($hash, $stream) = @_;
-  return DLNARenderer_upnpCallAVTransport($hash, "SetAVTransportURI", 0, $stream, "");
+  my ($hash, $stream, $meta) = @_;
+  if (!defined($meta)) { $meta = ""; }
+  return DLNARenderer_upnpCallAVTransport($hash, "SetAVTransportURI", 0, $stream, $meta);
}

sub DLNARenderer_upnpStop {


Mute / Unmute
Das funktioniert leider nur zu 50%. Mute geht, unmute nicht. Mit UpnpTester und dessen Linux Gegenstück GUpnP-Tools funktioniert beides.
Da ich dies komplett via FHEM Modul YAMAHA_AVR realisiere bin ich hier nicht traurig. Falls das Problem auch bei anderen auftaucht hier mal die relevanten Infos der Mitschnitte.

Mute via FHEM:
<?xml version="1.0" encoding="UTF-8"?><soap:Envelope soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:namesp54="u" xmlns:namesp55="urn:schemas-upnp-org:service:RenderingControl:1" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soap:Body><namesp55:SetMute><InstanceID xsi:type="xsd:int">0</InstanceID><Channel xsi:type="xsd:string">Master</Channel><DesiredMute xsi:type="xsd:boolean">true</DesiredMute></namesp55:SetMute></soap:Body></soap:Envelope>

Unmute via FHEM:
<?xml version="1.0" encoding="UTF-8"?><soap:Envelope soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:namesp61="u" xmlns:namesp62="urn:schemas-upnp-org:service:RenderingControl:1" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soap:Body><namesp62:SetMute><InstanceID xsi:type="xsd:int">0</InstanceID><Channel xsi:type="xsd:string">Master</Channel><DesiredMute xsi:type="xsd:boolean">false</DesiredMute></namesp62:SetMute></soap:Body></soap:Envelope>

Mute via GUpnP-Tools (Linux, gupnp-universal-cp):
<?xml version="1.0"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:SetMute xmlns:u="urn:schemas-upnp-org:service:RenderingControl:1"><DesiredMute>1</DesiredMute><Channel>Master</Channel><InstanceID>0</InstanceID></u:SetMute></s:Body></s:Envelope>

Unute via GUpnP-Tools (Linux, gupnp-universal-cp):
<?xml version="1.0"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:SetMute xmlns:u="urn:schemas-upnp-org:service:RenderingControl:1"><DesiredMute>0</DesiredMute><Channel>Master</Channel><InstanceID>0</InstanceID></u:SetMute></s:Body></s:Envelope>

FHEM sendet hier immer true und false während GUPnP-Tools 1 und 0 senden.

Fazit
Ein sehr schönes Modul, ich bin begeistert. Vielen vielen Dank.
Nun kann ich endlich meinen Yamaha als Wecker nutzen und komplett in die Heimautomatisierung incl. Anwesenheitserkennung, Feiertage, Urlaub, etc. integrieren.

Gruß
Christian

dominik

Hi Christian,

vielen Dank für die tollen Informationen/Patches!! :)
Das mit den Metadaten hatte ich schon mal am Radar, aber mir fehlten da noch passende Logs. Ich werde deinen Patch testen und wenn alles funktioniert das Modul updaten.

Mute/Unmute sollte mit deinen hilfreichen Traces auch noch umsetzbar sein.

Freue mich, dass dir das Modul gefällt und noch mehr, dass du gleich aktiv dazu beisteuerst! :)

Gruß,
Dominik
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik

dominik

Hi Christian,

kannst du mal die Version anbei nur mit set player stream http://relay3.slayradio.org:8080/ testen? Habe nun die Implementierung so gebaut, dass die DIDL-Lite Metadaten automatisch erstellt werden.

Gruß,
Dominik
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik