Dernières nouvelles

Une classe PHP pour piloter ses Sonos avec l’eeDomus

Au menu aujourd’hui, une classe PHP qui vous permet de piloter vos équipements Sonos, comme vous pourriez le faire depuis un Controler Sonos ou l’application Android/iOS/Windows dédiée. Avec cette classe, votre box domotique (ou tout autre système pouvant générer des requêtes HTTP) va pouvoir piloter votre produit Sonos :

  • mettre en lecture/pause,
  • gérer le niveau sonore,
  • avancer/reculer dans une chanson/une playlist,
  • charger une chanson/une radio,
  • charger/sauvegarder/vider la playlist,
  • connaitre l’état du Sonos (en lecture, en pause..),
  • connaitre les détails de la chanson diffusée (artiste, album, durée écoulée…),
  • etc…

En prime, cette classe va vous permettre de faire du Text-to-speech. Oui oui, vous avez bien lu. Vous allez pouvoir faire dire tout ce que vous voulez à vos enceintes, à l’image du Karotz.

Mais voyons sans attendre comment cela se présente.

La classe PHP est composée d’un fichier sonos.class.php et d’un fichier sonos.php (qui sert d’exemple) et à retrouver sur mon GitHub. Il vous faudra adapter le fichier sonos.php à vos besoins réels.

Le fichier sonos.class.php est composé de diverses fonctions qu’il va falloir appeler depuis votre script sonos.php selon ce que vous souhaitez exécuter. Les fonctions actuellement disponibles sont les suivantes (cela sera amené à évoluer) :

  * - Play() : play / lecture 
  * - Pause() : pause
  * - Stop() : stop
  * - Next() : next track / titre suivant 
  * - Previous() : previous track / titre précédent
  * - SeekTime(string) : seek to time xx:xx:xx / avancer-reculer à la position xx:xx:xx
  * - ChangeTrack(int) : change to track xx / aller au titre xx
  * - RestartTrack() : restart actual track / revenir au début du titre actuel
  * - RestartQueue() : restart queue / revenir au début de la liste actuelle
  * - GetVolume() : get volume level / récupérer le niveau sonore actuel
  * - SetVolume(int) : set volume level / régler le niveau sonore
  * - GetMute() : get mute status / connaitre l'état de la sourdine
  * - SetMute(bool) : active-disable mute / activer-désactiver la sourdine
  * - GetTransportInfo() : get status about player / connaitre l'état de la lecture
  * - GetMediaInfo() : get informations about media / connaitre des informations sur le média
  * - GetPositionInfo() : get some informations about track / connaitre des informations sur le titre
  * - AddURIToQueue(string,bool) : add a track to queue / ajouter un titre à la liste de lecture
  * - RemoveTrackFromQueue(int) : remove a track from Queue / supprimer un tritre de la liste de lecture
  * - RemoveAllTracksFromQueue() : remove all tracks from queue / vider la liste de lecture
  * - RefreshShareIndex() : refresh music library / rafraichit la bibliothèque musicale
  * - SetQueue(string) : load a track or radio in player / charge un titre ou une radio dans le lecteur
  * - PlayTTS(string message,string station,int volume,string lang) : play a text-to-speech message / lit un message texte

Par exemple, si vous souhaitez baisser le niveau sonore s’il est supérieur à une certaine valeur, votre fichier sonos.php ressemblera à celui-ci (il vous faut renseigner l’adresse IP du Sonos à contrôler) :

<?php
// Exemple d'application de la classe PHP Sonos permettant de baisser le niveau sonore s'il est supérieur à 50%

$IP_sonos_1 = "192.168.1.11"; // A adapter avec l'adresse IP du Sonos à contrôler

require("sonos.class.php");
//Instanciation de la classe
$sonos_1 = new SonosPHPController($IP_sonos_1);
$volume = $sonos_1->GetVolume();
if ($volume > 50)
$sonos_1 = $sonos_1->SetVolume(50);
?>

Et voilà pour les bases. Maintenons, passons à la pratique : diffusons un message texte généré par notre eedomus, même si un titre est en cours de diffusion sur notre Sonos. Cerise sur le gâteau, la diffusion sonore reprendra là où elle en était, et avec son niveau sonore, avant la diffusion du message.

Cela peut vous paraitre compliqué, mais avec cette classe PHP, tout ceci est simplifié puis c’est réalisé par un seul appel à la fonction PlayTTS  :

PlayTTS(string message,string directory,int volume,int force_unmute,string lang)

Détaillons les arguments disponibles lors de l’appel à cette fonction :

  • message : le message à diffuser (chaine de 100 caractères maximum),
  • directory : dossier partagé sur votre serveur web correspondant au dossier où est stocké le présent script (chaine de caractères)(voir ci-dessous),
  • volume : niveau sonore dans lequel le message sera diffusé (de 0 à 100). Optionnel (si non renseigné, niveau sonore conservé à la même valeur),
  • force_unmute : force à diffuser le message même si l’enceinte est en sourdine (=1). Optionnel (si non renseigné pas de modification de l’état de la sourdine),
  • lang : code pays (‘fr’, ‘en’, etc…) de la langue dans lequel le message doit être diffusé. Optionnel (si non renseigné lang=’fr’)

Comment fonctionne le principe de TTS ? Nous utilisons l’API PHP officieuse de Google permettant de faire du TTS : vous fournissez une chaine de caractères, une langue, Google vous retourne des données sonores.

Ici, pour éviter de charger inutilement les serveurs de Google (et perdre du temps) lors de la génération du message, ce dernier va être sauvegardé au format MP3 sur le serveur web qui héberge cette classe PHP Sonos, dans le sous-dossier « audio » pour être réutilisé par la suite. Cela a l’avantage à la fois d’avoir des requêtes plus rapides pour des messages répétitifs, mais aussi de pouvoir diffuser des messages sonores en l’absence de connexion Internet (et c’est là le gros avantage par rapport au Karotz), vu que le fichier aura été précédemment sauvegardé sur le serveur web.

Les 2 seuls prérequis est de mettre en partage Samba (lecture seule suffit) le dossier hébergeant les présents scripts (sur les NAS Synology par exemple, partager le dossier web est suffisant) et de rajouter ce dossier à la bibliothèque musicale de l’application Sonos.

La variable $directory contiendra le chemin Samba correspondant au dossier contenant les scripts PHP Sonos. Cela servira aux Sonos pour venir lire le fichier MP3 précédemment généré. Par exemple, si sur un Synology, on partage le dossier web et que les scripts sont dans un sous-dossier web/sonos, la variable $directory vaudra « IP_Synology/web/sonos ».

Voilà alors ce que pourrait donner une nouvelle version du script sonos.php :

<?php 
// Exemple de l'utilisation de la fonction Text-to-speech
require("sonos.class.php");
$IP_sonos_1 = "192.168.1.11"; // A adapter avec l'adresse IP du Sonos à contrôler 

$volume = 0;
$force_unmute = 0;

if (isset($_GET['force_unmute'])) $force_unmute = $_GET['force_unmute']; // Force la désactivation de la sourdine. Optionnel 
if (isset($_GET['volume'])) $volume = $_GET['volume']; // Niveau sonore. Optionnel. 
$message = $_GET['message']; // Message à diffuser 

//Instanciation de la classe 
$sonos_1 = new SonosPHPController($IP_sonos_1); 
$sonos_1->PlayTTS($message,$volume,$force_unmute); //Lecture du message
?>

Il ne vous restera alors qu’à appeler votre script et lui passer les paramètres qu’il faut :

Pour diffuser « Mon message à diffuser » sans toucher au niveau sonore (même si l’enceinte est en sourdine) :

http://IP_serveur_web/chemin/vers/sonos/sonos.php?$message=Mon message à diffuser

Pour diffuser « Mon message à diffuser » en forçant le niveau sonore à 50% mais sans toucher à la sourdine (si l’enceinte est en sourdine, elle le restera pour la diffusion de ce message -> pas de diffusion sonore) :

http://IP_serveur_web/chemin/vers/sonos/sonos.php?$message=Mon message à diffuser&volume=50

Pour diffuser « Mon message à diffuser » en forçant le niveau sonore à 50% et en désactivant la sourdine :

http://IP_serveur_web/chemin/vers/sonos/sonos.php?$message=Mon message à diffuser&volume=50&force_unmute=1

Voyons en pratique ce que cela donne sur une eedomus, en générant une alerte sonore lorsque notre département passe en vigilance orange (cf mon précédent article « La vigilance météo dans votre eedomus« ).

Sur notre eedomus, créons un actionneur HTTP.

Sauvegardez et continuez à éditer et passez à l’onglet « Valeurs ». Créez une nouvelle ligne en renseignant l’IP et le chemin où sont hébergés vos scripts. Dans les paramètres, complétons avec un message compréhensible, configurons le niveau sonore et sauvegardons.

Il ne vous reste plus alors qu’à ajouter cet actionneur HTTP dans la règle qui va bien.

Et voilà, vous serez averti dès lors que votre département passera en vigilance orange.

Le script joint à cette classe n’étant qu’un exemple à l’utilisation de la classe Sonos, votre imagination est alors votre seule limite… Faire une diffusion générale d’un même message simultanément sur plusieurs Sonos alors qu’il y a des lectures en cours différentes devient alors possible et très simple à mettre en œuvre par exemple…

Cette classe n’est pas complète, mais elle permet déjà pas mal de choses. Il me reste à y intégrer entre autre la gestion des groupes et des paires d’enceintes.

Les évolutions prochaines seront à suivre sur mon Github.

A propos de Fabien

Touche à tout dans le domaine de l'électronique et l'informatique tant chez moi qu'à mon boulot (réseaux, télécoms, radio, outils de supervision...), j'ai découvert la domotique en 2011. Ayant débuté avec un RFXCOM et un NAS Synology, j'ai testé la Zibase et la Vera lite avant de jeter mon dévolu sur une Eedomus. J'adore :-D

55 commentaires

  1. Bonjour, Super travail. Est ce possible d’executer ce script en hébergeant les pages php chez un FAI pour ne pas laisser un pc allumé en permanence par exemple ?
    Merci

  2. Bonjour,

    L’eedomus dispose désormais d’un moteur de script PHP directement intégré dans celle ci.

    Donc plus besoin d’un serveur externe.

    Cdlt

    Mickael

  3. Le moteur de script est toutefois limité. Il ne peut pas prendre en charge mes scripts Sonos. Il faut donc un serveur web local, si le script est hébergé en dehors de ton domicile, cela ne fonctionnera pas.
    Un raspberry fait très bien l’affaire.

  4. Fabrice, je vais jeter un oeil, avec toutes les mises à jour Sonos survenues ces derniers mois, il se peut que tout ne fonctionne pas correctement à partir des scripts PHP.

  5. Bonjour Fabien,

    Des nouvelles?
    J’ai remarqué également que si une station de radio est en pause, le TTS n’est pas diffusé non plus!

    D’avance merci.
    Fabrice

Répondre

Votre adresse email ne sera pas publiée. Les champs obligatoires sont marqués d'une étoile *

*

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Revenir en haut de la page