Sonos gruppiert einen Player mit dem Player auf dem zuletzt die Wiedergabe gestartet wurde mit einem langem Druck auf die Play Taste. Ein weiterer langer Druck entfernt den Player wieder aus der Gruppe.
Kann Ich diese Funktionalität per einfachem notify nachbilden - sprich einen langen Tastendruck auf Play per FHEM simulieren?
Danke.
Ich habe einen Ansatz gefunden. Am Sonos Haupt-Device bekomme ich die nötigen Informationen.
Internals:
DEF localhost:4711 30 1 5
DELAYTIME 5
DeviceName localhost:4711
FD 105
FUUID 5c4cb6b6-f33f-7452-9263-081ce7c4515e9d23
INTERVAL 30
NAME Sonos
NOTIFYDEV global
NR 25
NTFY_ORDER 50-Sonos
PARTIAL
STATE opened
TYPE SONOS
WAITTIME 1
READINGS:
2019-02-11 07:39:53 AllPlayer ['Sonos_Bad_X','Sonos_Gaesteklo','Sonos_Kueche','Sonos_Wohnzimmer']
2019-02-11 07:39:53 AllPlayerCount 4
2019-02-11 07:39:53 AllPlayerNotBonded ['Sonos_Bad_X','Sonos_Gaesteklo','Sonos_Kueche','Sonos_Wohnzimmer']
2019-02-11 07:39:53 AllPlayerNotBondedCount 4
2017-06-27 15:47:28 LastActionResult RefreshShareIndex: Success!
2019-02-11 21:49:57 LastProcessAnswer 1549918197
2019-02-10 17:42:29 LastProcessRestart 2019-02-10 17:42:29
2019-02-10 17:42:29 LastProcessRestartCount 34
2019-02-11 07:27:41 LineInPlayer ['Sonos_Wohnzimmer']
2019-02-11 07:39:53 MasterPlayer ['Sonos_Bad_X','Sonos_Gaesteklo','Sonos_Kueche','Sonos_Wohnzimmer']
2019-02-11 07:39:53 MasterPlayerCount 4
2019-02-11 21:48:26 MasterPlayerNotPlaying ['Sonos_Bad_X','Sonos_Kueche','Sonos_Wohnzimmer']
2019-02-11 21:48:26 MasterPlayerNotPlayingCount 3
2019-02-11 21:48:26 MasterPlayerPlaying ['Sonos_Gaesteklo']
2019-02-11 21:48:26 MasterPlayerPlayingCount 1
Soweit ich sehe steht der zuletzt gestartete Player vorne im Reading MasterPlayerPlaying.
Der Befehl zum Gruppieren lautet also in diesem Fall für meinen Küchen Player
set Sonos Groups [Sonos_Gaesteklo, Sonos_Kueche]
Nun soll das Ganze natürlich variabel immer den zuletzt gestarteten Player als Master nutzen. Was muss ich jetzt tun um nur den ersten Player aus dem Reading ohne die Zeichen [''] zu übergeben?
Im Idealfall kann ich wie mit dem langen Druck auf die Play Taste am Player durch die laufenden Player "zappen" und diese dann nacheinander mit dem Player in der Küche Gruppieren und wieder Lösen.
Ich habe es mit split Versucht. Ich nutze es in einem DOIF. Das ist der Zweig
([KU_4But_Btn_01:"^Long.1.*$"])({my $var = (split("'",ReadingsVal("Sonos","MasterPlayerPlaying","")))[1];; fhem("set Sonos Groups [$var, Sonos_Kueche]")})
Das klappt aber nicht. Im Log wird mir mit Verbose 5 folgendes angezeigt:
2019.02.12 20:18:59 4: di_KU_SonosFB: error in default: Sonos_Kueche
Hi willib,
allgemein ist es am Besten die Strukturen per eval() in eine Perl-Struktur zurückzuverwandeln, und damit dann zu arbeiten.
Allerdings ist die Grundlage falsch. Die Listen werden alphabetisch sortiert ausgegeben, dort steht also nicht der zuletzt gestartete Player vorne.
Du müsstest dir diese Liste mittels eines Notify merken, um bei Veränderung eben den neu hinzugekommenen Player (oder mehrere) zu erkennen und irgendwie zu speichern.
Grüße
Reinerlein
Danke Reinerlein, für den Hinweis mit der alphabetischen Sortierung. Deine vorgeschlagenen Maßnahmen übersteigen leider bei weitem meine Fähigkeiten.
Darf ich vielleicht vorsichtig den Wunsch äußern, dass du diese Sonos Funktion des Gruppierens bei langem Tastendruck auf die Playtaste in dein Modul mit aufnimmst? Sodass man die Möglichkeit hat diese über FHEM zu nutzen ohne die Taste am Player drücken zu müssen.
Kennst du diese Funktion?
Wir nutzen diese häufig um die Musik vom CD Player der an ein Play5 angeschlossen ist in andere Räume mitzunehmen. Das geht sehr viel schneller als über die Sonos App.
Hi willib,
hier mal ein Anfangs-Beispiel für das Notify:
define Sonos_LastPlayingPlayerNotify notify Sonos_.*:transportState:PLAYING setreading Sonos_LastPlayingPlayerNotify playername $NAME
Eigentlich sollte das den Playernamen ermitteln...
Dann brauchst du nur noch z.B. folgenden Perl-Code zum Gruppieren ausführen:
my $addplayername = ''; # Hier der Playerdevicename, der zum letzten abspielenden hinzugefügt werden soll
fhem('set '.ReadingsVal('Sonos_LastPlayingPlayerNotify', 'playername', '').' AddMember '.$addplayername);
Beachte, dass der letztere Code nicht auf ein Abspiel-Startevent ausgeführt wird, da dann das Reading bereits überschrieben worden sein könnte...
Ich habe leider gerade sehr wenig Zeit, und noch einiges anderes auf dem Tisch...
Grüße
Reinerlein
Ich Danke Dir vielmals, dass du dir trotzdem die Zeit genommen hast mir eine Lösung für mein Grundproblem zu präsentieren. Ich probiere es heute Abend aus.
Vielleicht gelingt es mir ja mit deinem Ansatz, die Gruppierung per Play Taste vollständig nachzubauen.
Könntest du dir grundsätzlich vorstellen dein Modul um diese Funktion zu erweitern, wenn es deine Zeit und deine Prioritäten erlauben?
Gutes Gelingen für die anderen Sachen auf deinem Tisch.
Funktioniert. Vielen Dank.
Ich habe ein usereading am notify erstellt und das notify mit einem punkt geändert da der Event an der Stelle ein Leerzeichen hat.
define Sonos_LastPlayingPlayerNotify notify Sonos_.*:transportState:.PLAYING setreading Sonos_LastPlayingPlayerNotify playername $NAME
Heute morgen waren alle Sonos player disappeared. Die Ursachen dafür untersuche ich noch.
wäre wirklich toll, wenn diese funktion ins modul eingepflegt werden könnte.
würde so einiges leichter machen.
Ja, das würde mir auch sehr zusagen.
Danke
Die Funktion fände ich auch sehr praktisch