Hallo zusammen!
Aus irgendwelchen Gründen wird die TransportInfo auf den Membern einer Gruppe beim Pausieren eines Streams nicht aktualisiert. TransportInfo liefert immer eine 1 zurück. Somit denkt das Skript, auf dem Member spielt noch was, obwohl der Coordinator die Wiedergabe längst gestoppt hat. Das ist ziemlich nervig. Passiert auch, wenn ich die Wiedergabe über die IPhone App pausiere. Hat jemand ne Idee, was man da machen kann.
Außerdem habe ich ein kleines Skript für meine Anbindung an einen Gira Homeserver geschrieben. Das Skript erlaubt es mit nur einer Taste auf den Bus-Schaltern entweder das Radio anzuschalten oder sich an einen bestehenden Stream im Haus anzuhängen. Bei erneutem Druck entfernt er den Client aus dem Stream oder stoppt die Wiedergabe des Radios.
Das ist ziemlich angenehm im Alltag, weil ich eh meistens einfach WDR2 einschalte. So muss ich das Handy nur noch zur Hand nehmen, wenn ich mal was anderes hören will. Und dann auch nur einmal am Anfang. In weiteren Räumen drücke ich dann wieder nur die Taste.
Zusätzlich habe ich eine Rückgabe an die LEDs der Schalter integriert. Wen die Integration im HomeServer interessiert, kann mich gerne kontaktieren.
Ich habe die Funktion „IntelliPlay“ genannt. Es gibt halt derzeit nur noch ein Problem mit diesem nicht mitbekommen, dass die Weidergabe eigentlich angehalten ist.
Ganz sauber ist das nicht programmiert. Aber ich hatte keine Lust mehr das aufzuräumen. Sorry dafür.
function IntelliPlay()
{
global $sonos, $zones, $zone, $rincons, $sonosClients, $thisZone, $thisZoneName;
//if something is running local, stop local playback (keep playing in the rest of the house)
if (intval($sonos->GetTransportInfo()) == 1)
{
$PositionInfo = $sonos->GetPositionInfo();
//echo "URI" . $PositionInfo['URI'] . "<BR>";
//Am I part of a Group? If yes, remove me
//echo "PositionInfo: " . $PositionInfo['TrackURI'];
//echo "STRSTR: " . substr(strstr($PositionInfo['TrackURI'],"x-rincon:"), 9);
if (strstr($PositionInfo['TrackURI'],"x-rincon:")) {
//echo "Remove me";
$coordinatorRincon = substr(strstr($PositionInfo['TrackURI'],"x-rincon:"),9);
$coordinatorName = array_search($coordinatorRincon, $rincons);
//echo "CoordinatorName" . $coordinatorName;
$coordinator = new PHPSonos($zones[$coordinatorName]);
$coordinator->RemoveMember($rincons[$zone]);
$sonos->Stop();
$sonos->SetAVTransportURI("");
$wasMember = 1;
} else {
//if not, simple stop
$stopIt = 1;
}
//or am I a coordinator? Then
if ($wasMember !== 1) {
//echo "Check if I am coordinator";
foreach($zones as $thisZoneName => $thisZone) {
$thisZone = new PHPSonos($thisZone);
//eigenen Player beim Check ausschließen
if($thisZoneName !== $zone) {
$myPositionInfo = $thisZone->GetPositionInfo();
//echo "MyPositionInfo: " . $myPositionInfo['TrackURI'];
$checkRincon = "x-rincon:" . $rincons[$zone];
//echo "Rincon: " . $checkRincon;
if ($myPositionInfo['TrackURI'] == $checkRincon) {
//echo "Tatsächlich! Ich bin ein Coordinator!!!";
//echo "Remove: " . $rincons[$thisZoneName];
//echo "Ich remove nun " . $thisZoneName . " vom Coordinator " . $zone;
$thisZone->Stop();
$mainPositionInfo = $sonos->GetPositionInfo();
$thisZone->SetAVTransportURI($mainPositionInfo["TrackURI"]);
$sonos->RemoveMember($rincons[$thisZoneName]);
$thisZone->Play();
$reportAOne = 1;
$memberZone = $thisZoneName;
}
}
}
}
$sonos->Stop();
$sonos->SetAVTransportURI("");
//report PlayStatus to LEDs
$stopIt = 1;
if ($reportAOne) {
ReportPlayStatus(1, $memberZone);
} else {
ReportPlayStatus(0, $zone);
}
//if nothing is running local, check the whole house
} else {
foreach($zones as $thisZoneName => $thisZone) {
$thisZone = new PHPSonos($thisZone);
//eigenen Client ausschließen
if($thisZoneName !== $zone) {
//Wenn hier was läuft, häng mich dran und gut
if (intval($thisZone->GetTransportInfo()) == 1 && $somethingsPlaying !== 1) {
//Vermutlich noch eine Unterscheidung nach Radio oder nicht Radio nötig?
echo "Es läuft was in: " . $thisZoneName;
echo "Angehangen an: " . $thisZoneName . "und zwar:" . $rincons[$zone];
$thisZone->AddMember($rincons[$zone]);
$sonos->SetAVTransportURI("x-rincon:" . $rincons[$thisZoneName]);
//report PlayStatus to local LED
$somethingsPlaying = 1;
ReportPlayStatus(1,$zone);
}
}
}
}
//echo "Spielt was: (" . $somethingsPlaying . ")";
//Wenn nirgendwo was lief, dann spiel einfach WDR2
if ($somethingsPlaying !== 1 and $stopIt !== 1) {
$sonos->SetRadio("x-rincon-mp3radio://www.wdr.de/wdrlive/media/wdr2.m3u","WDR2");
$sonos->Play();
//Wenn es sich um das Schlafzimmer oder das Elternbad handelt, dann spiel den jeweils anderen mit!
//if ($zone == "Schlafzimmer) {
//}
//if ($zone == "Bad") {
//}
ReportPlayStatus(1,$zone);
}
}