[Python] Bose Soundtouch Multiroom depuis domoticz
Re: [Python][TUTO] Bose Soundtouch Multiroom depuis domoticz
J'ai regarder ton script Chrominator, c'est vraiment un niveau de programmation très au dessus de ce que j'ai fait.
Par contre la fonction que ça ne rempli pas c'est la différenciation de chaque enceinte pour par exemple ne pas mettre un volume identique sur chaque enceinte. Comme j'ai des enceinte soundtouch de taille différent, je règle le niveau de son de façon différente en fonction du type d’enceinte.
La deuxième chose c'est que le nombre d’import pour ton script étant important, ça semble compliquer un peut plus la mise en oeuvre pour les néophytes de linux. Mais bon on peut pas tout avoir.
Je me demande si ça serais plus cohérent que tu refasse un topic avec ton script et que je supprime le mien (je sais pas si c'est possible), pas que j'ai particulièrement envie que mon travail et mon post disparaisse mais ton script étant tellement plus avancé et propre, il faudrait que les gens tombent dessus plus facilement.
Par contre la fonction que ça ne rempli pas c'est la différenciation de chaque enceinte pour par exemple ne pas mettre un volume identique sur chaque enceinte. Comme j'ai des enceinte soundtouch de taille différent, je règle le niveau de son de façon différente en fonction du type d’enceinte.
La deuxième chose c'est que le nombre d’import pour ton script étant important, ça semble compliquer un peut plus la mise en oeuvre pour les néophytes de linux. Mais bon on peut pas tout avoir.
Je me demande si ça serais plus cohérent que tu refasse un topic avec ton script et que je supprime le mien (je sais pas si c'est possible), pas que j'ai particulièrement envie que mon travail et mon post disparaisse mais ton script étant tellement plus avancé et propre, il faudrait que les gens tombent dessus plus facilement.
-
Chrominator
- Messages : 1042
- Inscription : 19 déc. 2015, 07:29
- Localisation : France
Re: [Python][TUTO] Bose Soundtouch Multiroom depuis domoticz
De mon point de vue, il n'y a rien à supprimer.
Il en faut pour tous les goûts et tous les besoins.
Certains vont se trouver à l'aise avec ton script et apprendre de lui, d'autres essaieront le mien.
Je ferais un autre post sur le sujet, tu as raison, avec des scripts plus avancés et plus intégrés à Domoticz.
Mais je ne suis pas encore arrivé à mes fins, j'ai encore pas mal de taf.
Je retiens le besoin de puissance différencié par enceinte, j'en tiendrais compte.
Il en faut pour tous les goûts et tous les besoins.
Certains vont se trouver à l'aise avec ton script et apprendre de lui, d'autres essaieront le mien.
Je ferais un autre post sur le sujet, tu as raison, avec des scripts plus avancés et plus intégrés à Domoticz.
Mais je ne suis pas encore arrivé à mes fins, j'ai encore pas mal de taf.
Je retiens le besoin de puissance différencié par enceinte, j'en tiendrais compte.
Un bon frein vaut mieux que deux sparadraps.
Ubuntu 24.04.3 LTS - Domoticz 2025.1 (build 16782)
Pentium G3220T 2.6GHz - 4Go DDR3
RFXtrx433 USB Ver Pro1/1043
Z-Stick GEN5 Version: 1.6-1136-g07ea22bb
Rtl433 RTL-SDR receiver
RFLink Gateway
Zigbee SLZB-06
Ubuntu 24.04.3 LTS - Domoticz 2025.1 (build 16782)
Pentium G3220T 2.6GHz - 4Go DDR3
RFXtrx433 USB Ver Pro1/1043
Z-Stick GEN5 Version: 1.6-1136-g07ea22bb
Rtl433 RTL-SDR receiver
RFLink Gateway
Zigbee SLZB-06
Re: [Python][TUTO] Bose Soundtouch Multiroom depuis domoticz
Bonjour à tous !
J'ai réussi à tout faire fonctionner !
Un changement du raspberry pi qui hébergeait domoticz était prévu depuis quelques temps, ce que j'ai enfin pu faire. Comme j'avais un peu de temps, j'ai opté pour une clean install, et je n'ai eu aucun problème important pour le script bose_all.py
J'ai par contre eu quelques bugs légers que peuvent peut être croiser d'autres personnes !
Le numéro du preset à donner n'est pas celui enregistré sur bose, mais peut dépendre du nombre de preset enregistré. Sur l'app soundtouch, j'ai par exemple des stations enregistrées sur les raccourcis 1, 2, 3 et 6.
Le lancement du preset 6 ne fonctionnait pas, par contre le lancement du 4 (normalement vide) lande la 4ème station enregistrée... donc celle en 6 normalement.
En deuxième petit bug, j'ai créé un interrupteur virtuel par présélection, puis pour ne pas multiplier les interrupteurs virtuels j'ai tenté de regrouper le tout via un sélecteur virtuel. Malheureusement, si le mode ON/OFF fonctionne bien, le système refuse de changer les station et reste sur la première sélectionnée. Je passe probablement à coté de quelques chose, mais je fouillerais plus tard.
Et en dernier point, je n'ai pas le retour dans les logs, même chose, j'approfondirais dans les semaines à venir.
J'ai réussi à tout faire fonctionner !
Un changement du raspberry pi qui hébergeait domoticz était prévu depuis quelques temps, ce que j'ai enfin pu faire. Comme j'avais un peu de temps, j'ai opté pour une clean install, et je n'ai eu aucun problème important pour le script bose_all.py
J'ai par contre eu quelques bugs légers que peuvent peut être croiser d'autres personnes !
Le numéro du preset à donner n'est pas celui enregistré sur bose, mais peut dépendre du nombre de preset enregistré. Sur l'app soundtouch, j'ai par exemple des stations enregistrées sur les raccourcis 1, 2, 3 et 6.
Le lancement du preset 6 ne fonctionnait pas, par contre le lancement du 4 (normalement vide) lande la 4ème station enregistrée... donc celle en 6 normalement.
En deuxième petit bug, j'ai créé un interrupteur virtuel par présélection, puis pour ne pas multiplier les interrupteurs virtuels j'ai tenté de regrouper le tout via un sélecteur virtuel. Malheureusement, si le mode ON/OFF fonctionne bien, le système refuse de changer les station et reste sur la première sélectionnée. Je passe probablement à coté de quelques chose, mais je fouillerais plus tard.
Et en dernier point, je n'ai pas le retour dans les logs, même chose, j'approfondirais dans les semaines à venir.
Re: [Python][TUTO] Bose Soundtouch Multiroom depuis domoticz
Quant tu sélectionne ta présélection avec le script il faut commencer à zéro, 0 pour le preset 1, 1 pour le preset 2... Donc si tu cherche à sélectionner le 6ème il faut mettre 5. As tu fait ça? Pour le sélecteur je sais pas trop à vrai dire.
Re: [Python][TUTO] Bose Soundtouch Multiroom depuis domoticz
Dans le script fourni par chrominator, les presets commencent à 1.
Mon problème de non changement de station semble venir de mon enceinte bose elle même. Elle refuse les changements même en passant par l'appli. Il doit y avoir une sorte de cache ou autre, je vais fouiller ça la semaine prochaine.
EDIT: En fait, je viens de faire le traditionnel débrancher/rebrancher de mon enceinte et le bouton selecteur fonctionne. Il y a donc bien quelques chose qui sature dans mon enceinte, reste plus qu'à trouver quoi !
Et le script produit quelques trucs curieux:
Extinction de l'enceinte pour l'allumer et le volume ne correspond pas toujours à la consigne donnée.
Mon problème de non changement de station semble venir de mon enceinte bose elle même. Elle refuse les changements même en passant par l'appli. Il doit y avoir une sorte de cache ou autre, je vais fouiller ça la semaine prochaine.
EDIT: En fait, je viens de faire le traditionnel débrancher/rebrancher de mon enceinte et le bouton selecteur fonctionne. Il y a donc bien quelques chose qui sature dans mon enceinte, reste plus qu'à trouver quoi !
Et le script produit quelques trucs curieux:
Extinction de l'enceinte pour l'allumer et le volume ne correspond pas toujours à la consigne donnée.
Code : Tout sélectionner
pi@raspberrypi:~/domoticz/scripts/python $ ./bose_all.py --master salon --volume 15 --preset 2 -s on
bose_all.py : Enceinte Salon mise hors fonction.
bose_all.py : Preset is set to 2
bose_all.py : Volume is set to 15
bose_all.py : Master device is set to salon
bose_all.py : Device trouve: Salon - Cinemate - volume force a 20
bose_all.py : Multiroom active sur 1 enceintes.
bose_all.py : Preselection n2 choisie : Voyage ! SPOTIFY-
Chrominator
- Messages : 1042
- Inscription : 19 déc. 2015, 07:29
- Localisation : France
Re: [Python][TUTO] Bose Soundtouch Multiroom depuis domoticz
Oui j'ai fait le même constat pour le volume, ça ne fonctionne pas à tous les coups.
Et j'ai pas encore eu le temps de chercher pourquoi...
Et j'ai pas encore eu le temps de chercher pourquoi...
Un bon frein vaut mieux que deux sparadraps.
Ubuntu 24.04.3 LTS - Domoticz 2025.1 (build 16782)
Pentium G3220T 2.6GHz - 4Go DDR3
RFXtrx433 USB Ver Pro1/1043
Z-Stick GEN5 Version: 1.6-1136-g07ea22bb
Rtl433 RTL-SDR receiver
RFLink Gateway
Zigbee SLZB-06
Ubuntu 24.04.3 LTS - Domoticz 2025.1 (build 16782)
Pentium G3220T 2.6GHz - 4Go DDR3
RFXtrx433 USB Ver Pro1/1043
Z-Stick GEN5 Version: 1.6-1136-g07ea22bb
Rtl433 RTL-SDR receiver
RFLink Gateway
Zigbee SLZB-06
Re: [Python][TUTO] Bose Soundtouch Multiroom depuis domoticz
Par curiosité, as tu aussi ce problème de saturation sur les preset ? (l’enceinte qui refuse les changements de preset en acceptant les autres consignes)
-
Chrominator
- Messages : 1042
- Inscription : 19 déc. 2015, 07:29
- Localisation : France
Re: [Python][TUTO] Bose Soundtouch Multiroom depuis domoticz
Non, rien de tel, que ce soit par programme ou par la télécommande.
Un bon frein vaut mieux que deux sparadraps.
Ubuntu 24.04.3 LTS - Domoticz 2025.1 (build 16782)
Pentium G3220T 2.6GHz - 4Go DDR3
RFXtrx433 USB Ver Pro1/1043
Z-Stick GEN5 Version: 1.6-1136-g07ea22bb
Rtl433 RTL-SDR receiver
RFLink Gateway
Zigbee SLZB-06
Ubuntu 24.04.3 LTS - Domoticz 2025.1 (build 16782)
Pentium G3220T 2.6GHz - 4Go DDR3
RFXtrx433 USB Ver Pro1/1043
Z-Stick GEN5 Version: 1.6-1136-g07ea22bb
Rtl433 RTL-SDR receiver
RFLink Gateway
Zigbee SLZB-06
-
Chrominator
- Messages : 1042
- Inscription : 19 déc. 2015, 07:29
- Localisation : France
Re: [Python] Bose Soundtouch Multiroom depuis domoticz
Bose a décommissionné son système Soundtouch dans le cloud.
C'était annoncé, mais ça fait suer quand même.
Entre autres effets, les presets ne fonctionnent plus.
Donc les 6 boutons des télécommandes deviennent inutiles.
Et mon script ici aussi.
Mais comme je m'en sers toujours, notamment comme réveil matin, voici une version modifiée qui défini "en dur" les presets disparus.
A vous de l'adapter en fonction des radios que vous écoutez, en définissant les url de ces radios internet.
C'était annoncé, mais ça fait suer quand même.
Entre autres effets, les presets ne fonctionnent plus.
Donc les 6 boutons des télécommandes deviennent inutiles.
Et mon script ici aussi.
Mais comme je m'en sers toujours, notamment comme réveil matin, voici une version modifiée qui défini "en dur" les presets disparus.
A vous de l'adapter en fonction des radios que vous écoutez, en définissant les url de ces radios internet.
Code : Tout sélectionner
#!/usr/bin/python3.10
# -*- coding: utf-8 -*-
'''-------------------------------------------------------------------------------------------------
Script permettant de créer une zone multiroom Bose avec toutes les enceintes
Auteur : Chrominator
Version 0.2
Changes :
2017-11-26 : Version initiale
2026-05-09 : SoundTouch n'est plus supporté par BOSE;
Les presets ne fonctionnent plus.
Redéfinition des presets ici en dur pour ne pas modifier le
fonctionnement du programme.
Principe : Récupère les paramètres enceinte maîtresse, volume du son, présélection
et crée une zone multiroom avec toutes les enceintes trouvées.
les paramètres sont --volume <volume_level> -master <master_device> -preset <# preset> -s <switch on or off>
Le switch on crée la zone multiroom, off la supprime et éteint les enceintes.
exemples : bose_all.py --master bureau --volume 10 --preset 6 -s on
bose_all.py -s off
-------------------------------------------------------------------------------------------------'''
import sys, getopt
import os
import urllib
import requests
import libsoundtouch # https://github.com/CharlesBlonde/libsoundtouch
from libsoundtouch import discover_devices
from libsoundtouch import soundtouch_device
from libsoundtouch.utils import Source, Type
from dataclasses import dataclass
from libsoundtouch.device import NoSlavesException, NoExistingZoneException, \
Preset, Config, SoundTouchDevice, SoundtouchInvalidUrlException
from urllib.request import urlopen
#from urllib import request
#from request import urlopen
@dataclass
class PresetItem:
url: str
name: str
source: str
presets = [
PresetItem(name="RTL", url= "http://icecast.rtl.fr/rtl-1-44-128?listen=webCwsBCggNCQgLDQUGBAcGBg", source="Internet Radio"),
PresetItem(name="OÜI FM", url="http://ouifm.ice.infomaniak.ch/ouifm-high.mp3", source="Internet Radio"),
PresetItem(name="Nostalgie", url="https://streaming.nrjaudio.fm/oug7girb92oc?origine=fluxradios", source="Internet Radio"),
PresetItem(name="Rires et Chansons", url="https://streaming.nrjaudio.fm/ou8o8xgk7oiu?origine=fluxradios", source="Internet Radio"),
PresetItem(name="RTL2", url="http://streaming.radio.rtl2.fr/rtl2-1-44-128?listen=webCwsBCggNCQgLDQUGBAcGBg", source="Internet Radio"),
PresetItem(name="OÜI FM Classic Rock", url="http://ouifm3.ice.infomaniak.ch/ouifm3.mp3", source="Internet Radio"),
]
URL_DOMOTICZ = 'http://127.0.0.1:8080/json.htm?type='
def DomoticzData(cmd, get=False):
url = URL_DOMOTICZ + cmd
result = requests.get(url)
def SendMessage(msg, colour="SaddleBrown", bg="LemonChiffon"):
#data = urllib.parse.quote('<COLOR="' + colour + '" style="BACKGROUND-COLOR: ' + bg + '">' + os.path.basename(__file__) + ' : ' + msg + '</font>')
data = urllib.parse.quote(os.path.basename(__file__) + ' : ' + msg)
cmd = "command¶m=addlogmessage&message=" + data
DomoticzData(cmd)
print(os.path.basename(__file__) + ' : ' + msg)
def main(argv):
volume = '' # Niveau de volume initial pour la création du groupe multiroom, de 1 à 100.
masterdev = '' # Nom de l'enceinte qui commandera le groupe multiroom.
master = ''
chaine = '' # Preset à sélectionner pour le multiroom : de 1 à 6, correspondent aux boutons de la télécommande.
switch = '' # Spécifie si on crée le multiroom ou si on le supprime : ON ou OFF.
try:
opts, args = getopt.getopt(argv,"hv:m:p:s:",["volume=","master=","preset=","switch="])
except getopt.GetoptError:
SendMessage (os.path.basename(__file__) + ' -v <volume_level> -m <master_device> -p <preset> -s <switch on or off>')
sys.exit(2)
for opt, arg in opts:
if opt == '-h':
SendMessage (os.path.basename(__file__) + ' -v <volume_level> -m <master_device> -p <preset> -s <switch on or off>')
sys.exit()
elif opt in ("-v", "--volume"):
volume = arg
elif opt in ("-p", "--preset"):
chaine = arg
elif opt in ("-s", "--switch"):
switch = arg
elif opt in ("-m", "--master"):
masterdev = arg
if switch.upper() not in ("ON", "OFF"):
SendMessage('--switch : Le switch doit être ON ou OFF')
sys.exit(2)
devices = discover_devices(timeout=5)
for device in devices:
SendMessage ("Enceinte " + device.config.name + " mise hors fonction.")
device.power_off()
if switch.upper() != "ON":
SendMessage ("Arrêt du multiroom.")
sys.exit(2)
if masterdev == '':
SendMessage ('Aucune enceinte maître définie : Arrêt du programme')
sys.exit(2)
if chaine == '':
chaine = '0'
SendMessage ('Présélection sélectionnée par défaut')
elif not chaine.isnumeric():
SendMessage ('Présélection ' + chaine + ' invalide. Valeurs autorisées de 1 à 6')
sys.exit(2)
elif int(chaine) not in range(1, 7):
SendMessage ('Préselection ' + chaine + ' invalide. Valeurs autorisées de 1 à 6')
sys.exit(2)
if volume == '':
volume = '20'
SendMessage ('Volume sélectionné par défaut.')
elif not volume.isnumeric():
SendMessage ('Le volume doit être compris entre 1 et 100.')
sys.exit(2)
elif int(volume) not in range(1, 101):
SendMessage ('Le volume doit être compris entre 1 et 100.')
sys.exit(2)
SendMessage ('Preset is set to ' + chaine)
SendMessage ('Volume is set to ' + volume)
SendMessage ('Master device is set to ' + masterdev)
#Noms des enceintes et types
for device in devices:
if device.config.name.upper() == masterdev.upper():
device.create_zone(devices)
master = device
device.set_volume(int(volume))
SendMessage ('Device trouvé: ' + device.config.name + " - " + device.config.type + " - volume forcé à " + str(device.volume().actual))
if master == '':
SendMessage ("L'enceinte " + masterdev + " n'existe pas. Arrêt du programme.")
else:
# Nombre d'enceintes en multiroom
SendMessage ('Multiroom activé sur ' + str(len(devices)) + ' enceintes.')
#ici on récupere les presets
#presets = master.presets()
index = int(chaine)-1
SendMessage ('Préselection n°' + chaine + ' choisie : ' + presets[index].name + ' ' + presets[index].source)
#master.select_preset(presets[index]) # 6 presets de 0 à 5
master.play_url(presets[index].url)
if __name__ == "__main__":
main(sys.argv[1:])
Un bon frein vaut mieux que deux sparadraps.
Ubuntu 24.04.3 LTS - Domoticz 2025.1 (build 16782)
Pentium G3220T 2.6GHz - 4Go DDR3
RFXtrx433 USB Ver Pro1/1043
Z-Stick GEN5 Version: 1.6-1136-g07ea22bb
Rtl433 RTL-SDR receiver
RFLink Gateway
Zigbee SLZB-06
Ubuntu 24.04.3 LTS - Domoticz 2025.1 (build 16782)
Pentium G3220T 2.6GHz - 4Go DDR3
RFXtrx433 USB Ver Pro1/1043
Z-Stick GEN5 Version: 1.6-1136-g07ea22bb
Rtl433 RTL-SDR receiver
RFLink Gateway
Zigbee SLZB-06