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

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

Vorheriges Thema - Nächstes Thema

Catinor

Ein Upgrade sollte ohne Probleme durchlaufen, wenn keine Spezialitäten wie selber kompilierte Software drin ist. Eine ausführliche Anleitung ist zb. hier: https://www.elektronik-kompendium.de/sites/raspberry-pi/2005051.htm . Backup schadet natürlich nie.

Allerdings sollte die Library auch in wheezy verfügbar sein. Ich würde erst mal die im obigen Artikel erwähnten Befehle für das Analysieren und Aufräumen durchführen (dpkg --audit und apt-get clean).

MichaelT

Zitat von: Catinor am 18 April 2016, 11:24:04
Ein Upgrade sollte ohne Probleme durchlaufen, wenn keine Spezialitäten wie selber kompilierte Software drin ist. Eine ausführliche Anleitung ist zb. hier: https://www.elektronik-kompendium.de/sites/raspberry-pi/2005051.htm . Backup schadet natürlich nie.

Allerdings sollte die Library auch in wheezy verfügbar sein. Ich würde erst mal die im obigen Artikel erwähnten Befehle für das Analysieren und Aufräumen durchführen (dpkg --audit und apt-get clean).

Danke für den Tip. schau ich mir mal an.
audit und clean hat aber nichts gebracht.

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

dominik

@Catinor, es gibt eigentlich nur 2 Prozesse die laufende gestartet werden:
- Neue Suche: Alle 30 Minuten.
- Subscriptions für Events erneuern: Alle 5 Minuten.

Ich tippe eher, dass die Subscriptions Schuld sind an der Verzögerung. Das könnte auch daran liegen, dass ein Gerät sehr langsam reagiert. Kannst du mal die Zeile InternalTimer(gettimeofday() + 200, 'DLNARenderer_renewSubscriptions', $hash, 0); ändern in InternalTimer(gettimeofday() + 3600, 'DLNARenderer_renewSubscriptions', $hash, 0); und prüfen ob danach die Hänger weniger oft vorkommen?
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik

Catinor

Ich denke, dass ich dem Übeltäter auf der Spur bin. Ich bin schon auf die Subscription-Renewal gestossen, und mal Start und Ende der Routine mit Debug-Output versehen. Die Hänger sind jeweils 200s, das passt.

Wenn ich DLNARenderer aktiviere, dann dauert es 2-4 Loops, bis diese Meldung kommt

2016.04.19 22:05:18 1: PERL WARNING: Loading device description failed with error: 500 Can't connect to 192.168.6.110:49152 at ./FHEM/98_DLNARenderer.pm line 117.

Dann nochmal 1-3 Loops bis zu so was

2016.04.19 23:12:37 1: DLNARenderer: XML parsing error: File does not exist: NOT_IMPLEMENTED at ./FHEM/98_DLNARenderer.pm line 265.

Dann beginnen die Pausen.

Das Gerät 192.168.6.110 ist ein Devolo Powerline-Adapter WLAN-Accesspoint (dLAN 1200+ WiFi ac). Im UPnP Spy sehe ich in nicht, aber er scheint sich auf Anfragen zu melden . Wenn FHEM stockt und ich den Adapter abzog, ging FHEM wieder in den Normalbetrieb. Adapter wieder rein, und bald war wieder 200s Pause.

Soviel hab ich nun rausgefunden für heute. Wenn was fürs Debugging im Code einfügen soll, mach ich das gerne.

vw80

Hallo Dominik,

kann man "Play next" mit einfügen, um den nächsten Titel abzuspielen wenn ich eine Playlist streame?

Gruß Heiko

dominik

Hallo Heiko,

play next/prev kann ich einfügen, das sollte kein Problem sein. Kommt dann mit dem 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

eckhart-g

Hallo Dominik,

beginnen möchte ich mit einer Erfolgsmeldung: Ich habe dein Modul mit zwei Renderern getestet (Kodi, Raumfeld). Stream abspielen, Lautstärke, Stop, Play - funktioniert alles. Also erst einmal vielen Dank für deine Arbeit; generische DLNA-Interaktion ist genau das Richtige!

Wenn du jetzt noch Pause/Resume unterstützt (und evtl. Seek), ist die Sache perfekt! Ich bin FHEM-Neuling und noch nicht bewandert in der Modulprogrammierung, aber ich habe ein funktionierendes "Pause" mit ein bisschen Rumprobieren in der Methode DLNARenderer_Define eingebaut. Vielleicht hilft es dir, die Funktionalität sauber in dein Modul zu integrieren.


if($ctrlParam eq "pause"){
    my $state = ReadingsVal($hash->{NAME}, "TransportState", "");
    Log3 $hash, 3, "DLNARenderer: set pause, current state $state\n";
    my $avtrans_service = $hash->{helper}{device}->getService('urn:upnp-org:serviceId:AVTransport');
    my $avtrans_ctrlproxy = $avtrans_service->controlProxy();
    if ($state eq 'PAUSED_PLAYBACK') {
      $avtrans_ctrlproxy->Play(0,1);
    } else {
      $avtrans_ctrlproxy->Pause(0);
    }
    return undef;
  }


Das ist dann der letzte Punkt, der in meinem ersten FHEM-Anwendungsszenario noch fehlt:

  • Telefon klingelt (über FB_CALLMONITOR)
  • Textnachricht an Kodi ("Anruf von XY")
  • falls Wiedergabe auf Kodi oder Raumfeld, pausieren und nach Anrufende weiterspielen
Viele Grüße,
Eckhart

mbuzina

Hallo - ich habe gerade fhem auf meiner Synology installiert und nach anfänglichem hin & her (die Pfade sind schon etwas ungewohnt auf der box) auch den DLNARenderer. Nach etwas probieren habe ich dann auch die requirements installieren können, denke ich (da ich ipkg nutzen muss, sind die namen etwas anders). Mir fehlt aber Data::UUID.

Ideen?
Can't locate Data/UUID.pm in @INC (you may need to install the Data::UUID module) (@INC contains: /opt/lib/perl5/site_perl/5.22.1 /usr/lib/perl5/site_perl /usr/share/perl5/site_perl /usr/lib/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib/perl5/core_perl /usr/share/perl5/core_perl . ./FHEM) at ./FHEM/98_DLNARenderer.pm line 66.
BEGIN failed--compilation aborted at ./FHEM/98_DLNARenderer.pm line 66.

dominik

@Eckhart, vielen Dank für die Vorarbeit! :) Gerne immer wieder mitarbeiten, ist auch ein Gemeinschaftsprojekt ;)
Ich habe den Code etwas abgeändert eingebaut, dabei wird noch kein Play unterstützt wenn man nochmals Pause drückt. Ich werde da noch den DLNA Standard prüfen ob das für alle Devices so nutzbar ist oder manche beim 2. Pause automatisch Play machen.

Im 1. Post gibt es ein Update...

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

@mbuzina, gibt es beim Synology die Möglichkeit "cpanminus" zu installieren? Wenn ja, dann kannst du über cpanm Data::UUID vermutlich das Modul nachinstallieren.
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik

eckhart-g

Das ging ja schnell, danke Dominik.

Ich habe das Pause-Verhalten meiner Renderer (Kodi, Raumfeld, BubbleUPnP) nochmal mit Hilfe des "GUPnP Universal Control Point" getestet. Alle drei bleiben im Zustand PAUSED_PLAYBACK, wenn erneut Pause aufgerufen wird. Ein Aufruf von Play setzt die Wiedergabe nahtlos fort. Ich nehme an, dies ist das Standardverhalten eines Renderers. Meines Erachtens sollte man dann auch kein Nichtstandardverhalten wie "2x Pause = Play" implementieren. Deine Implementierung von Pause ist also völlig richtig und vollständig.

Allerdings arbeitet die Play-Funktion des Moduls noch nicht richtig mit Pause zusammen, vor allem, wenn man auch andere Controller als FHEM verwendet. Die Wiedergabe startet dann manchmal nicht an der selben Stelle, sondern wieder zu Beginn des Tracks bzw. sogar Albums. Oder, wenn man über einen anderen Weg den Stream gewechselt hat, wird bei FHEM-Play dann nicht der aktuelle, sondern der vorige Stream wiederaufgenommen. Beispiel mit Kodi als Renderer:
Wenn ich dein Modul richtig verstehe, liegt dies vermutlich daran, dass du bei Play mehr machst, als nur das UPnP-Play aufzurufen: Du versuchst, aus der Modulvariable stream den letzten Stream zu rekonstruieren, oder? Das müsste man wohl anders machen und enger am Standard bleiben. D.h. bei Play nur das tun, was UPnP-Play tut. Zusätzlich könntest du eine Methode resumeLastStreamReading oder so etwas anbieten. Das würde auch deutlich machen, dass es sich bei dem einen um eine reinen Aufruf einer UPnP-Methode handelt, bei dem anderen um eine Zusatzfunktionalität des Moduls, die auch von dessen Zustand abhängig ist.

dominik

Hi Eckhart,

da stimme ich dir zu, das "play" ist sehr unsauber implementiert.

Meine Überlegung wäre:
set <device> stream ... (setzt den Stream und startet Playback)
set <device> off (=Stop)
set <device> play (=Standard Play)
set <device> on (=letzten Stream setzen und Play, weil "on" gibt es im UPnP Standard auch nicht)

Was meinst du?

...wegen Pause...ist im Standard auch nicht als Toggle definiert. Könnte aber noch ein "pauseToggle" implementieren welches dann Pause/Play nutzt.
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik

mbuzina

Zitat von: dominik am 04 Mai 2016, 18:16:57
@mbuzina, gibt es beim Synology die Möglichkeit "cpanminus" zu installieren? Wenn ja, dann kannst du über cpanm Data::UUID vermutlich das Modul nachinstallieren.
cpanminus finde ich nicht als Paket, auf meiner perl installation finde ich ein cpan. Damit laufe ich auf einen weiteren Fehler (/opt/bin/perl: symbol lookup error: /opt/lib/perl5/5.22.1/i686-linux/auto/Cwd/Cwd.so: undefined symbol: strlcat). Ob das noch was wird?

eckhart-g

Hi Dominik,

das klingt praktikabel und erfüllt eine m.E. sehr wichtige Anforderung: Man sollte stets auch auf die unverfälschten UPnP-Befehle zugreifen können, wenn man das möchte. Generell sehe ich zwei Ebenen:

  • Eine Basisschicht, in der die reinen UPnP-Aktionen 1:1 durchgereicht werden, indem du gleichnamige Setter und Readings anbietest.
  • Darauf aufbauend eine Schicht mit zusätzlicher Funktionalität deines Moduls wie "togglePause" oder "set xxx on" mit Wiederaufnahme.
Dann kann man je nach Bedarf die "Komfortfunktionen" nutzen oder auch direkt auf die UPnP-Ebene gehen.

Viele Grüße,
Eckhart

dominik

Update im 1. Post...nun werden die Sockets endlich in der Mainloop bearbeitet und erfordern keinen sekündlichen InternalTimer mehr :) Danke an justme1968 für die Hilfe diesbezüglich!

Bitte meldet Bugs wenn ihr welche findet. In 2-3 Wochen möchte ich diese Version ins offizielle FHEM Repository aufnehmen.

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)
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik

Norberto


Hallo Dominik,

Vielen Dank für Deine Arbeit!

Seit dem letzten Update bekomme ich leider einen FHEM-Absturz wenn ich für Munet LS playEverywhere oder addUnit aufrufe.

letzter Eintrag im log-file:
ZitatCan't call method "getValue" without a package or object reference at ./FHEM/98_DLNARenderer.pm line 508

Was kann ich tun um beim Debuggen zu unterstützen?

Grüße, Norbert