Google assistant, webhook et MQTT

ou comment faire la même chose mais autrement

Alors depuis quelques temps j’ai un Google home chez moi et je suis donc en recherche de nouveaux moyens de faire des choses sans bouger du canap’. Récemment j’ai compris comment envoyer du mqtt a peu près a n’importe quel device (raspberry, arduino, etc.) pour faire des choses derrière.

 

Dans cet exemple c’est l’execution d’un script python sur un raspberry pi.

1ere étape, créer un compte ifttt

ça c’est pas très compliqué, il faut lier son compte google pour activer assistant puis créer une applet quelconque

ensuite, lors de la création de l’action a lier a ce déclencheur il faut choisir l’option webhook :

dans mon cas j’ai choisi de mettre le webhook sur mon dédié : ca m’evite d’avoir un truc tout le temps allumé chez moi et de m’embeter avec un dyndns.

2nde étape, MQTT

sur le dédié j’ai installé un serveur MQTT (mosquitto sur ubuntu) auquel tous les devices iront s’inscrire. le broker MQTT ne sert qu’a transférer les messages recus provenant de plusieurs endroits (ici uniquement ifttt mais il pourrait y en avoir d’autres) vers tous les devices abonnés.

sur le dédié :

sudo apt-get install mosquitto

puis lire le readme, faire la conf et lancer le service

sur le raspberry, il faut installer un client MQTT, l’installer en tant que service afin qu’il se lance au démarrage et y coller des scripts ou autres a actionner lors de la réception de certains messages.

le client

voici un script python qui lance un client et permet de d’y coller des scripts :

import paho.mqtt.client as mqtt
from subprocess import call

# Don't forget to change the variables for the MQTT broker!
mqtt_topic = "lights/lum1"
mqtt_broker_ip = "XXXXXXXX"

client = mqtt.Client()

# These functions handle what happens when the MQTT client connects
# to the broker, and what happens then the topic receives a message
def on_connect(client, userdata, rc, el):
    # rc is the error code returned when connecting to the broker
    print "Connected!", str(rc)

    # Once the client has connected to the broker, subscribe to the topic
    client.subscribe(mqtt_topic)

def on_message(client, userdata, msg):
    # This function is called everytime the topic is published to.
    # If you want to check each message, and do something depending on
    # the content, the code to do this should be run in this function

    print "Topic: ", msg.topic + "\nMessage: " + str(msg.payload)
    if ( str(msg.payload) == "on" ):
        call("/home/pi/startupgpio")
    if msg.payload == 'off':
        call("/home/pi/offgpio")
    # The message itself is stored in the msg variable
    # and details about who sent it are stored in userdata

# Here, we are telling the client which functions are to be run
# on connecting, and on receiving a message
client.on_connect = on_connect
client.on_message = on_message

# Once everything has been set up, we can (finally) connect to the broker
# 1883 is the listener port that the MQTT broker is using
client.connect(mqtt_broker_ip, 1883)

# Once we have told the client to connect, let the client object run itself
client.loop_forever()
client.disconnect()

on peut voir que ca utilise la lib python paho-mqtt :

sudo pip install paho-mqtt

il y a deux lignes de conf au début et un gros “if” qui lance des scripts shell (startupgpio et offgpio) en fonction du message reçus sur le topic “lights/lum1”.

a partir de là on peut faire a peu près ce qu’on veut….

en fonctionnement c’est aussi rapide que les commandes  normales de Google Home, peut etre une demi-seconde plus lent. L’intérêt de passer par un dédié est que je peux lancer les commandes depuis l’assistant de mon téléphone sur la 4G. Et je n’ai qu’a configurer le hostname de mon dédié dans tous mes devices, ce qui veut dire qu’ils pourraient fonctionner même s’ils sont sur des réseaux différents tant qu’ils sont connectés au net.

Avec ifttt, il y a aussi possibilité de passer des valeurs numériques et j’aimerais bien actionner un petit servo par la voix (je ne sais pas encore pour quoi faire). Après, tout ça c’est un peu prendre un marteau pour écraser une mouche ; mais ça me permet de toucher un peu à MQTT et j’aime bien l’idée de pouvoir envoyer des commandes a des trucs chez moi pendant que je ne suis pas là… J’ai de l’esp2866 qui devrait arriver bientot, je trouverais des trucs a faire

3 comments

  1. Bonjour.
    Post très instructif, j’ai vu un peu la même chose avec l’utilisation de l’interface IO-Adafruit sans passer par une requête webhook.
    Par contre, j’ai une question. Dans tous les exemples que j’ai pu voir, on ne mentionne que le “passage d’ordre” descendant. C’est à dire de Google assistant vers un “actionneur”.
    De mon coté, je cherche à faire remonter une info sur demande.
    J’ai quelques ESP2866 équipé de sonde de T°et je cherche à faire un truc du genre : “quelle est la température du salon? ” et que Google me réponde la valeur de la température.
    Pour le moment, je fais choux blanc, je ne trouve pas de réponse… Si jamais tu t’es déjà penché sur ce problème et que surtout, tu as trouvé une solution, je suis preneur.
    Merci

  2. Salut !
    non effectivement tu ne peux pas faire remonter des infos vers ton google home. La seule solution est de faire une application et de publier en tant qu’action : https://gloob.eu/2017/11/15/les-prochains-trains/

    dans ce truc lorsque tu fais “prochain départ de montparnasse a versaille rive gauche”, Google va interroger un webservice hebergé par moi qui renvoi ensuite du JSON avec dedans une phrase que le Google Home doit dire (“le prochain train est a XXXX….”).
    Du coup le webservice peut très bien etre un truc qui va chercher la température chez toi.

    Le probleme c’est que les applications google home doivent être approuvées et sont ensuite disponible pour tout le monde, et donc tout le monde pourrait demander quel température il fait dans ton salon.

    je suis pas sûr qu’il soit vraiment possible de faire remonter des informations vers les google home en fait (autrement que par la voie des applications officielles et approuvées). Ce doit être un fait voulu pour Google…

Leave a comment

Your email address will not be published.