google home

Vous souhaitez créer votre propre chatbot pour pouvoir piloter votre domotique par la voix ? C'est possible très facilement grâce à Google Home et la plateforme de développement de chatbot Dialogflow !

Dialogflow est l'outil de chatbot API.AI racheté par Google en 2016 et qui permet en quelques clics de créer un chatbot intégrable avec Google Home, Alexa, Facebook et bien d'autres outils en ligne.

dialogflow intents

Pour permettre à Dialogflow de communiquer avec votre solution domotique pour piloter votre maison, Google a mis en place la notion de "fullfillment".

dialogflow google home architecture

Dialogflow réalise un appel HTTP au service que vous lui avez défini (dans la partie paramètre du chatbot) à chaque intention configurée pour répondre un "fullfillment". Dans mon cas, le webservice répondant au "fullfillment" est hébergé sur un serveur Node-Red assurant la gestion de l'ensemble de ma domotique et hébergé sur un Raspberry Pi localisé derrière ma Freebox.

dialogflow fullfillment config

dialogflow fullfillment

Afin de simplifier l'intégration de votre domotique avec cette API Dialogflow obligatoire pour permettre de recevoir des requêtes et y répondre, il existe un module Node-Red permettant d'exposer très facilement une API compatible. Ce module se prénomme node-red-contrib-google-action-dialogflow-http, il existe en version HTTPS : node-red-contrib-google-action-dialogflow comme en version HTTP.

Pour que ce service Node-Red puisse être appelé par les serveurs de Dialogflow, il est nécessaire :

  • D'utiliser soit d'une IP fixe sur Internet, soit d'un serveur dynamique DNS comme Dyndns par exemple.
  • Que le service soit accessible sur Internet en HTTPS avec un certificat signé par une autorité publique.
  • De configurer votre routeur Internet (freebox, livebox ...) pour qu'il transmette les requêtes HTTPS reçues vers votre serveur NGINX assurant la terminaison SSL.

Après avoir testé que votre service Nginx est correctement accessible depuis Internet, il vous faut un certificat SSL afin que Dialogflow accepte de transmettre les requêtes de "fullfillment". Le plus simple est de configurer un certificat gratuit obtenu auprès de Letsencrypt. Vous trouverez de nombreuses documentations en ligne détaillant la procédure de configuration d'un reverse-proxy NGINX sur un Raspberry Pi.

Une fois le reverse proxy fonctionnel, vous devez maintenant installer au sein de votre installation Node-Red le module node-red-contrib-google-action-dialogflow-http pour permettre à votre serveur Node-Red de recevoir les requêtes de fullfillment transmises par DialogFlow.

$ npm install node-red-contrib-google-action-dialogflow-http

Dès le module installé et le noeud Node-Red "Google Action Dialogflow Http" déployé, vous observerez que ce module possède une configuration si vous cliquez dessus. Par défaut ce nœud démarre un mini service Web écoutant sur le port 8089. C'est justement sur ce port qu'il faut que Nginx transmettre l'ensemble des requêtes en mode reverse proxy SSL.

dialogflow node red config

Voici un exemple de configuration de vhost NGINX intégrant les certificats SSL générés par Letsencrypt.

server {
        listen 80 default_server;
        server_name mondomaine.com;

        root /var/www/html/;

        location ~ /.well-known {
                allow all;
        }
}

server {
      listen 443 ssl default_server;
       server_name mondomaine.com;

       root /var/www/html/;

       ssl_certificate          /etc/letsencrypt/live/mondomaine.com/fullchain.pem;
       ssl_certificate_key      /etc/letsencrypt/live/mondomaine.com/privkey.pem;
       ssl_trusted_certificate /etc/letsencrypt/live/mondomaine.com/fullchain.pem;

       location / {
                proxy_pass    http://localhost:8089;
                auth_basic "Restricted Content";
                auth_basic_user_file /etc/nginx/.htpasswd;
       }
}

Vous remarquerez l'utilisation d'une authentification de type basic auth pour protéger le service d'appel illicites par des hackers.

Une fois le service configurez, essayez de positionner un composant de type "Switch" capable de router chaque intention reçue vers des actions Node-Red. Dans mon cas j'utilise principalement des requêtes REST de type GET pour ouvrir et fermer mes volets et stores.

dialogflow node red config switch

Vous noterez que l'intention reçue transmise par Dialogflow se cache dans l'objet ci-dessous et que le switch utilise cet objet pour réaliser les bonnes actions en fonction de l'intention reçue.

msg.body_.result.metadata.intentName

Pour tester que vous recevez bien les requêtes de "fullfillment", assurez-vous que votre Google Home soit configuré avec votre compte Google et assurez vous que votre chatbot Dialogflow ait bien le service d'intégration Google Home actif depuis l'onglet intégration du portail Dialogflow.

dialogflow integration

google action config

Un point d'attention dans Google Actions est de ne pas publier votre bot, sinon il risque d'être visible par tous les utilisateurs de Google Home si il passe les étapes de validation de Google ...

Si tout est OK, essayez de solliciter votre chatbot sur votre Google Home en précisant à votre Google Home :

OK Google, parler avec 'le nom de votre bot'

Le nom de votre bot est le nom que vous avez précisé dans la page de configuration de Google Actions lorsque vous avez activé l'intégration Google Home depuis le portail de DialogFlow. Par défaut, c'est l'intention d'accueil de votre chatbot qui vous accueillera.

Le seul point noir de cette intégration est qu'il semble être aujourd’hui impossible de solliciter un chatbot Google Home en version de développement directement sans la phase de confirmation de Google indiquant que vous allez parler à un robot de test. Dialogflow a été conçu pour construire de chatbots diffusés à grande échelle et n'est pas tout à fait adapté à la construction de chatbots personnels comme c'est le cas dans cet exemple.

1. Le , 23:40 par tuxtof
687aa41514b6c9c006baae7a22a75b53

Bonjour Ludovic,

Quelle surprise de tomber sur cet article et de voir qu’on parle de mon plugin node-red et d’en découvrir aussi un fork en http.
C’est chouette car tu décrit parfaitement l’idée première pour laquelle j’ai bricoler ça rapidement.
Pour ma part interfacé avec du KNX , Hue et RTI pour gérer volet, lumière, musique, home cinéma

Bonne continuation

2. Le , 22:54 par Ludovic
9ab09dd3e305f924f8930e20e1a35843

Excellent plugin Tuxtof ;-)

As-tu prévu une option pour désactiver le HTTPS ou faut-il encore utiliser le fork HTTP ?

3. Le , 23:13 par tuxtof
538e42481bd4fda699e19414661deae7

oui si ya un besoin faudrais que je le rajoute, mais si vous mettez un reverse proxy devant ça sert a rien de forker un autre port, faut que je modifie l'approche

reste plus qu'a trouver du temps pour modifier tout ça.

sinon excellent blog ;-)

4. Le , 22:52 par Ludovic
9ab09dd3e305f924f8930e20e1a35843

Merci Christophe !
Il aurait fallu que Orcema te propose plutôt une pull request ... Au lieu de faire un fork.

https://github.com/orcema/node-red-...

5. Le , 08:35 par tuxtof
538e42481bd4fda699e19414661deae7

oui je te l'accorde

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.