alexylem / jarvis-api

Plugin to allow controling Jarvis remotely using RestAPI
10 stars 7 forks source link

API & Commandes imbriquées : précisions et.ou évolution possible ... #6

Closed renault1669 closed 7 years ago

renault1669 commented 7 years ago

Dans le cadre de mon intégration de JARVIS avec mon écosystème domotique, je souhaite pouvoir déclencher une commande imbriquée directement à partir de l'API, via une requête HTTP - GET ad-hoc.

Exemple :

1- détection par la domotique d'un mouvement dans une pièce théoriquement inoccupée à cet instant

2- requête http de la domotique vers l'instance de JARVIS attachée à la pièce pour déclencher une commande "BONJOUR INCONNU" définie comme suit

BONJOUR*INCONNU*==say "Etes vous toto ?" 
>OUI*TOTO*==say "Bon retour à la maison ..." && jv_curl "xxxxxxxxx"
>NON==say "qui êtes vous alors ? "

3- échanges d'informations entre JARVIS et l'inconnu par le canal oral et remonté d'informations de JARVIS vers la domotique via des requêtes http ad-hoc

Suite à une lecture attentive du fil https://github.com/alexylem/jarvis-api/issues/2 , pas de soucis pour lancer une instance de JARVIS à partir de ma console, avec la bonne commande ...

Par contre, impossible de faire cohabiter cette exécution ponctuelle avec une autre instance de JARVIS ; les 2 instances accèdent à la même ressource micro ....

_rec FAIL formats: can't open input `default': snd_pcmopen error: Device or resource busy ERROR: rec command failed HELP: Verify your mic in Settings > Audio > Mic

Et en plus, pas idéal par rapport au mode de fonctionnement que je vise, à savoir disposer d'une seule instance par PI traitant à la fois :

Question : est-ce faisable avec la version actuelle de l'API ? J'ai lu et relu plusieurs fois la documentation mais pas trouvé de réponse ...

Sinon, est-il possible de faire évoluer l'API dans ce sens ? Dans un premier temps, la seule information en retour dont j'ai besoin est le résultat du traitement / le code retour. Je n'ai pas identifié à date l'intérêt d'avoir le détail du scénario dans le JSON.

Par avance merci.

Cordialement, Laurent.

alexylem commented 7 years ago

Aaah ca me rappelle une discussion que j'ai eu sur un autre ticket ou une personne voulait justement déclencher un ordre via ligne de commande mais répondre par la voix. Il y a bien sûr un conflit avec l'API car je ne peux pas savoir à l'avance si la réponse sera donné via la ligne de commande ou la voix.

Donc voici ce sur quoi nous nous sommes mis d'accord (et c'est ainsi que ca fonctionne):

Dans ton cas il te faudra donc déclencher l'ordre en ligne de commande. C'est facile si c'est sur le même raspberry pi. C'est possible depuis le réseau en lançant une commande via SSH.

API

$> ./jarvis.sh -jx "ca va?"
[{"snowboy":"Très bien et toi ça va?"},{"debug":"*OUI*            *NON*"}]
$> # have to send answer as new command

non-API

$> ./jarvis.sh -x "ca va?"
Jarvis: très bien et toi ça va?
# *OUI*        *NON*
Jarvis: Waiting to hear 'Jarvis' # BUG
Alex: # listening voice answer

Malheureusement j'ai l'impression qu'il y a un bug car il me demande de prononcer le hotword. Bon avant que je corrige, est-ce que cette solution te conviendrait? (si j'ai bien compris ce que tu essayes de faire).

renault1669 commented 7 years ago

Retour très intéressant, merci.

Une petite question avant de me positionner sur ta proposition : Il y a bien sûr un conflit avec l'API car je ne peux pas savoir à l'avance si la réponse sera donné via la ligne de commande ou la voix.

--> pourquoi le passage de l'information - canal de retour - en paramètre de l'API d'appel n'est pas une solution viable à ce problème de prédictibilité ?

En croisant différentes informations (celles de ce fil & celles du fil https://github.com/alexylem/jarvis/issues/335 sur les hooks), j'ai l'impression que c'est lié à la stratégie que tu as retenue pour la conception de l'API : lancement d'instances spécifiques de JARVIS au travers de requêtes HTTP, plutôt que l'appel de fonctions spécifiques d'une instance unique ... Si oui, est-ce pour cela que tu as adopté le fonctionnement binaire que tu me proposes ?

Mon retour sur ta proposition :

Le seul bémol que j'identifie (en attente de confirmation de ta part), c'est l'impossibilité de faire tourner sur une même machine 2 instances de JARVIS accédant toutes les deux à la même ressource physique 'micro'

Cordialement, Laurent.

renault1669 commented 7 years ago

Je me répond sur le dernier point : 2 instances de JARVIS en même temps --> impossible voir échange https://github.com/alexylem/jarvis/issues/321

alexylem commented 7 years ago

Si oui, est-ce pour cela que tu as adopté le fonctionnement binaire que tu me proposes ?

Exactement, tu as tout compris. C'est aussi car lea Jarvis en codé en bash et je ne saurais pas comment faire réagir le script à des évènements externes. En python ca serait possible.

c'est l'impossibilité de faire tourner sur une même machine 2 instances de JARVIS accédant toutes les deux à la même ressource physique 'micro'

Je confirme... décidément tu as bien cerné le fonctionnement de Jarvis. Après on peut très bien imaginer une commande tordue qui killerait l'instance background de Jarvis avant d'utiliser le micro...

Donc GO pour corriger le bug?

renault1669 commented 7 years ago

Bonsoir Alexandre,

merci d'avoir pris le temps de me répondre.

Pas certains qu'une commande tordue apporte une valeur ajoutée à ton développement. A moi, de gérer cette contrainte en fonction de mon besoin particulier.

Donc GO pour la correction du bug.

Cordialement, Laurent;

alexylem commented 7 years ago

Après analyse (et c'est pour ca que je ne l'ai pas vu avant), le bug n'arrive que lorsque le mode conversation est à false dans Settings > General > Conversation Mode

alexylem commented 7 years ago

Voila c'est corrigé. Mettez à jour:

$> ./jarvis.sh -u
renault1669 commented 7 years ago

Je suis en mode conversation ...

J'en profite même si hors sujet : y a t'il une commande spécifique pour sortir de ce mode avant les 3 tentatives ; par exemple, je dis "Merci" et l'on sort de la conversation ...

Merci pour la mise à jour.

alexylem commented 7 years ago

alexylem/jarvis/issues/425

renault1669 commented 7 years ago

Merci. Pas assez assidu ces derniers jours. Cdlt, Laurent.