Module de commande vocal d'un box orange

Bonjour,

Je voudrais piloter ma box orange via la reconnaissance vocal.

Je voulais m’inspirer du module pour la Freebox mais il s’agit d’un module avec une interface graphique (si j’ai bien compris).

Je ne veux pas d’interface graphique, du coup est ce que je dois créer un module de type device ou autre chose…

Merci pour votre aide

Tu as une API pour piloter ta box ?

Tu veux déclencher quel genre d’actions ?

Dis moi un peu plus ce que tu veux faire qu’on voit ensemble comment développer ça :slight_smile:

En fait, comme pour la freebox (cf module Free de Gladys), on peut piloter la box via une url en passant en paramètre un code correspondant à la commande.

je voudrais allumer/éteidnre la box, changer de chaîne, afficher le menu, les informations du programme.

Je pense que dans un premier temps, je vais reprendre le module Freebox de Gladys en l’adaptant à Orange. Ensuite, j’intégrerai la commande vocale.

Alors j’ai essayé d’installer le module Freebox

Voici ce que j’ai lors du redémarrage de Gladys !

User hook policies loaded from /home/pi/gladys/node_modules/gladys/api/hooks/freebox/policies.
0|gladys | User hook config loaded from /home/pi/gladys/node_modules/gladys/api/hooks/freebox/config.
0|gladys | Warning: connect.session() MemoryStore is not
0|gladys | designed for a production environment, as it will leak
0|gladys | memory, and will not scale past a single process.
0|gladys | A hook (freebox) failed to load!
0|gladys | TypeError: Cannot read property ‘on’ of undefined
0|gladys | at module.exports (/home/pi/gladys/node_modules/gladys/api/hooks/freebox/lib/bind/bindBoxs.js:10:24)
0|gladys | at Hook.initialize (/home/pi/gladys/node_modules/gladys/api/hooks/freebox/lib/initialize.js:10:34)
0|gladys | at Hook.wrapper [as initialize] (/home/pi/gladys/node_modules/gladys/node_modules/sails/node_modules/@sailshq/lodash/lib/index.js:3250:19)
0|gladys | at /home/pi/gladys/node_modules/gladys/node_modules/sails/lib/hooks/index.js:88:16
0|gladys | at /home/pi/gladys/node_modules/gladys/node_modules/sails/node_modules/async/lib/async.js:52:16
0|gladys | at /home/pi/gladys/node_modules/gladys/node_modules/sails/node_modules/async/lib/async.js:548:17
0|gladys | at /home/pi/gladys/node_modules/gladys/node_modules/sails/node_modules/async/lib/async.js:542:17
0|gladys | at _arrayEach (/home/pi/gladys/node_modules/gladys/node_modules/sails/node_modules/async/lib/async.js:85:13)
0|gladys | at Immediate.taskComplete (/home/pi/gladys/node_modules/gladys/node_modules/sails/node_modules/async/lib/async.js:541:13)
0|gladys | at processImmediate [as _immediateCallback] (timers.js:383:17)
0|gladys | A hook (orm) failed to load!

Le lien pour le module Freebox https://github.com/aschelch/gladys-freebox

Le module freebox a été codé pour Gladys v2 et pas v3, il n’est pas compatible v3 !

Inspire toi de modules compatible v3, par exemple Philips hue ! Au final une box à allumer/éteindre c’est comme des Philips hue à allumer/eteindre

Je vais essayer mais je veux quand même faire un peu plus que allumer et éteindre.

Peux tu m’aider un peu pour la marche à suivre
L’objectif étant de commander la box à la voix (avec cet agent https://github.com/GladysProject/gladys-voice).
Je ne sais pas encore comment fonctionne l’agent, mais je suppose qu’il va falloir récupérer une phrase et mettre en face un action.
Faut-il développer que des services permettant d’appeler les commandes de ma box ?
Faut-il que la box soit un device dans Gladys ?

Moi je recommanderais que la box soit un device dans Gladys, ça va permettre de mapper les fonctionnalités de la box à l’interface des devices. En gros tu vas avoir un Device “box” avec des deviceTypes ( “binary” pour le “On/off”, “volume” pour la partie volume, etc… ). Ce qui est intéressant c’est que c’est peut être l’occasion que je définisse les specs d’une gestion native de la TV dans Gladys ( du moins la vidéo ), de la même façon que j’ai fais la musique récemment.

Exemple, dans gladys tu peux faire gladys.music.pause({room: 5}); nativement, avec des modules de musique qui sont pluggés dessus comme le module Sonos, on pourrait faire pareil pour la TV (je comptais le faire pour le chromecast perso)

Ensuite, pour la commande vocale c’est hyper simple. Si ta box est un device on va pouvoir gérer ça nativement sans écrire de code déjà. Et pour des demandes plus spécifiques, il faut apprendre au réseau de neurone de Gladys qui classifie les commandes à reconnaitre tes phrases, pour cela tu peux l’entrainer avec un lot de phrases.

Les phrases ressemblent à ça dans Gladys => https://github.com/GladysProject/gladys-data/blob/master/sentences/v2/fr.json. Ici c’est le lot inclue de base dans Gladys mais on peut en injecter des nouvelles à l’installation d’un module.

Après là j’ai quasiment tout réécris la partie reconnaissance de texte et réponses de Gladys pour faire quelque chose de plus robuste et plus complet, je vais publier ça ce week-end j’espère. ( ça sera une grosse maj de gladys). Il vaut mieux que tu te lance dans la partie commande juste après :slight_smile:

Salut

J’ai tenté de créer un module pour que ma box soit gérer comme un device

fichier setup.js

module.exports = function() {

  var newDevice = {
  device: {
    name: device.friendlyName,
    protocol: 'wifi',
    service: 'orange',
    identifier: 'dcodeurtv4-1.home',
  },
  types: [
    {
      type:'binary',
      sensor: false,
      min: 0,
      max: 1
    }
  ]
};

gladys.device.create(newDevice);

return Promise.resolve();

};

J’ai aussi un fait un exec et un index.js

J’ai tout copier dans api/hooks, redémarrer gladys…, il est censé ce passé quelque chose ? J’attendais a avoir un device créé dans la liste des devices sur gladys mais je n’ai rien…

Autre chose, depuis aujourd’hui, j’ai ça à chaque redémarrage

Server failed to start.
0|gladys | (received error: EADDRINUSE)
0|gladys |
0|gladys | Troubleshooting tips:
0|gladys |
0|gladys | -> Is something else already running on port 8080 ?
0|gladys |
0|gladys | -> Are you deploying on a platform that requires an explicit hostname, like OpenShift?
0|gladys | (Try setting the explicitHost config to the hostname where the server will be accessible.)

La fonction setup est appelé si tu fais :

gladys.modules.TON-MODULE.setup();

C’est aussi la fonction appelée quand tu clique sur le bouton “configuration” d’un module ( mais bon, ici comme ton module est placé à la main pour dev tu n’as pas d’entrée module dans la base de donnée ), je te conseil juste de faire un script

Sinon l’erreur que tu as est juste du au fait que tu as déjà une instance de gladys qui tourne ( l’erreur dit que le port est déjà utilisé, normal vu que gladys tourne déjà ). Tu lance gladys deux fois en gros !

Quand j’exécute le script j’ai ce message :
Error in script : TypeError: Cannot read property ‘setup’ of undefined

:frowning:

Là je n’en peux plus…je crois que je vais laisser tomber…
Maintenant quand je fais un restart de gladys, voici les erreurs que j’ai

[email protected]:~/gladys $ sudo pm2 logs gladys
[TAILING] Tailing last 10 lines for [gladys] process (change the value with --lines option)
/root/.pm2/logs/gladys-out-0.log last 10 lines:
/root/.pm2/logs/gladys-error-0.log last 10 lines:
0|gladys | at Function.Module._resolveFilename (module.js:325:15)
0|gladys | at Function.Module._load (module.js:276:25)
0|gladys | at Function._load (/usr/local/lib/node_modules/pm2/node_modules/pmx/lib/transaction.js:62:21)
0|gladys | at Object. (/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js:46:21)
0|gladys | at Module._compile (module.js:409:26)
0|gladys | at Object.Module._extensions…js (module.js:416:10)
0|gladys | at Module.load (module.js:343:32)
0|gladys | at Function.Module._load (module.js:300:12)
0|gladys | at Function.Module.runMain (module.js:441:10)
0|gladys | at startup (node.js:139:18)

[STREAMING] Now streaming realtime logs for [gladys] process
0|gladys | Error: Cannot find module ‘/home/pi/gladys’
0|gladys | at Function.Module._resolveFilename (module.js:325:15)
0|gladys | at Function.Module._load (module.js:276:25)
0|gladys | at Function._load (/usr/local/lib/node_modules/pm2/node_modules/pmx/lib/transaction.js:62:21)
0|gladys | at Object. (/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js:46:21)
0|gladys | at Module._compile (module.js:409:26)
0|gladys | at Object.Module._extensions…js (module.js:416:10)
0|gladys | at Module.load (module.js:343:32)
0|gladys | at Function.Module._load (module.js:300:12)
0|gladys | at Function.Module.runMain (module.js:441:10)
0|gladys | at startup (node.js:139:18)
0|gladys | Error: Cannot find module ‘/home/pi/gladys’

Je ne comprends rien…j’ai tout reinstaller en repartant de l’image télécharger sur le site.
Je peux me connecter via mon navigateur http://192.168.1.xx
Je créé mon compte.

Quand je me connecte en ssh et que je fais un sudo pm2 list…il ne trouve rien ???
Je fais un pm2 start gladys et j’ai les message que j’ai mis dans le poste précédent…

A l’aide :frowning:

après avoir tout recommencé calmement, j’y suis arrivé :slight_smile:

Mon device est bien créé lorsque je fait un setup()

J’ai créé un fichier sendcommand qui permet d’envoyer une requête vers ma box pour l’allumer (pour l’instant).

Je ne comprends pas trop ce que je dois mettre dans le fichier Exec() et comment l’utiliser. Pour l’instant, j’ai mis ça (pour tester)
j’ai voulu l’executer par script gladys.modules.monmodule.exec(…) mais qu’est ce que je dois mettre en paramètre ?

var request = require(‘request’);
module.exports = function(params) {

	if(params.deviceType.type !== 'binary'){
        if(params.state.value === 1){
           request("http://dcodeurtv4-1.home:8080/remoteControl/cmd?operation=01&key=164&mode=0")    
        } else {
           request("http://dcodeurtv4-1.home:8080/remoteControl/cmd?operation=01&key=164&mode=0")    
        }
	}        

return(1);

};

Bon heureusement que tu as pu t’en sortir ! :slight_smile:

Si tu l’appelle par script tu mets les paramètres que tu attends dans la fonction, c’est toi qui l’as écrite ^^

Pour le tester c’est très simple ici, pas besoin de faire un script. Vu que attends dans ta fonction un deviceType de type “binary”, créé un deviceType de type binary dans l’interface ( sur le device que tu as créé dans la fonction setup ). Tu pourrais carrément faire la création du deviceType automatiquement au setup d’ailleurs.

Puis tu peux cliquer sur le bouton “On” ou “Off” ce qui va envoyer à ta fonction exec un objet :

{
   deviceType: {
      type: 'binary',
      min: 0,
      max: 1
   }, 
   state: { 
      value: 1
   }
} 

Attention : il faut que ton device ait bien le bon service ! A savoir le nom du dossier dans lequel est ton module, cela va permettre à Gladys de savoir qu’elle doit appeler la fonction :

gladys.modules.NOM_DU_SERVICE.exec(..);

C’est plus clair ? :slight_smile:

Merci pour ta réponse, je vais essayer.

Parallèlement, j’installe Gladys-voice et j’ai ce message :
node-pre-gyp ERR! Tried to download: https://storage.googleapis.com/grpc-precompiled-binaries/node/grpc/v1.0.0/node-v46-linux-arm.tar.gz
node-pre-gyp ERR! Pre-built binaries not found for [email protected] and [email protected] (node-v46 ABI) (falling back to source compile with node-gyp)

Est ce que je dois m’inquiter ? :slight_smile:

Pas mal de gens ont ce problème, ce n’est pas lié à toi, il faut que je me penche dessus… il y a des problèmes avec une dépendance de ce module

gladys-voice tombe en erreur…c’est lié à cette erreur ?

| at Function.Module._load (module.js:300:12)
1|gladys-v | at Function._load (/usr/local/lib/node_modules/pm2/node_modules/pmx/lib/transaction.js:62:21)
1|gladys-v | at Module.require (module.js:353:17)
1|gladys-v | at require (internal/module.js:12:17)
1|gladys-v | at Object. (/home/pi/node_modules/gladys-voice/app.js:1:75)
1|gladys-v | at Module._compile (module.js:409:26)

Sinon pour revenir à mon device, j’ai fait ce que tu m’as dit, créer un deviceType et cliquer sur le bouton on/off

Voici ce que j’ai dans la log

Event : create : new Event with code : devicetype-new-value
0|gladys | Scenario : Trigger : New event : devicetype-new-value
0|gladys | Scenario : Trigger : Found 0 launchers with code devicetype-new-value

Il faut créer un event ?

Yes c’est lié !

Non non pas besoin, c’est juste le signe que ça a bien fonctionné :slight_smile: Ta fonction exec a été appelé, à toi de voir que ton code fonctionne maintenant !

Si tu veux faire des requêtes HTTP dans Gladys tu peux faire tout simplement :

gladys.utils.request('http://.....');

ça expose juste le module request, ça t’évite d’avoir à le require dans ton module :wink:

Je te conseille de mettre des logs un peu partout dans ta fonction exec pour débugger, ça te permettra un peu de voir si ça passe dans les conditions ou pas.

Tu peux aussi avoir les erreurs/succés du call http en faisant :

gladys.utils.request('http://.....')
.then((result) => {
    console.log('success!');
})
.catch((err) => {
   console.log(err);
});