[TUTORIEL] Piloter Barre de son Samsung

Hello,
Voici un petit tuto permettant de piloter une barre de son Samsung HW-MS650.
Cette méthode devrait fonctionner (avec de légers ajustements) pour tous les appareils compatibles « multiroom Samsung ».

OBJECTIF:

  • Piloter depuis Jeedom ma barre de son (power, source, volume),
  • Récupérer l’état de la barre dans Jeedom.

RESULTATS:

  • Pilotage fonctionnel power, mute, volume, source,
  • Possibilité de piloter bien plus de chose (play, pause, playlist, etc…) avec le même principe; mais ce n’est pas détaillé ici. Toutes les methodes de l’API se trouvent ici https://github.com/bacl/WAM_API_DOC/blob/master/API_Methods.md
  • Récupération des status principaux (power, mute, volume, source).

LIMITATIONS (non exhaustif):

  • Je n’en connais pas, on peut tout faire, les commandes de l’API sont exhaustives,
  • Rappel: Votre barre de son doit être compatible « multiroom Samsung ».

PREREQUIS:

  • Plugin VIRTUEL (pour récupérer l’etat de la barre).

PRINCIPE:

  • Envoi de requêtes HTTP (API REST je pense).

FONCTIONNEMENT:

  • COMMANDE:
  • Un scénario « maitre » appelle un scénario de commande en lui envoyant (tag) les commandes à passer (1 tag « commande » et 1 tag « valeur »)(par ex. « commande=volume valeur=12 »)
  • Un scénario de commande, avec un bloc code PHP qui permet de lancer les requetes HTTP qui vont bien en fonction des tags qu’il recoit
  • STATUS:
  • Un scénario avec un bloc de code PHP tourne régulièrement, lance les requetes, récupère les infos et met à jour un virtuel info dans Jeedom

COMMANDE:

  • Créez un scénario (BarreDeSon_Commande) avec le bloc de code suivant. Naturellement, adaptez avec l’IP de votre appareil:
function launchHTTPResult($url){
    $curl = curl_init();
    curl_setopt_array($curl, array(
      CURLOPT_URL => $url,
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_ENCODING => "",
      CURLOPT_MAXREDIRS => 10,
      CURLOPT_TIMEOUT => 30,
      CURLOPT_CUSTOMREQUEST => "GET"
    ));
    $response = curl_exec($curl);
    curl_close($curl);
   	return $response;
}
// Recuperation des tags
$tags = $scenario->getTags();
$command=$tags['#commande#'];
$value=$tags['#valeur#'];
switch ($command) {
    case "power":
        if ($value == "on") {
            $url="http://192.168.2.10:55001/UIC?cmd=%3Cname%3ESetPowerStatus%3C/name%3E%3Cp%20type=%22dec%22%20name=%22powerstatus%22%20val=%221%22/%3E";
        } else {
            $url="http://192.168.2.10:55001/UIC?cmd=%3Cname%3ESetPowerStatus%3C/name%3E%3Cp%20type=%22dec%22%20name=%22powerstatus%22%20val=%220%22/%3E";
        }
        break;
    case "mute":
    	// on OU off
        $url="http://192.168.2.10:55001/UIC?cmd=%3Cpwron%3Eon%3C/pwron%3E%3Cname%3ESetMute%3C/name%3E%3Cp%20type=%22str%22%20name=%22mute%22%20val=%22".$value."%22/%3E";
        break;
    case "volume":
        $url="http://192.168.2.10:55001/UIC?cmd=%3Cname%3ESetVolume%3C/name%3E%3Cp%20type=%22dec%22%20name=%22volume%22%20val=%22".$value."%22/%3E";
        break;
    case "source":
    	// bt / optical (pour TV ARC et D IN) / aux / wifi
        $url="http://192.168.2.10:55001/UIC?cmd=%3Cname%3ESetFunc%3C/name%3E%3Cp%20type=%22str%22%20name=%22function%22%20val=%22".$value."%22/%3E";
        break;
}
$result=launchHTTPResult($url);
  • Vous pouvez créer une action, dans un autre scénario, pour passer la commande vers votre barre de son (ex: « commande=volume valeur=10 », « commande=power valeur=off », etc…).

STATUT:
Si vous le souhaitez, vous pouvez récupérer les infos de votre barre de son pour les stocker dans un virtuel:

  • Créez un virtuel qui va récupérer les infos de votre barre de son. Dans mon exemple, j’utilise 4 commandes de type info pour le power (binaire), le volume (numerique), le mute (binaire) et la source (autre):

  • Créez un scénario (BarreDeSon_Statut) avec le bloc de code suivant. Naturellement, adaptez avec l’IP de votre appareil et avec les Id de vos commandes Jeedom (par ex. « cmd::byId(1002) » => Remplacez 1002 par l’Id de votre commande, etc…):
function searchHTTPResult($url,$clef){
    $curl = curl_init();
     curl_setopt_array($curl, array(
      CURLOPT_URL => $url,
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_ENCODING => "",
      CURLOPT_MAXREDIRS => 10,
      CURLOPT_TIMEOUT => 30,
      CURLOPT_CUSTOMREQUEST => "GET"
    ));
    $response = curl_exec($curl);
    curl_close($curl);
    $balise1='<'.$clef.'>';
    $balise2='</'.$clef.'>';
    $pos1 = strpos($response, $balise1)+strlen($balise1);
    $pos2 = strpos($response, $balise2);
    $value = substr("$response",$pos1, $pos2-$pos1);
  	return $value;
}
//===============================================================================
// GetPowerStatus (Power)
//===============================================================================
$url = 'http://192.168.xxx.xxx:55001/UIC?cmd=%3Cname%3EGetPowerStatus%3C/name%3E';
$clef='powerStatus';
//------------
$result=searchHTTPResult($url,$clef);
// Mise à jour du virtuel Jeedom
cmd::byId(968)->event($result);
//===============================================================================
// GetFunctionStatus (Input) bt / optical (pour TV ARC et D IN) / aux / wifi
//===============================================================================
$url = 'http://192.168.xxx.xxx:55001/UIC?cmd=%3Cname%3EGetFunc%3C/name%3E';
$clef='function';
//------------
$result=searchHTTPResult($url,$clef);
// Mise à jour du virtuel Jeedom
cmd::byId(970)->event($result);
//===============================================================================
// GetVolume (Volume)
//===============================================================================
$url = 'http://192.168.xxx.xxx:55001/UIC?cmd=%3Cname%3EGetVolume%3C/name%3E';
$clef='volume';
//------------
$result=searchHTTPResult($url,$clef);
// Mise à jour du virtuel Jeedom
cmd::byId(969)->event($result);
//===============================================================================
// GetMute (Mute)
//===============================================================================
$url = 'http://192.168.xxx.xxx:55001/UIC?cmd=%3Cname%3EGetMute%3C/name%3E';
$clef='mute';
//------------
$result=searchHTTPResult($url,$clef);
// Mise à jour du virtuel Jeedom
if ($result == "on") 
{
  $result=1;
} 
else 
{
  $result=0;
}
cmd::byId(1002)->event($result);
  • Lancez le scénario lorsque vous voulez mettre à jour les infos (lancement du scénario par programmation, toutes les minutes par ex.).

NEXT STEP:

Cette barre est compatible Smartthings et peut être pilotée via l’application sur téléphone en wifi. J’aurai aimé arriver à utiliser cette fonctionnalité; mais je n’ai pas trouvé de moyen pour la piloter via Smarthings (sans avoir à acheter un hub Smarthings, évidemment). Si vous savez m’aider, je suis preneur de vos solutions.

Enjoy !

1 « J'aime »

Bonjour Ekinox
Merci pour ce tuto, je l’ai suivi et ça fonctionne nickel chez moi avec ma barre, je possède également deux enceintes WAM1500 mais je n’ai pas encore fais le test pour elles.
Est ce que tu as des exemples d’usage que tu fais avec Jeedom et ta barre de son ?
J’aimerai automatiser le lancement de Spotify mais pour l’instant ça ne fonctionne pas comme je veux, le fait d’allumer ma barre de son et la passer en wifi ne suffit pas à la faire apparaitre dans le plugin Spotify.
Encore merci pour ce boulot, j’aurais été incapable d’en faire autant.

Hello, ravi d’avoir pu t’aider. C’est dans ce but que nombre d’entre nous postent sur le forum afin de modestement contribuer; et c’est ce genre de retour positif, qui motive à continuer !
J’ai aménagé depuis peu au Canada; je n’ai pas bcp de matériel ici (quelques capteurs versus des 10aines en France). Donc mon besoin concernant la barre de son est très basique:

  • J’utilise Squeezebox pour faire du multiroom audio; j’ai un Rapsberry pi branché en optique sur la barre de son; Jeedom me permet de piloter la barre de son qd j’utilise ce lecteur (allume la barre, met sur OPTICAL, met au volume moyen habituel, dès que le lecteur passe sur PLAY)
  • Avec la mort de Snips, j’ai acheté une Google Home; elle me sert à piloter le volume de la barre de son (mute ou volume).
    Je n’ai pas d’autre appareil compatible « multiroom Samsung » (et je n’ai pas prévu d’en avoir d’autre).

Merci pour ton partage même si ça n’avance pas mon problème avec Spotify, ça me donne donne quelques idées :slight_smile:

Merci beaucoup @Ekinox grâce à toi je viens d’apprendre que je pouvais piloter ma barre de son Samsung HW-Q90R ! Je vais creuser mais c’est vraiment top :+1:

1 « J'aime »

Bonjour,
J’ai bien essayé le tuto pour ma barre de son Samsung HW-Q80R, mais je n’arrive pas du tout à le faire fonctionner…
Avez-vous réussi avec votre HW-Q90R ?
Merci

Bonjour,

J’ai réussi à créer le virtuel et à afficher les infos de ma barre son.
J’ai créer deux actions pour allumer et éteindre la barre. Les scénarios fonctionnent.
Par contre, je ne sais pas comment demander à mon google nest d’exécuter les actions via le plugin google smarthome.

Auriez-vous une idée?

Merci

Tannis

Si tes scénarios fonctionnent, il semble qu’il te manque des informations sur l’utilisation du plugin google; pas certain que tu trouves de l’aide sur ce fil de discussion. Perso, je n’utilise pas ce plugin et ne saurai pas t’aider.

1 « J'aime »

Bonjour,
Le port sur ma HW-Q90R est le 56001.
Cette commande permet par exemple d’allumer la barre :
http://<IP de la barre>:56001/UIC?cmd=%3Cname%3ESetPowerStatus%3C/name%3E%3Cp%20type=%22dec%22%20name=%22powerstatus%22%20val=%221%22/%3E
Je n’ai pas encore trop creusé le reste. Il faut que je joue avec l’API pour voir ce que je peux en tirer.

@Ekinox aurais tu l’API car le lien du github est HS

Lien OK pour moi. GitHub avait des problèmes ce matin.

Bonjour,

Une question : Comment récupérer l’ip de la barre ?

Merci

En général, c’est un DHCP (probablement celui de ta box internet) qui va fournir une adresse IP à ta barre de son. La mienne est connectée en Wifi; une fois le paramétrage fait sur l’application mobile et le réseau/mot de passe Wifi renseigné, elle se connecte; si je vais sur l’interface d’administration de ma box (ou mon routeur Wifi), la barre apparaît avec l’adresse IP attribuée associée.
Il est probable que dans les paramètres de l’application SmartThings tu puisses trouver cette information également; mais je n’ai pas investigué.

Ok merci de ta réponse, donc votre modele est en WIFI et bien sur l’ip se trouve facilement :slight_smile: Ma barre est en bluetooth et je ne comprenais pas comment trouver son ip d’ou ma question :slight_smile:

Bonjour, Merci pour les infos sur le port, mes fonctions fonctionnent bien pour ma HW-Q80R.
A part la source ‹ wifi ›, je n’arrive pas à basculer sur le wifi ; toutes les autres sources fonctionnent. Peut être un autre nom de la valeur ?

Hello,
En faisant un tour sur le lien vers l’API que j’ai donnée dans mon premier POST, tu peux essayer « http://ip_speaker:55001/UIC?cmd=%3Cname%3EGetFeature%3C/name%3E » qui te liste les fonctions dispos sur ton appareil.
En testant sur le mien, il m’a sorti la fonction « wifidlna » pour le wifi (pourtant, lors de mes appels, perso, çà fonctionne avec « wifi »).
Essaye cette requête et voit si çà te retourne un nom de fonction qui marche pour ton wifi.
Je ne saurais pas faire mieux.

Salut,
Merci de ta réponse, hélas j’ai essayer avec ‹ wifidlna › mais ça ne marche pas.
Et en essayant le lien qui liste les fonctions je n’ai qu’une séquence de 1111… et 0000…avec des input. Comme ci-dessous :


Devrais-je avoir autre chose ?

Sur Chrome, clic droit, « Afficher le code de la page » et tu devrais afficher le code XML de la réponse de ta barre de son.
Pour ma part:

<?xml version="1.0" encoding="UTF-8"?><UIC><method>Feature</method><version>1.0</version><speakerip>x.x.x.x</speakerip><user_identifier>public</user_identifier><response result="ok"><musiccontentsprovider>1</musiccontentsprovider><wifidlna>1</wifidlna><dmr>1</dmr><miracast>1</miracast><bt>1</bt><aux>1</aux><din>1</din><usb>0</usb><arc>1</arc><multiroomms>1</multiroomms><multiroommc>1</multiroommc><numofhdmi>1</numofhdmi><numofchannel>3</numofchannel><stepofvolume>100</stepofvolume><inputmode><input func="avsource"><notav>100</notav><av>100</av></input><input func="wifidlna"><notav>101</notav><av>100</av></input><input func="bt"><notav>100</notav><av>100</av></input><input func="aux"><notav>101</notav><av>100</av></input><input func="hdmi"><notav>101</notav><av>100</av></input><input func="optical"><notav>101</notav><av>100</av></input><input func="coaxial"><notav>000</notav><av>000</av></input><input func="usb"><notav>000</notav><av>000</av></input></inputmode></response></UIC>

« notav 000 » ou « av 000 » signifie que cette fonction n’est pas dispo sur cet appareil. Dans mon exemple, USB n’est pas dispo.

1 « J'aime »

Ok, merci…j’ai réussi à afficher la réponse de ma barre de son…j’ai bien mes fonctions hdmi, optical…wifidlna…mais lorsque j’essaye la commande « http://@ip:56001/UIC?cmd=%3Cname%3ESetFunc%3C/name%3E%3Cp%20type=%22str%22%20name=%22function%22%20val=%22’wifidlna’%22/%3E » ou avec seulement ‹ wifi ›…rien ne se passe, et tourne en boucle.

J’imagine que ta barre est bien en wifi (si tu as son adresse IP)(et pas en filaire), j’imagine que tu as déjà tenté de l’éteindre et la rallumer ?
Mes connaissances s’arrêtent là. Je ne vais pas savoir t’aider d’avantage.