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

plus de pages AMP !

Juste pour signaler que je viens de supprimer les pages AMP de ce site ( et oui, durant quelques temps si on ajoutait “/amp” a la fin de n’importe quelle URL, on avait une version “optimisée” mobile). J’avais pourtant bien fait le forcing; pas seulement ici mais aussi sur le site (public.fr) dont je m’occupais à l’époque du lancement du projet AMP; il y avait effectivement un coup a jouer en terme d’audience alors que les 3/4 des concurrents n’étaient pas à jour. Aujourd’hui, ça donne plus l’impression de ré-inventer le WAP.

J’aime bien quand un site charge vite, mais autant passer du temps pour optimiser le “vrai” site pour que tout le monde en profite, plutôt que juste la partie mobile, avec en plus des fonctionnalités manquantes et un analytics cassé.

Jardinage reloaded

Une petite mise a jour pour signaler que le système d’arrosage automatique a l’air de fonctionner : je ne suis pas toujours derrière à surveiller les valeurs fournies par le capteur d’humidité du sol mais j’ai bien pu voir le niveau d’eau du réservoir baisser plus rapidement lors de la récente canicule.

Quelques infos : je suis repassé sur un panneau solaire de 25w au lieu de 50w (qui lui est allé sur un autre projet). L’arduino consomme vraiment que dalle avec la lib de mise en veille que j’ai ajouté. Et le panneau sert donc principalement à recharger une batterie 12v qui est utilisée juste ponctuellement lorsque la pompe s’active.

La plante quand à elle a l’air de bien grandir malgré le gel qu’il y a eu au mois de Mars et la grêle qui lui est tombée dessus un peu après.

du coup, je pense que je vais faire la même chose sur mon balcon. J’ai investi dans une jardinière très cool. Je vais également y mettre un système d’arrosage auto (pas solaire cette fois car mon balcon n’est pas très bien exposé. Il sera donc sur secteur). Et couplé en plus avec des leds de croissance (toujours à cause de la mauvaise exposition du balcon). Les leds seront contrôlées par cronjob, soit à partir de mon raspberry pi central (celui qui contrôle déjà la lumière et affiche les horaires de train) qui n’est physiquement pas très loin, soit par un raspi Zero qui traine.

Youtube Live Stream Box avec un raspberry pi

un truc que j’ai envie d’essayer depuis que j’ai mon appareil photo hybride plein format (un sony alpha7), c’est de faire du streaming live juste pour voir ce que ca donne quand je mets mon 80mm f/1.2 dessus. Le but étant d’avoir une méthode de streaming plus ou moins nomade. Je regardais de temps a autre et j’ai vu des solutions a 500€, ou bien d’autres solutions qui pouvaiten consister a voir un intel NUC dans un sac a dos, attaché à un “Live Gamer Portable” de avermedia (le wifi étant fourni par un hotspot de mon téléphone).

OLYMPUS DIGITAL CAMERA

Finalement, et étant donné que j’avais un raspberry pi 3 qui trainait chez moi (oui oui, ce genre de trucs traine chez moi, j’ai un raspi Zero qu’il faut que je trouve quoi en faire d’ailleurs), j’ai finalement commandé une carte HDMI-in qui s’interface avec l’entrée caméra du raspberry pi. le tout est de capturer le flux vidéo et de passer par ffmpeg pour envoyer tout ça a youtube (ou n’importe quel service). J’ai fait quelques test et le live a l’air de bien marcher… Pour l’instant je lance la commande en ssh mais a terme je passerais par un petit bouton qui lancera un script shell:

raspivid -o -w 1280 -h 720 -n -awb off -t 0 -fps 30 -b 6000000 | ffmpeg -re -ar 44100 -ac 2 -acodec pcm_s16le -f s16le -ac 2 -i /dev/zero -f h264 -i -vcodec copy -acodec aac -ab 128k -g 50 -b:v 6000k -strict experimental -f flv rtmp://a.rtmp.youtube.com/live2/XXXXXXXXXXX

le raspi serait alimenté par une batterie externe pour portable (qui trainait aussi) et donc un cable hdmi entre raspi et camera.

J’aimerais aussi mettre un potentiomètre pour régler le bitrate d’envoi (ainsi que du coup un ecran oled pour l’afficher). mais ce sera dans un second temps…

 

avec ma nouvelle imprimante 3d, j’ai designé une jolie boite pour mettre tout ça dedans. Avec un peu de chance se sera prêt pour la maker faire de vendredi prochain, je pourrais tester en conditions réelles…

truc sympa c’est qu’une fois que ce sera au point, ca marchera avec ma caméra, mais aussi n’importe quel truc qui a une sortie hdmi

Impression 3D

J’ai réçu une imprimante 3D en kit (geetech prusa i3 mk 2). Cela faisait un moment que je voulais voir comment ça marche mais le prix me paraissait toujours un peu élevé…

le kit se monte en 8h. On se demande à quoi ca va ressembler au départ puis après, ca se monte vite finalement. L’intéret de l’avoir en kit est qu’ensuite on est capable de voir ce qui marche, ce qui demande de l’amélioration, et au final on n’a pas peur de démonter pour réparer.

 

forcément les premières impressions sont ratées mais la doc est finalement assez complète et la courbe d’apprentissage n’est pas trop dure, on a rapidement des résultats et des impressions de plus en plus propre. j’ai par exemple imprimé des pièces de remplacements pour l’imprimante qui gèrent mieux un probleme de vibration, ainsi qu’un support pour ventilo pour refroidir le plastique une fois qu’il est déposé sur la table d’impression (afin que le plastique soit plus rigide pour supporter la couche suivante).

Le truc a la mode en ce moment c’est les hand spinner et j’ai forcément fait le mien. Mais j’ai déjà des demandes de quelques personnes…

j’ai aussi fait des trucs utile, comme la monture pour utiliser la télécommande de mon drone sur mon vélo, en combinant deux modèles que j’ai trouvé sur thingiverse via un site de modelisation 3D.

Je vais également pouvoir faire des boites aux bonnes dimension et pas collées a l’arrache pour tous mes petits projet d’électronique (j’ai déjà une liste de truc a faire).

le plus gros probleme vient de la lenteur de l’impression (12h pour la monture de la télécommande par exemple : il a fallu imprimer des supports, ce qui ralenti considérablement l’impression).  Sur un WE, ca laisse pas beaucoup de temps…

Le projet de l’arroseur automatique (done !)

terminé !

un panneau solaire avec un controleur de charge qui recharge une batterie 12v. La batterie alimente un arduino qui mesure l’humidité du sol et déclenche (a l’aide d’un relais) une pompe immergée. La réserve d’eau se rempli soit avec l’eau de pluie, soit directement avec un tuyau d’arrosage.

Je l’ai mis en place dimanche et je suis parti après, j’espère que je ne retrouverais pas la plante noyée ce WE (j’ai quand meme testé et réglé un peu avant).

réflexion à part :

cela fait deux projet que j’utilise le clone chinois arduino uno et un protoype shield, et c’est super chouette : il y a des rails 5v et masse, un accès à tous les pins d’entrée sortie, et ca évite de souder directement sur la carte. On peut donc changer la carte rapidement pour la mettre près d’un pc afin de changer le firmware par exemple.

 

Le projet de l’arroseur automatique

J’ai vu que l’on pouvait cultiver de la vigne en pot. L’ancienne vigne n’ayant pas survécu au déménagement, je me suis donc décidé à en acheter une autre (et a changer de type de raisin, ce sera du rouge, je devrait pouvoir faire du rosé avec ça).
Avec un pot la vigne aura moins de place pour grandir, mais elle aura pour avantage le fait que je pourrais parfaitement controler le sol, et changer l’orientation par rapport au soleil si besoin.

Ils recommandent partout d’avoir une terre humide, mais qui ne baigne pas constamment dans l’eau. J’ai donc mélangé du terreau avec des copeaux de bois afin de garder l’humidité plus longtemps, fait un mix avec l’engrais qui va bien et au final ça donne ça (il faudrait d’ailleurs que je rajoute un peu plus de terreau) :

maintenant, je me suis dit que ca serait bien si on pouvait trouver un truc automatique pour garder un peu d’humidité dans le pot durant les grosses chaleurs d’été. Je vais donc tenter un petit truc arduino et réutiliser le panneau solaire qui traine dans le garage depuis des mois.

j’ai donc pensé à faire un récupérateur d’eau de pluie lié à une pompe et un capteur d’humidité. Le tout serait alimenté par le panneau solaire.

j’ai déjà fait le code (et téléchargé une lib afin d’intégrer un mode “low power” entre chaque mesure). Le capteur d’humidité à une sortie numérique à sensibilité réglable. Du coup pas besoin de faire un analogRead. 

Reste plus qu’a monter le matériel … Après ça reste surtout un moyen compliqué de faire quelque chose de simple. On verra ce que ça donne

Pedialier ovale

Hier j’ai enfin pu tester mon nouveau pédialier

Le principe est d’avoir une vitesse légèrement plus facile lorsque les jambes ne sont pas en position de puissance maximale.
C’est surtout sensible durant les montées où on est moins facilement bloqué. On sent bien que la puissance est constante. Aussi ça fait moins mal aux genoux.

Les dents en Narrow Wide (alternance dent large / dent fine ) sont censés éviter le déraillement du gros plateau. J’ai donc enlevé le guide chaine. J’ai moins de résistance au pédalage du coup.