May.05

S-Sound : la solution audio multi-room connectée dans la Constellation

La diffusion de l’audio dans une maison dite intelligente ou connectée est une étape quasi-indispensable. Elle doit permettre aux utilisateurs de diffuser tout type de média ou flux audio dans n’importe quelle pièce de l’habitat et de manière intuitive. Mais c’est aussi un moyen pour la maison elle-même de communiquer avec ses utilisateurs.

Bien qu’il existe différentes solutions sur le marché, je n’ai pas su trouver une solution qui remplissait tous mes critères. Dans cet article vous découvriez comment nous pouvons, avec un budget raisonnable, développer une solution audio multi-room, qui basée sur la plateforme Constellation, permettra de diffuser de l’audio depuis votre serveur de fichier, votre système domotique, votre PC, votre Smartphone, votre tablette ou n’importe quel système ou objet connecté !

ssound

Quand la maison prend la parole….


Historique

Lorsque nous avons emménagé dans notre maison, nous avons tout de suite cherché à diffuser de la musique. Historiquement, nous écoutions essentiellement de la musique dans le salon à travers des KEF E305 pilotées un ampli Pioneer sur lequel est connecté plusieurs sources comme le média-center XBMC via un Intel NUC, la box internet, un Chromecast pour YouTube ou Deezer, l’ampli lui-même (pour les webradios et endpoint DLNA) ou encore un bon vieux lecteur CD.

kef E305

Seulement la maison est grande et le son des KEF, bien que puissant, n’est pas adapté pour une écoute optimale dans la Cuisine / Salle à manger. De ce fait, pendant les travaux de câblage (alarme et ethernet) j’en ai profité pour installer des enceintes dans le plafond pour une intégration discrète et parfaite. Même topo pour la salle de bain, j’ai profité là encore des faux-plafonds pour incruster quelques enceintes !

Côté matériel, après étude, j’ai opté pour des Focal Custom IC106 pour la cuisine / salle à manger et des KEF Ci50 pour la salle de bain. A ce sujet je vous conseille de contacter Hifissimo par téléphone, ils sont de très bon conseil.

Focal Custom IC106 

KEF Ci50

Tant qu’à câbler la maison, j’en ai également profité pour installer une prise jack 3.5mm à côté du bar de la cuisine / SAM car nous avons un petit PC portable d’appoint à cet endroit, pratique pour mettre de la musique, regarder des photos ou consulter des recettes de cuisine !

Prise murale Jack 3.5Prise murale Jack 3.5

A l’époque des travaux je ne savais pas encore quelle solution choisir ou développer, c’est pourquoi j’ai préféré envoyer tous les câbles des enceintes dans la cave afin d’être libre d’installer n’importe quel type de solution. Pour le câblage, j’ai utilisé du 2,5mm² pour relier les enceintes de la cuisine/SAM à la baie technique de la cave et du 1,5mm² de la salle de bain à la cave. Idem pour le câble jack de la cuisine qui descend jusque la cave. Ne reste plus qu’à trouver comment piloter ces enceintes et prendre en compte la prise jack de la cuisine !

Autrement parmi les autres points d’écoute de la maison, on a aussi  la chambre avec un NUC connecté sur la TV, mon bureau avec un PC connecté à un ampli ou encore l’entrée avec The Mirror qui intègre des petits haut-parleurs.

Mes besoins

La question principale est : comment diffuser de l’audio parmi tous ces emplacements ? Dans l’entrée, salon, cuisine/SAM, bureau, chambres et salle de bain.

Et quand je dis “audio” j’entends aussi bien des fichiers audio sur mon serveur que du streaming sur des plateformes comme Youtube ou Deezer, du texte synthétisé (TTS) pour le système domotique de la maison, n’importe quelle entrée ligne (dont celle du bar), des radios FM / Web ou encore pouvoir recevoir de l’audio par un device DLNA.

De plus il faut que ça soit ultra simple pour l’utilisateur !

Pour résumer, le schéma des besoins :

Schéma fonctionnel S-Sound

Seulement je n’ai trouvé aucune solution sur le marché qui me permettait de faire tout cela. La solution Squeezbox très bien documentée par Domo-Blog.fr ne me permettait de diffuser que des fichiers audio sur mes serveurs alors que nous consommons essentiellement la musique à travers des services de streaming tel que Deezer ou encore Youtube.

Dans la même lignée j’ai également testé une solution avec mon logiciel Stream What You Hear couplé à gmediarender. L’idée étant de transformer un Raspberry Pi en un renderer DLNA afin de diffuser le son de votre PC dessus grâce à Stream What You Hear. Seulement cela oblige à diffuser depuis un PC Windows, pas très pratique pour la salle de bain. De plus gmediarender (à l’époque de mes tests, l’an passé) à la fâcheuse tendance à stopper le flux audio lors des “blancs” dans le stream ! En clair, dès qu’il n’y plus de musique sur votre PC (par exemple à la fin d’un titre) gmediarender coupe la lecture, il fallait alors, depuis SWYH, réactiver la diffusion sur le renderer, vraiment agaçant !

Bref j’ai préféré concevoir ma propre solution sur mesure : S-Sound.

Le hardware

Pour répondre aux besoins, j’ai d’abord installé deux amplis pour piloter de manière indépendante les enceintes de la salle de bain et celles de la cuisine/SAM.

Pour la salle de bain, j’ai opté pour un “Lepai Tripath TA2020” qui offre un bon rapport qualité/prix. Pour la cuisine il me fallait quelque chose de plus puissant, mon choix s’est tourné vers un “SMSL SA-50” :

Ampli Lepai Tripath TA2020 Ampli SMSL SA-50

L’entrée Jack de la cuisine arrive dans la cave puis est converti en RCA avec un adaptateur Jack/RCA. Pour le TTS, le DLNA, la (web)radio ou encore la lecteur de fichier audio sur le serveur, tout se pilotera par la partie software, donc pas de matériel à prévoir.

Pour envoyer du son d’un YouTube (ou Deezer) depuis son PC, smartphone ou tablette, le plus simple est d’utiliser un Chromecast.

Chromecast

Pour cela j’ai connecté le Chromecast sur un convertisseur “HDMI vers RCA” un peu dans la lignée du “analog hole” exploitée pour la Slightbox V3 à la différence que ce n’est pas le flux vidéo qui m’intéresse mais seulement le flux audio.

Convertisseur HDMI vers RCA

Très pratique car il suffit de prendre son smartphone ou une tablette pour streamer le son de l’application YouTube, Deezer et bien d’autre sur le système S-Sound :

Chromecast vers SSound

J’ai donc besoin, côté software, de deux “Device Out” (un pour la Salle de Bain et un autre pour la cuisine) mais aussi deux “Device In” pour les deux entrées ligne : la prise Jack de la cuisine et la Chromecast.

Les cartes son USB “Behringer UCA 202” disposent chacune d’une entrée ligne (et non micro) et d’une sortie RCA. Pile-poil ce qu’il nous faut ! Il suffira de rajouter autant d’UCA202 que vous avez de pièces à piloter.

Carte son USB Behringer UCA 202

Pour finir sur la partie matérielle, j’avais un dernier prérequis : je ne voulais pas laisser les amplis allumés 24/7. J’ai donc besoin de piloter les alimentations 24V et 12V (respectivement pour le SMSL et Lepai). J’ai choisi une carte relais USB de chez SainSmart en 5V que j’ai installé dans un boitier ABS :

RelayBoardRelayBoardRelayBoard

Comme nous le verrons par la suite, c’est la Constellation qui donnera l’ordre à la carte de relais d’allumer ou d’éteindre les amplis en fonction de l’état d’S-Sound !

J’ai également ajouté un hub USB alimenté pour connecter la carte relais et les deux cartes son USB mais également pour alimenter le Chromecast et le convertisseur HDMI/RCA.

En résumé, voici le schéma de l’installation :

SSound : schéma technique

Le tout proprement installé dans la baie réseau :

S-Sound installé dans la baie réseau

Le software

J’ai donc deux cartes son avec respectivement 2 sorties (cuisine et SdB) et deux entrées (prise Jack cuisine et Chromecast). La magie de Windows Server fait qu’il est possible de manipuler les devices audio depuis un service Windows.

Le software de S-Sound est un package Constellation. C’est à dire que le software pourra s’exécuter sur n’importe quel serveur ou ordinateur connecté à la Constellation.

Avec le SDK Constellation pour Visual Studio, nous allons créer un package de type console en .NET 4.5 :

image

Ce package utilise N-Audio pour la manipulation des flux audio ainsi que la librairie Developer Tools for UPnP Technologies d’Ylian-Saint-Hilaire pour exposer S-Sound en MediaRenderer DLNA l ! Deux frameworks que j’avais déjà utilisés pour la réalisation de Stream What You Hear.

Le package S-Sound expose les méthodes suivantes dans la Constellation :

  • PlayMediaRessource(uri) : lit un fichier audio
  • PlayM3UList(uri) : lit les fichiers audio d’une playlist M3U
  • PlayMediaRessourceList(list d’uri) : lit une liste de fichiers audio
  • PlayMP3Streaming(uri) : lit un flux MP3 en streaming
  • PlayWaveIn(deviceName) : lit une entrée audio
  • Speech(text) : lit un texte (TTS)
  • Play / Pause / Stop : contrôle de base de la lecture
  • SetVolume(level) : niveau sonore de 0% à 100%
  • SetMute(bool) : mode ”muet”

Pour qu’une méthode de votre programme .NET soit exposée dans la Constellation, il suffit simplement d’ajouter l’attribut “MessageCallback” :

[MessageCallback]
public void PlayMP3Streaming(string uri)
{
    this.PlayWaveProvider(new Players.StreamingPlayer().ConfigureWith(uri));
}

Avec cela n’importe qui connecté dans la Constellation (un autre package, une page Web, un Arduino ou tout autre objet) pourra invoquer ces méthodes pour jouer un fichier, un flux MP3, un texte, mettre pause ou encore gérer le volume.

Le package va également “pusher” des “StateObjects” dans la Constellation pour indiquer son état (en lecture ou arrêt) et donner des détails de ce qui est entrain de se jouer (le type de média et ses paramètres comme l’URI du flux ou du fichier).

Maintenant que mon package S-Sound est prêt, je le déploie sur le serveur Constellation puis dans la configuration je vais déclarer deux instances d’S-Sound : une pour la cuisine et une autre pour la salle de bain.

Pour chaque instance d’S-Sound je vais indiquer si je veux exposer un endpoint DLNA, définir le volume initial mais surtout indiquer quel est le device audio de sortie, la liste des device d’entrée et quelle est l’entrée à jouer automatiquement.

Car S-Sound est capable de détecter un signal sonore sur une entrée ligne pour de jouer automatiquement le flux audio. Par exemple pour le S-Sound de la cuisine le device “AutoPlay” est le “jack” ! Ce qui veut dire que lorsqu’un signal est envoyé sur le jack, S-Sound “Cuisine” lit automatiquement cette entrée.

Autrement dit, dès que je branche un device audio sur la prise jack de la cuisine, comme le PC portable qui trône sur notre bar, le son sort immédiatement sur les enceintes de la cuisine. Même principe pour le S-Sound de la salle de bain mais avec l’entrée Chromecast. Dès lors que j’envoie un média sur le Chromecast, le son sort dans la salle de bain ! Très user-friendly Sourire

En résumé, dans mon fichier de configuration de ma Constellation, je déclare :

<package name="SSound-Cuisine" filename="SSound.zip">
	<settings>
		<setting key="EndpointName" value="Cuisine" />
		<setting key="EnableDlnaRenderer" value="true" />
		<setting key="InitialVolume" value="0,8" />
		<setting key="WaveOutDevice" value="Speakers (USB Audio CODEC )" />
		<setting key="WaveInDevices">
			<content>
				<WaveInDevices autoPlayDeviceName="jack">
					<device name="jack" deviceId="Microphone (USB Audio CODEC )" />
					<device name="chromecast" deviceId="Microphone (2- USB Audio CODEC " />
				</WaveInDevices>
			</content>
		</setting>
	</settings>
</package>
<package name="SSound-SalleDeBain" filename="SSound.zip">
	<settings>
		<setting key="EndpointName" value="Salle de Bain" />
		<setting key="EnableDlnaRenderer" value="true" />
		<setting key="InitialVolume" value="0,8" />
		<setting key="WaveOutDevice" value="Speakers (2- USB Audio CODEC )" />
		<setting key="WaveInDevices">
			<content>
				<WaveInDevices autoPlayDeviceName="chromecast">
					<device name="jack" deviceId="Microphone (USB Audio CODEC )" />
					<device name="chromecast" deviceId="Microphone (2- USB Audio CODEC " />
				</WaveInDevices>
			</content>
		</setting>
	</settings>
</package>

Il ne reste plus qu’à appliquer la configuration et la Constellation démarre les deux instances de S-Sound :

Constellation Control CenterConstellation Control Center

 

Interface de contrôle

Grace à la Constellation il est très facile de réaliser une page Web de contrôle accessible depuis un PC, une tablette ou son Smartphone.

Il suffit de créer une page HTML et d’ajouter la librairie Constellation for Javascript :

Constellation for Javascript

Au démarrage de ma page, je vais m’abonner aux mises à jour des StateObjetcs des packages S-Sound et RelayBoard :

hubProxy.requestStateObjects('*', 'RelayBoard', '*', '*');	
hubProxy.requestStateObjects('*', 'SSound-Cuisine', '*', '*');	
hubProxy.requestStateObjects('*', 'SSound-SalleDeBain', '*', '*');	
hubProxy.subscribeStateObjects('*', 'RelayBoard', '*', '*');								
hubProxy.subscribeStateObjects('*', 'SSound-Cuisine', '*' , '*');									
hubProxy.subscribeStateObjects('*', 'SSound-SalleDeBain', '*' , '*');

Lorsque ces StateObjets sont mis à jour, j’affecte la valeur des StateObjects dans des variables de mon scope Angular :

 $scope.$on('updateStateObject', function (event, message) {
     $scope.$apply(function () {		
		if(message.PackageName == "SSound-Cuisine") {
			$scope.Cuisine[message.Name] = message.Value;
		}
		else  if(message.PackageName == "SSound-SalleDeBain") {
			$scope.SalleDeBain[message.Name] = message.Value;
		}
		else  if(message.PackageName == "RelayBoard") {
			$scope.RelayBoard[message.Name] = message.Value;
		}						
		RefreshUI();
     });
 });

Par exemple, lorsque le S-Sound dans la Cuisine est entrain de jouer un media audio, il push un StateObject “State” à “Playing”. Lorsque la media s’arrête, le State passe à “Stopped”.

Dès lors, dans mon scope AngularJS, j’aurais la variable de scope “$scope.Cuisine.State” qui passera de “Playing” à “Stopped” (basé sur SignalR, tout est en temps réel). Je pourrais donc mettre à jour ma page Web en fonction de l’état des StateObject pushés par les packages S-Sound.

En me basant sur des contrôles jQueryMobile, l’interface de sélection des entrées est la suivante :

<form>
	<label>Ampli [{{RelayBoard.Relay2 === true ? 'ON' : 'OFF'}}]</label>
	<fieldset id="controlCuisine" data-role="controlgroup">
		<input name="cuisine-input" id="cuisine-input-chromecast" value="chromecast" ng-checked="Cuisine.CurrentPlayer === 'WaveInPlayer<chromecast>'" type="radio">
		<label for="cuisine-input-chromecast">Chromecast</label>
		<input name="cuisine-input" id="cuisine-input-jack" value="jack" ng-checked="Cuisine.CurrentPlayer === 'WaveInPlayer<jack>'" type="radio">
		<label for="cuisine-input-jack">Prise Cuisine</label>
		<input name="cuisine-input" id="cuisine-input-streaming" value="streaming" ng-checked="Cuisine.CurrentPlayer === 'StreamingPlayer'" type="radio">
		<label for="cuisine-input-streaming">WebRadio</label>
		<input name="cuisine-input" id="cuisine-input-off" value="off" ng-checked="Cuisine.CurrentPlayer === ''" type="radio">
		<label for="cuisine-input-off">Off</label>	
		<div class="ui-field-contain">
			<label for="cuisine-volume">Volume:</label>		
			<input type="range" name="cuisine-volume" id="cuisine-volume" data-highlight="true" value="{{Cuisine.Volume * 100 }}" min="0" max="100" />
			<label for="cuisine-radio">Radio:</label>&#160;&#160;&#160;&#160; <select ng-model="Cuisine.StreamingPlayer.Arguments" name="cuisine-radio" id="cuisine-radio" ng-options="uri as name for (name, uri) in webRadios" ng-change="ChangeStreamingUri('Cuisine', Cuisine.StreamingPlayer.Arguments)"></select>
		</div>
	</fieldset>	
</form>

L’interface affichage l’état du relais de la cuisine (StateObject “Relay2” produit par le package “RelayBoard”), affiche l’entrée sélectionnée parmi le Chromecast, la prise Jack ou la WebRadio en se basant sur le StateObject “CurrentPlayer”. J’ai aussi un slider pour le contrôler du volume.

Pour prendre en compte les changements d’entrée et le changement de volume, je m’attache en jQuery à mes contrôles :

$(':radio').click(function() {
	var scope = angular.element($("#main")).scope();
	if($(this)[0].name == "cuisine-input") {
		scope.SetPlayer("Cuisine", $(this)[0].value);
	 }
});
 
$('#cuisine-volume').on("slidestop",
	function( event, ui ) {
		var scope = angular.element($("#main")).scope();
		scope.SetVolume("Cuisine", $(this)[0].value / 100);
	});

La méthode “SetVolume” envoi simplement un message au package S-Sound avec la valeur du volume. Idem pour changer d’entrée, je n’ai qu’à envoyer un message dans la Constellation à l’attention du package S-Sound :

$scope.SetPlayer = function (location, player) {				
	if(player == "off") {
		hubProxy.stop(location);
	}
	else if(player == "chromecast" || player == "jack") {
		hubProxy.playWaveIn(location, player);
	}
	else if(player == "streaming") {					
		if($scope[location].StreamingPlayer == null || $scope[location].StreamingPlayer.Arguments == null || $scope[location].StreamingPlayer.Arguments == '') {						
			hubProxy.playMP3Streaming(location, $scope.webRadios["France Info"]); // default radio
		}
		else {							
			hubProxy.playMP3Streaming(location, $scope[location].StreamingPlayer.Arguments);
		}
	}
};

Pour les radios, il me suffit d’envoyer un message au package S-Sound pour invoquer la méthode “PlayMP3Streaming” avec l’URI du flux MP3 à jouer. J’ai donc dans ma page référencé différentes radios bindées dans une listbox :

$scope.webRadios = {};
$scope.LoadMp3Radios = function() {
	// Radio list (voir http://www.listenlive.eu/france.html)
	$scope.webRadios["France Info"] = "http://www.listenlive.eu/franceinfo.m3u";
	$scope.webRadios["France Inter"] = "http://www.listenlive.eu/franceinter128.m3u";
	$scope.webRadios["France Musique"] = "http://www.listenlive.eu/francemusique128.m3u";			
	$scope.webRadios["RFI Monde"] = "http://www.listenlive.eu/rfimonde.m3u";
	$scope.webRadios["BFM"] = "http://www.listenlive.eu/bfm.m3u";				
	$scope.webRadios["Jazz Radio"] = "http://www.listenlive.eu/jazzradio.m3u";	
	$scope.webRadios["Le Mouv"] = "http://www.listenlive.eu/lemouv128.m3u";				
	$scope.webRadios["NRJ"] = "http://www.listenlive.eu/nrj_fr.m3u";				
	$scope.webRadios["RTL2"] = "http://streaming.radio.rtl.fr/rtl2-1-44-128.m3u";	
	$scope.webRadios["Virgin Radio"] = "http://www.listenlive.eu/virginradiofr.m3u";
	// etc.. etc..
}
$scope.LoadMp3Radios();

Et voilà comment en quelques lignes de HTML et Javascript on obtient une interface Web responsive (PC, tablette, smartphone) permettant de piloter la diffusion audio de ma cuisine/salle à manger et salle de bain facilement.

Interface S-Sound sur smartphone Interface S-Sound sur PC

Notez tout de même que nous n’utilisons pas tellement cette interface étant donné que la plupart du temps le son joué dans la Cuisine est lui du PC de la cuisine et dans la salle de bain celui du Chromecast que nous pilotons nos smartphones. Et si vous avez bien suivi il s’agit dans les deux cas des entrées lignes qui sont démarrées automatiquement dès qu’il y a un signal. Donc en fait on a jamais besoin de cette interface Web sauf si on souhaite mettre une Webradio ou envoyer le Chromecast dans le Cuisine ou inversement, envoyer le son du PC de la Cuisine dans la salle de bain Clignement d'œil

Allumage automatique des amplis

Comme je l’ai mentionné dans les besoins, les amplis ne doivent être allumés que lorsqu’un média audio est en lecture autrement l’ampli doit rester éteint !

Pour cela les amplis sont alimentés via une carte relais SainSmart comme vous avez pu le voir plus haut. Cela me permet de contrôler l’alimentation des deux amplis d’un point de vue logicielle.

Concrètement j’ai développé un package nommé “RelayBoard” qui expose la méthode “SetSwitch” dans la Constellation :

image

Il suffit d’envoyer un message dans la Constellation à destination de ce package pour allumer ou éteindre un des 4 relais de la carte SainSmart.

De ce fait, dans mon package MyBrain que vous avez déjà pu découvrir dans mon article sur les alarmes connectées ou S-Energy, je vais ajouter un peu d’intelligence.

Pour cela en C# je vais créer des propriétés liées aux StateObjects de l’état (State) de mes deux S-Sound et tous les StateObjects de mon package RelayBoard :

[StateObjectLink("CEREBRUM", "SSound-Cuisine", "State")]
public StateObjectNotifier SSound_Cuisine { get; set; }
 
[StateObjectLink("CEREBRUM", "SSound-SalleDeBain", "State")]
public StateObjectNotifier SSound_SalleDeBain { get; set; }
 
[StateObjectLink(Sentinel = "CEREBRUM", Package = "RelayBoard")]
public StateObjectCollectionNotifier RelayBoard { get; set; }

Et dès que l’un des états d’S-Sound change, je vais envoyer un message au package RelayBoard pour allumer l’ampli correspondant si ce relais est éteint :

this.SSound_Cuisine.ValueChanged += SSound_StateChanged;
this.SSound_SalleDeBain.ValueChanged += SSound_StateChanged;
// ...
 
private void SSound_StateChanged(object sender, StateObjectChangedEventArgs e)
{
    // Si SSound n'est pas dans l'état 'Stop' (Stop = 0)
    if (e.NewState.GetValue<int>() > 0)
    {
        // Determination de l'ID du relais en fonction du nom du package source (SSound-Cuisine ou SSound-SalleDeBain)
        int relayId = (int)(e.NewState.PackageName.EndsWith("Cuisine") ? Location.Cuisine : Location.SalleDeBain);
        // Si l'etat du relais n'est pas connu ou qu'il est coupé
        if (!this.RelayBoard.ContainsStateObject("Relay" + relayId) || this.RelayBoard["Relay" + relayId].GetValue<bool>() == false)
        {
            // On envoie un message pour allumer le relais
            this.WriteInfo("Allumage de l'ampli #" + relayId);
            this.SendMessage("CEREBRUM/RelayBoard").SetSwitch(relayId, true);
        }
    }
}

Et à l’inverse j’enregistre deux taches qui s’exécuteront toutes les minutes pour vérifier l’état de mes S-Sound et arrêter les amplis si le S-Sound correspondant est en état “Stop” depuis plus de 60 secondes :

// Enregistrement des taches d’extinction des amplis automatique
this.AddBackgroundTask(() =>
{
    this.CheckSSoundState(this.SSound_SalleDeBain.Value, Location.SalleDeBain);
    this.CheckSSoundState(this.SSound_Cuisine.Value, Location.Cuisine);
 
}, 60 * 1000 /* toutes les minutes*/);
// ...
 
private void CheckSSoundState(StateObject ssoundState, Location location)
{
    // Si SSound en état "Stop" depuis plus de 60 secondes avec l'ampli allumé
    var relayId = (int)location;
    if (ssoundState.GetValue<int>() == 0
        && (!this.RelayBoard.ContainsStateObject("Relay" + relayId) || this.RelayBoard["Relay" + relayId].GetValue<bool>() == true)
        && DateTime.Now.Subtract(ssoundState.LastUpdate).TotalSeconds >= 60)
    {
        // Extinction du relais
        this.WriteInfo("Extinction de l'ampli #" + relayId);
        this.SendMessage("CEREBRUM/RelayBoard").SetSwitch(relayId, false);
    }
}

Et voilà fini les allers-retours dans la cave pour allumer/éteindre les amplis… la Constellation s’occupe de tout ! Dès qu’on envoi du son à l’ampli il s’allume et dès qu’il n’y a plus rien, il s’éteint !

S-Sound everywhere

S-Sound est en fait un  simple package Constellation qui tourne sur une sentinelle et à qui on précise quel est son device de sortie et ses devices d’entrée. Une fois démarré on peut lui envoyer des messages dans la Constellation pour le piloter et lui indiquer quoi “jouer”, flux MP3, fichier audio, texte à synthétiser, etc..

Comme vous l’avez vu, j’ai deux instances sur mon serveur où sont connectées mes cartes son UCA qui pilote les amplis pour la Salle de bain et Cuisine.

Mais en fait, on peut aussi démarrer d’autre S-Sound sur d’autre Sentinelle à partir du moment où celles-ci ont au moins d’un device audio ! Ainsi j’ai également des instances de S-Sound enregistrées sur mes Intel NUC, comme celui du salon et celui de ma chambre, sur mon miroir dans l’entrée ou encore sur mon PC de mon bureau.

Il devient alors possible depuis la Constellation de piloter tous ces “points de diffusion audio” de la maison. Je peux donc synthétiser du texte en audio dans n’importe qu’elle pièce de la maison ou envoyer un flux audio dans les différentes pièces.

Messages vocaux dans toute la maison

Ce qui me plait avec S-Sound c’est la synthèse de texte. Il devient alors possible de diffuser de messages vocaux dans toute la maison.

hello

Comme vous l’avez déjà vu dans mon article sur les alarmes connectées la maison est capable, grâce à S-Sound, de vous dire bonjour quand vous rentrez ou encore vous indiquez votre consommation d’eau lors de vos douches avec  S-Energy !

N’importe quel objet connecté, pages Web, packages Constellation, programmes .NET, Python ou Powershell, Arduino, Gadgeteer, Raspberry, ….  Bref n’importe quoi connecté dans la Constellation peut profiter d’un système de diffusion multi-room et ainsi envoyer des messages vocaux dans toutes les pièces de la maison.

Depuis un package .NET :

PackageHost.CreateScope(MessageScope.ScopeType.Package, "SSound-Cuisine").Proxy.Speech("Salut je suis un package .NET");

Depuis un package Python :

Constellation.SendMessage("SSound-Cuisine", "Speech", "Salut je suis un package Python", Constellation.MessageScope.package)

Depuis un Gadgeteer ou Netduino (.NET Microframework) :

this.constellation = new ConstellationProxy("http://myConstellationServer:8888/", "myAccessKey123!", "DemoGadgeteer");
this.constellation.Connect();
this.constellation.SendMessage(ConstellationProxy.ScopeType.Package, "SSound-Cuisine", "Speech", "Salut je suis un Gadgeteer/Netduino");

Depuis une page Web avec du Javascript  :

var constellation = $.signalR.createConstellationClient("http://myConstellationServer:8888/", "myAccessKey123!", "DemoJS");
constellation.server.sendMessage({ Scope: 'Package', Args: ['SSound-Cuisine'] }, 'Speech', 'Bonjour je suis une page Web');

Depuis n’importe quel objet/système avec un appel HTTP :

http://myConstellationServer:8888/rest/constellation/SendMessage?SentinelName=MyObject&PackageName=DemoHTTP&AccessKey=myAccess123!&scope=package&args=SSound-Cuisine&key=Speech&data=Bonjour je suis un appel HTTP

Conclusion

Voilà maintenant plus de six mois que S-Sound est déployé dans la maison et il n’y a pas un jour où il n’est pas utilisé !

Grace à S-Sound la maison nous dit bonjour dès que nous rentrons, nous indique notre consommation d’eau à chaque sortie de douche, allume ou éteint les amplis automatiquement quand il le faut. Bref toute musique ou tout message jouer dans la maison est piloté par S-Sound !

Logo S-Sound

Le fait d’avoir basé cette solution sur la plateforme Constellation apporte plusieurs avantages : tout d’abord cela permet de créer une interface Web de pilotage très rapidement, ça apporte également beaucoup de simplicité dans le développement comme dans le déploiement car tout est géré nativement par Constellation mais surtout ça permet d’ouvrir complètement ce service à l’ensemble des autres services et objets connectés de la maison !

A partir du moment où l’on connecte “quelque chose” dans la Constellation, tout le monde peut l’utiliser ! Et c’est ainsi que l’intelligence ambiante prend naissance…

 

Note: la plateforme Constellation ainsi que le package S-Sound seront très prochainement disponible en téléchargement. N’hésitez pas à me contacter pour vous enregistrer aux betas privées.

HighTech,Domotique,Constellation
Share this Story:
  • facebook
  • twitter
  • gplus

Comments(7)

  1. Cédric
    447 days ago

    Très intéressante aussi, comme installation !

  2. Trackback: S-Sound : la solution audio multi-room connectée dans la Constellation - Maison et Domotique

  3. kraxdaz
    441 days ago

    Salut, très beau boulot comme à ton habitude !

    J’ai posé la question sur un autre blog sans réponse, peut être que tu aurai une idée un peu plus précise de comment réaliser mon idée.

    Je chercher à diffuser du son sur les haut parleurs de la maison mais du son « live » provenant soit d’un téléphone soit d’un micro avec un bouton encastré dans le mur par exemple.
    L’idée serait par exemple de pouvoir dire aux enfant de venir manger, sans oublier de ranger avant par exemple, ou d’aller se laver les mains (les deux espaces de vie sont relativement eloignés).

    Toujours dans l’idée des enfants, j’aimerai le soir pouvoir rediriger le micro de la chambre des enfants vers le haut parleur de ma chambre pour que cela fonctionne exactement comme un babyphone.
    Et puis idem si on est dehors, pouvoir écouter les enfants depuis mon téléphone quand je travaille dans le jardin.

    Après avoir lu ton article je pense que tout est presque déjà prévu, et qu’il suffirait de mettre un micro à la place d’un jack, et simplement pouvoir régler l’endroit ou on veut que le son ressorte.

    Je suis en train de faire construire donc je vais essayer de laisser des gaines en attente à proximité des interrupteurs et des faux plafonds !

    Encore merci de partager tout ça avec nous cela donne plein d’idées!

  4. Trackback: S-Panel : une interface domotique et IoT multi-plateforme avec Cordova, AngularJS et Constellation–ou comment créer son dashboard domotique mural - Sebastien.warin.fr

  5. Yoann
    338 days ago

    Bonjour je vais bientôt faire construire ma maison, et je suis très intéressé par votre installation, pourriez vous me dire quand comptez vous rendre tout ce joli projet publique ? car je trouve votre travail passionnant.

  6. Trackback: Créez votre “Home Analytics” : l’analyse et le reporting de votre domotique, informatique et objets connectés avec ElasticSearch, Graylog, Kibana et la plateforme Constellation - Sebastien.warin.fr

  7. Erwan
    244 days ago

    Bonsoir,
    Je cherche la plateforme Constellation dont vous parlez dans pas mal de sujet.
    Où est elle disponible ?

    Merci.

Leave a comment

Comment