Hallo Thorsten,
vielen Dank für Deinen tollen Einsatz.
Leider bekomme ich bei der Ausführung von folgendem Skript immer noch einige Fehlermeldungen:
SonosBY_TTS_Alle("Das ist ein Test");
Notice: Undefined offset: 1 in /usr/share/symcon/scripts/SonosBY.ips.php on line 694
Notice: Undefined offset: 1 in /usr/share/symcon/scripts/SonosBY.ips.php on line 694
Notice: Undefined offset: 1 in /usr/share/symcon/scripts/SonosBY.ips.php on line 694
Notice: Undefined offset: 1 in /usr/share/symcon/scripts/SonosBY.ips.php on line 694
Warning: file_put_contents(//192.168.178.20/public/SonosBY_AmazonIvonaTTS.mp3): failed to open stream: Datei oder Verzeichnis nicht gefunden in /usr/share/symcon/scripts/IVONA_TTS.ips.php on line 19
Notice: Undefined offset: 1 in /usr/share/symcon/scripts/SonosBY.ips.php on line 694
Notice: Undefined offset: 1 in /usr/share/symcon/scripts/SonosBY.ips.php on line 694
Notice: Undefined offset: 1 in /usr/share/symcon/scripts/SonosBY.ips.php on line 365
Notice: Undefined offset: 2 in /usr/share/symcon/scripts/SonosBY.ips.php on line 366
Mein SonosBY.ips.php Skript lautet wie folgt:
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// SonosBY v1.6 ///////////////////////////////////////////////////////////////////////////////////////////////////////////
// by Bayaro ///////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// https://www.symcon.de/forum/threads/28615-SonosBY-%28Sonos-Gruppen-erstellen-Gruppen-aufl%C3%B6sen-Text-to-Speech-%29 //////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//
// Auflistungen aller aktuell verfügbaren Funktionen in diesem Skript:
//
// SonosBY_GruppeErstellen() << Erstellt aus allen eingetragenen Sonos Playern eine Gruppe
// SonosBY_GruppeErstellen_Auswahl($Raumliste) << Erstellt aus den aufgelisteten Räumen eine Gruppe (1. Raum = Master) ...("Wohnzimmer,Flur,Kueche")
// SonosBY_GruppeAufloesen() << Löst die (alle) Gruppe(n) auf und setzt alle Player einzeln (nur wenn nichts abgespielt wird)
// $result = SonosBY_AltenZustandLesen() << Gibt den Zustand aller Player zurück (Playing/Track/TrackPosition/Volume) - wird sich nur während der Skriptlaufzeit gemerkt
// SonosBY_AltenZustandSetzen($result) << Setzt den vorher gespeicherten Zustand der Player wieder (nur wenn der alte Zustand während gleicher Skriptlaufzeit gelesen wurde)
// SonosBY_SetAVTransportRincon($SonosGroupAR_NrDesPlayer, $MasterRincon, $URI) << Setzt bei einem Player die Rincon vom Gruppen-Master, damit werden beide zu einer Gruppe und weitere Player spielen das ab, was der Gruppen-Master abspielt
// SonosBY_SetAVTransportFile($SonosGroupAR_NrDesPlayer, $Sonos_SMBPfadUndDateiname) << Spielt beim angegebenen Player eine Datei vom freigegebenen SMB-Pfad ab (z.B. "//192.168.1.50/sonos-sounds/datei.wav")
// SonosBY_SetPlaylistTrack($SonosGroupAR_NrDesPlayer, $TrackNr) << Wählt bei einem Player eine TrackNr in der Playlist aus ...(1, 5); < wählt Player 1, Track 5
// SonosBY_SetTrackPosition($SonosGroupAR_NrDesPlayer, $TrackPosition) << Setzt bei einem Player die TrackPosition ...(2, "0:01:20"); < wählt bei bei Player 2, TrackPosition 1 Minute 20 Sekunden
// $result = SonosBY_GetTrackDurationSekunden($SonosGroupAR_NrDesPlayer) << Gibt die Dauer des aktuellen Tracks eines Players in Sekunden zurück
// $result = SonosBY_GetTransportStatus($SonosGroupAR_NrDesPlayer) << Gibt von einem Player den Status von Transport zurück (PLAYING/STOPPED/PAUSED_PLAYBACK)
// $result = SonosBY_GetTrackPositionInfo($SonosGroupAR_NrDesPlayer) << Gibt von einem Player ein Array mit Infos zurück (RelTime=TrackPosition, Track=TrackNr, TrackDuration=TrackLänge)
// $result = SonosBY_GetSonosInfos($SonosGroupAR_NrDesPlayer) << Gibt Infos zum Sonos Player zurück (SoftwareVersion Build (z.B. 29.6-99010), SoftwareVersion auf Player (z.B. 6.0), HardwareVersion)
// SonosBY_StartResume_Playing($SonosGroupAR_NrDesPlayer) << Setzt den Transport Status eines Players auf PLAY und spielt das was in seiner Queue ist ab
// SonosBY_Stop_Playing($SonosGroupAR_NrDesPlayer) << Setzt den Transport Status eines Players auf STOP
// SonosBY_Pause_Playing($SonosGroupAR_NrDesPlayer) << Setzt den Transport Status eines Players auf PAUSE
// $result = SonosBY_GetVolume($SonosGroupAR_NrDesPlayer) << Liest die aktuell eingestellte Lautstärke eines Player aus
// SonosBY_SetVolume($SonosGroupAR_NrDesPlayer, $Volume) << Setzt die Lautstärke eines Players auf einen bestimmten Wert (0-99)
// SonosBY_SetGroupVolume($Volume) << Ändert die Lautstärke der gruppierten Player (Relativ zur aktuellen Lautstärke der einzelnen Player)
// SonosBY_SetGroupMute(1) << Setzt MUTE für die Gruppe (1 = Mute an // 0 = Mute aus)
// SonosBY_TTS($SonosGroupAR_NrDesPlayer, $TTS_Text) << Spielt am gewählten Player einen Text als Ton ab (Instanz-ID eures "Text to Speech" angeben // oder FALSE für Google API)
// SonosBY_TTS_Alle($Text) << Merkt sich den Zustand aller Player, erstellt eine Gruppe, spielt den Text ab, löst die Gruppe auf, stellt alte Zustände wieder her
// SonosBY_TTS_Auswahl($RaumlisteDerPlayer, $Text) << Merkt sich den Zustand der gewählten Player, erstellt eine Gruppe, spielt den Text ab, löst die Gruppe auf, stellt alte Zustände wieder her
// SonosBY_DateiAbspielen_Alle($Dateiname) << Spielt in allen Räumen eine Datei ab (Datei muss im freigegebenen Ordner liegen)
// SonosBY_DateiAbspielen_Auswahl($Raumliste, $Dateiname) << Spielt in bestimmten Räumen eine Datei ab (Datei muss im freigegebenen Ordner liegen)
/* BEISPIELE /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
>> Beispiel1 (aus allen eingetragenen Playern eine Gruppe erstellen):
SonosBY_GruppeErstellen();
>> Beispiel2 (Gruppe(n) auflösen - alle Player einzeln):
SonosBY_GruppeAufloesen();
>> Beispiel3 (Alte Zustände (Playing/Track/TrackPosition/Volume) merken, Gruppe erstellen, Sprachausgabe abspielen, Gruppe auflösen, alte Zustände wiederherstellen):
$AlterZustandAR = SonosBY_AltenZustandLesen();
SonosBY_GruppeErstellen();
SonosBY_TTS(0, "Ich bin ein Test der Sprachausgabe");
SonosBY_GruppeAufloesen();
SonosBY_AltenZustandSetzen($AlterZustandAR);
>> Beispiel4 (kurze Version von Beispiel3, macht aber genau das Gleiche)
SonosBY_TTS_Alle("Ich bin ein Test");
>> Beispiel5 (Sprachausgabe auf einem Sonos Player abspielen - inkl. merken und setzen der alten Zustände):
SonosBY_TTS_Auswahl("Badezimmer","Das ist ein Test");
>> Beispiel6 (Sprachausgabe auf bestimmten Sonos Playern (in Gruppe) abspielen - inkl. merken und setzen der alten Zustände):
SonosBY_TTS_Auswahl("Badezimmer,Wohnzimmer", "Das ist ein Test); // Spielt nur auf den Playern "Badezimmer" und "Wohnzimmer" den Text ab, aber nicht im "Flur" (ID 0) // Master ist dann der 1. genannte Raum/Player
>> Beispiel7 (Eine Datei in bestimmten Räumen abspielen - inkl. merken und setzen der alten Zustände)
SonosBY_DateiAbspielen_Alle("Waschmaschine_ist_fertig.wav");
>> Beispiel8 (Bestimmte Räume zu einer Gruppe zusammenfügen):
SonosBY_GruppeErstellen_Auswahl("Wohnzimmer,Badezimmer"); // Erstellt eine Gruppe mit beiden Räumen, Master ist Wohnzimmer
SonosBY_GruppeErstellen_Auswahl("Flur,Badezimmer"); // Erstellt eine Gruppe mit beiden Räumen, Master ist Flur
// KONFIGURATION //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// */
//
// Gruppen-Master (für alle Player in einer Gruppe) als 1. bei $SonosGroupAR[0] eintragen, alle
// anderen Sonos Player danach.
//
// Wenn ihr jetzt in der Gruppe irgendwelche Musik/Radio/Sprachausgaben abspielen wollt, dann
// müsst ihr das immer nur auf dem Player machen, welchen ihr als Gruppen-Master verwendet!
// Ich habe als Master einen Player genommen, welchen ich so gut wie nie im Einsatz habe, weil
// sollte auf dem Master gerade etwas abgespielt werden, dann hört man das kurzzeitig auf der
// Lautstärke in der das TTS erfolgt und gegebenenfalls auf weiteren Playern! Klingt dann
// bei Sprachausgaben etwas "unschön". Deshalb wählt als Master am Besten einen Player, der
// so gut wie nie (oder nie) in Verwendung ist. Auch wird beim Gruppen-Master der alte Zustand
// nicht wiederhergestellt! Gilt auch für den Master, wenn ihr nur bestimmte Player zu
// einer Gruppe zusammenfasst!
//
// Das Skript prüft nicht, ob bereits Gruppen existieren und stellt diese auch nicht
// wieder her! Er nimmt sich einfach alle Player, steckt sie in eine Gruppe und beim
// Gruppe auflösen werden alle Player wieder einzeln gesetzt.
//
//
// Je nach Länge der Sprachausgaben/Musikdateien, kann es notwendig sein die max_execution_time zu erhöhen (Skript bricht dann wegen Timeout ab)
ini_set("max_execution_time", 90);
//
// Syntax: $SonosGroupAR[0] = array("Raumname","IP-Adresse","RINCON","Lautstärke des Players im Gruppenbetrieb");
// Beispiel für 3 Sonos Player // [0] = Gruppen-Master
$SonosGroupAR[0] = array("Sonos","192.168.178.40","RINCON_B8E937E427AE01400","30");
//$SonosGroupAR[1] = array("Badezimmer","192.168.1.12","RINCON_B1111111111111111","35");
//$SonosGroupAR[2] = array("Wohnzimmer","192.168.1.13","RINCON_B2222222222222222","30");
$Sonos_Dateiordner = "/sonos/"; // Das hier eingetragene Verzeichnis muss für Sonos freigegeben werden
$Sonos_SMBordner = "//192.168.178.20/public/"; // Hier den SMB-Pfad zur Netzwerkfreigabe eintragen ("//IPS-Server-IP/ORDNERNAME/")
$TTS_InstanzID = TRUE; // ID eurer "Text to Speech" Instanz (ID = IPS TTS, FALSE = Google TTS, TRUE = Amazon/Ivona TTS)
// Mit der Text to Speech API von Google sind max. 100 Zeichen möglich! Wer mehr Zeichen will > https://www.symcon.de/forum/threads/25562-IPSSonos?p=243647#post243647
// Mit der Amazon/Ivona API sind max. 200 Zeichen möglich und ihr müsst diese Class einbauen > https://www.symcon.de/forum/threads/29015-TTS-mit-Amazon-Ivona-statt-Google-Translate
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
include 'IVONA_TTS.ips.php';
/****** AB HIER NICHTS MEHR ÄNDERN ****************************************************************/
function SonosBY_GruppeErstellen() {
Global $SonosGroupAR;
$AnzahlPlayer = count($SonosGroupAR);
for ($i=0; $i < $AnzahlPlayer; $i++) {
SonosBY_SetVolume($i, (int)$SonosGroupAR[$i][3]);
if ($i == 0) {
$MasterRincon = $SonosGroupAR[0][2];
}
else {
SonosBY_SetAVTransportRincon($i, 0, "x-rincon:".$MasterRincon);
}
}
}
function SonosBY_GruppeErstellen_Auswahl($Raumliste) {
Global $SonosGroupAR;
if(strpos($Raumliste,",")!==false){
$RaumlisteAR = explode(",", $Raumliste);
}
else {
$RaumlisteAR[] = $Raumliste;
}
$i=0;
foreach ($RaumlisteAR as $Raumname) {
$ResultVal = SearchArray($Raumname, 0, $SonosGroupAR);
$SonosGroupARx[$i] = array($SonosGroupAR[$ResultVal][0],$SonosGroupAR[$ResultVal][1],$SonosGroupAR[$ResultVal][2],$SonosGroupAR[$ResultVal][3]);
$i++;
}
$SonosGroupAR = $SonosGroupARx;
$AnzahlPlayer = count($SonosGroupAR);
for ($i=0; $i < $AnzahlPlayer; $i++) {
SonosBY_SetVolume($i, (int)$SonosGroupAR[$i][3]);
if ($i == 0) {
$MasterRincon = $SonosGroupAR[0][2];
}
else {
SonosBY_SetAVTransportRincon($i, 0, "x-rincon:".$MasterRincon);
}
}
}
function SonosBY_GruppeAufloesen() {
Global $SonosGroupAR;
$AnzahlPlayer = count($SonosGroupAR);
IPS_Sleep(2000);
$SonosInfos = SonosBY_GetSonosInfos(0); // Bis Sonos einen Fix hat für >> Player in einer Gruppe haben IMMER den Status PLAYING
if ($SonosInfos["DisplaySoftwareVersion"] < 5.5) {
$TransportStatus = SonosBY_GetTransportStatus(0);
while ($TransportStatus == "PLAYING") {
$TransportStatus = SonosBY_GetTransportStatus(0);
IPS_Sleep(100);
}
}
else {
$AbspieldauerSekunden = SonosBY_GetTrackDurationSekunden(0);
$SleepWaitTime = ($AbspieldauerSekunden * 1000) + 3000;
IPS_Sleep($SleepWaitTime);
}
for ($i=1; $i < $AnzahlPlayer; $i++) {
SonosBY_SetAVTransportRincon($i, $i, "x-rincon:".$SonosGroupAR[$i][2]);
}
}
function SonosBY_AltenZustandLesen() {
Global $SonosGroupAR;
$AnzahlPlayer = count($SonosGroupAR);
for ($i=0; $i < $AnzahlPlayer; $i++) {
$StatuslisteAR[0][] = SonosBY_GetTransportStatus($i);
$StatuslisteAR[1][] = SonosBY_GetVolume($i);
$StatuslisteAR[2][] = SonosBY_GetTrackPositionInfo($i);
}
return $StatuslisteAR;
}
function SonosBY_AltenZustandSetzen($StatuslisteAR) {
Global $SonosGroupAR;
$AnzahlPlayer = count($SonosGroupAR);
for ($i=0; $i < $AnzahlPlayer; $i++) {
SonosBY_SetVolume($i, $StatuslisteAR[1][$i]);
if ($StatuslisteAR[2][$i]["TrackDuration"] != "0:00:00") {
if ($StatuslisteAR[2][$i]["TrackNr"] != "") {
SonosBY_SetPlaylistTrack($i, $StatuslisteAR[2][$i]["TrackNr"]);
}
if ($StatuslisteAR[2][$i]["RelTime"] != "") {
SonosBY_SetTrackPosition($i, $StatuslisteAR[2][$i]["RelTime"]);
}
}
if ($StatuslisteAR[0][$i] == "PLAYING") {
SonosBY_StartResume_Playing($i);
}
}
}
function SonosBY_SetAVTransportRincon($i, $MasterPlayerID, $AVURI) {
Global $SonosGroupAR;
$content='POST /MediaRenderer/AVTransport/Control HTTP/1.1
HOST: '.$SonosGroupAR[$i][1].':1400
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#SetAVTransportURI"
CONTENT-TYPE: text/xml; charset="utf-8"
Content-Length: 477
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<u:SetAVTransportURI xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
<InstanceID>0</InstanceID>
<CurrentURI>x-rincon:'.$SonosGroupAR[$MasterPlayerID][2].'</CurrentURI>
<CurrentURIMetaData>x</CurrentURIMetaData>
</u:SetAVTransportURI>
</s:Body>
</s:Envelope>';
$result = SonosBY_SendSOAP($SonosGroupAR[$i][1], $content);
return $result;
}
function SonosBY_SetAVTransportFile($i, $Sonos_SMBPfadUndDateiname) {
Global $SonosGroupAR;
$SonosInfos = SonosBY_GetSonosInfos(0);
if ($SonosInfos["DisplaySoftwareVersion"] < 5.5) {
$contentlength = 477;
}
else {
$contentlength = 456 + strlen($Sonos_SMBPfadUndDateiname);
}
$content='POST /MediaRenderer/AVTransport/Control HTTP/1.1
HOST: '.$SonosGroupAR[$i][1].':1400
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#SetAVTransportURI"
CONTENT-TYPE: text/xml; charset="utf-8"
Content-Length: '.$contentlength.'
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<u:SetAVTransportURI xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
<InstanceID>0</InstanceID>
<CurrentURI>x-file-cifs:'.$Sonos_SMBPfadUndDateiname.'</CurrentURI>
<CurrentURIMetaData>x</CurrentURIMetaData>
</u:SetAVTransportURI>
</s:Body>
</s:Envelope>';
$result = SonosBY_SendSOAP($SonosGroupAR[$i][1], $content);
return $result;
}
function SonosBY_SetPlaylistTrack($i, $TrackNr) {
Global $SonosGroupAR;
$content='POST /MediaRenderer/AVTransport/Control HTTP/1.1
HOST: '.$SonosGroupAR[$i][1].':1400
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#Seek"
CONTENT-TYPE: text/xml; charset="utf-8"
Content-Length: 390
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<u:Seek xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
<InstanceID>0</InstanceID>
<Unit>TRACK_NR</Unit>
<Target>'.$TrackNr.'</Target>
</u:Seek>
</s:Body>
</s:Envelope>';
$result = SonosBY_SendSOAP($SonosGroupAR[$i][1], $content);
return $result;
}
function SonosBY_SetTrackPosition($i, $TrackPosition) {
Global $SonosGroupAR;
$content='POST /MediaRenderer/AVTransport/Control HTTP/1.1
HOST: '.$SonosGroupAR[$i][1].':1400
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#Seek"
CONTENT-TYPE: text/xml; charset="utf-8"
Content-Length: 396
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<u:Seek xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
<InstanceID>0</InstanceID>
<Unit>REL_TIME</Unit>
<Target>'.$TrackPosition.'</Target>
</u:Seek>
</s:Body>
</s:Envelope>';
$result = SonosBY_SendSOAP($SonosGroupAR[$i][1], $content);
return $result;
}
function SonosBY_GetTransportStatus($i) {
Global $SonosGroupAR;
$content='POST /MediaRenderer/AVTransport/Control HTTP/1.1
HOST: '.$SonosGroupAR[$i][1].':1400
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#GetTransportInfo"
CONTENT-TYPE: text/xml; charset="utf-8"
Content-Length: 353
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<u:GetTransportInfo xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
<InstanceID>0</InstanceID>
</u:GetTransportInfo>
</s:Body>
</s:Envelope>';
$resultx = SonosBY_SendSOAP($SonosGroupAR[$i][1], $content);
$result = XMLFilter($resultx, "CurrentTransportState");
return $result;
}
function SonosBY_GetTrackPositionInfo($i) {
Global $SonosGroupAR;
$content='POST /MediaRenderer/AVTransport/Control HTTP/1.1
HOST: '.$SonosGroupAR[$i][1].':1400
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#GetPositionInfo"
CONTENT-TYPE: text/xml; charset="utf-8"
Content-Length: 351
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<u:GetPositionInfo xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
<InstanceID>0</InstanceID>
</u:GetPositionInfo>
</s:Body>
</s:Envelope>';
$resultTrackInfo = SonosBY_SendSOAP($SonosGroupAR[$i][1], $content);
$result["RelTime"] = XMLFilter($resultTrackInfo, "RelTime");
$result["TrackNr"] = @XMLFilter($resultTrackInfo, "Track");
$result["TrackDuration"] = XMLFilter($resultTrackInfo, "TrackDuration");
return $result;
}
function SonosBY_GetTrackDurationSekunden($i) {
$TrackPositionInfoX = SonosBY_GetTrackPositionInfo($i);
$DurationAR = explode(":", $TrackPositionInfoX['TrackDuration']);
$DurationSTD = (int)$DurationAR[0];
$DurationMIN = (int)$DurationAR[1];
$DurationSEK = (int)$DurationAR[2];
$DurationSekGesamt = $DurationSEK + ($DurationMIN * 60) + ($DurationSTD * 3600);
return $DurationSekGesamt;
}
function SonosBY_GetSonosInfos($i) {
Global $SonosGroupAR;
$content='POST /DeviceProperties/Control HTTP/1.1
HOST: '.$SonosGroupAR[$i][1].':1400
SOAPACTION: "urn:schemas-upnp-org:service:DeviceProperties:1#GetZoneInfo"
CONTENT-TYPE: text/xml; charset="utf-8"
Content-Length: 289
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<u:GetZoneInfo xmlns:u="urn:schemas-upnp-org:service:DeviceProperties:1" />
</s:Body>
</s:Envelope>';
$resultSonosInfos = SonosBY_SendSOAP($SonosGroupAR[$i][1], $content);
$result["SoftwareVersion"] = XMLFilter($resultSonosInfos, "SoftwareVersion");
$result["DisplaySoftwareVersion"] = @XMLFilter($resultSonosInfos, "DisplaySoftwareVersion");
$result["HardwareVersion"] = XMLFilter($resultSonosInfos, "HardwareVersion");
return $result;
}
function SonosBY_StartResume_Playing($i) {
Global $SonosGroupAR;
$content='POST /MediaRenderer/AVTransport/Control HTTP/1.1
HOST: '.$SonosGroupAR[$i][1].':1400
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#Play"
CONTENT-TYPE: text/xml; charset="utf-8"
Content-Length: 356
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<u:Play xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
<InstanceID>0</InstanceID>
<Speed>1</Speed>
</u:Play>
</s:Body>
</s:Envelope>';
$result = SonosBY_SendSOAP($SonosGroupAR[$i][1], $content);
return $result;
}
function SonosBY_Stop_Playing($i) {
Global $SonosGroupAR;
$content='POST /MediaRenderer/AVTransport/Control HTTP/1.1
HOST: '.$SonosGroupAR[$i][1].':1400
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#Stop"
CONTENT-TYPE: text/xml; charset="utf-8"
Content-Length: 329
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<u:Stop xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
<InstanceID>0</InstanceID>
</u:Stop>
</s:Body>
</s:Envelope>';
$result = SonosBY_SendSOAP($SonosGroupAR[$i][1], $content);
return $result;
}
function SonosBY_Pause_Playing($i) {
Global $SonosGroupAR;
$content='POST /MediaRenderer/AVTransport/Control HTTP/1.1
HOST: '.$SonosGroupAR[$i][1].':1400
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#Pause"
CONTENT-TYPE: text/xml; charset="utf-8"
Content-Length: 331
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<u:Pause xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
<InstanceID>0</InstanceID>
</u:Pause>
</s:Body>
</s:Envelope>';
$result = SonosBY_SendSOAP($SonosGroupAR[$i][1], $content);
return $result;
}
function SonosBY_GetVolume($i) {
Global $SonosGroupAR;
$content='POST /MediaRenderer/RenderingControl/Control HTTP/1.1
HOST: '.$SonosGroupAR[$i][1].':1400
SOAPACTION: "urn:schemas-upnp-org:service:RenderingControl:1#GetVolume"
CONTENT-TYPE: text/xml; charset="utf-8"
Content-Length: 380
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<u:GetVolume xmlns:u="urn:schemas-upnp-org:service:RenderingControl:1">
<InstanceID>0</InstanceID>
<Channel>Master</Channel>
</u:GetVolume>
</s:Body>
</s:Envelope>';
$resultx = SonosBY_SendSOAP($SonosGroupAR[$i][1], $content);
$result = XMLFilter($resultx, "CurrentVolume");
return $result;
}
function SonosBY_SetVolume($i, $Volume) {
Global $SonosGroupAR;
if (strlen($Volume) > 1) {
$contentlength = 424;
}
else {
$contentlength = 423;
}
$content='POST /MediaRenderer/RenderingControl/Control HTTP/1.1
HOST: '.$SonosGroupAR[$i][1].':1400
SOAPACTION: "urn:schemas-upnp-org:service:RenderingControl:1#SetVolume"
CONTENT-TYPE: text/xml; charset="utf-8"
Content-Length: '.$contentlength.'
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<u:SetVolume xmlns:u="urn:schemas-upnp-org:service:RenderingControl:1">
<InstanceID>0</InstanceID>
<Channel>Master</Channel>
<DesiredVolume>'.$Volume.'</DesiredVolume>
</u:SetVolume>
</s:Body>
</s:Envelope>';
$result = SonosBY_SendSOAP($SonosGroupAR[$i][1], $content);
return $result;
}
function SonosBY_SetGroupVolume($GroupVolume) {
Global $SonosGroupAR;
if (strlen($GroupVolume) > 1) {
$contentlength = 403;
}
else {
$contentlength = 402;
}
$content='POST /MediaRenderer/GroupRenderingControl/Control HTTP/1.1
HOST: '.$SonosGroupAR[0][1].':1400
SOAPACTION: "urn:schemas-upnp-org:service:GroupRenderingControl:1#SetGroupVolume"
CONTENT-TYPE: text/xml; charset="utf-8"
Content-Length: '.$contentlength.'
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<u:SetGroupVolume xmlns:u="urn:schemas-upnp-org:service:GroupRenderingControl:1">
<InstanceID>0</InstanceID>
<DesiredVolume>'.$GroupVolume.'</DesiredVolume>
</u:SetGroupVolume>
</s:Body>
</s:Envelope>';
$result = SonosBY_SendSOAP($SonosGroupAR[0][1], $content);
return $result;
}
function SonosBY_SetGroupMute($MuteEinsNull) {
Global $SonosGroupAR;
$content='POST /MediaRenderer/GroupRenderingControl/Control HTTP/1.1
HOST: '.$SonosGroupAR[0][1].':1400
SOAPACTION: "urn:schemas-upnp-org:service:GroupRenderingControl:1#SetGroupMute"
CONTENT-TYPE: text/xml; charset="utf-8"
Content-Length: 394
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<u:SetGroupMute xmlns:u="urn:schemas-upnp-org:service:GroupRenderingControl:1">
<InstanceID>0</InstanceID>
<DesiredMute>'.$MuteEinsNull.'</DesiredMute>
</u:SetGroupMute>
</s:Body>
</s:Envelope>';
$result = SonosBY_SendSOAP($SonosGroupAR[0][1], $content);
return $result;
}
function SonosBY_TTS($i, $TTS_Text) {
Global $Sonos_Dateiordner;
Global $Sonos_SMBordner;
Global $TTS_InstanzID;
if ($TTS_InstanzID === FALSE) {
$SonosTTS_Dateiname = "SonosBY_GoogleTTS.mp3";
$SonosTTS_DateiPfad = $Sonos_Dateiordner.$SonosTTS_Dateiname;
$Sonos_SMBPfadUndDateiname = $Sonos_SMBordner.$SonosTTS_Dateiname;
$TTS_Text_UTF8 = urlencode(utf8_encode($TTS_Text));
if (strlen($TTS_Text_UTF8) > 100) {
IPS_LogMessage("SonosBY-TTS", "Google TTS Text darf maximal 100 Zeichen lang sein!");
return;
}
$GoogleTTSmp3 = @file_get_contents('http://translate.google.de/translate_tts?tl=de&ie=UTF-8&q='.$TTS_Text_UTF8."&client=t");
if ((strpos($http_response_header[0], "200") != false)) {
file_put_contents($SonosTTS_DateiPfad, $GoogleTTSmp3);
}
IPS_Sleep(500);
SonosBY_SetAVTransportFile($i, $Sonos_SMBPfadUndDateiname);
SonosBY_StartResume_Playing($i);
}
elseif ($TTS_InstanzID === TRUE) {
$SonosTTS_Dateiname = "SonosBY_AmazonIvonaTTS.mp3";
$SonosTTS_DateiPfad = $Sonos_Dateiordner.$SonosTTS_Dateiname;
$Sonos_SMBPfadUndDateiname = $Sonos_SMBordner.$SonosTTS_Dateiname;
$TTS_Text_UTF8 = urlencode(utf8_encode($TTS_Text));
if (strlen($TTS_Text_UTF8) > 200) {
IPS_LogMessage("SonosBY-TTS", "Amazon/Ivona TTS Text darf maximal 200 Zeichen lang sein!");
return;
}
if (class_exists("IVONA_TTS")) {
$Ivona = new IVONA_TTS();
$Ivona->save_mp3($TTS_Text_UTF8, $Sonos_SMBPfadUndDateiname);
}
IPS_Sleep(500);
SonosBY_SetAVTransportFile($i, $Sonos_SMBPfadUndDateiname);
SonosBY_StartResume_Playing($i);
}
else {
$SonosTTS_Dateiname = "SonosBY_TTS.wav";
$SonosTTS_DateiPfad = $Sonos_Dateiordner.$SonosTTS_Dateiname;
$Sonos_SMBPfadUndDateiname = $Sonos_SMBordner.$SonosTTS_Dateiname;
TTS_GenerateFile((int)$TTS_InstanzID, $TTS_Text, $SonosTTS_DateiPfad, 39);
IPS_Sleep(500);
SonosBY_SetAVTransportFile($i, $Sonos_SMBPfadUndDateiname);
SonosBY_StartResume_Playing($i);
}
}
function SonosBY_TTS_Alle($Text) {
$AlterZustandAR = SonosBY_AltenZustandLesen();
SonosBY_GruppeErstellen();
SonosBY_TTS(0, $Text);
SonosBY_GruppeAufloesen();
SonosBY_AltenZustandSetzen($AlterZustandAR);
}
function SonosBY_TTS_Auswahl($Raumliste, $Text) {
Global $SonosGroupAR;
if(strpos($Raumliste,",")!==false){
$RaumlisteAR = explode(",", $Raumliste);
}
else {
$RaumlisteAR[] = $Raumliste;
}
$i=0;
foreach ($RaumlisteAR as $Raumname) {
$ResultVal = SearchArray($Raumname, 0, $SonosGroupAR);
$SonosGroupARx[$i] = array($SonosGroupAR[$ResultVal][0],$SonosGroupAR[$ResultVal][1],$SonosGroupAR[$ResultVal][2],$SonosGroupAR[$ResultVal][3]);
$i++;
}
$SonosGroupAR = $SonosGroupARx;
$AlterZustandAR = SonosBY_AltenZustandLesen();
SonosBY_GruppeErstellen();
SonosBY_TTS(0, $Text);
SonosBY_GruppeAufloesen();
SonosBY_AltenZustandSetzen($AlterZustandAR);
}
function SonosBY_DateiAbspielen_Alle($Dateiname) {
Global $SonosGroupAR;
Global $Sonos_SMBordner;
$Sonos_SMBPfadUndDateiname = $Sonos_SMBordner.$Dateiname;
$AlterZustandAR = SonosBY_AltenZustandLesen();
SonosBY_GruppeErstellen();
SonosBY_SetAVTransportFile(0, $Sonos_SMBPfadUndDateiname);
SonosBY_StartResume_Playing(0);
SonosBY_GruppeAufloesen();
SonosBY_AltenZustandSetzen($AlterZustandAR);
}
function SonosBY_DateiAbspielen_Auswahl($Raumliste, $Dateiname) {
Global $SonosGroupAR;
Global $Sonos_SMBordner;
if(strpos($Raumliste,",")!==false){
$RaumlisteAR = explode(",", $Raumliste);
}
else {
$RaumlisteAR[] = $Raumliste;
}
$i=0;
foreach ($RaumlisteAR as $Raumname) {
$ResultVal = SearchArray($Raumname, 0, $SonosGroupAR);
$SonosGroupARx[$i] = array($SonosGroupAR[$ResultVal][0],$SonosGroupAR[$ResultVal][1],$SonosGroupAR[$ResultVal][2],$SonosGroupAR[$ResultVal][3]);
$i++;
}
$SonosGroupAR = $SonosGroupARx;
$Sonos_SMBPfadUndDateiname = $Sonos_SMBordner.$Dateiname;
$AlterZustandAR = SonosBY_AltenZustandLesen();
SonosBY_GruppeErstellen();
SonosBY_SetAVTransportFile(0, $Sonos_SMBPfadUndDateiname);
SonosBY_StartResume_Playing(0);
SonosBY_GruppeAufloesen();
SonosBY_AltenZustandSetzen($AlterZustandAR);
}
function SonosBY_SendSOAP($IPaddress, $content) {
$fp = fsockopen($IPaddress, 1400);
fputs ($fp, $content);
$result = stream_get_contents($fp, -1);
fclose($fp);
return $result;
}
function XMLFilter($Var,$SuchString) {
preg_match('/\<'.$SuchString.'\>(.+)\<\/'.$SuchString.'\>/',$Var,$result);
return $result[1];
}
function SearchArray($value, $key, $array) {
foreach ($array as $k => $val) {
if ($val[$key] == $value) {
return $k;
}
}
return NULL;
}
Hast Du eine Idee was ich noch ändern muß?
Gruß
Axel