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)

Screenshot_20171105-191945

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
  1. Appuyez sur votre Dash Button
  2. 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 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&param=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&param=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 !)

 

 

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *