Re: BOSE SoundTouch Einbindung (All-In-One Skript)
Verfasst: 30.10.2018, 10:00
Warum benutzt Du nicht einfach den Bose Skill?
Heimautomation mit ELV HomeMatic und FHZ Funk-Hauszentralen
https://homematic-forum.de/forum/
Warum benutzt Du nicht einfach den Bose Skill?
Hi Nitram,Nitram hat geschrieben: ↑30.10.2018, 10:33Die Gruppenbildung unterstützt der leider nicht. Ich kann zwar Musik auf einem Lautsprecher starten, diese kann dann aber nicht erweitert werden. Es gibt auch keine permanenten Gruppen bei Bose, weshalb der Skill wirklich nur für die Benutzung eines Lautsprechers ausgelegt ist.
Bose ist echt lahm in der Entwicklung, schaue schon abundzu neidvoll zu Sonos auch wenn ich gernerell zufrieden mit meinen Lautsprechern bin. Ein bisschen Komfort für diese Smart-Lautsprecher vermisse ich dennoch.
Hallo tobinedo,tobinedo hat geschrieben: ↑02.11.2018, 17:54Hi Nitram,
du kannst natürlich für jede Paarbildung ein Programm erstellen.
Wenn du immer mit dem selben Master arbeitest, dann müsstest du nur pro Slave ein Programm haben, das sich einklingt.
Wenn du auch wieder ausklinken möchtest, dann würdest du hier wahrscheinlich ein weiteres Programm benötigen. Dafür kenne ich mich aber zu wenig mit der Alexa Anbindung über die Homecloud aus.
Wenn du hilfe bei der Programmerstellung benötigst, helfe ich natürlich gerne.
Code: Alles auswählen
!Slaves koppeln
...
if(dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State().Find("STANDBY") != "-1"){
if (ST_Master_Status == false) {
!Slave mit Master koppeln
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl -d '<zone master='" # ST_Master_DeviceID # "'>
<member ipaddress='" # ST_Slave.StrValueByIndex(",", 0) # "'>" # ST_Slave.StrValueByIndex(",", 1) # "</member>
</zone>' http://" # ST_Master_IP # ":8090/setZone");
}
}
Code: Alles auswählen
!Name der Systemvariable mit Werteliste
var sv_Werteliste = "Status.Soundtouch.Preset";
Code: Alles auswählen
!*******************************************************************************
!** Bose Soundtouch Add to Group HomeMatic-Script V0.1
!** erstellt von Nitram
!** 08.11.2018
!**
!** Das Script sucht einen aktiven SoundTouch Lautsprecher und
!** macht diesen zum Master einer neuen Gruppe.
!** durch setzen der Systemvariablen sv_add_device_number kann
!** der SoundTouch Lautsprecher gewählt werden, welcher hinzugefügt
!** werden soll.
!**
!** Verwendete Homematic Systemvariablen:
!** sv_add_device_number (Zahl, von 0 bis Anzahl vorhandener SoundTouch Lautsprecher - 1)
!**
!** Voraussetzungen:
!** - Feste IP-Adressen für Soundtouch-Geräte
!** - CUxD muss auf der CCU installiert sein
!** - CUxD Adresse von Soundtouch
!**
!** Inspiriert durch fraat:
!** https://homematic-forum.de/forum/viewtopic.php?f=37&t=29122
!** und durch tobinedo:
!** https://homematic-forum.de/forum/viewtopic.php?f=37&t=36840
!*******************************************************************************
!*******************************************************************************
!************************** START DEFINITIONSBEREICH ***************************
!*******************************************************************************
!SoundTouch Geräte definieren:
!Die Device ID findet man unter http://<<SoundtouchIP>>:8090/now_playing
!0 = IP Adresse, 1 = Device ID
!Am besten die Lautsprecher werden nach Wahrscheinlichkeit Master zu sein sortiert
string ST_Devices ="192.168.1.XX,507224BXXXXX;" +
"192.168.1.XX,A81B6A0XXXXX;" +
"192.168.1.XX,506583CXXXXX";
string ST_Device; !ST_Device.StrValueByIndex(",", 0) 0=IP, 1=ID
integer ST_DeviceCount = 0;
integer active_master = -1;
integer counter = 0;
string ST_Designated_Master ="";
!Über die Systemvariable kann das gewünschte Gerät (Position im Array 0-x) gewählt werden,
!welches zur Gruppe hinzugefügt werden soll
integer add_device_number = dom.GetObject("sv_add_device_number").Value();
!*******************************************************************************
!*************************** ENDE DEFINITIONSBEREICH ***************************
!*******************************************************************************
!Zählen wieviele Geräte vorhanden sind
foreach(ST_Device, ST_Devices.Split(";")) {
ST_DeviceCount = ST_DeviceCount + 1;
}
!Debugausgabe
WriteLine("Anzahl Geräte: " + ST_DeviceCount);
!Aktiven Master suchen, der erste aktive Lautsprecher im Array wird der neue aktive Master
WriteLine("Check active Master");
if(ST_DeviceCount >= 1) {
foreach(ST_Device, ST_Devices.Split(";")) {
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("/usr/local/addons/cuxd/curl -s -k -L http://" # ST_Device.StrValueByIndex(",", 0) #":8090/now_playing");
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
if(dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State().Find("STANDBY") != "-1"){
counter = counter + 1;
}else
{
if(active_master == -1)
{
active_master = counter;
ST_Designated_Master = ST_Device;
}
}
}
}
!Debugausgabe
WriteLine("Aktiver Master: " + active_master);
WriteLine(ST_Designated_Master);
!Slave mit Master koppeln
counter = 0;
foreach(ST_Device, ST_Devices.Split(";")) {
if (counter == add_device_number)
{
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl -d '<zone master='" # ST_Designated_Master.StrValueByIndex(",", 1) # "'>
<member ipaddress='" # ST_Device.StrValueByIndex(",", 0) # "'>" # ST_Device.StrValueByIndex(",", 1) # "</member>
</zone>' http://" # ST_Designated_Master.StrValueByIndex(",", 0) # ":8090/setZone");
counter = counter + 1;
}else
{
counter = counter + 1;
}
}
Code: Alles auswählen
!*******************************************************************************
!** Bose Soundtouch Add to Group HomeMatic-Script V0.1
!** erstellt von Nitram
!** 10.11.2018
!**
!** Das Script sucht einen aktiven SoundTouch Lautsprecher und
!** macht diesen zum Master einer neuen Gruppe.
!** durch setzen der Systemvariablen sv_add_device_number kann
!** der SoundTouch Lautsprecher gewählt werden, welcher hinzugefügt
!** werden soll.
!**
!** Verwendete Homematic Systemvariablen:
!** sv_add_device_number (Zahl, von 0 bis Anzahl vorhandener SoundTouch Lautsprecher - 1)
!**
!** Voraussetzungen:
!** - Feste IP-Adressen für Soundtouch-Geräte
!** - CUxD muss auf der CCU installiert sein
!** - CUxD Adresse von Soundtouch
!**
!** Inspiriert durch fraat:
!** https://homematic-forum.de/forum/viewtopic.php?f=37&t=29122
!** und durch tobinedo:
!** https://homematic-forum.de/forum/viewtopic.php?f=37&t=36840
!*******************************************************************************
!*******************************************************************************
!************************** START DEFINITIONSBEREICH ***************************
!*******************************************************************************
!SoundTouch Geräte definieren:
!Die Device ID findet man unter http://<<SoundtouchIP>>:8090/now_playing
!0 = IP Adresse, 1 = Device ID
!Am besten die Lautsprecher werden nach Wahrscheinlichkeit Master zu sein sortiert
string ST_Devices ="192.168.1.XX,507224BXXXXX;" +
"192.168.1.XX,A81B6A0XXXXX;" +
"192.168.1.XX,506583CXXXXX";
string ST_Device; !ST_Device.StrValueByIndex(",", 0) 0=IP, 1=ID
integer ST_DeviceCount = 0;
integer active_master = -1;
integer counter = 0;
string ST_Designated_Master ="";
!Über die Systemvariable kann das gewünschte Gerät (Position im Array 0-x) gewählt werden,
!welches zur Gruppe hinzugefügt werden soll
integer add_device_number = dom.GetObject("sv_add_device_number").Value();
!*******************************************************************************
!*************************** ENDE DEFINITIONSBEREICH ***************************
!*******************************************************************************
!Zählen wieviele Geräte vorhanden sind
foreach(ST_Device, ST_Devices.Split(";")) {
ST_DeviceCount = ST_DeviceCount + 1;
}
!Debugausgabe
WriteLine("Anzahl Geräte: " + ST_DeviceCount);
!Aktiven Master suchen, der erste aktive Lautsprecher im Array wird der neue aktive Master
WriteLine("Check active Master");
if(ST_DeviceCount >= 1) {
foreach(ST_Device, ST_Devices.Split(";")) {
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("/usr/local/addons/cuxd/curl -s -k -L http://" # ST_Device.StrValueByIndex(",", 0) #":8090/now_playing");
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
if(dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State().Find("STANDBY") != "-1"){
counter = counter + 1;
}else
{
if(active_master == -1)
{
!Untersuchen ob Gerät vielleicht Slave in einer Zone ist
!senderIPAddress=
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("/usr/local/addons/cuxd/curl -s -k -L http://" # ST_Device.StrValueByIndex(",", 0) #":8090/getZone");
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
if(dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State().Find("senderIPAddress=") != "-1"){
!Ist bereits Slave einer Zone, nächster bitte
counter = counter + 1;
}
else
{
active_master = counter;
ST_Designated_Master = ST_Device;
}
}
}
}
}
!Debugausgabe
WriteLine("Aktiver Master: " + active_master);
WriteLine(ST_Designated_Master);
!Slave mit Master koppeln
counter = 0;
foreach(ST_Device, ST_Devices.Split(";")) {
if (counter == add_device_number)
{
!Untersuchen ob Gerät schon aktiv ist -> dann ausschalten statt Zone bilden
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("/usr/local/addons/cuxd/curl -s -k -L http://" # ST_Device.StrValueByIndex(",", 0) #":8090/now_playing");
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
if(dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State().Find("STANDBY") != "-1")
{!Zone bilden
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl -d '<zone master='" # ST_Designated_Master.StrValueByIndex(",", 1) # "'>
<member ipaddress='" # ST_Device.StrValueByIndex(",", 0) # "'>" # ST_Device.StrValueByIndex(",", 1) # "</member>
</zone>' http://" # ST_Designated_Master.StrValueByIndex(",", 0) # ":8090/setZone");
counter = counter + 1;
}else
{!Ausschalten
!Virtuellen Powerbutton drücken
string CurlCmd='/usr/local/addons/cuxd/curl --data "<key state="press" sender="Gabbo">POWER</key>" http://' # ST_Device.StrValueByIndex(",", 0) # ':8090/key';
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State(CurlCmd);
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
!Virtuellen Powerbutton loslassen
string CurlCmd='/usr/local/addons/cuxd/curl --data "<key state="release" sender="Gabbo">POWER</key>" http://' # ST_Device.StrValueByIndex(",", 0) # ':8090/key';
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State(CurlCmd);
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
counter = counter + 1;
}
}else
{
counter = counter + 1;
}
}
Wenn der Master Aktiv bereits eingeschaltet ist, bleibt er an, wechselt das Programm und die Slaves hängen sich an.
Code: Alles auswählen
!Überprüfen ob der Master bereits eingeschlatet ist
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("/usr/local/addons/cuxd/curl -s -k -L http://" # ST_Master_IP #":8090/now_playing");
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
if(dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State().Find("STANDBY") != "-1"){ ST_Master_Status = false; }
else { ST_Master_Status = true; }
Die Systemvariable muss wie der Wert der Skriptvariable heißen. In dem Beispiel wäre dann der Name der Systemvariable "Status.Soundtouch.Preset"Und was passiert hier im Definitionsbereich? Habe eine Systemvariable sv_Werteliste mit "Aus;1;2;3;4;5;6" angelegt, war das richtig?Code: Alles auswählen
!Name der Systemvariable mit Werteliste var sv_Werteliste = "Status.Soundtouch.Preset";
Ja, das ist egal, so Lange es ein Preset ist. Bluetooth/Aux sind meines Wissens nicht auf ein Preset legbar. Hier könnte man aber auch die Bluetooth/Aux Taste mit in die Systemvariable aufnehmen und in das Skript einbinden.Beim bilden einer Zone ist es wahrscheinlich egal welche Quelle der Master gerade abspielt?