SONOS langen Tastendruck auf Play simulieren - für automatische Gruppierung

Begonnen von willib, 07 Januar 2019, 13:02:26

Vorheriges Thema - Nächstes Thema

willib

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.
FHEM in Debian 10 LXC unter Proxmox auf NUC, Homematic, Hue, Intertechno, Jeelink, RFXTRX, Harmony Hub, VU+ Uno 4K, Sonos, AMAD

willib

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.

FHEM in Debian 10 LXC unter Proxmox auf NUC, Homematic, Hue, Intertechno, Jeelink, RFXTRX, Harmony Hub, VU+ Uno 4K, Sonos, AMAD

willib

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

FHEM in Debian 10 LXC unter Proxmox auf NUC, Homematic, Hue, Intertechno, Jeelink, RFXTRX, Harmony Hub, VU+ Uno 4K, Sonos, AMAD

Reinerlein

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

willib

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.
FHEM in Debian 10 LXC unter Proxmox auf NUC, Homematic, Hue, Intertechno, Jeelink, RFXTRX, Harmony Hub, VU+ Uno 4K, Sonos, AMAD

Reinerlein

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

willib

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.
FHEM in Debian 10 LXC unter Proxmox auf NUC, Homematic, Hue, Intertechno, Jeelink, RFXTRX, Harmony Hub, VU+ Uno 4K, Sonos, AMAD

willib

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.
FHEM in Debian 10 LXC unter Proxmox auf NUC, Homematic, Hue, Intertechno, Jeelink, RFXTRX, Harmony Hub, VU+ Uno 4K, Sonos, AMAD

Abercrombie1892

wäre wirklich toll, wenn diese funktion ins modul eingepflegt werden könnte.

würde so einiges leichter machen.

diko

FHEM auf Raspi 2 B, Jessi, 1x CUL868, 1x Hue, 1x Harmony, 1x HM-USB2

Pete37

Fhem auf Raspberry Pi3 mit Fritzbox inkl. Steckdosen, Philips Hue inkl. Orsam Lightify-Lampen, eq-3 Max!, SONOS, Rollotron Rolläden, Asus ZenPad, Samsung Galaxy xCover 3