Un bouton Amazon Dash pour contrôler une lampe Philips Hue

J’ai un peu hésité avant de rédiger ce sujet, parce que comme je l’explique dans le prochain Canard PC Hardware – bientôt en kiosque -, le concept des boutons d’Amazon me gêne un peu. Malgré tout, ça reste assez pratique, et puis…. je l’ai fait juste pour l’avoir fait.


Les boutons Amazon, je vais faire simple, ne servent qu’à faire consommer. Je n’ai rien contre Amazon (j’apprécie le service et le fonctionnement, et les liens financent en partie le blog), mais les boutons me semblent inutiles et finalement peu pratiques. Un bouton sert à commander un produit précis (et uniquement ce produit précis) en simplifiant le processus : pour des choses achetées régulièrement, une simple pression lance une commande. Le problème, selon moi, vient du fait qu’un bouton ne sert que pour un produit, empêche de profiter de certaines promotions et qu’il s’agit foncièrement d’un produit jetable.

Amazon vend deux types de boutons : ceux destinés à commander des produits et celui pour s’amuser. Les premiers valent 5 € et Amazon rembourse le prix du bouton à la première commande. En gros, si vous prenez un bouton lié à un produit que vous achetez habituellement, c’est gratuit. Le second vaut 20 $, ne s’achète pas (encore) en France et peut se programmer pour effectuer des tâches liées aux services de cloud d’Amazon. Ce sont des produits jetables dans l’absolu : ils utilisent une pile qui n’est pas amovible (lithium dans les premières générations, une simple AAA alcaline actuellement). Amazon indique ~2 000 pressions sur les versions récentes, les hackers parlent plutôt de 500 à 1 000, ce qui reste dans l’absolu assez faible. En pratique, une fois la pile vide, le bouton est bon pour la poubelle. Pour un usage legit, ça ne devrait jamais arriver dans l’absolu : il y a peu de chances de commander plusieurs centaines de fois le même produit.

Bref, j’ai acheté un bouton AMazon

Maintenant, un exemple de détournement d’un bouton Amazon : contrôler une lampe Hue. C’est plus une démonstration technologique qu’un truc vraiment utile, ceci dit : c’est assez lent et le bouton, comme expliqué avant, a une durée de vie limitée. De plus, le vrai problème, les hacks interceptent les pressions du bouton et nécessitent donc un appareil branché en permanence (Raspberry Pi, Mac, etc.). Enfin, je l’explique après, ça bloque en partie l’usage de l’application Amazon.

A la base, j’ai suivi ce tutorial et je voulais le faire sur mon Mac, directement. Le problème, c’est qu’une partie des logiciels nécessaires ne fonctionne pas sous macOS Sierra (ou OS X El Capitan) à cause du SIP et que je n’avais pas envie de désactiver le SIP juste pour ça. J’ai donc finalement utilisé un Raspberry Pi. Question matériel, rien de fou : un appareil UNIX (Linux, macOS, etc.) relié au réseau suffit. Pour les lampes Hue, il faut évidemment des ampoules et un pont.

Première étape, accéder au pont Hue. Il faut presser le bouton central et ensuite tape la commande suivante. L’adresse IP (ici 192.168.1.x) est celle du pont Hue. Vous pouvez l’obtenir avec un logiciel qui scanne le réseau (par exemple Fing) ou avec des logiciels dédiés aux Hue.

curl http://192.168.1.x/api -X POST -d'{"devicetype":"dash"}'

Elle donne en résultat un truc comme ça [{"success":{"username":"3TkMFUmTF8aKjH6T47QjY9kECawieh4NXVSeSEky"}}]. L’username est important, notez-le.

Etape suivante, choisir les lampes. Il faut quelques lignes de python. Si pip est installé sur certaines versions de Raspbian, ce n’est pas toujours le cas, la première ligne l’installe.

sudo apt-get install python-pip
sudo pip install requests
nano lampe.py

Il faut entrer le code suivant.

#!/usr/bin/env python
import requests,json

bridgeIP = "192.168.1.9"
user = "3TkMFUmTF8aKjT8T47QjY9kECawieh4NXVSeSEky"

r = requests.get("http://"+bridgeIP+"/api/"+user+"/lights/")
data = json.loads(r.text)

for i in data:
    print '"'+data[i]["name"]+'" Is light ID: ',i

Attention à bien indenter la dernière ligne. Mettez l’adresse de votre pont Hue dans bridgeIP et l’username trouvé dans la première étape dans user.

Pour l’exécuter, une simple commande : python lampe.py. Il va lister les lampes avec leur ID. Normalement, si les Hue sont bien configurées, vous trouverez facilement la lampe que vous voulez commander.

La détection du Dash Button peut être casse-pieds. Si vous l’avez déjà utilisé – c’était mon cas, pour commander un produit et rembourser le bouton – , il faut d’abord le remettre à zéro. Dans l’application Amazon, allez dans Votre compte, Gérer les appareils, sélectionnez le Dash Butoon et choisissez Désactiver ce Dash Button. Ensuite, il suffit de presser le bouton pour le remettre à zéro. Maintenant, configurez le bouton de façon classique dans l’application Amazon. Une fois le Wi-Fi configuré, attention : il ne faut pas lier de produits, en pressant la croix au moment de la configuration. Enfin, pensez à désactiver les notifications : l’application va vous notifier à chaque pression si vous ne le faites pas, pour prévenir que le bouton n’est pas configuré.

Pressez la croix

La détection par un script scapy n’a jamais fonctionné dans mon cas. Je suis donc passé par un script node.js qui – lui – fonctionne.

sudo apt-get install libpcap-dev
sudo npm install node-dash-button
cd node_modules/node-dash-button
sudo node bin/findbutton

Une fois le programme lancé, il faut simplement presser le bouton pour récupérer son adresse MAC. Une ligne comme celle-ci devrait apparaître.

Possible dash hardware address detected: ac:63:be:9i:4b:f2 Manufacturer: Amazon Technologies Inc. Protocol: udp

Dernière étape (on s’approche de la fin), un script qui va éteindre (ou allumer) la lampe.

sudo pip install qhue
nano commande.py

Le script va contenir plusieurs choses : l’adresse MAC du bouton (bedroom_dash), l’adresse du bridge (Bridge) et votre nom d’utilisateur (juste après) et enfin l’ID de la lampe (bedroomLight).


#!/usr/bin/env python
import time
from scapy.all import *

bedroom_dash = 'ac:63:be:9i:4b:f2'

from qhue import Bridge

# Connect to Hue bridge
b = Bridge("192.168.1.9", "3TkMFUmTF8aKjT8T47QjY9kECawieh4NXVSeSEky")

# Used to only trigger Dash button once
execute = True

# Variables for Hue lights
bedroomLight = b.lights[17]

# Get current state of each light
def updateStates():
    global bedroomLight_state, livingroomLight_state
    bedroomLight_state= bedroomLight().get(u'state').get(u'on')

updateStates()

def arp_display(pkt):
    global execute, bedroomLight_state

    if pkt[ARP].op == 1: #who-has (request)
        if pkt[ARP].hwsrc == bedroom_dash:
            if execute:
                updateStates()
                # Flip the light state
                bedroomLight_state = not bedroomLight_state
                # Send the new light state
                bedroomLight.state(on=bedroomLight_state)
            execute = not execute

print sniff(prn=arp_display, filter="arp", store=0, count=0)

Maintenant, il suffit de lancer le script pour que ça fonctionne.

sudo python commande.py

Normalement, ça devrait fonctionner : le bouton permet d’éteindre ou allumer la lampe.

Deux astuces qui améliorent les choses. Premièrement, régler votre serveur DHCP (Box, etc.) pour qu’il attribue toujours la même IP au bouton en fonction de son adresse MAC accélère les choses (je ne peux pas vous aider, ça dépend vraiment des appareils). Deuxièmement, il est évidemment possible de lancer le script au démarrage sur le Raspberry Pi. Rendez le script exécutable (sudo chmod +x commande.py) et ajouter la ligne suivante (/home/pi/commande.py &) à /etc/rc.local.

Pour terminer, honnêtement, j’ai fait ce sujet parce que j’avais acheté le bouton. Ca m’a pris un peu de temps pour tout configurer (en partie parce que ça n’a pas fonctionné au départ sur le Mac) et c’est lent à l’utilisation. De plus, pour un usage spécifique comme gérer une lampe, la durée de vie du bouton risque d’être assez faible. C’est peut-être plus cher, mais un Hue Dim Switch est quand même (beaucoup) plus pratique pour ça, et sans le côté jetable.