[Résolu] Problème d'installation de module et réponse de Gladys


#1

Bonjour,

Je viens de créer mon premier module Gladys, mais je rencontre deux problèmes majeurs lors de l’installation.

Voici l’URL du Git du module en question: https://github.com/JuBouillet/gladys-chucknorris

J’ai utilisé le module “Freebox” comme base de départ et modifié le code à l’aide des informations récupérées sur le Forum et la doc.
L’objectif de ce module est assez simple, je souhaite faire lire à Gladys une Chuck Norris fact… Le code n’est certainement pas parfait mais c’est juste un projet de test pour comprendre le concept derrière les modules…

Mes problèmes sont les suivants:

  • Lorsque j’utilise la méthode “install” dans mon code, celle-ci ne semble pas se déclencher et le module est alors non fonctionnel (un console.log dans la méthode install ne s’affiche même pas…). Si j’utilise la méthode setup() et que je configure mon module après l’installation, celui-ci fonctionne (le log s’affiche bien). Pour plus de détail, voici le changeset ajoutant la méthode install et qui rend le module inutilisable: https://github.com/JuBouillet/gladys-chucknorris/commit/2f24ca2199235f2c669879a4b2c23ad1dce8bb37

  • Second problème, lorsque le module est installé (via la méthode du “setup”) Gladys parvient à obtenir la réponse de l’API lorsque je lui demande des infos sur notre cher Chuck via le chat, mais celui-ci n’affiche qu’un bref “C’est fait” et le résultat de l’appel ne s’affiche qu’en cas de rafraichissement de la page. Ma question: Comment rafraîchir le chat automatiquement et ne plus afficher le message “C’est fait”?

J’espère avoir donné assez d’information, mais si besoin, n’hésitez pas à me demande plus de détail.

Merci pour votre aide :).

Julien.


#2

Bonjour,

Voici un petit point sur la situation:

Pour le problème d’installation (méthode “install” non déclenchée), il semblerai que je rencontre un soucis au démarrage de Gladys. En effet, les logs montrent une erreur au niveau du module permettant l’exécution de cette méthode…

/home/pi/.pm2/logs/gladys-error-0.log last 15 lines:
0|gladys | You have triggered an unhandledRejection, you may have forgotten to catch a Promise rejection:
0|gladys | TypeError: Cannot read property ‘then’ of undefined
0|gladys | at execInstallFunction (/home/pi/gladys/api/core/module/module.init.js:42:5)
0|gladys | at /home/pi/gladys/api/core/module/module.init.js:17:16
0|gladys | at tryCatcher (/home/pi/gladys/node_modules/bluebird/js/release/util.js:16:23)
0|gladys | at MappingPromiseArray._promiseFulfilled (/home/pi/gladys/node_modules/bluebird/js/release/map.js:61:38)
0|gladys | at MappingPromiseArray.PromiseArray._iterate (/home/pi/gladys/node_modules/bluebird/js/release/promise_array.js:114:31)
0|gladys | at MappingPromiseArray.init (/home/pi/gladys/node_modules/bluebird/js/release/promise_array.js:78:10)
0|gladys | at MappingPromiseArray._asyncInit (/home/pi/gladys/node_modules/bluebird/js/release/map.js:30:10)
0|gladys | at Async._drainQueue (/home/pi/gladys/node_modules/bluebird/js/release/async.js:138:12)
0|gladys | at Async._drainQueues (/home/pi/gladys/node_modules/bluebird/js/release/async.js:143:10)
0|gladys | at Immediate.Async.drainQueues (/home/pi/gladys/node_modules/bluebird/js/release/async.js:17:14)
0|gladys | at runCallback (timers.js:789:20)
0|gladys | at tryOnImmediate (timers.js:751:5)
0|gladys | at processImmediate [as _immediateCallback] (timers.js:722:5)

D’ailleurs, je me suis aperçu que cela ne concernait pas uniquement mon module, car la méthode “install” du module speak n’a pas fonctionné également et j’ai dû créer le dossier de cache manuellement et j’ai exécuté la création du mode de notification à l’aide d’un script dans Gladys.

Je vais donc continuer de chercher à résoudre cette anomalie…

Concernant mon second problème (rafraichissement du chat), j’ai enfin trouvé la solution!

Je vais donc détailler ici la démarche qui m’a permis de solutionner ce soucis en espérant que cela aidera d’autres personnes…

Remise en place du contexte
L’objectif de ce module est de permettre à Gladys de citer un “Chuck Norris Fact” lorsqu’un utilisateur le lui demande.

Par exemple, l’utilisateur saisie “Parle-moi de Chuck Norris” dans le chat afin que Gladys lui réponde “Certaines personnes portent un pyjama Superman. Superman porte un pyjama Chuck Norris”…

Un module pas très utile en résumé mais qui me permet de développer les interactions possible avec Gladys…

Problème: Obtenir une réponse de Gladys…
J’ai donc développé un module interrogeant une API permettant d’obtenir ces fameuses “Chuck Norris Facts”…
Cependant… Comment retourner cette information à l’utilisateur dans le chat ou tout autre moyen de notification configuré (speak, telegram etc…)?

J’ai donc cherché longuement la solution et j’ai fini par l’obtenir grâce au forum…

Fonctionnement des sentences et answers

  1. Les “sentences”

Avant de chercher à comprendre le système de réponse dans Gladys, je pense qu’il est intéressant de revoir comment initialiser un module pour que Gladys exécute le code du module lorsque l’utilisateur saisie une phrase pré-configurée (dans mon exemple, comment aller chercher une “Chuck Norris Fact” lorsque l’utilisateur saisie “Parle moi de Chuck Norris”).

Lors de l’initialisation du module, il faut donc déclaré une sentence à l’aide de la commande

Commande d’ajout de “sentence”:

gladys.sentence.create(sentences.sentenceFact)

Dans le code ci-dessus, l’objet “sentences” contient l’ensemble des “phrases” que je souhaite configurer et l’attribut “sentenceFact” correspond à la phrase “Parle moi de Chuck Norris”.

Plus précisément, l’attribut “sentenceFact” correspond à l’objet suivant:

Description sentence:

{
“uuid”: “e2483aa1-58ee-46b1-ad2b-343dc450c025”, // UUID unique de ma sentence
“text”: “Parle-moi de Chuck Norris”, // Phrase de déclenchement du module
“label”: “chuck-norris-question”, // Label de ma sentence
“service”: “cnfacts”, // Nom du module?
“language”: “fr” // Langue de la phrase
}

L’ajout de cette “sentence” va donc dire à Gladys: "Si tu reçois, le phrase “Parle-moi de Chuck Norris” pour un utilisateur parlant le français, associe là au module “cnfacts”. La méthode “command’()” sera alors exécutée.

D’ailleurs, si on regarde les logs du gladys, on constate que lorsqu’il reçoit la phrase configurée, il la “classifie” avec le label “chuck-norris-question” (préfixé par le nom du service):

Log gladys:

1|gladys-v | Received sentence : parle-moi de Chuck Norris
0|gladys | Access with token to user Julien
0|gladys | brain : classify : Identified label cnfacts;chuck-norris-question

Gladys exécute donc maintenant le module Chuck Norris Facts lorsque l’utilisateur lui demande.

  1. Les “answers”

Pour obtenir une réponse, le fonctionnement est finalement assez similaire. A l’exception de la déclaration qui se fait non plus à l’aide de la méthode “gladys.sentence.create” mais à l’aide de:

_Commande d’ajout d’“answer”

gladys.answer.create(sentences.answerFact);

Le principe est cependant le même, on déclare la réponse à l’aide d’un objet décrivant notre “phrase”:

Déclaration de “sentences.answerFact”

{
“uuid”: “ef5d7698-56b8-4fd3-b4f0-cc359e335d6b”,
“text”: “%CNFACT_ANSWER%”,
“label”: “chuck-norris-fact”,
“service”: “cnfacts”,
“language”: “fr”
}

On retrouve donc un objet identique à celui déclaré un peu plus tôt avec: un label de réponse, un UUID, le service, la langue et le texte de notre réponse. Dans cet exemple, le texte correspond à une variable qui sera remplacée par la réponse de l’API (c’est à ça que servent les signes % en début et fin de texte).

Il ne reste donc plus qu’a demander au module de retourner la réponse avec comme label “chuck-norris-fact”.

Objet retourné par la méthode "command() du module Chuck Norris Facts

{
label: ‘chuck-norris-fact’,
scope: {
‘%CNFACT_ANSWER%’: message
}
}

L’attribut “scope” contient les variables à remplacer dans la réponse (ici tout le texte…).

Voilà, j’espère que cela pourra être utile à d’autres personnes. Si cela intéresse, voici l’URL vers le Git du module: https://github.com/JuBouillet/gladys-chucknorris

Voilà, j’espère ne pas trop me tromper dans ma compréhension du fonctionnement des modules et espère revenir très vite avec une solution au problème d’installation.

Julien.


#3

Re,

Après investigation, il semblerai que l’erreur soit causée par le module Freebox. En désinstallant le module, Gladys ne tombe plus en erreur et la méthode d’installation des modules est correctement effectuée.

Je passe donc le sujet en résolue et je vais creuser au niveau du module freebox pour trouver une solution ;).

Julien.

EDIT : Une “issue” existe déjà à ce sujet et un fix pour corriger cette anomalie est proposé mais n’a pas encore été ajouté à la branche du projet: https://github.com/Lyreo/gladys-freebox/issues/1