[Tuto] Contrôle Volumio - Jeedom - Harmony Elite

Hellooooooo,

Bon, je me doute qu’avec ce que je vais écrire ici, le terme de Tuto risque d’être un peu pompeux, c’est surtout pour aiguiller et partager avec vous mon approche sur le sujet. Et puis quand j’ai cherché, j’ai rien trouvé, donc pour ceux qui cherchent, et qui auraient encore rien trouvé… bref, voilà.

Volumio kézako?

Je me suis tourné vers Volumio pour ma solution multiroom. De tout ce que j’ai cherché :

  • L’interface était la plus jolie (suivant mes goûts)
  • L’installation était la plus simple
  • Le support de la carte HiFi Berry était directe
  • Une API simple (oui je suis pas non plus très au point)
  • Support le LMS
  • Application dédiée pour le contrôle
  • Support du Airplay : Full pommé à la maison, donc indispensable
  • Plugin Spotify pour directement lancer la zik depuis le volumio et pas d’un terminal

Pour ceux que ça intéresse, vous trouverez tous les détails ici : https://volumio.org/
Inutile de vous expliquer comment faire, tellement c’est simple…

Matériel :

Pour le moment, je n’ai équipé que mon salon, donc je ne décrirai ici que cette pièces, mais pour les
Pour le matériel après de longue recherche je me suis tourné vers :

  • 2 Enceintes Kef Ci160QR intégrées au faux plafond (qui sert de caisson de basses)
  • 1 Raspeberry 4
  • 1 carte Hifi Berry Amp2 (Ampli 60W mono ou 2x30W Stéréo) : https://www.hifiberry.com/shop/boards/hifiberry-amp2/
  • 1 Alim 24V dédiée
    Je vous passe le reste avec la carte SD, le boitier, les radiateurs ainsi que le câblage.

et le tout dans son boitier

Alors première réaction certainement, « mais 2x30W c’est pipi de chat!! »
Expression de 1930, mais c’est pas grossier au moins :slight_smile:
Alors oui ça peut paraître peu mais c’est largement suffisant au regard de mes enceintes, que j’ai choisis spécifiquement pour leur sensibilité.
Je vous invite à lire ceci : l'HiFiBerry Amp 2 : jusque 60W en sortie audio! - MCHobby - Le Blog
et à rechercher les abaques permettant de déterminer la puissance nécessaire à injecter à une enceinte en fonction de son impédance, sa sensibilité et du taux de distorsion.
En résumé, dans mon cas, je crois de mémoire qu’à 15/20W j’étais au top.

Et pour les avoir poussé à fond : aucun soucis de distorsion, on s’entend plus parler bref, largement suffisant pour mettre de l’ambiance. :crazy_face:

Pré-requis

Donc maintenant que tout fonctionne, que vous avez du son, passons au côté WAF. Parce que oui au final c’est nickel, vous avez les louanges de madame ou monsieur ou j’en sais rien, mais disons que l’un d’entre eux est aussi doué en informatique et geekerie qu’un Jean Pierre Coffe à ses grandes heures, et ça vous gâche le plaisir.
Du coup à la maison, j’ai une harmony Elite 950 avec le hub… vous me voyez venir?

Il nous faudra donc :

  • Une Harmony + Hub sur laquelle vous pouvez mapper les touches
  • Le plugin Fake-Roku
  • Le Plugin HTTP Remote Events
  • Le Plugin Script
  • Le Plugin Harmony (pas indispensable, mais un plus si vous voulez allez plus loin)
  • Un réseau interne ==> la blague

Configuration Http Remote Events:

Avec lui on va récupérer la payload pouvant être émise en notification par Volumio à chaque changement d’état.
On va procéder comme pour les Webhooks de Plex pour ceux qui l’utilisent.

On créé donc un nouvel appareil dans le plugin :

Ensuite on ajoute un paramètre get

On récupère au passage l’adresse de notification de l’event
image

J’ai coupé volontairement, clef d’api oblige

Voilà, c’est fini.

Configuration de Volumio

La doc est bien fait, l’api aussi, il suffit donc d’ajouter l’adresse Http Remote ci dessus,en n’oubliant pas d’ajouter votre ip locale:

http://IPLOCALE/core/api/jeeApi.php?apikey=APIKEYi&type=httpRemoteEvent&eqId=IDCOMMANDE

IP locale car le DNS ne passe pas et de toute manière vous êtes à la maison quoi.

On se connecte en SSH sur le Pi du Volumio
Il suffit de passer notre URL ci dessus à l’adresse du volumio : http://localhost:3000/api/v1/pushNotificationUrls
D’ailleur si vous tapez ça dans votre navigateur (avec l’Ip du Volumio) vous aurez la liste des URLs de notification enregistrées.

Donc j’ai procédé de la sorte :

echo "url=http://IPLOCALE_JEEDOM/core/api/jeeApi.php?apikey=VOTRECLEF%26type=httpRemoteEvent%26eqId=IDEQUIPEMENT" >> url.txt
curl -d @url.txt -H "Content-Type: application/x-www-form-urlencoded" -X POST http://localhost:3000/api/v1/pushNotificationUrls

Ne pas oublier de remplacer les « & » par les « %26 » comme indiqué, sinon, vous n’aurez pas l’adresse complète. M’a fallut 2h pour y arriver :innocent: :rofl:

Vérifiez si tout est ok en tapant l’adresse http://IPVOLUMIO:3000/api/v1/pushNotificationUrls dans votre navigateur.

Si vous avez fait une erreur, vous pouvez supprimer l’URL via :

curl -d @url.txt -H "Content-Type: application/x-www-form-urlencoded" -X DELETE http://localhost:3000/api/v1/pushNotificationUrls

Donc maintenant, tout changement d’état sur le Volumio, enverra la payload à Jeedom via Http Events.

Récupération des Informations :

On créé un petit scénario :

  • Déclencheur : [PIECE][APPAREIL HTTPEVENT][payload]
    dans mon cas :

#[Salon][Volumio Salon Webhooks][payload]#

On ajoute le code suivant :

// On récupère le payload
$cmd = cmd::byString("#[Salon][Volumio Salon Webhooks][payload]#");
$postdata = $cmd->execCmd();

// On le décode
$postdata = utf8_encode($postdata);
$scenario->setLog('PostData :'.$postdata);
$results = json_decode($postdata);

// On récupère les éléments de la payload qui nous interessent
//Le statut de lecture : play, stop, pause etc
$status = $results->data->status;
$scenario->setLog('Status: ' . $status);
$scenario->setData('Volumio_Salon_status', $status);
//Le volume en cours
$volume = $results->data->volume;
$scenario->setLog('Volume: ' . $volume);
$scenario->setData('Volumio_Salon_volume', $volume);
//On check a tout hasard l'état mute du lecteur
$mute = $results->data->mute;
$scenario->setLog('Mute: ' . $mute);
$scenario->setData('Volumio_Salon_mute', $mute);

Je reviendrais plus tard sur la suite de ce scénario qui va me permettre de me faire une synchro complète de mon virtuel et de l’interface web.

Script d’interface Volumio (API)

J’ai utilisé ici le plugin script, on créé donc un nouvel appareil et on va créer autant de commande que nécessaire pour notre besoin.
Je vous montre la configuration de l’une d’elle :

En gros voici les requêtes que j’ai utilisé :

Play/Pause : http://192.168.1.94/api/v1/commands/?cmd=toggle
Previous : http://192.168.1.94/api/v1/commands/?cmd=prev
Next : http://192.168.1.94/api/v1/commands/?cmd=next
Mute ON : http://192.168.1.94/api/v1/commands/?cmd=volume&volume=mute
Mute OFF : http://192.168.1.94/api/v1/commands/?cmd=volume&volume=unmute
Volume : http://192.168.1.94/api/v1/commands/?cmd=volume&volume=#slider# // ne pas oublier le sous type Curseur
Volume UP : http://192.168.1.94/api/v1/commands/?cmd=volume&volume=plus
Volume DOWN : http://192.168.1.94/api/v1/commands/?cmd=volume&volume=minus

En complément j’ai les informations suivantes :

Etat Volume // pour avoir le retour du niveau de volume en cours
MuteUnMute // pour avoir le statut mute ou non de l'interface

Bien penser à les lier aux commandes correspondantes.

Bonus
Pour ma part, j’ai un scénario qui me permet de lancer la radio le matin quand je descends. La commande pour Volumio demande un petit script :

<?php 
	// Generated by curl-to-PHP: http://incarnate.github.io/curl-to-php/
	$ch = curl_init();

	curl_setopt($ch, CURLOPT_URL, 'http://192.168.1.94/api/v1/replaceAndPlay');
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_POST, 1);
	curl_setopt($ch, CURLOPT_POSTFIELDS, "{\n  \"service\": \"webradio\",\n  \"type\": \"webradio\",\n  \"title\": \"Radio Monaco\",\n  \"uri\": \"http://radiomonaco.ice.infomaniak.ch/radiomonaco-128.mp3\",\n  \"albumart\": \"http://cdn-radiotime-logos.tunein.com/s87645q.png\"\n}");

	$headers = array();
	$headers[] = 'Content-Type: application/json';
	curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

	$result = curl_exec($ch);
	if (curl_errno($ch)) {
    	echo 'Error:' . curl_error($ch);
	}
	curl_close($ch);
?>

En gros, les éléments à adapter sont :

  • title
  • uri
  • albumart
    Pour connaître ceux de votre radio favorite, lancez là, regardez la payload, et vouaaaala. :innocent: :innocent:

Attention, j’ai remarqué que ça merdait un peu si la lecture était déjà en cours, donc mieux vaut faire un stop avant de lancer la radio.

Télécommande & Fake-Roku:

Là, pas de miracle, il faut que vous ayez suffisamment de cmd fake-roku de disponible pour faire les différentes actions nécessaires, ensuite, c’est simple, on liste tous les déclencheurs, dans mon cas :
image

Ensuite il suffit, en fonction du trigger de lancer la commande script qu’on a créé plus haut., je ne vous détaille pas tout, si besoin demandez.
Pour ma part, j’ai une variable donnant l’état de l’activité Harmony en cours, je vérifie dans mon cas que l’activité est bien lancée.

Ensuite dans l’application Harmony, mappez les correspondantes de votre fake-roku dans une activité dédiée avec uniquement le roku comme dispositif.
Dans mon cas j’ai limité au strict minimum:


Seuls les boutions non cerclé d’orange sont affectés, pour éviter les fausses manipulations.

La mise en forme :
Petite mise en forme de l’appareil pour que ce soit présentable.
Voilà le résultat en mode Dark
image

Et en mode Light
image
J’ai utilisé un widget custom pour chaque bouton et une transparence pour le bouton muet (d’où le retour d’information) pour avoir un joli rendu.

Vous voyez le slider? ben ça me dérangeait qu’il ne soit pas à jour vs l’état du lecteur… pareil pour la fonction mute. Donc on reprend le scénario d’extraction de la payload (plus haut là pour ceux qui n’ont pas encore lâché). On rajoute :


En gros, si un changement apparait :

  • Via l’interface web → notif → traitement de la payload → si je volume du slider est différent on met à jour
  • Via le widget → notif → traitement de la paylard → le volume renvoyé sera le même donc on ne fait rien
    C’est assez important sinon ça boucle :rofl: :joy: :sweat_smile:

Pareil pour le mute.

En complément, je ne voulais pas avoir à lancer l’activité sur la télécommande le matin pour la radio pour prendre le contrôle. Ouais je sais je suis une feignasse, mais j’ai une sainte horreur des activités que je répète à l’identique. En plus le matin, comme les vieux, on n’écoute que la radio, toujours au même volume et on ne joue pas au DJ donc vraiment inutile de passer par l’app ou l’interface web. Du coup la télécommande devient naturelle pour éteindre quand on a fini le petit dej et qu’on passe à autre chose.

Donc l’idée c’est que ça se lance, j’ai donc rajouté dans mon scénario de sync la chose suivante :

// si on détecte une lecture et que la TV est sur OFF (ma fille ne regarde pas de dessins animés)
Si variable(Volumio_Salon_status) == "play" ET variable(Etat_TV_Salon) == "Power Off"
Alors 
         Lance(ActivitéVolumio)
         Attends variable(Etat_TV_Salon) == "Volumio" time_out=120s
Fin si

Le step d’attente sur la fin est assez important, j’ai fais un DOS sur mon hub ce matin sans ça. En effet il y a un effet ping pong entre les notifs de Volumio et ma sync, sur un temps très court. Du coup le hub Harmony n’aime pas.
Du coup je bloque le scénario le temps que l’activité soit bien lancée, comme ça au coup d’après, on ne rentre plus dans la condition.
Le diable se cache dans les détails.

Conclusion

Mon premmier boulot en autonomie sur un sujet, j’y ai passé du temps, mais je me suis amusé et j’ai appris. Du coup je partage.

Pour le coup on peut désormais :

  • Avoir la radio le matin quand on descend dans le salon, avec le volume exact qui nous va bien. (en plus des volets qui s’ouvrent, le chauffage qui s’est mis, la lumière en fonction de la luminosité etc…)
  • Le matin avoir directement le contrôle via la télécommande puisqu’on déclenche aussi le lancement de l’activité correspondante sur la télécommande.
  • Utiliser des commandes vocales, jouer avec des scénarios plus complexes…

Un exemple de la base de la domotique quoi, l’art de compliquer la vie pendant des heures pour se la simplifier pendant des jours et des jours. :hugs:

Aller, je m’arrête là, si vous avez des questions, ou besoin de détails n’hésitez pas…

EDIT 19/01/2021 : Ajout du lancement d’activité Harmony sur un démarrage de lecture.
EDIT 20/01/2021 : Correction concernant la mise en forme de l’appareil, en fait je n’avais pas utilisé de virtuel, suis con :slight_smile:

5 « J'aime »

Bravo pour le tuto :slight_smile: Petite question sur volumio, est ce qu’il est possible de synchroniser la musique sur 2 enceintes ? à l’époque non, c’est ce qui m’avait orienté vers LMS ou ca fonctionne super bien.

Hello et merci

Pour le moment je n’ai pas encore testé, j’attends un peu pour acheter un autre kit pour ma deuxième et troisième pièce.
Pour information, il y a un plugin LMS dans dispo pour Volumio directement installable depuis l’interface (web ou application). De même que Squeezelite player a utiliser avec.
Donc, je dirais que oui si tu veux rester avec LMS.

Après en regardant dans la doc ils y disent clairement que le multiroom est géré si plusieurs appareils sont disponibles : Audio Output - Volumio Documentation

Du coup, oui :slight_smile:

@gormson,

Merci pour ce magnifique Tuto.
Les ampli class D c’est plutôt bluffant en rapport volume performance.
Pour ceux qui sont vielle mode du siècle dernier en classe A ou AB
J’ai le plaisir d’avoir un DAC sabre es9038q2m qui alimente un Ampli et la magie du PI opère :wink:
Il y a un excellent article ici et Audio Science Review est extrêmement critique.

Merci, c’est vrai qu’à l’écoute, se dire que ça vient d’une solution à environ 100 euros (rasp et carte) et aussi petite d’encombrement, ça déstabilise, j’ai mis du temps à me lancer pour ça, je me disais, naaaaaan me faut 1500W pour sortir du son (Jacky Tunning si tu nous écoutes).

Merci pour l’article très interessant !! je vais l’analyser en détail !!

Perso j’étais tombé sur cet article justement sur le choix de la sensibilité :

Pour information, la solution complète 2 enceintes Kef + rasp + Hifiberry et les accessoires, j’en ai eu pour moins de 600 euros, à comparer aux 1500 euros de la solution SONOS (500 euros juste l’ampli !!) ya pas photo !!

En effet article intéressant sur la sensibilité.
Je prends l’enceinte KEF avec une sensibilité de 89db, cela donne 50W optimal comme dans l’exemple.
D’autre part l’ampli avec Alimentation=24V, HP = 8Ohm, THD+N < 0.1% → 28W
J’ignore le test à 10% de distortion, car c’est un peu violent pour les oreilles.

Exactement, perso, j’ai testé directement à fond, pour voir, ben aucun crachas, ni grésillement ou encore de trous. Et on s’entend à peine parler avec madame, donc on a validé en l’état :rofl:

Franchement, pour les personnes qui ont de bonnes enceintes (pas forcément des encastrables) ben le taf et largement fait suffit de bien choisir les différents composants.

L’alim est primordiale, l’avantage aussi de la carte c’est qu’elle alimente le Pi directement.

Du coup je vais calquer le fonctionnement pour mon bureau et la salle de bain… yen a marre des fils qui pendent lol.

Quel a été ton choix pour l’alimentation ?
Une base informatique je crois voir sur la photo

Oui c’est un peu ça, c’est une alim pour montage elec si on peut dire.
Tension d’alim 110/220V pour une sortie en DC 24V 15A 360W.
Je voulais quelque chose qui puisse encaisser des demandes en courant/tension.

Après le modèle en lui même est peut être pas au top du top mais il était bien noté et pas cher !
https://www.amazon.fr/gp/product/B0758BNMLH/ref=ppx_yo_dt_b_asin_title_o04_s01?ie=UTF8&psc=1

1 « J'aime »

Petit ajout dans le tuto pour le lancement de l’activité sur la télécommande :slight_smile: