Playlist für Sonos direkt vom Synology NAS?

Begonnen von ah966, 27 März 2017, 22:13:57

Vorheriges Thema - Nächstes Thema

ah966

Hallo,

ich heisse Andreas und lese hier seit einiger Zeit mit.

Ich möchte meine Sonos Play:1 mittels FHEM steuern, z.B. mit voreingestelltem Sender nach einem Reboot - was auch super funktioniert.

Jetzt würde ich gerne per
fhem "set Sonos_Kueche LoadPlaylist file://synologynas/music/playlists/Sonosliste.m3u" ;
eine Playliste direkt vom Server laden.

Habe schon alle möglichen Variationen ausprobiert:
mit maskierten Backslashes, ohne Maskierung, mit file: vorangestellt und ohne. Aber nichts funktioniert.
Das Modul kann doch eine Playliste aus dem Filesystem laden, die Funktion wurde 2015 eingefügt.
Funktioniert das nicht über einen UNC-Pfad?
Der Server ist dem Sonos-System bekannt - ich kann im Windows-Controller über "Musikbibliothek - Importierte Playlisten" darauf zugreifen.

Im Monitor von FHEM sehe ich, daß er dann
SONOSPLAYER Sonos_Kueche currentEnqueuedTransportURI: x-file-cifs://synologynas/music/playlists/Sonosliste.m3u
aufruft, aber selbst mit x-file-cifs in der DEF des Notify funktioniert das nicht.

Hat jemand eine Idee, ob das überhaupt möglich ist?
Und ob ich mit "LoadPlaylist" überhaupt auf dem richtigen Weg bin, eine .m3u-Datei zu laden?

Viele Grüße,
Andreas 

Reinerlein

Hi Andreas,

LoadPlaylist ist auf jedenfall richtig. Die Angabe lautet "file:" Dahinter muss ein Dateiname kommen, der vom Fhem-System aus lesbar ist.
Die Playliste wird vom SubProzess verarbeitet, und jeder Eintrag einzeln an den Sonosplayer übertragen. Die Einträge (bzw. die damit referenzierten Musikdateien) selbst müssen dann vom Sonosplayer aus gelesen werden können.

Bevor du das im Notify einsetzt, solltest du erstmal einen Direktaufruf über die FhemWeb Seite des Players versuchen.
Versuch mal folgendes:

set Sonos_Kueche LoadPlaylist file:\\synologynas\music\playlists\Sonosliste.m3u
Darauf achten, dass es keine Leerzeichen im Namen gibt...

Wenn das nicht geht, dann müsstest du vermutlich erstmal den NAS-Ordner auf deinem Fhem-System mounten (wenn es z.B. Debian ist), und dann den entsprechenden lokalen Pfad an das Sonosmodul übergeben...

Grüße
Reinerlein

Hotbird

Zitat von: ah966 am 27 März 2017, 22:13:57

z.B. mit voreingestelltem Sender nach einem Reboot - was auch super funktioniert.


Wie hast Du das denn hinbekommen? Gibt es da ne Befehlszeile hier im Board oder ne Anleitung? Ich hab 3 Play1 und muss immer zum Handy greifen um ne Playlist/Radiosender zu laden wenn ich denen Strom gebe ( hängen alle an ner schaltbaren Steckdose )

ah966

Hallo Reinerlein,

vielen Dank für Deine Antwort.

Der Fehler sitzt natürlich vor dem Rechner :-)
Ich habe vom FHEM-Server aus keinen Zugriff auf das NAS eingerichtet. Dachte, daß FHEM das als Parameter an Sonos übergibt, und diese dann drauf zugreifen.
Weil die Sonos haben Zugriff darauf - hab ich in der Musikbibliothek eingerichtet.

@Hotbird:
Du legst ein Notify für den Play an:

DEF:

Sonos_Kueche:presence:.appeared {
  if (ReadingsVal('Sonos_Kueche', 'numberOfTracks', -1) == 0) {
    fhem "set Sonos_Kueche LoadFavourite Die%20Neue%20Welle" ;
    fhem "set Sonos_Kueche Volume 7"
  }
}


Wenn sich also der Status des Play auf "appeared" ändert, wird das ausgeführt.
Der Sender (Die Neue Welle) ist als Sonos-Favorit hinterlegt. Man könnte wohl auch die URL nehmen.

Ich benutze das, weil ich zum einen WLAN nachts abschalte und zukünftig auch die Play an eine Zeitschaltuhr hänge.
Bisher funktioniert das zuverlässig.

Viele Grüße,
Andreas 

Hotbird

#4
Vielen Dank für die Info! Allerdings will das bei mir nicht klappen mit nem Notify

define Sonos_Schlafzi_Playlist notify Sonos_Schlafzimmer:presence:.appeared {
  if (ReadingsVal('Sonos_Schlafzimmer', 'numberOfTracks', -1) == 0) {
    fhem "set Sonos_Schlafzimmer LoadFavourite YOU%20FM%20-%20YOUNG%20FRESH%20MUSIC" ;
    fhem "set Sonos_Schlafzimmer Volume 7"
  }
}


Wollte es erstmal im Schlafzimmer ausprobieren. Ist der Code nicht eher ein DoIf ?

Es kommt diese Fehlermeldung
Missing right curly or square bracket at (eval 28848) line 1, at end of line
syntax error at (eval 28848) line 1, at EOF


ah966

Hallo,

das Define komplett auf der Eingabezeile abzusetzen hat bei mir noch nie geklappt.
Ich mache immer ein Dummy-Define und ändere hinterher im DEF-Feld das wie gewünscht ab.

Dort sollte es wie im angefügten Bild aussehen.


ah966

Wie kann ich eigentlich herausfinden, welche Playliste als letztes auf einem Sonos geladen wurde?

Wenn ich eine Playliste abspiele, kann ich über die Readings nur herausfinden, welcher Titel, Interpret etc. abgespielt wird/wurde - aber nicht der Name der Playliste.

Ich baue an einer Hardware-Steuerung für Sonos und würde gerne mit einer Tastenkombination die jeweils nächste Playliste laden.
Das kann auch ruhig umständlich im notify hinterlegt sein - mit if {} elsif {} zum Beispiel.

- Kann ich die Playliste irgendwie ermitteln?
- Falls nicht, kann ich die z.B. in das userattr reinschreiben - aber wie lese ich die aus?
- Oder muß ich mit Variablen arbeiten? Da hatte ich allerdings den explicit package - Fehler....


Hotbird

Zitat von: ah966 am 28 März 2017, 17:25:14
Hallo,

das Define komplett auf der Eingabezeile abzusetzen hat bei mir noch nie geklappt.
Ich mache immer ein Dummy-Define und ändere hinterher im DEF-Feld das wie gewünscht ab.

Das hat geklappt, vielen lieben Dank! Endlich nicht mehr das Handy rausholen um die Playlist zu laden :-) Hatte nur Probleme beim angeben des Favoriten, die kann man aber auch über die Sonos App umbenennen. Namen gekürzt und es hat gleich funktioniert :-)

ah966

Das hier:
Zitat von: ah966 am 28 März 2017, 21:43:03
Wie kann ich eigentlich herausfinden, welche Playliste als letztes auf einem Sonos geladen wurde?

Wenn ich eine Playliste abspiele, kann ich über die Readings nur herausfinden, welcher Titel, Interpret etc. abgespielt wird/wurde - aber nicht der Name der Playliste.

Ich baue an einer Hardware-Steuerung für Sonos und würde gerne mit einer Tastenkombination die jeweils nächste Playliste laden.
Das kann auch ruhig umständlich im notify hinterlegt sein - mit if {} elsif {} zum Beispiel.

- Kann ich die Playliste irgendwie ermitteln?
- Falls nicht, kann ich die z.B. in das userattr reinschreiben - aber wie lese ich die aus?
- Oder muß ich mit Variablen arbeiten? Da hatte ich allerdings den explicit package - Fehler....



hat übrigens geklappt. Ich benutze tatsächlich das userattr und lese es mittels AttrVal aus.
Wenn ich eine Playliste lade, wird der Name der Liste in das Attribut gesetzt und entsprechend kann ich auf das Notify reagieren.

Reinerlein

Hi ah966,

als Attribut ist sowas aber von der Logik her ungünstig. Attribute stellen im Normalfall Konfigurationen dar, Readings entsprechen eher "Laufzeitvariablen"...

Aber seit der letzten Version wird das von Sonos geliefert, und von mir im Reading "currentPlaylistName" abgelegt. Das funktioniert aber nur, wenn du die verfügbaren Playlisten in einem Fhem-Device mal mittels "get Sonos_Player PlaylistsWithCovers" abgefragt hast (bzw. am Besten bei Änderung aktualisieren läßt).

Grüße
Reinerlein

ah966

Hallo Reinerlein,

besten Dank für die Info.
Habe es jetzt, wie vorgeschlagen, über das Reading gelöst.

Somit kann ich die Player direkt über die vorhandenen Tasten steuern. Saugut, das erhöht den WAF!

Viele Grüße,
Andreas 

Hotbird

schönen guten Morgen,

seit dem update vom Modul funktioniert es nicht mehr mit dem automatischen laden der Playlist sobald des Sonos am Netz ist. Hat jemand einen Tip was ich ändern muss? Vorher hat es prima geklappt...