Sonos Lautstärke mit Homematic Taster ändern

Ich weis ja nicht wie Du den Taster drücken willst, aber ich gehe mal davon aus das z.B. Tastendruck rauf Play sein soll und Tastendruck runter Stop. Oder willst Du z.B. immer nur nach oben drücken und es soll eben abwechselnd auf Play oder Stop geschaltet werden, je nachdem was für ein Zustand das Gerät zuletzt hatte?

Guten Tag,

Vielen dank für die Antworten.

Im Prinzip geht es um folgendes:

Wir haben Momentan 3 Player, früher oder später 5.
Als Taste verwende ich das 8-Fach Sendemodul von HomeMatic.

Ziel ist es Heim zukommen und alle Player sind aus.
Dann gehe ich ins Badezimmer Drücke dort am Taster die Taste 8, Radio SWR3 z.B. läuft nun.

Anschließend gehe ich in die Küche und drücke dort ebenfalls die Taste 8 Player dort geht an und wird der Gruppe „Badezimmer“ zugewiesen.

Selbes Spiel für Schlafzimmer, Wohnzimmer, Büro…

Nun kann man wieder irgendwo auf die Taste 8 drücken und der Player wird aus der Gruppe entfernt.
Also quasi auf Taste 8 immer ein Toggle Modus.

Spielt jetzt in der Küche SWR3 und im Badezimmer SWR4 z.B.
Dann sollte beim Drücken der Taste 8 im Badezimmer ja erst einmal die Musik ausgehen. Drückt man die Taste erneut, so wird diese wieder dem Player Esszimmer untergeordnet.

Im Regelfall (95%) hören wir überall die selbe Musik.
Trotzdem muss ich ja irgendwie drauf reagieren können wenn bereits 2 Player in einer Gruppe spielen welchem ich den 3ten unterordne, denn soweit ich weis geht das nur mit dem Coordinator.

Liebe Grüße,
Adrian.

Verwendest Du HM-RC-8?

Ich verwende das hier: ELV Homematic Komplettbausatz 8-Kanal-Sendemodul für Smart Home / Hausautomation | ELV-Elektronik

Hier ist die Frage soll immer SWR3 laufen oder willst Du was auswählen, dann lässt sich das schwer mit nur einer Taste realisieren. Wenn immer der gleiche Sender aufgerufen wird geht das auch mit einer Taste.

So als Entwurf die Objekt ID im Define Block müssen halt individuell angepasst werden zum einfachen ein aus schalten wenn das Gerät nicht in einer Gruppe ist.


<?

IPS_LogMessage("Sonos Play/Pause", "Event ".IPS_GetName($_IPS['EVENT'])." (".$_IPS['EVENT']."), Variable ".IPS_GetName($_IPS['VARIABLE'])." (".$_IPS['VARIABLE'].")" ); // Gibt eine Meldung im Meldungsfenster aus

// Festlegen der Gerätebezeichnung, Zuordnung der ObjektID

// Sonos Geräte
define("Sonos_Badezimmer", 28191 /*[Geräte\Heimkino\Audio\Sonos\Sonos Bad]*/);
define("Sonos_Schlafzimmer", 37212 /*[Geräte\Heimkino\Audio\Sonos\Sonos Schlafzimmer]*/);
define("Sonos_Kueche", 51749 /*[Geräte\Heimkino\Audio\Sonos\Sonos Küche]*/);
define("Sonos_Wohnzimmer", 32720 /*[Geräte\Heimkino\Audio\Sonos\Sonos Wohnzimmer]*/);
define("Sonos_Buero", 28191 /*[Geräte\Heimkino\Audio\Sonos\Sonos Büro]*/);
define("Sonos_Esszimmer", 28191 /*[Geräte\Heimkino\Audio\Sonos\Sonos Esszimmer]*/);

// Taster
define("Taste8_Sonos_Badezimmer", 58098 /*[Geräte\Homematic\Räume\Bad\Sonos Taster Bad\PRESS_SHORT]*/);
define("Taste8_Sonos_Schlafzimmer", 44743 /*[Geräte\Homematic\Räume\Schlafzimmer\Sonos Taster Schlafzimmer\PRESS_SHORT]*/);
define("Taste8_Sonos_Kueche", 22579 /*[Geräte\Homematic\Räume\Küche\Sonos Taster Küche\PRESS_SHORT]*/);
define("Taste8_Sonos_Wohnzimmer", 39761 /*[Geräte\Homematic\Räume\Wohnzimmer\Sonos Taster Wohnzimmer\PRESS_SHORT]*/);
define("Taste8_Sonos_Buero", 39761 /*[Geräte\Homematic\Räume\Büro\Sonos Taster Büro\PRESS_SHORT]*/);
define("Taste8_Sonos_Esszimmer", 39761 /*[Geräte\Homematic\Räume\Esszimmer\Sonos Taster Esszimmer\PRESS_SHORT]*/);

//Definition bzw. hohlen diverser Variablen

//Play Status
$statusBadezimmer = GetSonosStatus(Sonos_Badezimmer); // Badezimmer
$statusSchlafzimmer = GetSonosStatus(Sonos_Schlafzimmer); // Schlafzimmer
$statusKueche = GetSonosStatus(Sonos_Kueche); // Küche
$statusWohnzimmer = GetSonosStatus(Sonos_Wohnzimmer); // Wohnzimmer
$statusBuero = GetSonosStatus(Sonos_Buero); // Büro
$statusEsszimmer = GetSonosStatus(Sonos_Esszimmer); // Esszimmer



//Gruppenmember
$ingroupBadezimmer = GetSonosGroup(Sonos_Badezimmer);
$ingroupSchlafzimmer = GetSonosGroup(Sonos_Schlafzimmer);
$ingroupKueche = GetSonosGroup(Sonos_Kueche);
$ingroupWohnzimmer = GetSonosGroup(Sonos_Wohnzimmer);
$ingroupBuero = GetSonosGroup(Sonos_Buero);
$ingroupEsszimmer = GetSonosGroup(Sonos_Esszimmer);


// Auslöser Badezimmer
if($_IPS['VARIABLE'] == Taste8_Sonos_Badezimmer) 
{
	ToggleSonosStatus(Sonos_Badezimmer);
}

// Auslöser Schlafzimmer
if($_IPS['VARIABLE'] == Taste8_Sonos_Schlafzimmer)
{
	ToggleSonosStatus(Sonos_Schlafzimmer);  
}  

// Auslöser Küche
if($_IPS['VARIABLE'] == Taste8_Sonos_Kueche)
{
	ToggleSonosStatus(Sonos_Kueche);    
}  

// Auslöser Wohnzimmer
if($_IPS['VARIABLE'] == Taste8_Sonos_Wohnzimmer)
{
	ToggleSonosStatus(Sonos_Wohnzimmer);  
}  

// Auslöser Büro
if($_IPS['VARIABLE'] == Taste8_Sonos_Buero)
{
	ToggleSonosStatus(Sonos_Buero);
}  

// Auslöser Esszimmer
if($_IPS['VARIABLE'] == Taste8_Sonos_Esszimmer)
{
	ToggleSonosStatus(Sonos_Esszimmer); 
}  

/***********************************************************
 * Helper methods
 ***********************************************************/

 
/* Get Sonos Status
* @param int $sonosname ObjectID
* return string $status
*/
function ToggleSonosStatus($sonosname)
{
	// Wenn nicht in Gruppe
	if((GetSonosStatus($sonosname) == "pause" || GetSonosStatus($sonosname) == "stop") && GetSonosGroup($sonosname) == "none") 
	 { 
	    SNS_Play(Sonos_Badezimmer);  
	 }
	 else
	 {
	 	SNS_Stop(Sonos_Badezimmer);
	 } 
	
	$status = GetValueFormatted(IPS_GetObjectIDByIdent("Status", $sonosname));
	return $status;
}
 
 
/* Get Sonos Status
* @param int $sonosname ObjectID
* return string $status
*/
function GetSonosStatus($sonosname)
{
	$status = GetValueFormatted(IPS_GetObjectIDByIdent("Status", $sonosname));
	return $status;
}

/* Get Sonos Group Name
* @param int $sonosname ObjectID
* return string $groupname
*/
function GetSonosGroup($sonosname)
{
	$groupname = GetValueFormatted(IPS_GetObjectIDByIdent("MemberOfGroup", $sonosname));
	return $groupname; 
}

?>

Grundsätzlich zu togglen mit einer Taste also Play/pause ist nicht das Problem. Wo ich selber mal drüber nachdenken müsste wie ob das das mit Gruppen mit ein und der selben Taste gehen soll, da fällt mir auf Anhieb nichts ein. Das Problem ist, wenn immer das gleiche passieren soll, sprich Du drückst in der Küche, wenn im Bad Musik läuft wird er in die Gruppe ergänzt, mag das ja noch gehen. Aber eine allgemeine Bedienbarkeit, das Du in jedem Raum ein Gerät der passenden Gruppe hinzufügen kannst bzw. wieder aus der Gruppe nimmst und das nur mit einem Knopf stelle ich mir schwer vor aber vielleicht fällt Dir, jemand oder mir da noch was ein.

Hier ist eben die Frage bei mehreren Räumen wie soll da jeweils die Gruppenzuordnung erfolgen. Es gibt also stets nur eine Gruppe und das Gerät soll immer entweder der Gruppe zugeordnet werden wenn nichts läuft?

Die Frage ist halt wenn schon zwei Räume Musik spielen und Du im dritten auch einen Knopf drückst dann soll dieser Raum auch der Gruppe zugeordnet werden und die gleiche Musik spielen, richtig? Soll dann auch aus jedem Raum die Musik insgesamt beendet werden, bei erneuten Knopfdruck und die Gruppe dann wieder automatisch aufgelöst?

Hallo Fonzo,

Vielen dank für das Umfangreiche Skript :slight_smile:

Ja das ist echt eine etwas schwierige Aufgabe Sache…
Ich kenne das eben nur von HVL ( HomeMatic Virtual Layer) so wie genau das dort realisiert wird weis ich allerdings auch nicht genau…
Homematic-Virtual-Interface/plugins/SonosPlugin at master · thkl/Homematic-Virtual-Interface · GitHub

Dort wir soweit ich das jetzt verstehe glaube ich immer alles über den Coordinator gelenkt, also irgendwo im Skript muss wohl durchgegangen werden welcher Player der Coordinator ist somit habe ich dann immer den richtigen Player dann muss ich „nur noch“ den weiteren hinzufügen.

und Anderst rum wenn einer bereits in der Gruppe ist und die Taste gedrückt wird wird dieser wieder entfernt, und ich meine wenn man den Coordinator entfernt wird diese „berechtigung“ einfach an einen anderen weitergegeben.

Gruß,
Ardrian

Also ich weis jetzt nicht ob das so möglich ist, aber wäre es machbar eine Variable zu definieren die sich „Coordinator“ nennt?
Diese Variable füllt man mit einer if Abfrage immer mit der aktuellen Objekt ID des Coordinators bzw. wahrscheinlich geht das mit einer einfach if Abfrage so garnicht?

Und dann könnte man eventuell in dieser Funktion:

SNS_SetGroup(<InstanceID>,<CoordinatorInstanceID>);

Statt einer Statischen ID für „CoordinatorInstanceID“ die Variable „Coordinator“ einsetzen ?
Und im Skript kann ich ja dann theoretisch wieder für jede Taste diese Funktion anlegen.
Somit sollte das ja immer Funktionieren da man nicht über die Festen ObjectID´s geht bzw. nur eine Feste ObjektID definiert hat und zwar diese die man einer Gruppe hinzufügen möchte.

Ist das so denkbar?

Gruß,
Adrian

Ja ein Coordinator gibt es, in dem Fall durch sucht die Funktion SearchSonosGroup nach einer Gruppe


<?

IPS_LogMessage("Sonos Play/Pause", "Event ".IPS_GetName($_IPS['EVENT'])." (".$_IPS['EVENT']."), Variable ".IPS_GetName($_IPS['VARIABLE'])." (".$_IPS['VARIABLE'].")" ); // Gibt eine Meldung im Meldungsfenster aus

// Festlegen der Gerätebezeichnung, Zuordnung der ObjektID

// Sonos Geräte
define("Sonos_Badezimmer", 28191 /*[Geräte\Heimkino\Audio\Sonos\Sonos Bad]*/);
define("Sonos_Schlafzimmer", 37212 /*[Geräte\Heimkino\Audio\Sonos\Sonos Schlafzimmer]*/);
define("Sonos_Kueche", 51749 /*[Geräte\Heimkino\Audio\Sonos\Sonos Küche]*/);
define("Sonos_Wohnzimmer", 32720 /*[Geräte\Heimkino\Audio\Sonos\Sonos Wohnzimmer]*/);
define("Sonos_Buero", 28191 /*[Geräte\Heimkino\Audio\Sonos\Sonos Bad]*/);
define("Sonos_Esszimmer", 28191 /*[Geräte\Heimkino\Audio\Sonos\Sonos Esszimmer]*/);

// Taster
define("Taste8_Sonos_Badezimmer", 58098 /*[Geräte\Homematic\Räume\Bad\Sonos Taster Bad\PRESS_SHORT]*/);
define("Taste8_Sonos_Schlafzimmer", 44743 /*[Geräte\Homematic\Räume\Schlafzimmer\Sonos Taster Schlafzimmer\PRESS_SHORT]*/);
define("Taste8_Sonos_Kueche", 22579 /*[Geräte\Homematic\Räume\Küche\Sonos Taster Küche\PRESS_SHORT]*/);
define("Taste8_Sonos_Wohnzimmer", 39761 /*[Geräte\Homematic\Räume\Wohnzimmer\Sonos Taster Wohnzimmer\PRESS_SHORT]*/);
define("Taste8_Sonos_Buero", 39761 /*[Geräte\Homematic\Räume\Wohnzimmer\Sonos Taster Büro\PRESS_SHORT]*/);
define("Taste8_Sonos_Esszimmer", 39761 /*[Geräte\Homematic\Räume\Wohnzimmer\Sonos Taster Esszimmer\PRESS_SHORT]*/);


// Auslöser Badezimmer
if($_IPS['VARIABLE'] == Taste8_Sonos_Badezimmer) 
{
	ToggleSonosStatus(Sonos_Badezimmer);
}

// Auslöser Schlafzimmer
if($_IPS['VARIABLE'] == Taste8_Sonos_Schlafzimmer)
{
	ToggleSonosStatus(Sonos_Schlafzimmer);  
}  

// Auslöser Küche
if($_IPS['VARIABLE'] == Taste8_Sonos_Kueche)
{
	ToggleSonosStatus(Sonos_Kueche);    
}  

// Auslöser Wohnzimmer
if($_IPS['VARIABLE'] == Taste8_Sonos_Wohnzimmer)
{
	ToggleSonosStatus(Sonos_Wohnzimmer);  
}  

// Auslöser Büro
if($_IPS['VARIABLE'] == Taste8_Sonos_Buero)
{
	ToggleSonosStatus(Sonos_Buero);
}  

// Auslöser Esszimmer
if($_IPS['VARIABLE'] == Taste8_Sonos_Esszimmer)
{
	ToggleSonosStatus(Sonos_Esszimmer); 
}  

/***********************************************************
 * Helper methods
 ***********************************************************/

 
/* Get Sonos Status
* @param int $sonosname ObjectID
* return string $status
*/
function ToggleSonosStatus($sonosname)
{
		
	//Play Status
	$statusBadezimmer = GetSonosStatus(Sonos_Badezimmer); // Badezimmer
	$statusSchlafzimmer = GetSonosStatus(Sonos_Schlafzimmer); // Schlafzimmer
	$statusKueche = GetSonosStatus(Sonos_Kueche); // Küche
	$statusWohnzimmer = GetSonosStatus(Sonos_Wohnzimmer); // Wohnzimmer
	$statusBuero = GetSonosStatus(Sonos_Buero); // Büro
	$statusEsszimmer = GetSonosStatus(Sonos_Esszimmer); // Esszimmer
	
	//var_dump($statusBuero);
	
	
	//var_dump($ingroupBuero);
	$group = SearchSonosGroup();
	
	// Wenn Player spielt aber noch keine Gruppe
	 if(($statusBadezimmer == "play" || $statusSchlafzimmer == "play" || $statusKueche == "play"|| $statusWohnzimmer == "play" ||$statusBuero == "play" || $statusEsszimmer == "play") && $group["name"] == "none")
	 { 
		$active_device = SearchActiveSonosDevice();
		if($active_device["id"] != $sonosname && $active_device["name"] != "none")
		{
		IPS_LogMessage("Sonos Play/Pause", "Create Sonos Group ".$active_device["name"].", add ".IPS_GetName($sonosname)." to group ".$active_device["name"] ); // Gibt eine Meldung der Gruppe im Meldungsfenster aus
		IPS_LogMessage("Sonos", "Send \"SNS_SetGroup(".$sonosname.",".$active_device["id"].");\" (".IPS_GetName($sonosname).",". $active_device["name"].")");
		SNS_SetGroup($sonosname, $active_device["id"]);
		SNS_Play($sonosname);  
		}
	 }
	
	// Wenn alles aus und nicht in Gruppe
	if((($statusBadezimmer == "pause" || $statusBadezimmer == "stop") && ($statusSchlafzimmer == "pause" || $statusSchlafzimmer == "stop") && ($statusKueche == "pause" || $statusKueche == "stop")
	 && ($statusWohnzimmer == "pause" || $statusWohnzimmer == "stop") && ($statusBuero == "pause" || $statusBuero == "stop") && ($statusEsszimmer == "pause" || $statusEsszimmer == "stop")) && $group["name"] == "none") 
	 { 
	    IPS_LogMessage("Sonos Play/Pause", "Sonos no group active, Play ".IPS_GetName($sonosname)); 
		SNS_Play($sonosname);  
	 }
	 // Wenn irgendwas spielt aber nicht in Gruppe
	 if(($statusBadezimmer == "play" || $statusSchlafzimmer == "play" || $statusKueche == "play"|| $statusWohnzimmer == "play" ||$statusBuero == "play" || $statusEsszimmer == "play") && $group["name"] == "none")
	 {
	 	IPS_LogMessage("Sonos Play/Pause", "Sonos no group active, Stop ".IPS_GetName($sonosname));
		SNS_Stop($sonosname);
	 } 
	 
	 // Wenn Gruppe existent
	 if((($statusBadezimmer == "pause" || $statusBadezimmer == "stop") && ($statusSchlafzimmer == "pause" || $statusSchlafzimmer == "stop") && ($statusKueche == "pause" || $statusKueche == "stop")
	 && ($statusWohnzimmer == "pause" || $statusWohnzimmer == "stop") && ($statusBuero == "pause" || $statusBuero == "stop") && ($statusEsszimmer == "pause" || $statusEsszimmer == "stop")) && $group["name"] != "none")
	 {
	 	IPS_LogMessage("Sonos Play/Pause", "Sonos group active ".$group["name"].", remove ".IPS_GetName($sonosname)." from group" ); // Gibt eine Meldung der Gruppe im Meldungsfenster aus
		SNS_SetGroup($sonosname, $group["id"]);
		SNS_Play($sonosname);
	 }
	 if(($statusBadezimmer == "play" || $statusSchlafzimmer == "play" || $statusKueche == "play"|| $statusWohnzimmer == "play" ||$statusBuero == "play" || $statusEsszimmer == "play") && $group["name"] != "none")
	 {
	 	IPS_LogMessage("Sonos Play/Pause", "Sonos Group active ".$group["name"].", remove ".IPS_GetName($sonosname)." from group" ); // Gibt eine Meldung der Gruppe im Meldungsfenster aus
		SNS_SetGroup($sonosname, $group["id"]);
		SNS_Stop($sonosname);
	 }
	 
	 
	
	$status = GetValueFormatted(IPS_GetObjectIDByIdent("Status", $sonosname));
	return $status;
}

function SearchActiveSonosDevice()
{
	$sonos_devices = [Sonos_Badezimmer, Sonos_Schlafzimmer, Sonos_Kueche, Sonos_Wohnzimmer, Sonos_Buero, Sonos_Esszimmer];
	foreach ($sonos_devices as $device)
	{
		$state = GetSonosStatus($device);
		if($state == "play")
		{
			$sonosdevice = ["name" => IPS_GetName($device), "id" => $device];
			return $sonosdevice;
		}
	}
	$sonosdevice = ["name" => "none", "id" => 0];
	return $sonosdevice;
}


function SearchSonosGroup()
{
	$sonos_devices = [Sonos_Badezimmer, Sonos_Schlafzimmer, Sonos_Kueche, Sonos_Wohnzimmer, Sonos_Buero, Sonos_Esszimmer];
	foreach ($sonos_devices as $device)
	{
		$groupname = GetSonosGroup($device);
		$groupmembers = GetSonosGroupMembers($device);
		if($groupname != "none")
		{
			$group = ["name" => $groupname, "id" => $device];
			return $group;
		}
		
	}
	
	$group = ["name" => "none", "id" => 0];
	return $group;
} 
 
/* Get Sonos Status
* @param int $sonosname ObjectID
* return string $status
*/
function GetSonosStatus($sonosname)
{
	$status = GetValueFormatted(IPS_GetObjectIDByIdent("Status", $sonosname));
	return $status;
}

/* Get Sonos Group Name
* @param int $sonosname ObjectID
* return string $groupname
*/
function GetSonosGroup($sonosname)
{
	$groupname = GetValueFormatted(IPS_GetObjectIDByIdent("MemberOfGroup", $sonosname));
	return $groupname; 
}

/* Get Sonos Group Name
* @param int $sonosname ObjectID
* return string $groupname
*/
function GetSonosGroupMembers($sonosname)
{
	$groupmembers = GetValueFormatted(IPS_GetObjectIDByIdent("GroupMembers", $sonosname));
	return $groupmembers; 
}

?>

schau mal was das Skript bei Dir macht, die Objekt ID in define anpassen.

Ja auch da würde über SearchSonosGroup geprüft werden, nur bei den vielen wenn dann Bedingungen verdreht es mir den Kopf, das alles mit einer einzigen Taste zu machen, aber Du kannst ja mal schauen ob das so vielleicht geht.

Die Variable gibt es, es gibt die Variable MemberOfGroup und Groupmembers.

Ja schau mal ob das Skript so irgendwie Sinn macht.

In dem Fall wird auch nicht über eine feste ID gegangen, der Koordinator ist logischerweise immer das Gerät das bereits aktiv ist, daher wird erst mal geschaut ob bereits ein Gerät etwas abspielt und dann der nächste Raum der Gruppe hinzugefügt, ich weis nur nicht ob das Skript so ausführlich funktioniert, das müsstest Du testen bzw. eventuell noch nachbessern.

Ich fürchte nur in dem Moment wenn Du mehrere Gruppen anlegst mit der Sonos App gibt es mit nur einem Knopf Chaos. Warum nutzt Du eigentlich von Deiner 8 fach Taster nicht mehrere Tasten? Das würde denke ich das ganze deutlich einfacherer machen, auch von der Bedienbarkeit.

Hallo Fonzo,

Vielen Dank für deine Hilfe,
Konnte mich leider erst jetzt wieder dran setzen da ich Geschäftlich etwas eingebunden war.

Ich habe das Skript mal so angepasst wie es für mich passt mit den Objekt IDs etc.

Nun ist es wie folgt:

Player 1 Läuft, ich Drücke die Taste für Player 2, dieser wird hinzugefügt jedoch spielt die Musik dann nicht weiter sondern wird pausiert.

Nun ist Player 1 Coordinator , ich drücke die Taste um Player 1 zu entfernen, die ganze Gruppe geht auf Pause. Ich Drücke die Taste erneut, die ganze Gruppe spielt wieder Musik.

Drücke ich die Taste um Player 2 zu entfernen, so wird dieser korrekt der Gruppe entnommen und die Musik spielt weiter.

Spielen 2 Player Musik die nicht zusammen in einer Gruppe sind (Badezimmer und Esszimmer)
Drücke ich nun Taste 8 im Badezimmer so wird die Musik dort nicht beendet, sondern der Player Badezimmer sofort zu Esszimmer geschoben und wieder die Musik pausiert.

Anbei noch das Skirpt, ich steig da nicht ganz durch wo der Fehler liegt, soweit mein Verständnis dafür reicht sollte das doch so Funktionieren?

<?

IPS_LogMessage("Sonos Play/Pause", "Event ".IPS_GetName($_IPS['EVENT'])." (".$_IPS['EVENT']."), Variable ".IPS_GetName($_IPS['VARIABLE'])." (".$_IPS['VARIABLE'].")" ); // Gibt eine Meldung im Meldungsfenster aus

// Festlegen der Gerätebezeichnung, Zuordnung der ObjektID

// Sonos Geräte
define("Sonos_Badezimmer", 19980 /*[Sonos_Badezimmer]*/);
define("Sonos_Wohnzimmer", 10054 /*[Sonos_Wohnzimmer]*/);
define("Sonos_Esszimmer", 10049 /*[Sonos_Esszimmer]*/);

// Taster
define("Taste8_Sonos_Badezimmer", 21533 /*[Taste 8 Badezimmer\PRESS_SHORT]*/);
define("Taste8_Sonos_Esszimmer", 29269 /*[KEY\PRESS_SHORT]*/);
define("Taste8_Sonos_Wohnzimmer", 15741 /*[KEY\PRESS_SHORT]*/);

// Auslöser Badezimmer
if($_IPS['VARIABLE'] == Taste8_Sonos_Badezimmer) 
{
    ToggleSonosStatus(Sonos_Badezimmer);
}  

// Auslöser Wohnzimmer
if($_IPS['VARIABLE'] == Taste8_Sonos_Wohnzimmer)
{
    ToggleSonosStatus(Sonos_Wohnzimmer);  
}  

// Auslöser Esszimmer
if($_IPS['VARIABLE'] == Taste8_Sonos_Esszimmer)
{
    ToggleSonosStatus(Sonos_Esszimmer); 
}  

/***********************************************************
 * Helper methods
 ***********************************************************/

 
/* Get Sonos Status
* @param int $sonosname ObjectID
* return string $status
*/
function ToggleSonosStatus($sonosname)
{
        
    //Play Status
    $statusBadezimmer = GetSonosStatus(Sonos_Badezimmer); // Badezimmer
    $statusWohnzimmer = GetSonosStatus(Sonos_Wohnzimmer); // Wohnzimmer
    $statusEsszimmer = GetSonosStatus(Sonos_Esszimmer); // Esszimmer
    
    //var_dump($statusBuero);
    
    
    //var_dump($ingroupBuero);
    $group = SearchSonosGroup();
    
    // Wenn Player spielt aber noch keine Gruppe
     if(($statusBadezimmer == "play" || $statusWohnzimmer == "play" || $statusEsszimmer == "play") && $group["name"] == "none")
     { 
        $active_device = SearchActiveSonosDevice();
        if($active_device["id"] != $sonosname && $active_device["name"] != "none")
        {
        IPS_LogMessage("Sonos Play/Pause", "Create Sonos Group ".$active_device["name"].", add ".IPS_GetName($sonosname)." to group ".$active_device["name"] ); // Gibt eine Meldung der Gruppe im Meldungsfenster aus
        IPS_LogMessage("Sonos", "Send \"SNS_SetGroup(".$sonosname.",".$active_device["id"].");\" (".IPS_GetName($sonosname).",". $active_device["name"].")");
        SNS_SetGroup($sonosname, $active_device["id"]);
        SNS_Play($sonosname);  
        }
     }
    
    // Wenn alles aus und nicht in Gruppe
    if((($statusBadezimmer == "pause" || $statusBadezimmer == "stop") 
     && ($statusWohnzimmer == "pause" || $statusWohnzimmer == "stop") && ($statusEsszimmer == "pause" || $statusEsszimmer == "stop")) && $group["name"] == "none") 
     { 
        IPS_LogMessage("Sonos Play/Pause", "Sonos no group active, Play ".IPS_GetName($sonosname)); 
        SNS_Play($sonosname);  
     }
     // Wenn irgendwas spielt aber nicht in Gruppe
     if(($statusBadezimmer == "play" || $statusWohnzimmer == "play" || $statusEsszimmer == "play") && $group["name"] == "none")
     {
         IPS_LogMessage("Sonos Play/Pause", "Sonos no group active, Stop ".IPS_GetName($sonosname));
        SNS_Stop($sonosname);
     } 
     
     // Wenn Gruppe existent
     if((($statusBadezimmer == "pause" || $statusBadezimmer == "stop") 
     && ($statusWohnzimmer == "pause" || $statusWohnzimmer == "stop") && ($statusEsszimmer == "pause" || $statusEsszimmer == "stop")) && $group["name"] != "none")
     {
         IPS_LogMessage("Sonos Play/Pause", "Sonos group active ".$group["name"].", remove ".IPS_GetName($sonosname)." from group" ); // Gibt eine Meldung der Gruppe im Meldungsfenster aus
        SNS_SetGroup($sonosname, $group["id"]);
        SNS_Play($sonosname);
     }
     if(($statusBadezimmer == "play" || $statusWohnzimmer == "play" || $statusEsszimmer == "play") && $group["name"] != "none")
     {
         IPS_LogMessage("Sonos Play/Pause", "Sonos Group active ".$group["name"].", remove ".IPS_GetName($sonosname)." from group" ); // Gibt eine Meldung der Gruppe im Meldungsfenster aus
        SNS_SetGroup($sonosname, $group["id"]);
        SNS_Stop($sonosname);
     }
     
     
    
    $status = GetValueFormatted(IPS_GetObjectIDByIdent("Status", $sonosname));
    return $status;
}

function SearchActiveSonosDevice()
{
    $sonos_devices = [Sonos_Badezimmer, Sonos_Wohnzimmer, Sonos_Esszimmer];
    foreach ($sonos_devices as $device)
    {
        $state = GetSonosStatus($device);
        if($state == "play")
        {
            $sonosdevice = ["name" => IPS_GetName($device), "id" => $device];
            return $sonosdevice;
        }
    }
    $sonosdevice = ["name" => "none", "id" => 0];
    return $sonosdevice;
}


function SearchSonosGroup()
{
    $sonos_devices = [Sonos_Badezimmer, Sonos_Wohnzimmer, Sonos_Esszimmer];
    foreach ($sonos_devices as $device)
    {
        $groupname = GetSonosGroup($device);
        $groupmembers = GetSonosGroupMembers($device);
        if($groupname != "none")
        {
            $group = ["name" => $groupname, "id" => $device];
            return $group;
        }
        
    }
    
    $group = ["name" => "none", "id" => 0];
    return $group;
} 
 
/* Get Sonos Status
* @param int $sonosname ObjectID
* return string $status
*/
function GetSonosStatus($sonosname)
{
    $status = GetValueFormatted(IPS_GetObjectIDByIdent("Status", $sonosname));
    return $status;
}

/* Get Sonos Group Name
* @param int $sonosname ObjectID
* return string $groupname
*/
function GetSonosGroup($sonosname)
{
    $groupname = GetValueFormatted(IPS_GetObjectIDByIdent("MemberOfGroup", $sonosname));
    return $groupname; 
}

/* Get Sonos Group Name
* @param int $sonosname ObjectID
* return string $groupname
*/
function GetSonosGroupMembers($sonosname)
{
    $groupmembers = GetValueFormatted(IPS_GetObjectIDByIdent("GroupMembers", $sonosname));
    return $groupmembers; 
}

?>

Gruß, Adrian

Ich hab da noch ne Idee wie das gehen könnte dazu brauche ich aber den Coordinator einer Gruppe, ich habe mich etwas mehr in php eingelesen / geschaut und bin auf die Idee gekommen meine Lautsprecher im Array durchzugehen und nach dem ersten Lautsprecher bei dem die Variable Coordinator = True ist diese Objekt ID in die Variable $Coordinator zu übergeben.
Das sollte doch rein theoretisch möglich sein?

Das müsste doch mit der Funktion array_search gehen ? Jedoch komm ich grad nicht auf den Trichter wie ich den gefunden wert in die Variable $Coordinator packe bzw. wie ich von den 3 Speakern den Coordinator im array genau raussuche und dann die Objekt ID beidem die Variable True ist in die Variable $Coordinator übergebe.

Eventuell kann mir da jemand nen Denkanstoss geben :smiley:

Hallo zusammen,

So wie sich jetzt raus stellte ist das größte Problem den aktuellen Coordinator einer Gruppe zu entfernen, da ich leider nirgendswo in der Doku des Moduls einen Hinweis darauf finden kann wie man das „Coordinator Recht“ eines Players auf einen anderen überträgt.

Weis hier jemand wie das funktioniert ?

Gruß, Adrian

Ich würde das noch mal speziell im Thread des Sonos Moduls fragen, hier geht das sonst eventuell unter.