BOSE SoundTouch Einbindung (All-In-One Skript)

Anbindung von FS20-Komponenten, ELV-Wetterstationen, EnOcean und DMX an HomeMatic

Moderator: Co-Administratoren

Fonzo
Beiträge: 1235
Registriert: 22.05.2012, 08:40

Re: BOSE SoundTouch Einbindung (All-In-One Skript)

Beitrag von Fonzo » 30.10.2018, 10:00

Nitram hat geschrieben:
29.10.2018, 09:47
Ein Traum wäre es einfach sagen zu können "Alexa, spiele die Musik auch im Wohnzimmer".
Warum benutzt Du nicht einfach den Bose Skill?

Nitram
Beiträge: 23
Registriert: 15.10.2018, 10:48

Re: BOSE SoundTouch Einbindung (All-In-One Skript)

Beitrag von Nitram » 30.10.2018, 10:33

Die 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.

tobinedo
Beiträge: 23
Registriert: 23.02.2016, 11:46

Re: BOSE SoundTouch Einbindung (All-In-One Skript)

Beitrag von tobinedo » 02.11.2018, 17:54

Nitram hat geschrieben:
30.10.2018, 10:33
Die 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.
Hi 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.

Nitram
Beiträge: 23
Registriert: 15.10.2018, 10:48

Re: BOSE SoundTouch Einbindung (All-In-One Skript)

Beitrag von Nitram » 07.11.2018, 15:31

tobinedo hat geschrieben:
02.11.2018, 17:54
Hi 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.
Hallo tobinedo,

vielen Dank für dein Hilfsangebot. Ich versuche es erstmal mit deinem All-In-One Skript und passe es dann nach meinen Wünschen an. Aber erstmal ne grundsätzliche Frage. Was macht dein Script wenn der Master bereits eingeschaltet ist mit den Slaves? Wird hier kein Slave gekoppelt, sollte der Master schon aktiv sein?

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");
        }
      }
Gibt im Weiteren kein Koppelanweisung für den Fall, dass der Master bereits aktiv ist. Auch die Slaves werden nicht gekoppelt wenn sie bereits etwas anderes spielen, das ist aber wahrscheinlich auch so gewünscht?

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";
Beim bilden einer Zone ist es wahrscheinlich egal welche Quelle der Master gerade abspielt? Also egal ob Preset, Bluetooth oder Spotify?
Beim schnellen Testen Gestern lief es leider noch nicht direkt los bei mir. Schon blöd das es hier keine Fehlerausgaben gibt mit Breakpoints usw. :mrgreen:

Nitram
Beiträge: 23
Registriert: 15.10.2018, 10:48

Re: BOSE SoundTouch Einbindung (All-In-One Skript)

Beitrag von Nitram » 08.11.2018, 08:57

Gestern hatte ich noch ein bisschen Zeit um an meiner Scriptversion zu basteln. Ist sicher nicht perfekt und es werden auch nicht alle Eventualitäten abgefangen. Es tut bei mir aber erstmal was es soll.

Folgendes Szenario:
Auf einem SoundTouch Lautsprecher läuft bereits Musik, ich möchte diese Musik auch auf anderen Lautsprechern wiedergeben. Ich muss nun nur noch Alexa bitten einen weiteren hinzuzufügen und schon spielt er los.
Habe mir eine Systemvariable angelegt und diese mit virtuellen Tasten verknüpft. Diese Tasten sind wiederum über ioBroker für Alexa ansprechbar. Wird die Systemvariable aktualisiert, läuft folgendes Script los:

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;
		  }
	}
Das Script ist eigentlich recht dumm, weshalb es wichtig ist im Array mit den Geräten hier nach der Wahrscheinlichkeit zu sortieren im System der Master zu sein. So habe ich bei mir die Geräte mit LAN Anschluss ganz oben stehen, weil ich immer diese als Master verwende.
Ich kenne die verwendete Scriptsprache der CCU nicht wirklich und habe nur das Script von tobinedo angepasst. Ich bin für Verbesserungsvorschläge offen.

Grüße,
Martin

Nitram
Beiträge: 23
Registriert: 15.10.2018, 10:48

Re: BOSE SoundTouch Einbindung (All-In-One Skript)

Beitrag von Nitram » 10.11.2018, 17:35

Jetzt gibts die Version 0.2, diese ist bei der Erkennung des Masters etwas schlauer. Zusätzlich werden Geräte die bereits aktiv sind ausgeschaltet, das ist für mich nun recht praktisch. Ich habe nur einen Befehl um einen Lautsprecher entweder zur Musikgruppe hinzuzufügen oder um den Lautsprecher auszuschalten. Bin jetzt soweit zufrieden.

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;
		  }
	}

tobinedo
Beiträge: 23
Registriert: 23.02.2016, 11:46

Re: BOSE SoundTouch Einbindung (All-In-One Skript)

Beitrag von tobinedo » 15.11.2018, 15:01

Hi Nitram,
dein skript gefällt mir.
Hier noch die Antworten auf deine anfänglichen Fragen, auch wenn du dir schon einiges selbst beantworten konntest.
Nitram hat geschrieben:
07.11.2018, 15:31
Was macht dein Script wenn der Master bereits eingeschaltet ist mit den Slaves? Wird hier kein Slave gekoppelt, sollte der Master schon aktiv sein?
Wenn der Master Aktiv bereits eingeschaltet ist, bleibt er an, wechselt das Programm und die Slaves hängen sich an.
Ist er aus, wird er eingeschlatet.

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; }

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";
Die Systemvariable muss wie der Wert der Skriptvariable heißen. In dem Beispiel wäre dann der Name der Systemvariable "Status.Soundtouch.Preset"
Beim bilden einer Zone ist es wahrscheinlich egal welche Quelle der Master gerade abspielt?
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.

Gruß
Tobinedo

Antworten

Zurück zu „CUxD“