mediola

BOSE SoundTouch Einbindung (All-In-One Skript)

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

Werbung


BOSE SoundTouch Einbindung (All-In-One Skript)

Beitragvon tobinedo » 24.04.2017, 17:00

Hallo Zusammen, hier mein kleines Projekt zum Thema Soundtouch:

Die Vorgeschichte:

Nachdem ich die Bose Soundtouch Lautsprecher (habe inzwischen 4) erfolgreich in mein Smarthome intergriert habe, und diese auch erfolgreich liefen, habe ich mal die dafür erstellten Programme und Systemvariablen durchgezählt und kam auf sage und schreibe 12 Programme und 23 Variablen.
Das war mir zu viel und sorgte immer wieder für Verwirrung bei Anpassungen. Aber so ist es leider, wenn man immer mal eben schnell anbaut und es trotzdem dauerhaft funktioniert.

Jedenfalls habe ich mal gesammelt, gebündelt und umstrukturiert und programmiert.
Ich war selbst erstaunt: Ich habe nur noch ein Programm und eine Systemvariable.
Man muss aber dazu sagen, dass ich auf das Auslesen des Aktuellen Tracks verzichte. (Seit dem Bose Plugin für Mediola NEO benötige ich das nicht mehr.

Meine Soundtouch Anforderungen:

Wenn bei uns zu Hause (Zwei-Personen Haushalt) Musik läuft, dann immer in allen Räumen das gleiche.
Die Soundtouch geht an wenn jemand nach hause kommt und geht aus wenn alle aus dem Haus sind.
Genau so ist es wenn der Fernseher eingeschaltet wird: TV an -> Musik aus, TV aus -> Musik an.
Nachdem abends dann die Nachttischlampen aus sind, geht die Musik zu schlafen aus und morgens mit dem Wecker wieder an.
Ihr merkt schon. Bei uns läuft immer Musik so lange jemand zu hause ist und nicht schläft oder TV guckt.
Und abhängig von Tageszeit, Helligkeit, Wochentag, Gästen usw. andere Presets.

Changelog:
v1.4
- Es gibt einen Definitionsbereich. Änderungen im Quellcode sind nicht mehr notwendig
- Die Slaves werden nur noch im Definitionsbereich definiert.
- Es können beliebig viele Slaves definiert werden.
- Sind keine Slaves definiert, findet auch kein Koppeln statt
- SHUFFLE und REPEAT_ALL sind definierbar
- Klingelfunktion wurde hinzugefügt: (Danke Nanouk)
- Wird ein Klingelsensor verwendet und mit Soundtouch angesteuert, kann ein Preset für die Klingel definiert werden. Dies kann dann mit einer eigenen Lautstärke pro Device gestartet werden.
v1.3
- Beim Start des Skripts wird geprüft welche Soundtouch bereits an ist und in einer Booleal wariabel ablegelt
- Beim ausschlaten wird jede Soundtouch ausgeschlatet, für den Fall, dass eine Soundtouch ohne Master betrieben wurde
- Beim Einschalten werden nur Slaves gekoppelt, die vorher nicht an waren
v1.2
- SystemVariable in Status.Soundtouch umbenannt
- Status "0" in "aus" umbenannt
v1.1
- prüfen ob Soundtouch vorher schon an war, dann alle einstellungen (Lautstärke, Slaves) beibehalten
- Durch Preset 0 Soundtouch ausschalten
- SystemVariable von String zu Werteliste geändert

Meine Lösung:

Ich habe nur noch eine Systemvariable mit dem Namen Status.Soundtouch. Eine Werteliste mit den Zahlen von 1-6 und "aus" (Das Bild ist aus einer Älteren Version):
"1"-"6" sind meine Presets und "aus" heisst ausschalten.

In einem anderen Programm, in dem ich dann z.B. die Musik wieder einschalten möchte,
wähle ich die Systemvariable ST.Preset aus und gebe mein Wunschpreset an.
Bild


Kommen wir nun zum eigentlichen Programm:

Mein Programm ist Systemintern und heißt Soundtouch und sieht so aus:

Bild


Ändert sich meine Systemvariable springt wird das Programm "aktiv" und führt das folgende Skript aus:
Ich hab mir mühe gegeben, alles soweit es geht zu kommentieren. :D
(Die CUxD Adresse ist CUxD.CUX2801001:1 wie man unschwer im Skript erkennen kann.)

Code: Alles auswählen
!*******************************************************************************
!**      Bose Soundtouch HomeMatic-Script V1.4                                **
!**      by TobiNedo                                                          **
!**      22.08.2017                                                           **
!**                                                                           **
!**      Durch wählen eines Presets aus der Werteliste einer                  **
!**      Systemwariablen werden alle im Script enthaltenen                    **
!**      SoundTouch Geräte eingeschaltet, synchronisiert auf eine             **
!**      individuell für jedes Gerät vorgegebene Lautstärke gesetzt und       **
!**      nach wunsch SHUFFLE_ON und REPEAT_ALL aktiviert.                     **
!**                                                                           **
!**      Verwendete Homematic Systemvariablen:                                **
!**      ST.Preset (Werteliste)                                               **
!**      - aus;1;2;3;4;5;6                                                    **
!**                                                                           **
!**      Voraussetzungen:                                                     **
!**      - Feste IP-Adressen für Soundtouch-Geräte                            **
!**      - Definierte Presets                                                 **
!**      - CUxD muss auf der CCU installiert sein                             **
!**      - CUxD Adresse von Soundtouch                                        **
!*******************************************************************************

!************************** START DEFINITIONSBEREICH ***************************

!Master und Slaves Definieren:
!Die Device ID findet man unter
!http://<<SoundtouchIP>>:8090/now_playing
  !Master bestimmen
  var ST_Master_IP = "192.168.178.29";
  var ST_Master_DeviceID = "EC1127B09231";
  var ST_Master_Volume = "30"; !Normal Lautstärke 0-100
  var ST_Master_Volume2 = "40"; !Klingel Lautstärke 0-100

  !Slaves bestimmen - beliebig viele
  !Schreibweise: "IP-Adresse,DeviceID,NormaleLautstärke,Klingellautstärke;";
  !Keine Leerzeichen;
  !Klingellautstärke muss gesetzt werden auch wenn nicht genutzt
  !Die letzte Zeile darf kein ";" innerhalb der Anführungszeichen
  !und statt dem "+" ein ";" enthalten.
  !Wenn keine Slaves vorhanden: "";
  string ST_Slaves = "192.168.178.27,EC24B8E8DD88,30,40;"+
                     "192.168.178.25,EC24B8CBB0FF,30,40;"+
                     "192.168.178.23,EC24B8CA4567,30,40";

!Klingelfunktion
  !Funktion nutzen? (true/false)
  boolean FU_Klinkel = false;
  !Preset für Klingelsound
  integer Klingel_Preset = "6";

!REPEAT_ALL aktivieren oder Deaktivieren (true/false);
boolean repeat = true;

!SCHUFFLE_ON aktivieren oder Deaktivieren (true/false);
boolean shuffle = true;

!*************************** ENDE DEFINITIONSBEREICH ***************************

!Soundtouch Preset holen und setzen
var tmp_preset = dom.GetObject("Status.Soundtouch");
var ST_Preset = web.webGetValueFromList(tmp_preset.ValueList(), tmp_preset.Value());
boolean ST_Master_Status;
string ST_Slave; ! ST_Slave.StrValueByIndex(",", 0) 0=IP, 1=ID, 2=Volume1, 3=Volume2
!Zählen wieviele Slaves vorhanden sind
integer ST_Slavecount = 0;
foreach(ST_Slave, ST_Slaves.Split(";")) {
  ST_Slavecount = ST_Slavecount+1;
}

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

!Wenn Preset = aus, dann sollen Master und alle Slaves ausgeschaltet werden
if (ST_Preset == "aus") {
  !Power-Butten in SoundTouch-Key Wandeln
  var tmp_Key = "POWER";
  !Wenn Master bereits eingeschlatet war
  if (ST_Master_Status == true) {
    !Virtuellen Powerbutton drücken
    string CurlCmd='/usr/local/addons/cuxd/curl --data "<key state="press" sender="Gabbo">' # tmp_Key # '</key>" http://' # ST_Master_IP # ':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">' # tmp_Key # '</key>" http://' # ST_Master_IP # ':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();
  }
  !Slaves ausschlaten
  if(ST_Slavecount >= 1) {
    foreach(ST_Slave, ST_Slaves.Split(";")) {
      dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("/usr/local/addons/cuxd/curl -s -k -L http://" # ST_Slave.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"){
        !Virtuellen Powerbutton drücken
        string CurlCmd='/usr/local/addons/cuxd/curl --data "<key state="press" sender="Gabbo">' # tmp_Key # '</key>" http://' # ST_Slave.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">' # tmp_Key # '</key>" http://' # ST_Slave.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();
      }
    }
  }
}
else {
  !ST_Master mit Preset einschalten Einschlaten
  !Preset in SoundTouch-Key Wandeln
  var tmp_Key = "PRESET_" + ST_Preset;

  !Soundtouch-Key auf ST_Master ausführen
  string CurlCmd='/usr/local/addons/cuxd/curl --data "<key state="press" sender="Gabbo">' # tmp_Key # '</key>" http://' # ST_Master_IP # ':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();
  !SoundTouchKey auf ST_Master beenden
  string CurlCmd='/usr/local/addons/cuxd/curl --data "<key state="release" sender="Gabbo">' # tmp_Key # '</key>" http://' # ST_Master_IP # ':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();

  if (ST_Master_Status == false) {
    !ST_Master Lautstärke setzen
    if(FU_Klinkel && ST_Preset == Klingel_Preset){
      string CurlCmd='/usr/local/addons/cuxd/curl --data "<volume>' # ST_Master_Volume2 # '</volume>" http://' # ST_Master_IP # ':8090/volume';
    }
    else {
      string CurlCmd='/usr/local/addons/cuxd/curl --data "<volume>' # ST_Master_Volume # '</volume>" http://' # ST_Master_IP # ':8090/volume';
    }
    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();
  }

  !Slaves koppeln
  if(ST_Slavecount >= 1) {
    foreach(ST_Slave, ST_Slaves.Split(";")) {
      !Prüfen ob Slave eingeschlatet ist
      dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("/usr/local/addons/cuxd/curl -s -k -L http://" # ST_Slave.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"){
        if (ST_Master_Status == false) {
          !Slaves mit ST_Master koppeln und Lautstärke setzen, wenn sie vorher nicht eingeschaltet waren
          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");
          if(FU_Klinkel && ST_Preset == Klingel_Preset){
            string CurlCmd='/usr/local/addons/cuxd/curl --data "<volume>' # ST_Slave.StrValueByIndex(",", 3) # '</volume>" http://' # ST_Slave.StrValueByIndex(",", 0) # ':8090/volume';
          }
          else {
            string CurlCmd='/usr/local/addons/cuxd/curl --data "<volume>' # ST_Slave.StrValueByIndex(",", 2) # '</volume>" http://' # ST_Slave.StrValueByIndex(",", 0) # ':8090/volume';
          }
          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();
        }
      }
    }
  }
  !ST_Master auf SHUFFLE_ON und REPEAT_ALL setzen
  if(shuffle) {
    !SoundTouch-Key für SHUFFLE_ON
    var tmp_Key = "SHUFFLE_ON";
    !Soundtouch-Key auf ST_Master ausführen
    string CurlCmd='/usr/local/addons/cuxd/curl --data "<key state="press" sender="Gabbo">' # tmp_Key # '</key>" http://' # ST_Master_IP # ':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();
    !SoundTouchKey auf ST_Master beenden
    string CurlCmd='/usr/local/addons/cuxd/curl --data "<key state="release" sender="Gabbo">' # tmp_Key # '</key>" http://' # ST_Master_IP # ':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();
  }
  !SoundTouch-Key für REPEAT_ALL
  if(repeat) {
    var tmp_Key = "REPEAT_ALL";
    !Soundtouch-Key auf ST_Master ausführen
    string CurlCmd='/usr/local/addons/cuxd/curl --data "<key state="press" sender="Gabbo">' # tmp_Key # '</key>" http://' # ST_Master_IP # ':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();
    !SoundTouchKey auf ST_Master beenden
    string CurlCmd='/usr/local/addons/cuxd/curl --data "<key state="release" sender="Gabbo">' # tmp_Key # '</key>" http://' # ST_Master_IP # ':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();
  }
}


Gerne würde ich das Skript perfektionieren und mit Wünschen von euch füllen. Also bitte Feedback, Fragen und Wünsche äußern

Inspiriert durch:
viewtopic.php?f=37&t=29122
DANKE!
Zuletzt geändert von tobinedo am 25.08.2017, 20:21, insgesamt 2-mal geändert.
tobinedo
 
Beiträge: 18
Registriert: 23.02.2016, 11:46

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

Beitragvon tobinedo » 25.04.2017, 12:35

FAQ

Hier sammel ich mal Fragen und antworten, die schnell implementiert werden können. Ich werde versuchen sie dann in die nächsten Versionen einzubauen.
Zuletzt geändert von tobinedo am 22.08.2017, 20:07, insgesamt 3-mal geändert.
tobinedo
 
Beiträge: 18
Registriert: 23.02.2016, 11:46

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

Beitragvon Nachtfux » 06.08.2017, 10:51

Hallo und erstmal danke für das tolle Script.
Was mich noch interessieren würde ist, wie man MP3 Dateien direkt an die SoundTouch senden kann um die SoundTouch als Ersatz für den MP3 Funkgong zu verwenden. Hat da jemand eine Idee zu wie man das realisieren könnte?
Benutzeravatar
Nachtfux
 
Beiträge: 23
Registriert: 09.01.2016, 17:49

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

Beitragvon tobinedo » 20.08.2017, 11:18

Nachtfux hat geschrieben:Hallo und erstmal danke für das tolle Script.
Was mich noch interessieren würde ist, wie man MP3 Dateien direkt an die SoundTouch senden kann um die SoundTouch als Ersatz für den MP3 Funkgong zu verwenden. Hat da jemand eine Idee zu wie man das realisieren könnte?


Du kannst über die Bose Soundtouch App eine DLNA Quelle oder andere Musikserver hinzufügen. Dafür brauchst du natürlich einen solchen Server. bieten aber die meisten NAS-Server, wenn du einen hast, ansonsten einen Rasperry Pi nehmen. Diese kannst du dann genau wie Online Streaming deinste als Favorit hinzufügen und ansteuern. Ob das ganze aber schnell genug reagiert ums als Funkgong zu fungieren kann ich nicht sagen.
tobinedo
 
Beiträge: 18
Registriert: 23.02.2016, 11:46


Zurück zu CUxD

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste







© homematic-forum.de & Lizenzgebern. Alle Rechte vorbehalten. Alle Bilder & Texte auf dieser Seite sind Eigentum
der jeweiligen Besitzer und dürfen ohne deren Einwilligung weder kopiert noch sonstwie weiter verwendet werden.