Autor Thema: SONOS langen Tastendruck auf Play simulieren - für automatische Gruppierung  (Gelesen 751 mal)

Online willib

  • Full Member
  • ***
  • Beiträge: 261
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.
« Letzte Änderung: 11 Februar 2019, 21:46:16 von willib »
Raspberry Pi 3B, Homematic, Hue, Intertechno, Jeelink, Harmony Hub, VU+ Uno 4K, Sonos

Online willib

  • Full Member
  • ***
  • Beiträge: 261
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.
 
Raspberry Pi 3B, Homematic, Hue, Intertechno, Jeelink, Harmony Hub, VU+ Uno 4K, Sonos

Online willib

  • Full Member
  • ***
  • Beiträge: 261
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
« Letzte Änderung: 12 Februar 2019, 20:20:25 von willib »
Raspberry Pi 3B, Homematic, Hue, Intertechno, Jeelink, Harmony Hub, VU+ Uno 4K, Sonos

Offline Reinerlein

  • Developer
  • Hero Member
  • ****
  • Beiträge: 2030
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

Online willib

  • Full Member
  • ***
  • Beiträge: 261
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.
Raspberry Pi 3B, Homematic, Hue, Intertechno, Jeelink, Harmony Hub, VU+ Uno 4K, Sonos

Offline Reinerlein

  • Developer
  • Hero Member
  • ****
  • Beiträge: 2030
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

Online willib

  • Full Member
  • ***
  • Beiträge: 261
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.
Raspberry Pi 3B, Homematic, Hue, Intertechno, Jeelink, Harmony Hub, VU+ Uno 4K, Sonos

Online willib

  • Full Member
  • ***
  • Beiträge: 261
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.
Raspberry Pi 3B, Homematic, Hue, Intertechno, Jeelink, Harmony Hub, VU+ Uno 4K, Sonos

Offline Abercrombie1892

  • Full Member
  • ***
  • Beiträge: 161
wäre wirklich toll, wenn diese funktion ins modul eingepflegt werden könnte.

würde so einiges leichter machen.
Gefällt mir Gefällt mir x 1 Liste anzeigen

Offline diko

  • Jr. Member
  • **
  • Beiträge: 58
Ja, das würde mir auch sehr zusagen.
Danke
FHEM auf Raspi 2 B, Jessi, 1x CUL868, 1x Hue, 1x Harmony, 1x HM-USB2
Gefällt mir Gefällt mir x 1 Liste anzeigen