Bose Soundtouch in IPS einbinden

Hallo,

für das neue Jahr gibt es ja immer neue Vorsätze, bzw. Projekte. :smiley:

Ich will gerne mein Bose Soundtouch (ST) in IPS einbinden.

Warum, wenn es doch die Bose app gibt, weil ich das gerne mit Geofency, Timern erweitern möchte.

Primäres Ziel soll sein:

  • Bose Soundtouch ein- und ausschalten
  • Preset 1 - 6 auswählen

Sekundäres Ziel:

  • Timer, nach x Minuten ausschalten
  • Wecker, zur Bestimmten Uhrzeit einschalten

Ich mache mal den Anfang, was ich bislang herausgefunden habe:

Idee ist eine URL zu übergeben, welche dann den ST steuert.
Auf dem ST ist ein Linuxsystem, auf dem auch ein Webserver läuft.

Gibt man unter (IP-Adresse) 192.168.1.100:8090/now_playing ein, so wird ausgegeben was gerade läuft.
mit /select kann man wohl etwas auswählen

Ich habe mir mal auf dem ST die Request und Response Logs angeschaut:

Request:


ReqNumb=288  Request=>><msg><header deviceID="123456789012" url="select" method="POST"><request requestID="113"><info type="new"/></request></header><body><ContentItem source="INTERNET_RADIO" location="15275" sourceAccount="" isPresetable="true"><itemName>ETN.FM 1 - Trance Channel</itemName></ContentItem></body></msg><<
 ReqTime=Tue Dec 30 07:56:13 2014
  ReqNumb=289  Request=>><msg><header deviceID="123456789012" url="now_playing" method="GET"><request requestID="114"><info type="update"/></request></header></msg><<
 ReqTime=Tue Dec 30 07:56:13 2014
  ReqNumb=290  Request=>><msg><header deviceID="123456789012" url="now_playing" method="GET"><request requestID="115"><info type="update"/></request></header></msg><<
 ReqTime=Tue Dec 30 07:56:14 2014
  ReqNumb=291  Request=>><msg><header deviceID="123456789012" url="now_playing" method="GET"><request requestID="116"><info type="update"/></request></header></msg><<
 ReqTime=Tue Dec 30 07:56:17 2014
  ReqNumb=292  Request=>><msg><header deviceID="123456789012" url="now_playing" method="GET"><request requestID="120"><info type="update"/></request></header></msg><<
 ReqTime=Tue Dec 30 07:56:18 2014

ReqNumb=288:
<msg>
<header deviceID="123456789012" url="select" method="POST">
<request requestID="113"><info type="new"/>
</request>
</header>
<body>
<ContentItem source="INTERNET_RADIO" location="15275" sourceAccount="" isPresetable="true">
<itemName>ETN.FM 1 - Trance Channel</itemName>
</ContentItem>
</body>
</msg>

Response:


Response:
 ReqNumb=288  Request=>><?xml version="1.0" encoding="UTF-8" ?><status>/select</status><<
 ReqTime=Tue Dec 30 07:56:13 2014
  ReqNumb=289  Request=>><?xml version="1.0" encoding="UTF-8" ?><nowPlaying deviceID="123456789012" source="INTERNET_RADIO"><ContentItem source="INTERNET_RADIO" location="" sourceAccount="" isPresetable="true"><itemName></itemName></ContentItem><track></track><artist></artist><album></album><stationName></stationName><art artImageStatus="INVALID" /><playStatus>BUFFERING_STATE</playStatus><description>   kbps  ,  </description><stationLocation></stationLocation></nowPlaying><<
 ReqTime=Tue Dec 30 07:56:14 2014
  ReqNumb=290  Request=>><?xml version="1.0" encoding="UTF-8" ?><nowPlaying deviceID="123456789012" source="INTERNET_RADIO"><ContentItem source="INTERNET_RADIO" location="" sourceAccount="" isPresetable="true"><itemName></itemName></ContentItem><track></track><artist></artist><album></album><stationName></stationName><art artImageStatus="INVALID" /><playStatus>BUFFERING_STATE</playStatus><description>   kbps  ,  </description><stationLocation></stationLocation></nowPlaying><<
 ReqTime=Tue Dec 30 07:56:14 2014
  ReqNumb=291  Request=>><?xml version="1.0" encoding="UTF-8" ?><nowPlaying deviceID="123456789012" source="INTERNET_RADIO"><ContentItem source="INTERNET_RADIO" location="15275" sourceAccount="" isPresetable="true"><itemName>ETN.FM 1 - Trance Channel</itemName></ContentItem><track></track><artist></artist><album></album><stationName>ETN.FM 1 - Trance Channel</stationName><art artImageStatus="IMAGE_PRESENT">http://logo.vtuner.net/007452/logo/logo-15275.jpg</art><playStatus>BUFFERING_STATE</playStatus><description>MP3  256 kbps  Internet Only,  No frills, no gimmicks, just plain quality electronic music!</description><stationLocation>Internet Only</stationLocation></nowPlaying><<
 ReqTime=Tue Dec 30 07:56:17 2014
  ReqNumb=292  Request=>><?xml version="1.0" encoding="UTF-8" ?><nowPlaying deviceID="123456789012" source="INTERNET_RADIO"><ContentItem source="INTERNET_RADIO" location="15275" sourceAccount="" isPresetable="true"><itemName>ETN.FM 1 - Trance Channel</itemName></ContentItem><track></track><artist></artist><album></album><stationName>ETN.FM 1 - Trance Channel</stationName><art artImageStatus="IMAGE_PRESENT">http://logo.vtuner.net/007452/logo/logo-15275.jpg</art><playStatus>PLAY_STATE</playStatus><description>MP3  256 kbps  Internet Only,  No frills, no gimmicks, just plain quality electronic music!</description><stationLocation>Internet Only</stationLocation></nowPlaying><<
 ReqTime=Tue Dec 30 07:56:18 2014
  ReqNumb=293  Request=>><?xml version="1.0" encoding="UTF-8" ?><status>/select</status><<
 ReqTime=Tue Dec 30 07:56:19 2014
  ReqNumb=294  Request=>><?xml version="1.0" encoding="UTF-8" ?><nowPlaying deviceID="123456789012" source="INTERNET_RADIO"><ContentItem source="INTERNET_RADIO" location="" sourceAccount="" isPresetable="true"><itemName></itemName></ContentItem><track></track><artist></artist><album></album><stationName></stationName><art artImageStatus="INVALID" /><playStatus>BUFFERING_STATE</playStatus><description>   kbps  ,  </description><stationLocation></stationLocation></nowPlaying><<
 ReqTime=Tue Dec 30 07:56:19 2014
  ReqNumb=295  Request=>><?xml version="1.0" encoding="UTF-8" ?><nowPlaying deviceID="123456789012" source="INTERNET_RADIO"><ContentItem source="INTERNET_RADIO" location="" sourceAccount="" isPresetable="true"><itemName></itemName></ContentItem><track></track><artist></artist><album></album><stationName></stationName><art artImageStatus="INVALID" /><playStatus>BUFFERING_STATE</playStatus><description>   kbps  ,  </description><stationLocation></stationLocation></nowPlaying><<
 ReqTime=Tue Dec 30 07:56:20 2014


ReqNumb=291  
Request=>>
<?xml version="1.0" encoding="UTF-8" ?>
<nowPlaying deviceID="123456789012" source="INTERNET_RADIO">
<ContentItem source="INTERNET_RADIO" location="15275" sourceAccount="" isPresetable="true">
<itemName>
ETN.FM 1 - Trance Channel
</itemName>
</ContentItem>
<track>
</track>
<artist>
</artist>
<album>
</album>
<stationName>
ETN.FM 1 - Trance Channel
</stationName>
<art artImageStatus="IMAGE_PRESENT">http://logo.vtuner.net/007452/logo/logo-15275.jpg</art>
<playStatus>BUFFERING_STATE</playStatus>
<description>MP3  256 kbps  Internet Only,  No frills, no gimmicks, just plain quality electronic music!</description>
<stationLocation>Internet Only</stationLocation>
</nowPlaying>

Ich bin jetzt nicht der html / xml Fachmann… Hat sich jemand mit dem Thema auseinandergesetzt?
Funktioniert überhaupt mein Ansatz?

Parallel habe ich versucht mit Wireshark zu loggen, aber ein wirklich brauchbares Ergebnis habe ich nicht gesehen :frowning:

Vielleicht kann man ja ein Gegenpart zu IPSSonos erstellen :stuck_out_tongue:

Einen guten Rutsch ins neue Jahr

Könnte eine Lösung für die Ansteuerung cURL sein, um den oben aufgeführten Request zu senden?

Wieder einen Schritt weiter.

cURL ist wohl der richtige Ansatz.

Mit nachfolgendem Script lässt sich ein Preset des Bose Soundtouch’s anwählen. Die Daten müssen manuell angepasst werden.


<?
// Bose Soundtouch Preset schalten

// IP-Adresse für Bose Soundtouch anpassen
$ip = "192.168.1.2";

// Account
$sourceAccount = "";

// Quelle
$source = "INTERNET_RADIO";

// Name des Senders
$itemName = "ETN.FM 1 - Trance Channel";

// Senderposition
$location = "15275";

// Preset
$isPresetable = "true";

// XML Data
$xml_data = '<ContentItem source="'.$source.'" sourceAccount="'.$sourceAccount.'" location="'.$location.'">
<itemName>'.$itemName.'</itemName>
</ContentItem>';
echo $xml_data;

// cURL 
$curl = curl_init();
curl_setopt_array($curl,
		  array(CURLOPT_URL => 'http://'.$ip.':8090/select',
			CURLOPT_HEADER => 0,
			CURLOPT_RETURNTRANSFER => 1,
			CURLOPT_POST => 1,
			CURLOPT_POSTFIELDS => $xml_data,
			CURLOPT_HTTPHEADER => array('Content-type: text/xml')
			));
$resp = curl_exec($curl);
curl_close($curl);
?>

Im Moment ist es noch nicht sehr komfortabel, aber es erfüllt erstmal meinen Zweck ein Preset zu schalten.

Auf dem ST gibt es eine Datei Presets.xml, die liegt unter:

/var/lib/Bose/PersistenceDataRoot/BoseApp-Persistence/1/Presets.xml

Dort sieht man die Informationen zu seinen gespeicherten Sendern/Presets.

Fortsetzung folgt :slight_smile: :loveips:

Zum ausschalten des ST Systems folgender PHP Code:


<?
// Bose Soundtouch ausschalten

// IP-Adresse Bose Soundtouch anpassen
$ip = "192.168.1.2";

// Status
$state01 = "press";
$state02 = "release";

// Senders
$sender = "Gabbo";

// Key
$keyname = "POWER";

// XML Data
$xml_data01 = '<key state="'.$state01.'" sender="'.$sender.'">'.$keyname.'
</key>';
$xml_data02 = '<key state="'.$state02.'" sender="'.$sender.'">'.$keyname.'
</key>';

echo $xml_data01;
echo $xml_data02;

// cURL Press Key Button
$curl = curl_init();
curl_setopt_array($curl,
		  array(CURLOPT_URL => 'http://'.$ip.':8090/key',
			CURLOPT_HEADER => 0,
			CURLOPT_RETURNTRANSFER => 1,
			CURLOPT_POST => 1,
			CURLOPT_POSTFIELDS => $xml_data01,
			CURLOPT_HTTPHEADER => array('Content-type: text/xml')
			));
$resp = curl_exec($curl);
curl_close($curl);

// cURL Release Key Button
$curl = curl_init();
curl_setopt_array($curl,
		  array(CURLOPT_URL => 'http://'.$ip.':8090/key',
			CURLOPT_HEADER => 0,
			CURLOPT_RETURNTRANSFER => 1,
			CURLOPT_POST => 1,
			CURLOPT_POSTFIELDS => $xml_data02,
			CURLOPT_HTTPHEADER => array('Content-type: text/xml')
			));
$resp = curl_exec($curl);
curl_close($curl);
?>

Kann mit Sicherheit noch optimiert werden, es funktioniert aber :rolleyes:

Es ist noch einfacher die Preset Tasten 1-6 zu schalten, indem man das Script zum Ausschalten nimmt und die Variable

// Key
$keyname = „POWER“;

durch

// Key
$keyname = „PRESET_1“;

ersetzt.

Preset Taste 2 = PRESET_2 usw.

Dann benötigt man nicht die Daten aus der Presets.xml für das cURL PHP Script zum schalten.

Weitere Tasten sind:

STOP
PLAY
VOLUME_UP (simuliert das Drücken der Taste Lautsprecher + , also Lautstärkenerhöhung)
VOLUME_DOWN (simuliert das Drücken der Taste Lautsprecher - , also Lautstärkenveringerung)

Weitere Tasten folgen…

Bis zum nächsten Jahr, einen guten Rutsch! :smiley:

Erstmal! Ein gesundes und Erfolgreiches 2015!

Saubere Arbeit! Ich war seinerzeit auch schon mal bis zum Wireshark Snip gekommen. Aber dann
wurds für mich unüberschaubar! Bin halt kein Programmierer. Ich bin dann den Weg über Airfoil gegangen.
Aber dieses ist natürlich der richtigere Weg!

Alles was du bisher gepostet hast funktioniert. Was ich aber äußerst Interessant finde, dein eingestelltes
Presset Script ruft bei mir auch deinen ETN.FM Sender auf. Damit könnte man ja getrost die 6 Preset Tasten
für Internetradio Nutzung vergessen und die Sender per Script schalten!

Hast du schon etwas in die Richtung DLNA auf dem Schirm ? Ich nutze zum Beispiel eine Preset Taste um meine MP3
Sammlung vom Twonky Server zu streamen.

Ein frohes, neues Jahr!

Schön, dass meine „Arbeit“ anklang findet :wink:

Ich selber bin auch kein Programmierer, meist gilt try and error :eek:

Zum Thema Presets schalten:

Nimm mal das Script aus Post #4 und ersetzte die Zeile

// Key
$keyname = „POWER“;

durch

// Key
$keyname = „PRESET_1“;

dann sollte er genau das tun, was du auf der Taste gespeichert hast.

PRESET_2 ist dann die Preset Taste 2 auf dem Soundtouch usw.

Ich selber nutze die Presets nur für Internetradio.

Mit DLNA habe ich mich noch nicht beschäftigt… ist in meiner Prioliste auch dann hinten dran.

Ich bin gerade dabei die Script zu erweitern und zu modifizieren für’s WebFront,

denn ich will meinen Ausschalttimer nutzen, dass sich der Soundtouch nach x Minuten von selber ausschaltet.

Und ich will noch einen Weg finden, um den Status des Soundtouch’s abzufragen. Wenn ich zum Beispiel manuell den Soundtouch ausschalte und ich zuvor den Timer aktiviert habe, dann braucht der Timer den Soundtouch nicht mehr ausschalten, denn er ist ja aus, ansonsten schaltet das Timerscript den Soundtouch wieder ein und ich stehe dann senkrecht im Bett :smiley:

Ausserdem muss ich noch die Volume Buttons einbinden…

Timer + Fadeout Volume könnte ich mir vorstellen. :slight_smile:

Ziel wäre es, ein IPSSoundtouch (Modul) zu kreieren (analog zu IPSSonos), aber ich glaube da fehlen mir die „professionellen“ php-Kenntnisse… mal sehen.

Vielleicht hat ja Jemand Lust mich / uns zu unterstützen?

So einige Variablen und Scripte für WebFront zusammengestellt.

Am Design muss noch etwas getan werden. Ebenfalls die Auswertung vom Bose Soundtouch (Rückkanal, sofern das geht :confused:)

Hier mal ein Screenshot:

Guten Morgen,

das mit den Presets hatte ich schon erfolgreich mit dem Power Script umgesetzt. Bei deinem ersten Script aber, kam einer deiner Sender hoch! Das fand ich interessant, denn dann ist man ja nicht mehr auf die 6 Preset Tasten beschränkt. Man könnte also alle seine Wunschsender mehr oder weniger direkt aufrufen.

Ich hab mir mal kurz auf die schnelle das zusammen gebastelt. Aktuell noch ohne Sendernamen.

Baue auch gerade um :eek:

Und habe mir nochmal 6 Presets spendiert :smiley:

Warum nennst du die Stationen Preset ? Hat das einen bestimmten Grund ? Ich hab mir jetzt die genutzten Sender raus gesucht und rufe die mit eingetragenem Stationsnamen direkt auf. Ist doch viel übersichtlicher.

Wie hast du denn den Volume Slider umgesetzt ?

Hallo Gosef,

habe meine Preset Tasten auch mit den Sendernamen versehen. Mein IPSSoundtouch Projekt ist ja gerade am Anfang, wird ständig verändert und wächst. Danke für deine Idee :o

Volumeslider:

Zunächst eine Integervariable neu anlegen und benennen.

Dann ein neues Variablenprofil zuweisen:

und der Variable nachfolgendes Script zuweisen:


<?
/*
Bose Soundtouch Volume Control-Script
Bose Soundtouch Systeme in IPS einbinden und schalten

Änderungen / Versionhistorie
01.01.2015 Version 1.0.0 Initialscript
*/

// Variablendefinitionen holen
include("bose_VarDefinitions.ips.php");

// Schaltvorgang WebFront
SetValue($_IPS['VARIABLE'], $IPS_VALUE);

$volume = GetValue($BoseSoundtouchVolume);

// XML Data
$xml_data01 = '<volume>'.$volume.'</volume>';

// Bose Systeme, IP Adresse festlegen
if (GetValueFormatted($BoseSoundtouchSystem) == "Soundtouch 20")
{
$ip = ($BoseSoundtouch20IP);
}
if (GetValueFormatted($BoseSoundtouchSystem) == "Soundtouch Portable")
{
$ip = ($BoseSoundtouchPortableIP);
}
if (GetValueFormatted($BoseSoundtouchSystem) == "Soundtouch CineMate")
{
$ip = ($BoseSoundtouchCineMateIP);
}

// cURL Press Key Button
$curl = curl_init();
curl_setopt_array($curl,
		  array(CURLOPT_URL => 'http://'.$ip.':8090/volume',
			CURLOPT_HEADER => 0,
			CURLOPT_RETURNTRANSFER => 1,
			CURLOPT_POST => 1,
			CURLOPT_POSTFIELDS => $xml_data01,
			CURLOPT_HTTPHEADER => array('Content-type: text/xml')
			));
$resp = curl_exec($curl);
curl_close($curl);
?>

Der Wert wird erst bei loslassen des Sliders gesetzt.

Werde mich jetzt erstmal meinem Volume Fadeout widmen.

So siehts im Moment aus:

Weitere To Do’s:

  1. Now Playing auswerten und in IPS Variable schreiben, parsen und auswerten einer XML-Datei :eek:
  2. Volume vom Gerät auslesen, sofern das geht
  3. WakeUpSoundtoch Funktion
  4. Design Webfront

Now Playing ist doch da !?

Ich hol mir das so:

SetValue (42221 /[Smarthome\W27\Scripte\Variablen\Bose\aktueller Sender]/, $itemName);

Danke für das Volume Script!

Kannst du mir noch die bose_VarDefinitions.ips.php posten bitte ?

Ja, das ist auch einfach, weil du den Namen der Variablen definiert hast :rolleyes:

Ich will bei Schaltvorgängen, oder in einem zyklischen Ereignis den Status des System abfragen (Query).

Dafür muss ich eine XML Datei auswerten (now_playing). Da steht dann nochmals der Sendername und andere Informationen drin. Ebenfalls werte wie „STANDBY“. Dies kann ich dann wieder für Abfragen nutzen, ein Script soll nur ausgeführt werden, wenn z.B. das System nicht im STANDBY ist.

XML Parsen mit Zuweisung hab eich nicht nicht gemacht… mal sehen vermutlich erst am nächsten Wochenende.

Ich baue gerade mal wieder um :eek:

In der bose_VarDefinitions.ips.php habe ich den Objektivs nur sprechende Namen gegeben.

Beispiel:
$BoseSoundtouchPowerSwitch = (12345); …usw.

Update:

  • Design geändert

  • Volume Fade Out überarbeitet

  • Systemstatus wird abgefragt und ausgegeben
    (es sind noch nicht alle Statusmeldungen integriert)

  • Now Playing
    (Sendername wird angezeigt, Artist und Titel, sowie sonstige Infos fehlen noch)

  • Senderlogo wird angezeigt

Screenshot:

Gib mir mal einen Tip wie du die XML Variablen weiter verarbeitest.
Simple XML ?

Hier ein Script um verschiedene Zustände des Systems per CURL GET abzufragen.

Am Anfang die Werte für euer System anpassen, ebenfalls die benötigte Abfrage auswählen.

Im Script Ausgabefenster der Konsole erscheinen die Ergebnisse.

Viel Spaß! :smiley:


<?
/*
Dateiname: bose_SoundTouchSystemQueryCurlGet

Bose SoundTouch Systeme in IPS einbinden

Bose SoundTouch Script, Curl Get Systemstatusabfrage
Version 1.0.0 vom 06.01.2015

Änderungen / Versionhistorie
06.01.2015 Version 1.0.0 Initialscript
*/

// Start, Query Script

// Start, Config

// Bose SoundTouch IP-Adresse
$BoseSoundTouchSystemIP = "192.168.1.2";

// Abfrage auswählen

// Volume
//$URLString = "volume";

// Now Playing
$URLString = "now_playing";

// Sources
//$URLString = "sources";

// Presets
//$URLString = "presets";

// Get Zone
//$URLString = "getZone";

// Ende, Config
	
// Bose System verfügbar
$SystemAvailable = false;
$SystemAvailable = (boolean)Sys_Ping($BoseSoundTouchSystemIP, 1000);
if ($SystemAvailable == false)
	{
	echo "Bose SoundTouch System ist nicht verfügbar!";
	}
else
	{
	// Curl Get
	$Curl = curl_init();

	curl_setopt_array($Curl, array(
				       	CURLOPT_URL => 'http://'.$BoseSoundTouchSystemIP.':8090/'.$URLString,
			   	    	CURLOPT_HEADER => 0,
			      	 	CURLOPT_RETURNTRANSFER => 1
			       		));

	$Response = curl_exec($Curl);

	$ResponseUTF8 = utf8_decode($Response);
	echo "Response: ".$ResponseUTF8."

";

	$XMLData = new SimpleXMLElement ($Response);

	$XMLDataJson = json_encode($XMLData);
	echo "XML Data Json: ".($XMLDataJson)."

";

	if ($URLString == "volume")
	   {
	   // Ziellautstärke
		$TargetVolume	=	$XMLData->targetvolume;
		// aktuelle Lautstärke
		$ActualVolume 	= 	$XMLData->actualvolume;
		// Lautsprecher stumm
		$MutedVolume 	= 	$XMLData->muteenabled;
		// Werte ausgeben
		echo "Target Volume: ".$TargetVolume."
";
		echo "Actual Volume: ".$ActualVolume."
";
		echo "Mute enabled: ".$MutedVolume."
";
      }
	if ($URLString == "now_playing")
		{
		// Systemstatus
		$SystemStatus = utf8_decode($XMLData->playStatus);
		// Sendername
		$StationName = utf8_decode($XMLData->stationName);
		// Senderlogo
		$SenderLogo = utf8_decode($XMLData->art);
		$SenderLogoURL = (string)'<center><embed src="'.$SenderLogo.'"></embed></center>';
		// Werte ausgeben
		echo "Play Status: ".$SystemStatus."
";
		echo "Station Name: ".$StationName."
";
		echo "Art: ".$SenderLogo."
";
		}
}
// Ende, Query Script
?>

Hallo ubittner ,
ich versuche auch gerade das Bose ST System zu impelmentieren, jedoch für FHEM.
Wie bist Du an die Informationen über die ST gekommen?
Habe weder eine FTP noch Telnet Verbindung hin bekommen:-(
Gruß der Freibeuter