[21_HEOSMaster,21_HEOSPlayer,21_HEOSGroup] Module für das Denon Multiroomsystem

Begonnen von CoolTux, 21 Januar 2017, 21:47:52

Vorheriges Thema - Nächstes Thema

CoolTux

Zitat von: laurello am 20 Januar 2021, 00:59:13
Hallo zusammen,

da unsere Stereoanlage im Schlafzimmer, auf der wir sonst zum Nächtigen immer ein Hörbuch starteten, das Zeitliche gesegnet hat und ich nicht einfach Ersatz kaufen wollte, möchte ich eine Art "Jukebox" für Hörbücher mit einem Heos 1, dem existierenden DLNA Server (Plex) und "Hörbuch Karten" mit aufgeklebtem NFC Sticker basteln (Idee fußt auf einem Artikel in der c't - dort mit Sonos über smb Freigabe).

Die Hörbuch Karten mit den NFC Stickern und dem notwendigen Reader mit Meldung an FHEM über MQTT hab ich grundlegend schon so weit.

Aufgrund der gescannten ID des NFC Tags möchte ich jetzt das referenzierte Hörbuch-Album in die Warteschlange des HEOS 1 Lautsprechers schieben und die Wiedergabe starten. In HEOS CLI gesprochen wäre das der Befehl heos://browse/add_to_queue?pid=xxx&sid=xxx&cid=xxx&aid=4. Dieser wird im Grunde ja auch über den HEOSMaster abgesetzt, wenn ich für das HEOS Device in FHEM ein get HEOS_Device ls anstosse und mich dann in der Oberfläche zum DLNA Server und dort weiter bis zum Album hangele.
Mit einem Klick auf den Track wird eben dieser der Warteschlange hinzugefügt und auch gleich angespielt.

Jetzt stellen sich also folgende Fragen:
- m. E. funktioniert beim Browsen das Hinzufügen zur Warteschlange nur für einen Track und nicht für ein ganzes Album - ich kann kein ganzes Album mit einem Klick in die Warteschlange bugsieren, stimmt das oder stell ich mich doof an?
- habe ich derzeit eine Möglichkeit aus dem HEOS Modul heraus irgendwie die add_to_queue Funktion direkt aufzurufen, da ich die notwenigen Infos (pid = HEOS1, sid = DLNA Plex Server und cid = Hörbuch Album) ja habe und mir diese (wie wahrscheinlich sonst normal) nicht erst über das Browsen besorgen muß?

Puuh - ich hoffe, daß war verständlich umschrieben und jemand kann mir hier weiterhelfen.

Viele Grüße,
laurello

Da ich selbst das Teil nicht habe kann ich Dir bezüglich der ersten Frage nicht antworten.
Bei der zweiten Frage mit dem direkten Aufruf befürchte ich das dies so einfach nicht möglich ist.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

laurello

Hallo CoolTux,
danke für deine Antwort - ich hatte sowas ja schon fast befürchtet, daß ich mir das zu einfach vorstelle :-)

Kannst du mir sagen, wo diese heos://.... Aufrufe denn abgesetzt werden oder ob ich meinen Aufruf da irgendwie rein-pipen kann? Im 21_HEOSPlayer Modul habe ich den Aufruf selbst nicht gefunden (oder übersehen), aber im Log sehe ich, daß wohl WriteFn aufgerufen wird und dann den heos://.... Befehl hinterher, wenn ich nach dem Browsen durch den DLNA Server abschließend auf einen Track klicke:

2021.01.20 00:15:12 4: HEOSMaster (HeosMasterBox) - WriteFn called
2021.01.20 00:15:12 5: HEOSMaster (HeosMasterBox) - heos://browse/add_to_queue?pid=xxx&sid=xxx&cid=xxx&mid=xxx&aid=4

Viele Grüße,
laurello

CoolTux

Mach mal im HEOS Player Device verbose 5 und im Master auch und dann sende da mal deinen Befehl ab.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

laurello

Ich hab jetzt mal zwei logs gezogen mit verbose=5 gesetzt auf dem Master und dem Player Device (Heos 1 mit Namen Heos_Mobil).

Fall 1: (add_to_queue-command by CLI-telnet.txt)
Ich hab meinen heos://... Befehl direkt im telnet auf die MasterBox abgesetzt (heos://browse/add_to_queue?pid=392161117&sid=-128505844&cid=f9603dfb803f5c7b3cb2&aid=4). Da bekommt FHEM den heos:// Befehl nicht mit und man sieht nur die Folgeaktionen im Log.

Fall 2: (add_to_queue-command by FHEM Heos device by browsing and click on track.txt)
Im Player Device ein get HEOS_Mobil ls abgesetzt und dann in den folgenden Fenstern durch die Ebenen nach unten gebrowst um abschließend einen Track anzuklicken zum Abspielen. Das Log hab ich erst ab dem Abschluß-Klick auf den Track gezogen ohne das vorige "Durchhangeln" (Wenn das auch von Interesse sein sollte mach ich das gern nochmal). Da findet sich dann der CLI add_to_queue Befehl im Log wieder mit den Folgeaktionen.

laurello

Ich glaube, ich hab's rausbekommen wie es funktioniert - der Code in der 21_HEOSPlayer Zeilen 654 bis 741 hatten den entscheidenden Hinweis:


    } elsif( $cmd eq 'input' ) {
        return "usage: $cmd sid[,cid][,mid]" if( @args != 1 );

        my $param = shift( @args );
        my ($sid,$cid,$mid) = split /,/,$param;
        return "usage: $cmd sid[,cid][,mid]" unless( defined $sid || $sid eq "" );

        ...
        ...
        ...

        } else {
            if ( $sid > 0 && $sid < 1024 ) {
                return "usage: $cmd sid,cid,mid" unless( defined($cid) && defined($mid) );

                #Radio abspielen
                $heosCmd = 'playStream';
                $action = "sid=$sid&cid=$cid&mid=$mid";

            } else {
                return "usage: $cmd sid,cid[,mid]" unless( defined($cid) );
               
                #Server abspielen
                $heosCmd = 'playPlaylist';
                $action  = "sid=$sid&cid=$cid&aid=4";
                $action  = "sid=$sid&cid=$cid&mid=$mid&aid=4" if ( defined($mid) );

            }
        }



Die sid eines DLNA Servers ist wohl immer <0 oder >1024 - bei mir ist sie im Minusbereich.

Wenn ich ein set HEOS_Device input sid,cid absetze, dann fügt er das Album in die Warteschlange ein und fängt an abzuspielen. Die sid ist ja bei meinem Vorhaben immer dieselbe - nämlich die des DLNA Servers - und die cid ist die dem Album vom DLNA Server zugewiesene "Album ID", die ich über die entsprechende "Hörbuch Karte" bekomme.

Das einzige ist jetzt noch die fest verdrahtet "aid=4" am Ende des Befehls, die ja dafür sorgt, daß die Warteschlange geleert wird, dann mit den Tracks des Album wieder gefüllt wird und abschließend mit Track 1 angespielt wird.
Da meine Idee war, mir zu merken, welcher Track zuletzt gespielt wurde um dann von dort oder 1-2 Tracks früher wieder anzusetzen, muß ich mir dazu noch was überlegen oder schau mir den Code nochmal an, ob man das nicht "einfach" parametrierbar machen kann (ähnlich wie im Code derzeit schon die mid), obwohl ich nicht wirklich Programmierer bin - evtl. hast du da eine bessere Idee oder Ansatz.

Dann könnte ich sonst erst ein clearQueue absetzen, dann ein input sid,cid,aid mit z. B. aid=3 und abschließend ein playQueueItem {Track#}.

Das mit der parametrierbaren aid wird aber tricky, weil wie unterscheidet man dann ob das letzte Argument jetzt eine mid oder eine aid ist :-) Evtl. über den Wert, z. B. wenn einstellig, dann ist es eine aid sonst eine mid?

Vielen Dank nochmal und viele Grüße,
laurello

CoolTux

Also wenn ich Dich Recht verstehe geht es nun nur noch um die aid? Du willst 3 statt 4, aber vorher die Queue leeren? Aber 4 macht doch genau das. Es ersetzt doch laut API und spielt dann ab.
Sorry wenn ich so doof frage aber ich habe damals alles nur nach API gemacht und hatte kein Gerät. Vieles hat auch noch ein zweiter Entwickler geschrieben der nun nicht mehr da ist. Muss mich da auch erst wieder rein fuchsen.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

laurello

Ja, genau - jetzt geht es nur noch um die aid :-)
und du hast Recht, aid=4 macht im Grunde genau das, was ich will, aber mit aid=4 kann ich nicht steuern bei welchem Track in der Warteschlange er das Abspielen wieder ansetzt - er startet immer den ersten Track.
Aber du hast mich mit der Nachfrage auf eine Idee gebracht: Was ich probieren kann, ist natürlich das playQueueItem gleich hinterher zu schieben nach dem input sid, cid Befehl, das hat wahrscheinlich den gleichen Effekt und er springt dann gleich auf den gewünschten Track und kommt gar nicht dazu von vorne anzufangen.
Ich probier das heute aus - wahrscheinlich hab ich zu viel technisch drauf rumgedacht  ;)

CoolTux

Zitat von: laurello am 21 Januar 2021, 08:29:04
Ja, genau - jetzt geht es nur noch um die aid :-)
und du hast Recht, aid=4 macht im Grunde genau das, was ich will, aber mit aid=4 kann ich nicht steuern bei welchem Track in der Warteschlange er das Abspielen wieder ansetzt - er startet immer den ersten Track.
Aber du hast mich mit der Nachfrage auf eine Idee gebracht: Was ich probieren kann, ist natürlich das playQueueItem gleich hinterher zu schieben nach dem input sid, cid Befehl, das hat wahrscheinlich den gleichen Effekt und er springt dann gleich auf den gewünschten Track und kommt gar nicht dazu von vorne anzufangen.
Ich probier das heute aus - wahrscheinlich hab ich zu viel technisch drauf rumgedacht  ;)

Berichte mal bitte dann. Danke Dir.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

laurello

Kurzer Zwischenstand:

Ich hab das ausprobiert mit einem set input sic,cid und dann gleich ein set playQueueItem 3 hinterher.
Aber wie ich erwartet hatte (weil mal irgendwo gelesen), hat die angegebene Abfolge der Befehle keinen Einfluß auf deren Abarbeitungssequenz. Also klappt das eigentlich nie in der gewünschten Reihenfolge! Noch dazu kann es vorkommen -  da im Hintergrund evtl. mehrere heos:// Befehle abgesetzt werden pro FHEM Befehl - daß sich sogar dort der zweite fhem Befehl in die Abfolge des ersten mit rein schiebt und wahrscheinlich ist dann das HEOS device zu langsam oder verwirrt.

Ich hatte durch mehrere Versuche mit gleicher Befehlsabfolge, verschiedene Ergebnisse:

  • Kurzes Anspielen (mehr ein kurzes Laut geben im MilliSek Bereich) von Track 3 der aktuellen Warteschlange, Update der Warteschlange mit dem neuen Album und dann Abspielen Track 1
  • Update der Warteschlange mit dem neuen Album und dann Abspielen Track 1 ohne daß der playQueueItem 3 irgendeinen Effekt hatte - taucht praktisch nicht auf
  • Abspielen von Track 1, obwohl die Anzeige noch Track 3 zeigte
  • ...
ist also nicht so richtig zu gebrauchen, selbst wenn man mit einem Sleep die Befehlsabarbeitung beeinflussen und auf Reihe bekommen würde, da ja dann in der Zwischenzeit der erste Track so lange läuft wie der Sleep dauert.

Man muß also mit den mehreren Befehlen sehr wahrscheinlich immer mit einem sleep arbeiten, aber ohne das Autoplay wär's dann in der Zwischenzeit wenigstens ruhig :-)

Mal sehen, was mir noch einfällt ...

laurello

Hallo CoolTux,

jetzt läuft dieser Teil wie ich mir das dachte: Auflegen einer Hörbuch-Karte auf den Reader - Meldung der NFC Informationen per MQTT an FHEM - ein Notify, der auf diese Meldung reagiert und aufgrund der Info das HEOS_device ansteuert und das entsprechende Hörbuch startet.

Das eigentliche Problem lag ja im letzten Schritt mit dem Befüllen der HEOS_device Warteschlange und dem Starten des Hörbuchs ab einem definierten Track und nicht immer von vorne. Um dies zu verwirklichen, blieb mir nichts anderes übrig als im Modul (21_HEOSPlayer.pm) den aid Parameter des heos:// commands parametrierbar zu machen.

Also statt aid=4 fest vorgegeben:
heos://browse/add_to_queue?pid=xxx&sid=xxx&cid=xxx&mid=xxx&aid=4

abändern zu
heos://browse/add_to_queue?pid=xxx&sid=xxx&cid=xxx&mid=xxx&aid=x

Meine Idee war dabei, aid nicht im set Aufruf mitzugeben sondern über ein Attribut am device voreinzustellen. In meinen Augen reicht das, wenn man es pro HEOS_device einstellen kann, da der Anwendungsfall dann sehr wahrscheinlich derselbe bleibt. So habe ich mir also das Modul zur Brust genommen und habe aid parametrierbar gemacht über ein neues Attribut mit dem Namen "add2qopt" (add to queue option) und die notwendigen Änderungen durch das Modul hindurch eingebaut.

Somit kann ich jetzt die Warteschlange nach meinen Gusto ansteuern z. B. mit:

  • Für HEOS_Mobil device "immer nur ans Ende der Warteschlange anfügen ohne die Wiedergabe zu starten" konfigurieren - Attribut add2qopt auf 3 setzen -
  • Warteschlange löschen - set HEOS_Mobil clearQueue
  • Gewähltes Hörbuch - also Album mit den Tracks - an das Ende der Warteschlange anfügen ohne gleich das Abspielen zu starten - set HEOS_Mobil input -128505844,f9603dfb803f5c7b3cb2
  • Abspielen des Albums beginnend mit dem Track 5, weil da das letzte mal stehen geblieben oder eingeschlafen :-) - set HEOS_Mobil playQueueItem 5

zwischen den Befehlen habe ich immer noch ein sleep 1 und damit funktioniert es in der gewünschten Reihenfolge.


Bei mir läuft es soweit ohne Probleme und um auch evtl. andere davon profitieren zu lassen jetzt die Bitte an dich, dir das mal anzuschauen und durchzugehen. Wie schon vorher erwähnt: Ich bin eigentlich kein Programmierer und kann keine Garantie auf einen sauberen Programmierstil geben, habe mir aber Mühe gegeben  ;)


Modul hab ich hier als Attachment rangehängt und alle Perl-Code-Änderungen mit einem
Zitat#lau
gekennzeichnet sowie mit einem:
Zitat<--
für "diese Zeile Code kann raus" und einem
Zitat-->
für "diese Zeile Code muß rein" gekennzeichnet.

Den html Teil am Ende habe ich jeweils (en und deu) um das Attribut add2qopt mit einer Beschreibung ergänzt - diese aber nicht zusätzlich gekennzeichnet.

Wenn das so paßt, kannst du gerne alles von mir Auskommentierte und Kennzeichnungen rausnehmen - sollte dir nur das Auffinden der Stellen erleichtern.

Viele Grüße,
laurello

CoolTux

Hallo Laurello,

Vielen lieben Dank für Deine Arbeit. Das schaue ich mir die Tage sehr gerne an und werde es sicherlich auch übernehmen. Ist ja eine nette Flexibilität.


Grüße
Marko
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

BjoernC

Hi,

Das ganze funktioniert super für DLNA - aber Amazon Music, Napster, Deezer sollten auch alle gehen laut HEOS CLI Spec 1.13 (31.10.2018). War ein Hauptgrund / DER Grund mir überhaupt HEOS anzuschaffen (kein Google/Alexa und gute Boxen)... Im Thread habe ich dazu nichts gefunden...

Ich hatte selbst was programmiert aber komme seit Tagen nicht weiter - jetzt hab ich in meiner Verzweifelung das Modul hier gefunden und es damit ausprobiert - geht leider auch nicht...

Entweder mache ich was falsch - oder HEOS CLI unterstützt das nicht mehr... finde dazu aber leider nichts mit Duckduckgo oder Google.

Hat jemand von euch das Abspielen von nicht-DLNA Quellen (oder Geräte Input etc.) hinbekommen und wenn ja wie?

Ich möchte ein Album/Lied von Rammstein auf Deezer hören (auf einem AVR-X440H):

Suche nach Rammstein:
heos://browse/search?sid=5&search=Rammstein&scid=1
-->
container: "yes", type: "artist", cid: "Artists-464", playable: "no", name: "Rammstein"

Suche nach zugehörigen Containern:
heos://browse/browse?sid=5&cid=Artists-464
--> (unter anderem)
container: "yes"
playable: "no"
type: "container"
name: "Albums"
image_url: ""
cid: "Artists-Albums-464"

Suche nach zugehörigen Alben:
heos://browse/browse?sid=5&cid=Artists-Albums-464
--> (unter anderem)
container: "yes", "type": "album", "artist": "", "cid": "Albums-137560432", "playable": "yes", "name": "REMIXES"

Somit habe ich ein abspielbares Album gefunden...

Das Album abspielen:
heos://browse/add_to_queue?pid=xxxx&sid=5&cid=Albums-137560432&aid=1
-->
Nichts passiert, keine Antwort

Suche nach Liedern in dem Album:
heos://browse/browse?sid=5&cid=Albums-137560432
--> untern anderem
container: "no", mid: "910171762", type: "song", artist: "Rammstein", album: "REMIXES", album_id: "137560432", playable: "yes", name: "DU RIECHST SO GUT (SCAL REMIX)"

Versuch das Lied in dem Album abszuspielen:
heos://browse/add_to_queue?pid=xxxx&sid=5&cid=Albums-137560432&mid=910171762&aid=1
-->
Nichts passiert, keine Antwort

Versuch das Lied selbst abszuspielen:
heos://browse/add_to_queue?pid=xxxx&sid=5&mid=910171762&aid=1
-->
Nichts passiert, keine Antwort

Danke!

laurello

Hallo BjoernC,

an sich macht dein Aufruf einen guten Eindruck, deswegen trau ich mich schon gar nicht wirklich fragen:
- Deine pid=xxxx ist nur hier für das Forum maskiert? Deine Player ID stimmt aber sonst?
- Du setzt ja den Befehl in einer telnet session auf dem HEOS ab - wird denn dann in der Warteschlange in der App irgendwas angezeigt oder bleibt die leer bzw. ist da noch was drin?
- probier mal mit aid=4 um sicher zu gehen, daß die Warteschlange geleert, dann hinzugefügt und abschließend abgespielt wird.

Viele Grüße,
laurello

laurello

Hab grad nochmal bei mir geschaut und weiß nicht genau, ob dich das weiter bringt, da ich kein Deezer hab, hab ich mal mit Amazon Music probiert:

  • Wenn ich in der App ein Album zur Warteschlange hinzuzufügen will, dann geht das erstmal gar nicht - da fehlt sogar die ganze Funktion in meinen Augen. Über die CLI geht das! Allerdings kann man in beiden Fällen nichts abspielen mit der Meldung "Kein Streaming von Amazon Music möglich"
    Das wäre der heos://browse/add_to_queue?pid=392161117&sid=13&cid=catalog/albums/B08CM527DZ/#album_desc-NAME-1. Jerusalema&aid=4 Aufruf
  • Wenn ich in der App einen Track aus dem Album zur Warteschlange hinzufügen will, dann gibt es zwar eine Funktion dafür, die dann aber in einer Meldung resultiert, daß dies derzeit nicht unterstützt wird. Das einzige, was funktioniert, ist das sofortige Wiedergeben und daß mit der Meldung, daß Amazon Music direkt abgespielt wird ohne der HEOS Warteschlange hinzugefügt zu werden. An sich wäre das in der CLI die Option aid=1 - hier funktioniert aber auch die aid=4 auch. Ich nehme an, daß die CLI nur die Meldung nicht wie in der App zurück gibt. In der Warteschlange ist dann tatsächlich nix - ABER: er spielt das ganze Album und nicht nur den ersten Track.  ???
    Das wäre der heos://browse/add_to_queue?pid=392161117&sid=13&cid=catalog/albums/B08CM527DZ/#album_desc-NAME-1. Jerusalema&mid=B08CMDBSL7&aid=4 Aufruf
Heißt insgesamt, daß man sich keine Warteschlange mit Amazon Music Tracks zusammen klicken kann - weil eben immer nur sofort abspielen geht. Im Falle eines Albums, daß seltsamerweise komplett über das Hinzufügen eines einzelnen Tracks aus diesem Album hinzugekommen ist, kann man nicht einzelne Tracks wählen und auch keine eigene Reihenfolge bestimmen. Bei einzelnen Tracks wird immer der gerade gespielte abgebrochen und auf den neuen umgeschwenkt. Auch auf eine Amazon Music selbst erstellt Playlist auszuweichen, funktioniert wohl nicht, weil die werden in den Playlists in der HEOS App nicht gelistet sondern nur die Amazon Music eigenen der Amazon Musikredaktion.

Von der Implementierung her eigentlich traurig und sehr schade! Da ginge erheblich mehr!

Soweit zu Amazon Music - u. U. bei Deezer ähnlich ?!?

laurello

Und es kommt noch besser:  ;D ;D ;D

Aus der Amazon Music App oder auch über Alexa kann ich alles von Amazon Music spielen, weil der HEOS Player über den Skill in der Alexa App bekannt gemacht werden kann und dann einfach als Wiedergabegerät dient. So rum also keine Probleme: nicht mit Tracks, Alben oder Playlisten!