Bon c'est bien rigolo Python finalement, je me suis régalé.
J'ai fait deux petits scripts pour Domoticz.
Le premier en Python ne fait pas grand chose d'autre que ce que fait celui de ayziaa, mais accepte des paramètres pour indiquer l'enceinte Bose maîtresse en multiroom, le niveau sonore au démarrage, la présélection à jouer.
Ce même script permet aussi d'éteindre les enceintes.
On le lance comme ça : bose_all.py --master bureau --volume 10 --preset 6 --switch on
Ah et puis il écrit ce qu'il fait dans le log de domoticz, c'est pratique.
Le second appelle le premier et sera typiquement sur un interrupteur dans Domoticz.
C'est un script shell tel que recommandé dans le WIKI domoticz (voir
scripting in Domoticz); il lance en batch le script Python pour libérer Domoticz et ne pas attendre la fin...
Tuto :
Comme j'utilise Python3 avec ce script, il faut :
- Installer la bibliothèque libsoundtouch pour Python3 :
- Décomprimer le tarball exec.tgz dans domoticz/scripts (si vous n'en avez pas déjà un)
- Décomprimer le tarball bose_all.tgz dans domoticz/scripts/python
- Créer un interrupteur dans Domoticz sur un device virtuel
- Dans les rubriques Action On et Action Off, indiquer le script exec.sh avec comme paramètres le lancement de bose_all.py :
Exemple pour Action On : Code : Tout sélectionner
script://exec.sh python/bose_all.py --master bureau --volume 10 --preset 6 -s on
Exemple pour Action Off
- Sauvegarder
Normalement ça fonctionne.
Pour vérifier, inspecter le log de Domoticz :

- Capture.PNG (14.06 Kio) Consulté 7914 fois
Je joins le code en clair ici, pour le coup d'oeil.
Ah oui c'est en Python3, à cause d'un import que j'utilise.
Code : Tout sélectionner
#!/usr/bin/python3
# -*- coding: utf-8 -*-
'''-------------------------------------------------------------------------------------------------
Script permettant de créer une zone multiroom Bose avec toutes les enceintes
Auteur : Chrominator
Version 0.1
Changes :
2017-11-26 : Version initiale
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> --switch <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 libsoundtouch.device import NoSlavesException, NoExistingZoneException, \
Preset, Config, SoundTouchDevice, SoundtouchInvalidUrlException
from urllib.request import urlopen
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>')
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
if __name__ == "__main__":
main(sys.argv[1:])
TODO : Disposer d'un objet comme ceux qui viennent par KODI en upnp dans Domoticz et disposer de la navigation, musique suivante, précédente, changer le volume, etc..., mais là j'ai pas encore le niveau

- Capture3.PNG (57.17 Kio) Consulté 7914 fois
Pour éviter les indentations intempestives, voici les scripts en tarball.
- exec.tgz
- (190 octets) Téléchargé 381 fois
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