[plugin] Plugin Mood Audio

Bonsoir,

J’utilise MoodeAudio sur RPI avec un Dac et je cherchais un plugin pour piloter l’interface depuis Jeedom.
http://moodeaudio.org/

Armé de mon tuto, j’ai entrepris un modeste plugin.

La config est ultra simple

Les actions sont créées automatiquement
image

Si vous trouvez l’idée interessante, faites moi part de vos commentaires.

1 « J'aime »

Bonjour,

Je bute sur un problème dans les code, si un expert pouvait jeter un oeil :wink:
Le volume + / - stop…fonctionne

Je voudrais avoir un curseur et passer directement le volume, et c’est ici

  $volume_set = $this->getCmd(null, 'volume_set');       
      if (!is_object($volume_set)) {
        $volume_set = new moodeaudioCmd();
        $volume_set->setLogicalId('volume_set');
        $volume_set->setIsVisible(1);
        $volume_set->setOrder(4); 
        $volume_set->setName(__('Volume', __FILE__));
        $volume_set->setDisplay('icon', '<i class="fas fa-volume-off"></i>');
      }
      $volume_set->setType('action');
      $volume_set->setSubType('slider');
      $volume_set->setConfiguration('minValue', 0);
      $volume_set->setConfiguration('maxValue', 100);            
      $volume_set->setValue($volknob->getId());   
      $volume_set->setEqLogic_id($this->getId());
      $volume_set->save();

Je n’arrive pas à récuper la valeur de volume dans $volume_set ou $volknob

      log::add('moodeaudio', 'info', '-----COLLECTE VOLUME ----------');
      $volknob = $this->getconfiguration('volknob');
      log::add('moodeaudio', 'info', '*****************Volume volknob: '.$volknob);

Mon log est vide

[2021-01-21 22:00:52] moodeaudio.INFO: -----COLLECTE VOLUME ---------- [] []
[2021-01-21 22:00:52] moodeaudio.INFO: *****************Volume volknob:  [] []

J’ai mis à jour les fichier sur le Gihub

Merci de votre aide

Salut,

la valeur du slider sera dans l’array $option

Donc je suppose que là tu es dans ton cmd::execute:
donc quelque chose du genre:

public function execute($_options = array()) {
    if($this->getLogicalId()=='volume_set') {
        $volume = $_options['slider'];
        # implementation to set volume
        ...
    }
}

Hello Mips,

On est samedi, j’ai fini un peu tard hier et réattaqué ce matin, je vais tacher de faire court pour toi également.
Cela me donne un rendement proche du néant :wink:
En 2 mots : Ca marche :innocent:

1 « J'aime »

Ca avance bien :
-le plugin collecte toutes les données nécessaires et bien plus (config…)
-les boutons fonctionnent

Bonjour,

Le plugin est fonctionnel et souhaiterai le rendre compatible avec Volumio via un menu

1/ je n’arrive pas à faire apparaitre ou disparaitre le menu URL en fonction du Choix :
-MoodeAudio
-Volumio

	<legend><i class="fas fa-cogs"></i> {{PLAYER}}</player>

								<div class="form-group">
									<label class="col-sm-3 control-label"> {{Type de player}}</label>
									<div class="col-sm-7">
										<select class="eqLogicAttr form-control"data-l1key="configuration" data-l2key="measure_type">
											<option value="MoodeAudio">{{MoodeAudio}}</option>
											<option value="Volumio">{{Volumio not yet!}}</option>
											
										</select>
									</div>
								</div>


								<legend><i class="fas fa-cogs"></i> {{URL}}</legend>
								<div class="form-group">
									<label class="col-sm-3 control-label">{{URL Moode Audio}}</label>
									<div class="col-sm-7">
										<input type="text" class="eqLogicAttr form-control" data-l1key="configuration" data-l2key="URL_param" placeholder="{{192.168.1.x}}"/>
									</div>
								</div>

2/ J’ai créé des onglets et je souhaiterai que les commandes soient créés dans des onglets différents

Voici la création des onglets

	<!-- Onglets -->
		<ul class="nav nav-tabs" role="tablist">
			<li role="presentation"><a href="#" class="eqLogicAction" aria-controls="home" role="tab" data-toggle="tab" data-action="returnToThumbnailDisplay"><i class="fas fa-arrow-circle-left"></i></a></li>
			<li role="presentation" class="active"><a href="#eqlogictab" aria-controls="home" role="tab" data-toggle="tab"><i class="fas fa-tachometer-alt"></i><span class="hidden-xs"> {{Équipement}}</span></a></li>
			<li role="presentation"><a href="#commandtab" aria-controls="home" role="tab" data-toggle="tab"><i class="fas fa-list"></i><span class="hidden-xs"> {{Commandes}}</span></a></li>
			<li role="presentation"><a href="#infotab" aria-controls="home" role="tab" data-toggle="tab"><i class="fas fa-music"></i><span class="hidden-xs"> {{Info}}</span></a></li>
			<li role="presentation"><a href="#ostab" aria-controls="home" role="tab" data-toggle="tab"><i class="fas fa-cog"></i><span class="hidden-xs"> {{OS}}</span></a></li>
		</ul>

Par exemple la commande Play, que je souhaiterai déplacer dans le Tab « info »

	$play = $this->getCmd(null, 'play');      
     	if (!is_object($play)) {
     		$play = new moodeaudioCmd();
     		$play->setLogicalId('play');
     		$play->setIsVisible(1);
     		$play->setOrder(2);   
     		$play->setName(__('Play', __FILE__));
     		$play->setDisplay('icon', '<i class="fas fa-play"></i>');
     	}
     	$play->setType('action');
     	$play->setSubType('other');
     	$play->setEqLogic_id($this->getId());
     	$play->save();

3/ Je pensais mettre un cron chaque minute pour collecter la musique en cours, j’ai compris que il est possible d’utiliser le Daemon. Une solution est elle meilleur que l’autre ?

Bonjour,

Un petit « UP », si quelqu’un pouvait m’apporter un éclairage sur ces questions

Merci d’avance

Désolé pas encore regardé, enfin si mais en vitesse.
Faut que je me plonge un peu dedans.
Mais je ne t’ai pas oublié, j’ai toujours le rappel.

1 « J'aime »

Pour cela il faut mettre un js dans on fichier moodaudio.js qui va déclencher sur changement de la valeur dans la liste, exemple:

$('.eqLogicAttr[data-l1key=configuration][data-l2key=measure_type]').on('change',function(){
    if($(this).value()=='MoodeAudio') {
        $('.moodaudiourl').show();
    } else {
        $('.moodaudiourl').hide();
    }
});

En supposant que tu as mis la class moodaudiourl sur les labels et input que tu veux cacher ou montrer

Pour ça tu dois adapter la fonction function addCmdToTable(_cmd) {} et tester dans quel onglet tu te trouves pour savoir si tu dois afficher la commande ou la passer.

Mais je ne recommande pas du tout de faire cela:

  • d’abord je ne sais pas trop ce qu’il va se passer lors du save, toutes les commandes ne seront pas envoyées et donc il faudra que tu rajoutes une gestion dans la méthode dontremovecmd de ta class cmd
  • ce n’est pas du tout habituel ni standard sous jeedom et donc ca risque d’être plus pertubant qu’autre chose

Difficile à dire, cela dépend de comment tu dois récupérer les infos, de comment tu te connectes au device.
Si de toute façon c’est pour faire un call http une fois toutes les minutes alors le cron suffit je pense.

Bonjour, je voulais savoir si il était possible de lancer une radio sur MoodeAudio avec le plugin ?

Bonsoir,
Je vais regarder cela, mais pas possible à ma connaissance.
Ayant dit cela, je le fais avec LMS et squeezebox le matin.

Merci, je peux essayer de donner un coup de main, je suis développeur PHP mais j’ai pas trouvé de doc clair sur l’API de Moode.

Pour lancer une radio, ça peut le faire depuis le navigateur avec les commandes suivantes lancées à la suite :

http://IP_MOODE/command/?cmd=clear
http://IP_MOODE/command/?cmd=add http://icecast.radiofrance.fr/franceinter-hifi.aac
http://IP_MOODE/command/?cmd=play

Pour pouvoir le faire depuis jeedom, j’ai créé un script sur moodeaudio :

sudo nano /var/www/command/franceinter.sh

#!/bin/bash
mpc clear
mpc add 'http://icecast.radiofrance.fr/franceinter-hifi.aac'
mpc play

sudo chmod +x /var/www/command/franceinter.sh

Il faut ensuite modifier le fichier /var/www/command/index.php

// SH, PHP or other defined commands
elseif (stripos($_GET['cmd'], '.sh') !== false || stripos($_GET['cmd'], '.php') !== false) {
        // Check for valid chrs
    if (preg_match('/^[A-Za-z0-9 _.-]+$/', $_GET['cmd'])) {
                // Reject directory traversal ../
                if (substr_count($_GET['cmd'], '.') > 1) {
                        echo 'Invalid string';
                }
                // Check for valid commands
        elseif (stripos($_GET['cmd'], 'vol.sh') !== false) {
                        $result = sysCmd('/var/www/' . $_GET['cmd']);
                        echo $result[0];
        }
        elseif (stripos($_GET['cmd'], 'franceinter.sh') !== false) {
                        $result = sysCmd('/var/www/command/' . $_GET['cmd']);
                        echo $result[0];
        }
        elseif (stripos($_GET['cmd'], 'libupd-submit.php') !== false) {
                        $result = sysCmd('/var/www/' . $_GET['cmd']);
                        echo 'Library update submitted';
        }
        else {
            echo 'Unknown command';
        }
    }
    else {
        echo 'Invalid string';
    }
}

Puis dans jeedom j’ai un script qui lance cette commande :

http://IP_MOODE/command/?cmd=franceinter.sh

Je ne sais pas si c’est bien propre, mais en tout cas ça marche.

Peut-être que ton plugin peut appeler les 3 premières commandes à la suite pour éviter de passer par le script sh.

Bonsoir @loicfavory ,

Oui, bien sûr, tu as raison il n’existe pas de doc sur L’API.
Barvo, comme tu as les commandes, il sera possible de les intégrer.

Je regarde ça.

En fait l’API (si on peut appeler ça une api) utilise les commandes MPC à priori.
J’ai trouvé cette doc qui à l’air de faire le taf : mpc(1) - Linux man page

@loicfavory, Très intéressant ce rapprochement avec les commandes MPC.

Je suis « padavan », si tu es volontaire, tu es également bienvenu pour améliorer le plugin

Bonsoir @loicfavory,

J’ai intégré la radio sur le modèle que tu utilises,
L’URL du flux à écouter dans le message de la commande Radio.
Tu ne seras pas dépaysé,en image cela donne dans un scénario.