Day: November 9, 2017

  • 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