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

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

Vorheriges Thema - Nächstes Thema

dominik

Das Modul ist ab sofort im offiziellen FHEM Repository. Prüft bitte vor Verwendung die Perl Library Voraussetzungen.

Das DLNARenderer Modul listet automatisch alle eure DLNA Renderer Devices im Netzwerk unter "Unsorted". Danach könnt ihr darüber per set <devicename> stream http://... beliebige Streams abspielen, Lautstärke steuern oder Devices mit Caskeid Unterstützung (z.B. MUNET) im Multiroom Modus betreiben. Sofern der DLNA Renderer auch Events unterstützt, werden diese vom Modul verarbeitet und im Reading angezeigt (z.B. aktueller Titel, Album, Lautstärke, ...).

Bitte meldet Bugs & Ideen in diesem Thread, nur durch eure Hilfe wird die Qualität besser!

Voraussetzung
SOAP::Lite
LWP::Simple
XML::Simple

Schnellanleitung
define dlnadevices DLNARenderer (ca. 2 Minuten warten, dann erscheinen die Devices unter Unsorted)
set <devicename> stream http://mp3-live.swr3.de/swr3_m.m3u (SWR3 starten)
set <devicename> playEverywhere (auf allen Caskeid Lautsprechern synchron abspielen)

Changelog
v2.0.0 RC5 - 20160614
- BUGFIX: support events from devices with wrong serviceId
- BUGFIX: fix perl warning on startup
- BUGFIX: fix error if LastChange event is empty

v2.0.0 RC4 - 20160613
- FEATURE: support devices with wrong serviceId
- BUGFIX: fix crash during stereo mode update for caskeid players
- FEATURE: add stereoPairName reading
- CHANGE: add version string to main device internals
- BUGFIX: fix error when UPnP method is not implemented
- FEATURE: identify stereo support (reading: stereoSupport)

v2.0.0 RC3 - 20160609
- BUGFIX: check correct number of params for all commands
- BUGFIX: fix addUnitToSession/removeUnitFromSession for MUNET/Caskeid devices
- BUGFIX: support devices with non-standard UUIDs
- CHANGE: use BlockingCall for subscription renewal
- CHANGE: remove ignoreUDNs attribute from play devices
- CHANGE: remove multiRoomGroups attribute from main device
- CHANGE: split stereoDevices reading into stereoLeft/stereoRight
- FEATURE: support multiRoomVolume to change volume of all group speakers e.g.
              set <name> multiRoomVolume +10
              set <name> multiRoomVolume 25
- FEATURE: support channel_01-10 attribute
              attr <name> channel_01 http://... (save URI to channel_01)
              set <name> channel 1 (play channel_01)
- FEATURE: support speak functionality via Google Translate
              set <name> speak "This is a test."
              attr <name> ttsLanguage de
              set <name> speak "Das ist ein Test."
- FEATURE: automatically retrieve stereo mode from speakers and update stereoId/Left/Right readings
- FEATURE: support mute
              set <name> mute on/off

v2.0.0 RC2 - 20160510
- BUGFIX: fix multiroom for MUNET/Caskeid devices

v2.0.0 RC1 - 20160509
- CHANGE: change state to offline/playing/stopped/paused/online
- CHANGE: removed on/off devstateicon on creation due to changed state values
- CHANGE: play is NOT setting AVTransport any more
- CHANGE: code cleanup
- CHANGE: handle socket via fhem main loop instead of InternalTimer
- BUGFIX: do not create new search objects every 30 minutes
- FEATURE: support pauseToggle
- FEATURE: support SetExtensions (on-for-timer, off-for-timer, ...)
- FEATURE: support relative volume changes (e.g. set <device> volume +10)

v2.0.0 BETA3 - 20160504
- BUGFIX: XML parsing error "NOT_IMPLEMENTED"
- CHANGE: change readings to lowcaseUppercase format
- FEATURE: support pause
- FEATURE: support seek REL_TIME
- FEATURE: support next/prev

v2.0.0 BETA2 - 20160403
- FEATURE: support events from DLNA devices
- FEATURE: support caskeid group definitions
                set <name> saveGroupAs Bad
                set <name> loadGroup Bad
- FEATURE: support caskeid stereo mode
                set <name> stereo MUNET1 MUNET2 MunetStereoPaar
                set <name> standalone
- CHANGE: use UPnP::ControlPoint from FHEM library
- BUGFIX: fix presence status

v2.0.0 - 20160321 - !! BETA !!
- FEATURE: autodiscover and autocreate DLNA devices
       just use "define dlnadevices DLNARenderer" and wait 2 minutes
- FEATURE: support Caskeid (e.g. MUNET devices) with following commands
                set <name> playEverywhere
                set <name> stopPlayEverywhere
                set <name> addUnit <UNIT>
                set <name> removeUnit <UNIT>
                set <name> enableBTCaskeid
                set <name> disableBTCaskeid
- FEATURE: display multiroom speakers in multiRoomUnits reading
- FEATURE: automatically set alias for friendlyname
- FEATURE: automatically set webCmd volume
- FEATURE: automatically set devStateIcon audio icons
- FEATURE: ignoreUDNs attribute in main
- FEATURE: scanInterval attribute in main
20160216, v1.23
- BUGFIX: call GetVolume only after scan
- FEATURE: add presence based on first scan
20160214, v1.22
- CHANGED: set state offline on startup and off when found
- BUGFIX: add use Blocking
- FEATURE: log version on startup
20160210, v1.21
- BUGFIX: fix handling if device was not found
20160210, v1.20:
- CHANGED: removed all iThreads
- CHANGED: use BlockingCall for upnp search
20160105, v1.11:
- FIXED: support all versions of RenderingControl UPnP service (by MichaelT)
20151201, v1.10:
- CHANGED: set MyPlayer stream <url> instead of set MyPlayer <url>
- CHANGED: states are now on/off only
- FIXED: fhem hanging when starting play
- FIXED: issue with multiple DLNAClients (by ufo-hans)
- FIXED: shutdown warning regarding active threads (by ufo-hans)
- FIXED: arguments are now properly shown in the webgui
20150820, v1.9-beta:
- Fixed crash when device is offline and set methods are used.
- Still beta due to an issue on shutdown: (2015.08.19 18:16:09 1: PERL WARNING: Perl exited with active threads:
        1 running and unjoined
        0 finished and unjoined
        0 running and detached)
20150819, v1.8-beta:
- Fix threading issue, now only 1 thread is created instead of "unlimited".
- Still beta due to an issue on shutdown: (2015.08.19 18:16:09 1: PERL WARNING: Perl exited with active threads:
        1 running and unjoined
        0 finished and unjoined
        0 running and detached)
20150818, v1.7-beta:
- Search every 5 minutes for the device in a separate thread
    e.g. if the device isn't available at startup, it can still be found afterwards
20150817, v1.6:
- Fixed DLNA client support with blanks in their name (thx2Sukaos)
    e.g. define MyPlayer DLNAClient Samsung TV
20150814, v1.5:
- Code cleanup
- Set "stream" reading instead of "state"
- Load last "stream" reading when switching "on"
20150814, v1.2:
- Fix current status detection
- Fix search for rendering devices with special characters
20150804:
- Added volume control (set DLNA_Device volume 20)



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

dominik

Ich habe mir nochmals Gedanken über dieses Modul und den Aufbau gemacht.

Würde gerne folgenden Punkt implementieren:
- Autosearch für DLNA Renderer welche der User dann auswählen kann. Gibt es dazu Möglichkeiten in FHEM? Ich müsste die gefundenen Geräte irgendwo hinschreiben wo der User sie auswählen kann. Bislang ist mir da in FHEM noch nichts bekannt wie das machbar wäre. Jemand eine Idee??
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik

dominik

Mir ist gerade die Idee gekommen, dass man die gefundenen Devices doch gleich alle in FHEM erstellen könnte. So würde jedes Device gleich als DLNAClient angezeigt werden. Denke die autocreate Funktionalität macht ja ähnliches - hab keine Devices die das nutzen um es zu prüfen.

Btw, nutzt eigentlich außer mir jemand dieses Modul? Wenn ja, bitte um Feedback ob es funktioniert oder ob Fehler auftreten.
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik

Sukaos

Ich versuche das zu verwenden, habe aber momentan noch keine Zeit dafür gehabt.
Kurzer Test funktionierte aber nicht. Er sagt immer
2015.08.14 14:18:27 3: DLNAClient: Device current state is <<>>.
2015.08.14 14:18:27 3: DLNAClient: Device is in bad state, starting up!

Ich kann das erst in 2-3 Wochen genauer testen.

dominik

Danke für das Feedback Sukaos.
Anbei eine aktualisierte Version welche den Device State korrekt ausliest.

Der wichtigste Part des Moduls ist der beim Starten. Da sollten folgende Meldungen im Log kommen:
2015.08.10 22:42:06 3: DLNAClient: Searching for renderers...
2015.08.10 22:42:10 3: DLNAClient: found [1] : device name: [Kodi (htpc)]
2015.08.10 22:42:10 3: DLNAClient: skipping this device.
2015.08.10 22:42:10 3: DLNAClient: found [2] : device name: [Speaker]


Wenn kein Device gefunden wird, dann funktioniert es nicht. Also auf alle Fälle sicherstellen, dass FHEM im gleichen Netz ist, so dass das Device gefunden wird.
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik

Powermac_G5

Nutze dein Modul ebenfalls! Vielen Dank schonmal dafür.
Bei meinem Kodi Mediaplayer funktioniert das Modul. Bei meinem Samsung Fernseher jedoch nicht. Das Modul erkennt zwar das der Fernseher verfügbar ist überspringt ihn aber. Ich denke es liegt daran dass der Geräte meines Fernsehers mit [TV] anfängt. Hast du eine Ahnung ob das gefixt werden kann? Am TV selbst kann ich den Gerätenamen nicht ändern.

Gruß!

dominik

@Powermac_G5
Danke für das Feedback. Probier bitte mal die Version anbei.
Wichtig: In dieser Version muss der Name des Devices 100% korrekt geschrieben sein. Vorher war es ein RegExp Match.
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik

Powermac_G5

Also das nenne ich mal Support, funktioniert nun einwandfrei!
Vielen Dank dafür!

dominik

v1.5 im ersten Post
- Code aufgeräumt
- State wird nun nicht mehr mit dem Stream beschrieben (sah nicht so schön aus)
- Eigenes Reading für "stream"
- Zuletzt gehörter "stream" (anhand Reading) wird beim Einschalten wieder geladen

Bitte gebt mir Feedback wenn etwas nicht funktioniert bzw. wenn ihr Ideen für weitere Funktionen habt :)
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik

Sukaos

Ich habe mal auf die Schnelle die Define Funktion wie folgt modifiziert, damit auch DLNA Renderer die ein Leerzeichen im Namen haben gefunden werden.

return "too few parameters: define <name> DLNAClient <DLNAName>" if(int(@param) < 3);
   
    my $name            = $param[0];
    my $clientName      = "";
for(my $i = 2; $i < @param; $i++) {
  $clientName .= " ".$param[$i];
}
$clientName =~ s/^\s+|\s+$//g;
    $hash->{CLIENTNAME} = $clientName;


Die Steuerung scheint aber noch nicht zu funktionieren. Allerdings konnte ich das eben auch nur mit einem älteren Harman Kardon receiver probieren, der nicht so die tolle Implementierung von DLNA hat und ein gmrender auf einem Raspberry Pi ist zudem in ein OpenHome Server eingebunden und scheint daher Probleme zu machen. Der OpenHome Renderer wird nämlich gar nicht gefunden. Dieser wird aber auch von Windows als anderer Geräte Typ angezeigt. Da muss ich mich noch einmal schlau machen.

dominik

Danke für das Update Sukao, werde deine Änderung dann morgen in den Code mit einbauen.

Bzgl. der Funktionalität, probier mal den Receiver mit den UpnpTester (Google chip download) ausfindig zu machen. Dort sollte der Receiver gefunden werden. Wenn er den Service AVTransport hat und dort die Funktion SetAVTransportURI dann müsste das klappen. So habe ich die diversen DLNA Funktionalitäten meiner Geräte ausgewertet.
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik

Sukaos

Danke für den Tipp. Tool funktioniert, jetzt muss ich nur noch gucken, was da nicht wollte gestern. Wird aber erst nach dem 28. etwas.
AVTransport, ConnectionManager und RenderingControl haben beide Geräte.
Der OpenHome-Server zeigt sich aber als "DeviceType: urn:linn-co-uk:device:Source:1" und nicht als MediaRenderer. Das funktioniert dementsprechend gänzlich anders über den Services Playlist, Info, Volume und Time.

Vielen Dank also nochmal für den Hinweis mit dem Tool. Dann kann ich demnächst endlich die Musik im Wohnzimmer über fhem steuern. :)

Viele Grüße

Wulf

Brockmann

Wollte nur Rückmeldung geben, dass ich das Modul nun auch mal getestet habe.
Es klappt deutlich besser als die frühere Version, mit der es für mich letztlich nicht nutzbar war.

So werde ich es mal integrieren und länger testen.


dominik

Danke für die Rückmeldung Brockmann.

@Sukaos:
Version 1.6 im ersten Post aktualisiert.
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik

det.

Hallo,


hab das Modul auch eben mal getestet mit einem Philips NP 2900. Lautstärkeänderungen gehen prima. Einen Radiosender bekomme ich nicht abgespielt. Da versucht das Device immer auf einen (dann immer nicht vorhandenen) Mediaserver zuzugreifen. Leider spielt das Ding nach dem Einschalten (Neustart) nichts ab, sodern zeigt das Menü an. Mein Ziel wäre es, früh das Ding über Funksteckdose einzuschalten und einen Radiosender abzuspielen.
Kann ich irgendwie beim Testen helfen?
LG
det.