Hallo,
ich möchte hier mein kleines Sonosscript vorstellen.
Ist noch nicht ganz fertig und nur wenig getestet. Aber ich poste es schonmal. So kann der eine oder andere die Sache schonmal antesten.
Voraussetzung für das Script ist die von mir angepasste Sonos-Klasse aus diesem Thread.
Kopiert den Code in irgendein Script. Editiert am Anfang die richtige IP und MAC Adresse eures Sonos-ZP. Dann das Script einmal ausführen.
Es wird dann ein Dummy „Sonos“ und alle Hilfsvariablen erstellt.
Anschließend könnt ihr in die Variable „Message“ einen über das Netzwerk erreichbaren link zu der IPS-Nachricht eintragen.
Z.B.: „//server/Nachrichten/Achtung.mp3“ (Man beachte „/“ nicht „“)
Das laufende Programm am Sonos wird unterbrochen und die Nachricht abgespielt. Danach sollte das alte „Programm“ wieder anlaufen.
Im Moment kann nur eine Nachricht abgespielt werden. D.h. solange „playing“ „true“ ist, darf keine weitere Nachricht in „Message“ geschrieben werden.
Vielleicht mach ich auch mal ne Warteschlange.
Bekannte Probleme:
- braucht etwas viele Variablen
Hier nun das Script:
<?
include ("PHPSonos.inc.php");
$sonos_ip = "192.168.1.1"; // IP Adresse des Sonosspielers
$sonos_mac = "000XXXXXXXXX"; // MAC Adresse des Sonospielers
$sonos_vol = 25; // Lautstärke in der die Nachricht wiedergegeben werden soll
//Ab hier nichts mehr ändern
$object = IPS_GetObject($IPS_SELF);
$parentID = $object['ParentID'];
//Installer
if ($IPS_SENDER == "Execute")
{
IPS_SetHidden($IPS_SELF, true);
IPS_SetName($IPS_SELF, "Play-Message");
$parentObject = IPS_GetObject($parentID);
if ($parentObject['ObjectType'] !== 1)
{
$instanceID = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");
IPS_SetParent($instanceID, $parentID);
$parentID = $instanceID;
IPS_SetParent($IPS_SELF, $parentID);
IPS_SetName($instanceID, "Sonos");
}
}
// Benötigte Variablen anlegen, bzw id besorgen.
$PositionInfo_Var = CreateVariableByName($parentID, "PositionInfo", 3);
$MediaInfo_Var = CreateVariableByName($parentID, "MediaInfo", 3);
$OldStatus_Var = CreateVariableByName($parentID, "OldStatus", 1);
$Messages_Var = CreateVariableByName($parentID, "Message", 3);
$Playing_Var = CreateVariableByName($parentID, "playing", 0);
$OldVol_Var = CreateVariableByName($parentID, "OldVol", 1);
$Mute_Var = CreateVariableByName($parentID, "Mute", 0);
// Setzen einer Events von Message auf dieses Script
$eventlist = IPS_GetEventList();
$isset = false;
foreach($eventlist as $event_id)
{
$event = IPS_GetEvent($event_id);
// Merken, wenn unsere Message Variable bereist für ein Ereignis benutzt wurde
if ($event["TriggerVariableID"] === $Messages_Var)
{
$isset = true;
}
}
if ($isset == false)
{ // Es wurde noch kein Ereigniss gefunden. Also eins neu anlegen
$event = IPS_CreateEvent(0);
IPS_SetEventTrigger($event, 0, $Messages_Var);
IPS_SetParent($event, $IPS_SELF);
IPS_SetEventActive($event, true);
}
// Setzen des Events ENDE
$Message = GetValueString($Messages_Var); // Datei muss das Format "//server/Dir/Name.mp3" haben.
if ($Message !== "")
{
$sonos = new PHPSonos($sonos_ip); // ZP in Küche
$PositionInfo = $sonos->GetPositionInfo();
$MediaInfo = $sonos->GetMediaInfo();
//print_r ($PositionInfo);
//print_r ($MediaInfo);
if($IPS_SENDER == "TimerEvent")
{ //Script hat sich selber aufgerufen. Warten auf das Ende der Nachricht
//print "Transport: ".$sonos->GetTransportInfo()."
";
if((intval($sonos->GetTransportinfo()) !== 1) || intval($PositionInfo["track"]) !== intval($MediaInfo["tracks"]))
{ // Wiedergabe ist gestoppt, Oder es wird nicht mehr der letzte Titel gespielt
// Letzen Titel löschen
$sonos->RemoveFromQueue(intval($MediaInfo["tracks"]));
// Event löschen
IPS_DeleteEvent($IPS_EVENT);
// Die alten Einstellungen wiederherstellen
// Zurücklesen des gespeicherten Arrays
$string = GetValueString($PositionInfo_Var);
$lines = explode("
", $string);
foreach($lines as $line)
{
list($key, $val) = explode('=', $line);
$PositionInfo[trim($key)] = trim($val);
}
$string = GetValueString($MediaInfo_Var);
$lines = explode("
", $string);
foreach($lines as $line)
{
list($key, $val) = explode('=', $line);
$MediaInfo[trim($key)] = trim($val);
}
// wurde zuletzt Radio gespielt?
if (stripos($PositionInfo["URI"], "mp3radio") > 0)
{ // Es wurde eine Radiostation gehört
$sonos->SetRadio($PositionInfo["URI"], $MediaInfo["title"]);
$sonos->SetVolume(GetValueInteger($OldVol_Var));
$sonos->SetMute(GetValueBoolean($Mute_Var));
if (GetValueInteger($OldStatus_Var) === 1)
$sonos->Play();
}
else
{ // Vorher lief eine Musikliste
$sonos->SetTrack(intval($PositionInfo["track"]));
$sonos->SetVolume(GetValueInteger($OldVol_Var));
$sonos->SetMute(GetValueBoolean($Mute_Var));
// An die alte Stelle springen
$sonos->Seek(trim($PositionInfo["position"]));
if (GetValueInteger($OldStatus_Var) === 1)
$sonos->Play();
}
// Merken, dass eine nachricht abgespielt wurde
SetValueBoolean($Playing_Var, false);
// löschen der Verknüpfuing zur Nachrichtendatei
SetValueString($Messages_Var, "");
}
}
else
{
//Sichern der alten Einstellungen
$string = "";
foreach($PositionInfo as $key => $val)
{
$string .= "$key = $val
";
}
SetValueString($PositionInfo_Var, $string);
$string = "";
foreach($MediaInfo as $key => $val)
{
$string .= "$key = $val
";
}
SetValueString($MediaInfo_Var, $string);
SetValueBoolean($Mute_Var, $sonos->GetMute());
SetValueInteger($OldVol_Var, $sonos->GetVolume());
SetValueInteger($OldStatus_Var, $sonos->GetTransportInfo());
if ($MediaInfo["title"] !== "")
{ // Es läuft eine Radiostation
//Wenn Radio läuft, muss zuerst die Liste wieder aktiviert werden
$sonos->SetQueue("x-rincon-queue:RINCON_".$sonos_mac."01400#0"); //Playliste aktivieren
}
else // Es läuft eine Musikliste
{
// Nichts besonderes zu tun
}
// Merken, dass eine nachricht abgespielt wird
SetValueBoolean($Playing_Var, true);
$sonos->AddToQueue("x-file-cifs:".$Message);
//Nochmal Infos einholen
$PositionInfo = $sonos->GetPositionInfo();
$MediaInfo = $sonos->GetMediaInfo();
//Auf den neuen Track zeigen
$sonos->SetTrack($MediaInfo["tracks"]);
$sonos->SetMute(false);
$sonos->SetVolume($sonos_vol);
$sonos->Play(); // Abspielen
// Selber aufrufen, um das Ende der Nachricht abzuwarten
IPS_SetScriptTimer($IPS_SELF, 1);
}
}
function CreateVariableByName($id, $name, $type)
{
global $IPS_SELF;
$vid = @IPS_GetVariableIDByName($name, $id);
if($vid === false)
{
$vid = IPS_CreateVariable($type);
IPS_SetParent($vid, $id);
IPS_SetName($vid, $name);
IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
}
return $vid;
}
?>
Edit: V2 Die alte TransportInfo wird nun auch gespeichert.
Viel Spass beim Testen.
Ich geh erstmal schlafen.
cu…