Hack simple du Amazon Dash Button
TL;DR
Ce petit tutoriel vous permettra d’utiliser votre Amazon Dash Button pour contrôler n’importe quel object/service accessible via un webservice. Vous n’avez besoin que d’un Raspberry Pi (1, 2 ou 3 ici sous Raspbian GNU/Linux 8.0 Jessie) connecté à votre réseau local.
Pour rappel, le Dash Button est un bouton Wi-Fi permettant de commander simplement un ou plusieurs articles d’une même marque. Rapidement, ce bouton a été “hacké” par la communauté, en utilisant les requêtes ARP envoyées lors de la connexion du bouton au réseau Wi-Fi précédemment configuré. En effet le bouton se reconnecte au réseau Wi-Fi à chaque appui et envoie donc une requête ARP visible par tous les équipements du réseau. Il suffira donc d “écouter” le réseau sur un équipement connecté en permanence (un RPi dans mon cas) pour déclencher n’importe quelle action : allumer une ampoule Hue, déclencher l’arrosage de votre jardin ou ouvrir votre garage. Simple mais il fallait y penser 😉
Lorsque j’avais regardé il y a quelques mois, le seul script disponible pour utiliser ce “hack” était un script basé sur nodeJS. Il nécessite l’installation de node et de pas mal de librairies… Sur le RPi, certaines de ces librairies ne sont pas disponibles nativement et l’installation peut rapidement devenir un calvaire. J’avais donc laissé tomber, en me disant que je trouverais probablement un moyen plus simple. Et grâce à la magie de GitHub, ce jour est arrivé : https://github.com/maxisme/amazon-bash
Configuration du Dash Button et du Raspberry Pi
Je ne vais pas rentrer dans le détail de configuration et d’appairage du Dash Button, il est disponible sur de nombreux sites et notamment sur le site d’Amazon.
Deux choses à ne pas oublier cependant :
- Ne pas choisir de produit à commander à la fin de la configuration (à moins que vous vouliez commander de la lessive ou du café à chaque fois que vous allumez la lumière…)
- Désactiver les notifications dans l’application Amazon (Paramètres > Notifications > Mise à jour du Dash Button) sinon vous recevrez une notification push vous invitant à finaliser la configuration du bouton (cela pourrait également servir de notification dans certains cas d’utilisation)
Il y a seulement 2 pré-requis à installer sur le Raspberry Pi : arp-scan (utilisé uniquement pour la configuration et que vous pourrez supprimer ensuite) et tcpdump (l’outil qui va “écouter” le réseau)
sudo apt-get install tcpdump arp-scan
Il faut ensuite récupérer l’adresse Mac de votre Dash Button,
Téléchargez le fichier suivant (sorte d’annuaire des adresses MAC)
wget https://raw.githubusercontent.com/maxisme/amazon-bash/master/ieee-oui.txt
Tapez la commande suivante (après être passé root : sudo -i)
while :; do arp-scan --localnet -O ieee-oui.txt | grep 'Amazon'; done
- Appuyez sur votre Dash Button
- Vous devriez voir apparaître dans votre terminal
192.168.1.23 50:f5:da:2f:23 Amazon Technologies Inc.
La 2ème adresse correspond à l’adresse MAC de votre Dash Button, copiez-là, elle nous servira pour configurer le script.
Installation du script amazon-bash
Récupérez le script :
wget https://github.com/maxisme/amazon-bash/blob/master/amazon-bash.sh
Editez le script (par exemple avec vi) et ajouter l’adresse MAC récupérée auparavant:
#!/bin/bash MAC="50:f5:da:2f:23" function onClick { #code to be ran on click echo "Ding Dong" } START=$(date +%s); tcpdump -l -i eth0 ether host "$MAC" | while read b; do END=$(date +%s); diff=`echo $((END-START)) | awk 'int($1%60)'` # Get time since last click. if [ $(($diff)) -gt 3 ] # wait more than 3 seconds after last click - tcdump has multiple outputs. then START=$(date +%s) onClick & # run in background fi done
Détaillons un peu :
- la variable MAC vous permet de renseigner l’adresse MAC de votre Dash Bouton
- la fonction “onClick” : elle contient l’action que vous allez déclencher lors de l’appui sur le Dash Button, cela peut être par exemple : un appel à l’API Domoticz pour contrôler votre maison, un appel à l’API Hue pour contrôler votre éclairage, un appel à l’API IFTTT pour déclencher n’importe quel service, un appel à l’API Domino’s pour commander votre pizza habituelle…. Nous verrons un exemple ensuite.
- le lancement de la boucle d’écoute tcpdump avec vérification que vous n’avez pas cliqué trop rapidement sur le bouton
Nous pouvons maintenant tester, lancez le script puis appuyez sur le bouton :
$ sudo ./amazon-bash.sh tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes Ding Dong
Voilà ! L’appui sur le bouton est détecté par votre Raspberry Pi !
Il faut maintenant installer le script afin qu’il écoute en permanence. On pourrait se contenter de le lancer en background (sudo ./amazon-bash &) ou dans un “screen” mais que va t-il se passer si votre RPi redémarre ? Il faudra relancer manuellement… Pas très pratique. J’ai essayé beaucoup de façons différentes pour assurer le démarrage du script car il y a quelques particularités sur la séquence de démarrage du RPi. J’ai finalement créé un petit script de démarrage systemd (dispo sur GitHub) :
[Unit] Description=Amazon Bash service After=network.target multi-user.target [Service] Type=simple User=root ExecStart=<CHEMIN ABSOLU VERS VOTRE SCRIPT AMAZON BASH>/amazon-bash.sh & [Install] WantedBy=multi-user.target
N’oubliez pas d’indiquer le chemin vers votre script, par exemple :
ExecStart=/home/julien/amazon-bash.sh &
Copiez ce script dans /etc/systemd/system/ puis ajouter le à systemd :
sudo cp amazonbash.service /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable amazonbash.service
Il n’y a plus qu’à redémarrer le RPi et vérifier que le service se lance bien au démarrage, par exemple avec :
$ sudo systemctl status amazonbash.service ● amazonbash.service - Amazon Bash service Loaded: loaded (/etc/systemd/system/amazonbash.service; enabled) Active: active (running) since dim. 2017-11-19 15:46:20 CET; 6min ago
Exemple avec les lampes HUE (via Domoticz)
Si comme moi vous possédez quelques ampoules connectées de type Philips HUE et que vous n’avez pas investi dans un “interrupteur” connecté de la même marque, vous devez trouver parfois peu pratique de devoir sortir votre téléphone pour éteindre ou allumer l’ensemble de vos lumières (par exemple en rentrant avec les courses, ou en partant vous coucher le soir). C’est pour ce besoin que j’utilise mon 1er Dash Button.
Philips propose une API avec son “hub” qui permet de contrôler vos lumières comme si vous le faisiez avec votre Acheter du Viagra sans ordonnance application mobile. La 1ère solution serait donc de faire une requête http à ce hub pour déclencher le scénario voulu. Malheureusement Philips ne donne accès à sa documentation API qu’après création d’un compte sur le site web https://www.developers.meethue.com/philips-hue-api et même en y accédant, l’API n’est pas très simple car il faut utiliser un token d’identification et faire plusieurs requêtes avant d’arriver au résultat voulu.
J’ai donc choisi de passer par l’intermédiaire de Domoticz, aussi installé sur le RPi, qui est mon logiciel domotique “à tout faire”. Il permet d’ajouter le hub Philips très simplement et donc de contrôler les lampes.
Je ne vais pas détailler ici la connexion de Domoticz au hub HUE mais une fois que vous avez ajouté celui-ci vous devriez voir apparaître l’ensemble de vos lampes dans la page “Devices” de Domoticz. Il y a également quelques groupes déjà configurés comme le “Group All Lights”. C’est celui là que j’ai utilisé.
Il suffit ensuite de repérer l’IDX et de faire la requête suivante dans la fonction onClick du script :
curl -s "http://IP_DOMOTICZ:PORT_DOMOTICZ/json.htm?type=command¶m=switchlight&idx=IDX_GROUPE_ALL_LIGHTS&switchcmd=Toggle"
Par exemple :
function onClick { #code to be ran on click curl -s "https://julien:toto@192.168.1.23:8080/json.htm?type=command¶m=switchlight&idx=124&switchcmd=Toggle" }
Appuyez sur le bouton et VOILA! Vous éteignez et allumez l’ensemble de vos lumières avec votre Dash Button à 4,99 € 🙂 ! Il y a évidemment un peu de latence entre l’appui et l’action mais ça me parait acceptable, voici ce que ça donne à vitesse réelle (oui j’ai un Dash Button Pampers !)
Un grand merci!
j’ai suivi à la lettre et ca a marché nickel du premier coup! 🙂