Sonos Gruppen trennen

Begonnen von Spartacus, 29 Juli 2015, 11:29:57

Vorheriges Thema - Nächstes Thema

Spartacus

Hallo,
ich möchte zu einer bestimmten Uhrzeit zwei Sonos-Player vom Rest der Gruppe abtrennen, aber nur, wenn Sie auc verbunden sind. Dieser Code funktioniert zwar, scheint mir aber zu umständlich. Hat jemand eine Idee, wie man das vereinfachen könnte?

*09:59
{
  if (sameGroup('OG.kz.SON.ZP_S1_L','OG.sz.SON.ZP_S1_L'))
  {
   fhem "set Sonos Groups [OG.sz.SON.ZP_S1_L, OG.bz.SON.ZP_S1_L] [OG.kz.SON.ZP_S1_L]"
  }
  if (sameGroup('DG.kz.SON.ZP_S1','OG.sz.SON.ZP_S1_L'))
  {
   fhem "set Sonos Groups [OG.sz.SON.ZP_S1_L, OG.bz.SON.ZP_S1_L] [DG.kz.SON.ZP_S1]"
  }
}


Spartacus
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

rapster

Habe mir mal verschiedene Sonos-Helper-Functions für die myUtils gebastelt:

z.B. zum ungroupieren:
### Sonos Ungroup/RemoveFromGroup function ###
# 1st parameter must be the sonos-player
# (optional without restore Volume) To only remove from group set 2nd parameter to any true value, else to 0 (false)
# (optional) To restore Volume to level before grouping set 3rd parameter to any true value
sub sonosUngroup($@) {
my ($SONOS,@param) = @_;
my @groups = split('\], ', CommandGet(undef, 'SONOS groups'));
my (@devices,$master,$member);
for (@groups) {
s/[\[\]]//g;
@devices = split(', ');
if(scalar(@devices) > 1) {
if (grep {$_ eq $SONOS} @devices) {
$master = shift(@devices) ;
while($member=shift(@devices)) {
                    if(!$param[0] || $member eq $SONOS) {
                        CommandSet(undef, "$master RemoveMember $member");
if($param[1]) { CommandSet(undef, "$member VolumeRestore"); }
                    } elsif($param[0] && $master eq $SONOS) {
                        CommandSet(undef, "$master RemoveMember $master");
                        last;
                    }
}
last;
}
}
}
}


Damit sollte das so gehen:
{ sonosUngroup('OG.kz.SON.ZP_S1_L',1); sonosUngroup('OG.sz.SON.ZP_S1_L',1) }
damit werden diese 2 Player von Ihrer Gruppe abgetrennt aber die Gruppe bleibt noch bestehen. Evtl. musst du halt zuvor noch prüfen ob sie sich in einer bestimmten oder der gleichen Gruppe befinden.

Spartacus

Hallo rapster,
Das ist ja genial! Probiere ich direkt aus, wenn ich wieder zu Hause bin.....
Vielen Dank dafür!

Spartacus
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Reinerlein

Hallo Spartacus,

eigentlich brauchst du doch nur den Sonos-Gruppierer aufrufen, und eben diese beiden Player nicht gruppieren.
Also sowas wie

set Sonos Groups [OG.kz.SON.ZP_S1_L], [OG.sz.SON.ZP_S1_L]


Das macht eigentlich auch keine Probleme, wenn die Player bereits alleine sind.
Klappt das bei dir nicht wie erwartet?

Grüße
Reinerlein

Spartacus

Hallo Reinerlein,
danke für den Tipp. Ich habe das heute mal ausprobiert. Das funktioniert ganz gut. Allerdings wollte ich die Routine nur durchlaufen, wenn die Player Bestandteil der Gruppe sind.
*04:00
set Sonos Groups [OG.kz.SON.ZP_S1_L], [DG.kz.SON.ZP_S1], [OG.br.SON.ZP_S3]


wenn ich das so mache, werden hier jeden Tag um 0400 die Player abgetrennt. Es scheint zumindest so, als habe das keine Auswirkungen auf die  Player, wenn die Gruppe nicht besteht.

Christian
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

50watt

#5
Ich möchte ein set Sonos_Bad Speak 30 de ...
Die Ausgabe soll NUR auf Sonos_Bad erfolgen, ganz egal ab Sonos_Bad in einer group ist oder nicht.
Idealerweise wird nach dem "Speak" wieder die gleiche Gruppierung hergestellt wie vor dem "Speak".

Gibt es dafür eine einfache Lösung?
Lohnt es sich dafür den Befehl "set xxx speak" oder "set xxx group" zu erweitern?

Das Szenario ist etwa wie folgt: Es gibt diverse Sonos Player, die in wechselnden Gruppierungen betrieben werden (von "alle einzeln" bis "alle in einer Gruppe"). Wenn am Morgen das Licht im Bad eingeschaltet wird, "sagt" der Sonos-Player im Bad diverse Wetterdaten. Diese Wetterdaten sollen aber nur im Bad zu hören sein (und nicht auch im Schlafzimmer ;-) da könnte ja noch jemand schlafen)...
RaspberryPi, EnOcean PI
Sonos Play1, Connect
Eltako FT55, FSB61, FAM12, FSR12-4x

justme1968

wenn das gruppieren und auflösen nicht so langsam wäre würde ich mir noch das umgekehrte wünschen: gruppieren für eine synchrone ausgabe auf alle erreichbaren devices und danach wieder auflösen in den zustand vorher und jeweils so weiterspielen wie zuvor.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Reinerlein

Hallo,

ja, die Gruppenbildung ist nicht die schnellste.

Aber das mit der Durchsage kann man vielleicht mit der folgenden Sequenz lösen:

{
  my $oldGroups = CommandGet(undef, 'Sonos Groups');
  fhem('set Sonos Groups [Sonos_Bad]');
  fhem('set Sonos_Bad Speak de +0 Durchsage');
  fhem('set Sonos Groups '.$oldGroups);
}

Das hat nur den Nachteil, dass eine Gruppenänderung während der Durchsage wieder zurückgesetzt wird...
Du musst halt mal schauen, ob das sauber nachinander ausgeführt wird, oder ob etwas überholt wird...

Grüße
Reiner

50watt

Danke für die rasche Antwort. set Sonos Groups [Sonos_Bad] ändert nichts an den Sonos Gruppen hier, überprüft via get Sonos Groups.

Vorher und nachher:
[Sonos_Bad, Sonos_Test01_Schlafzim, Sonos_Test01_Schlafzim_RF, Sonos_Wohnzimmer, Sonos_Kueche]
Anbei ein Auszug aus dem verbose 5 log...


2015.10.17 15:09:07 5: SONOS0: Desired-Crowd: []

2015.10.17 15:09:07 5: SONOS0: Desired-List: [
  [
    'Sonos_Bad'
  ]
]

2015.10.17 15:09:34 3: SONOS0: Connection accepted from localhost:56786
2015.10.17 15:09:34 5: SONOS0: Received: 'hello'
2015.10.17 15:09:34 5: SONOS0: Received: 'goaway'
2015.10.17 15:09:34 4: SONOS0: Got correct Answer from Subprocess...


Darüberhinaus würden alle Sonos player aufhören weiter das bisherige "Programm" wiederzugeben, wenn der "Master" bisher Sonos_Bad war, oder irre ich mich da?
RaspberryPi, EnOcean PI
Sonos Play1, Connect
Eltako FT55, FSB61, FAM12, FSR12-4x

Reinerlein

Hallo,

ich werde einen neuen Befehl einbauen, mit dem man einen Player direkt aus seiner Gruppe holen kann, und ihn alleine dastehen lassen kann. Intern ist der Befehl sowieso schon da, da ich ihn für den Groups-Befehl brauche...
Das mit der Veröffentlichung wird aber noch ein paar Tage dauern, ich hänge noch an der Speak-URL-Umstellung fest...

Damit kannst du einen Player schon mal sicher aus irgendwelchen Gruppenkonstellationen holen...

Grüße
Reiner

m0urs

So einen Befehel zum Herauslösen eines Palyers würde ich auch sehr begrüßen ;-) Und wenn ich gerade dabei bin Wünsche zu äußern: Ein Befehl eine Durchsage an alle Sonos-Player zu machen ud danach wieder alle in der vorherigen Einstellung (Gruppe, Radio bzw. Playlist etc.) weiterspielen zu lassen, wäre auch der Hit :-)

Elektrolurch

Zitat:
Ein Befehl eine Durchsage an alle Sonos-Player zu machen ud danach wieder alle in der vorherigen Einstellung (Gruppe, Radio bzw. Playlist etc.) weiterspielen zu lassen, wäre auch der Hit :-)

Ja, ja. Darüber denke ich auch  gerade nach, wie ich das am Besten lösen kann. Wobei bei mir noch ein weiterer Faktor hinzukommt: Um Strom zu spatren, werden die Player bei Nichtbenutzung über einen FS20 St3 ausgeschaltet, d.h. ich muss zuerst alle Player einschalten, dann warten bis die alle hochgefahren sind, dann Gruppieren und nach der Durchsage wieder ausschalten, falls sie vorher ausgeschaltet waren.

Und wenn man so was baut, dann kann man es ja auch zur Weckfunktion erweitern.

Überlegung ist, so eine Art offline-Buffer für die Befehle zu bauen, wenn dann da etwas drin ist, den entsprechenden Player über die Steckdose einzuschalten usw. wie oben.

Frickel da gerade an einem Konzept herum.

Das o.g. Featur mit dem Gruppieren wäre da auch schon mal hilfreich (z.B. für eine Alarmanlage....)

Elektrolurch
configDB und Windows befreite Zone!

Reinerlein

Hi,

geht denn die Abfolge der Befehle für gruppieren, Durchsage und un-gruppieren?
Also z.B.:

{
  my $groups = CommandGet(undef, 'Sonos Groups');
  fhem('set Sonos Groups [Sonos_Wohnzimmer, Sonos_Schlafzimmer, Sonos_Bad]');
  fhem('set Sonos_Wohnzimmer Speak 10 de Durchsage hier machen');
  fhem('set Sonos Groups '.$groups);
}

Das könnte ich als Speak-Befehl am Sonos-Device einbauen.

Grüße
Reiner

50watt

Der Befehl für das Herausnehmen eines Players ist nun da - vielen Dank!
Mit
set Sonos_Bad makeStandaloneGroup
vor dem "speak" spielen die anderen Player weiter und Sonos_Bad "sagt" die Durchsage.

RaspberryPi, EnOcean PI
Sonos Play1, Connect
Eltako FT55, FSB61, FAM12, FSR12-4x

willib

Ich versuche mich gerade an dem Thema SONOS Player für eine Durchsage zu gruppieren und danach wieder zu trennen.
Ich möchte anmerken, dass
set Sonos_Bad makeStandaloneGroup
in der FHEM reference nicht existiert.
Wie macht ihr das mit dem gruppieren und trennen bei einer Durchsage?
FHEM in Debian 10 LXC unter Proxmox auf NUC, Homematic, Hue, Intertechno, Jeelink, RFXTRX, Harmony Hub, VU+ Uno 4K, Sonos, AMAD