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
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.
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
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
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.
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 :
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
Et en mode Light
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
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.
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