Detournement de Dash Bouton


Je ne souhaite pas faire un énième tuto pour montrer comment détourner le bouton "dash d'amazon" de sa fonction première. Il en existe déjà pas mal et je ne vais pas parodier ce que j'ai lu pour réaliser à mon tour l'opération. 
Par contre, je ne sais pas si c'est pareil pour vous, mais moi quand je lis des tutoriels, même en les suivant à la lettre, il y a quasiment systématiquement des choses qui ne marchent pas ou des tas de questions que je me pose. Et souvent ce sont des questions vraiment triviales tellement triviales qu'elles ne sont pas abordées dans le tuto. Du coup je dois faire des recherches sur Internet, je perds du temps à trouver les réponses et quand je ne le trouve pas j'improvise. Et je me plante !
Enfin bref, l'idée de ce billet dans mon blog, c'est d’apporter un peu de valeur ajoutée en faisant partager les problèmes rencontrés, les questions triviales que je me suis posé et bien entendu les solutions que j'ai trouvé.

PS: En cliquant sur ce lien vous pourrez acheter des Dash Button sur Amazon et m'encourager en me faisant gagner 1 centime ! La fortune ! 


C'est quoi un "Dash Button" ?


Comme vous le savez surement le "Dash Button" est un petit bouton wifi vendu par Amazon qui ressemble à une sonnette de porte. Ce bouton est associé à une marque et une pression sur le bouton permet de commander de manière automatique les produits de cette marque que vous aurez sélectionné lors de la configuration sur l'application Android ou IOS Amazon.
L’intérêt de détourner ce produit de son usage initial pour l'utiliser dans une solution domotique est son prix. Pour 4€99 vous avez un bouton connecté fonctionnant sur pile. Pour ma part je n'ai trouvé aucun bouton connecté générique à moins de 25-30€. Je suppose que les marques en subventionnent une partie. 

Quand à son utilisation je ne sais pas encore vraiment ce que je vais en faire. Je pense à faire un compteur de sac de pellets, ou alors pour mémoriser quand j'arrose mes plantes, ou prévenir le serveur domotique que je quitte la maison ou que j'arrive afin qu'elle se mette dans un mode particulier ou me prévienne si j'ai laissé une fenêtre ouverte. Enfin bref il y a beaucoup de possibilités ... si ça marche ! 

Allons y !

Découvrons nous physiquement


De nombreuses marques disposent de leur Dash Button


C'est mignon, bien emballé. Mais première question : comment ouvrir le carton proprement pour ne pas tout saccager au cas où je devrais le retourner ?



Il y a des flèches sur l'étiquette qui ferme le carton. Je passe donc un couteau sur le coté et cela s'ouvre sans rien abîmer, ni le carton d'emballage, ni les codes imprimés sur l'étiquette. 



Pour le reste aucune surprise. On retrouve exactement ce qui est présenté partout. 
Le bouton est cerclé par un anneau de plastique qui permet de le suspendre à un crochet. 
Au dos un film plastique protège une surface auto-collante permettant de coller le bouton ou l'on souhaite.  Je n'ai pas encore testé si cela colle bien et sur quels supports.
Dans le carton deux notices : 
- Les information de sécurité, qui précisent notamment que les piles ne se changent pas et que le bouton ne s'ouvre pas. 
- Le mode d'emploi pour configurer le bouton. 

Chacune de ces deux notices sont multilingues dont le français. 



J'ai choisi un bouton "Signal". C'est le dentifrice que j'utilise alors je me suis dit que si par mégarde je génère une commande ce sera un moindre mal. J'espère juste ne pas en commander un semi-remorque ! Sinon j'inclurais une rubrique de vente de dentifrice à ce blog.
Je me pose la question de savoir si l'étiquette "Signal" peut s'enlever. Alors j'essaie de le décoller avec la pointe d'un couteau.
La réponse est "oui". Je ne vais pas l'enlever tout de suite mais elle se décolle assez facilement.


Je me suis aussi posé la question de la fonction du tout petit trou qui apparait sur le bouton. Je pensais qu'il s'agissait un interrupteur pour faire un reset matériel en y enfonçant une pointe de crayon. Hé bien pas du tout. En fait il s'agit d'un petit conduit pour diriger le son vers un micro situé à l'intérieur. Le micro est destiné à communiquer avec le haut parleur d'un téléphone si ce dernier n'est pas équipé de Bluetooth pour mettre en place la configuration. Apparemment il n'y a aucun risque d'être mis sous écoute ... ouf !

Sur la notice pour la partie configuration, le première page (de gauche), indique qu'il faut se rendre du www.amazon.fr/app.
Je vais suivre la procédure indiquée. 
Une fois sur la page, je demande l'installation de l'application Amazon sur mon téléphone. Et comme par magie l'application s'installe sur mon téléphone. C'est fort mais c'est aussi un peu inquiétant qu'un site web puisse déclencher des choses sur mon téléphone sans que je n'ai rien à faire ! 

ARP qui es tu ? 


Lorsque l'on lit les tutoriels sur le détournement du Dash Button, tous s’appuient sur la détection des paquets ARP (Address Resolution Protocol) qui sont diffusés sur le réseau local (LAN) quand le bouton essaie de se connecter en wifi pour envoyer la commande à Amazon. 
Avant de me lancer dans la configuration du bouton avec l'application, j'ai voulu tester ma capacité à recevoir les trames ARP sur mon Raspberry PI. 
Sans rentrer dans les détails techniques que je ne connais pas, si vous ne savez pas ce qu'est ARP et que vous avez la flemme de chercher, je vais vous dire expliquer le minimum a connaitre.
Tous les équipements qui se connectent à un réseau local sont identifiés par leur adresse MAC. Le plus souvent, l'adresse MAC est inscrite en dur dans l'électronique qui gère la couche de communication. En plus de l'adresse MAC, quand il se connecte, un équipement se voit attribué une adresse IP. Cette adresse IP peut être fixée par l'administrateur ou donnée de manière automatique par un équipement réseau qui dispose de la fonction  serveur DHCP. Une box par exemple.
ARP est un protocole réseau qui permet de faire une correspondance entre les adresses IP et les adresses MAC.


ARP comment marches tu ? 

Lorsque qu'un équipement se connecte à un réseau Ethernet et qu'il veut communiquer avec une machine, il a besoin de connaitre l'adresse MAC de cette dernière. Pour ce faire, l'équipement envoi une requête ARP à toutes les machines du réseau pour que celle concernée (connue par son adresse IP) par la connexion lui renvoi son adresse MAC.Cette requête envoyée à toutes la machines du réseau contient l'adresse MAC de la machine émettrice. 
Le Dash Button ayant la particularité d'être en sommeil et de se réveiller juste au moment de l'appuie, on peut en déduire que si une requête ARP avec l'adresse MAC du Dash Button est détectée par une machine de réseau, cela signifie qu'on vient d'appuyer sur le bouton.
Il suffit donc d'avoir un programme qui écoute les requêtes ARP, identifient celles en provenance de notre bouton et de générer l'action que nous aurons programmée. Par exemple une requête json vers notre serveur domoticz. 
Simplissime ... sur le papier ! 

On rentre dans le dur avec le soft ! 

Que tous ceux qui sont fâchés avec le code se rassurent, je suis loin d'être un champion de la programmation et tout ce que je fais désormais c'est en ajoutant ma toute petite touche personnelle à des choses que d'autres ont réalisés avant moi. Donc ce que j'arrive à faire, n'importe qui peut le faire. 

En parcourant les différents tutos, j'ai identifié deux techniques différentes pour écrire un programme qui réalise les actions que je viens de présenter. : à partir de node.js ou en python. Les deux sont des langages de programmation qui fournissent des librairies de fonction réseau que nous pourrons utiliser pour "sniffer" (écouter) les paquets ARP et en récupérer les informations. Notamment l'adresse MAC de l'emetteur.
Pour ma part, ne connaissant pas node.js et débutant dans la programmation python, j'ai choisi python. 
La librairie de fonctions réseau pour sniffer les trames ARP que j'ai trouvé s’appelle scapy.
J'avais déjà Python d'installé sur mon Rapsberry PI 3 (RPI3). Je me suis donc lancé dans l'installation de scapy.
Et c'est là que tous les problèmes ont commencés !

Catastrophe en chaine ! 


Avant de commencé j'ai voulu mettre à jour mon RPI3 (qui est en version Jessie) avec les commandes habituelles apt-get update & apt-get upgrade. 
Après un long moment j'ai obtenu des messages d'erreur. Étrange mais après tout ça arrive. J'ai décidé de les ignorer et de continuer. 
J'ai ensuite voulu installer scapy. Cela a mal fonctionné, avec de nouveau pas mal de messages d'erreur, en Anglais, pas très explicites ... j'ai donc décidé d'ignorer à nouveau. 
Pensant que scapy était installée, j'ai donc co
Je me suis renseigné et apparemment les problèmes venaient de la version de python. J'avais déjà installé Python 3 et scapy est compatible python 2. 
Donc le script python pour sniffer ne fonctionnait pas. 
J'ai voulu activer le wifi de mon RPI3 comme un access point (AP) pensant que c'était parce que le RPI ne recevait pas les trames ARP du wifi de la box ...
Enfin bref, une galère. J'ai passé une journée pour au final fusiller les interfaces de communication de mon RPI. 
Au bilan, plus de serveur ... tout à réinstaller. 

Je suis donc reparti d'une sauvegarde du système, je me suis retroussé la manches et j'ai remis à jour l'environnement domoticz. 
J'ai repassé python en python 2.7 (en modifiant juste le lien dans /usr/bin). 
J'ai relancé  apt-get update & apt-get upgrade ... et cette fois plus de messages d'erreur ! Yess ! 
J'ai relancé le script python pour sniffer les trames ARP et cette fois j'ai vu des choses passer ! Re-Yesss !

Pour le programme que j'ai utilisé vous trouverez le code ci-dessous à l'adresse : https://thisisyetanotherblog.wordpress.com/2017/07/

#!/usr/bin/python
from scapy.all import *
import httplib, urllib

def doWhatIWant():
  print "TODO"

def arp_detect(pkt):
  #pkt.show() # debug info
  if pkt[ARP].op == 1: # network request
    mac = pkt[ARP].hwsrc
    mac = mac.lower()
    ip = pkt[ARP].psrc
    print "IP: " + str(ip) + ", MAC: " + str(mac)

  if mac == 'xx:xx:xx:xx:xx:xx': # dash button
    doWhatIWant()
    sleep(5)
    return "dash button detected\n"
  else:
    print "Unknown: " + str(ip) + ", " + str(mac)
    return "Unknown MAC: " + pkt[ARP].hwsrc

try:
  print sniff(prn=arp_detect, filter="arp", store=0)
except KeyboardInterrupt:
  exit() 


Edit du 11/03/2018 : Pour une raison que j'ignore, ce code n'est pas totalement fiable. J'ai constaté qu'il peut arriver que la requête ARP ne soit pas détectée. Dans les forum on met en cause la fiabilité de la librairie scapy. J'ai donc écrit un code basé sur un autre type de requête qu'ARP et ne faisant pas appel à la librairie scapy. J'explique tout ça dans l'article : Fiabilisation Dash Button.

Maintenant passons à l'initialisation du bouton sur l'application Amazon


J'ai suivi les indications sur site https://easydomoticz.com/domoticz-dash-button-amazon/
Cette partie est vraiment facile. 
Il faut activer le blutooth du téléphone, appuyer quelques secondes ( 5 ou 6 ) sur le bouton le temps que la LED passe au bleu. Et ensuite le bouton est configuré avec les informations saisies dans l'application amazon. Principalement le mot de passe du wifi car le SSID (identifiant visible de votre wifi) est détecté tout seul. 
Enfin bref, cette partie là est vraiment simplissime à gérer. 
On quitte l'application Amazon avant d'avoir choisi quelle commande associer au bouton. 
Ensuite après les tests, l'application Amazon, à chaque fois que j'ai pressé sur le bouton, m'a émis une notification sur mon téléphone comme quoi "Votre Signal Dash Button est presque prêt ...." ! Mais pour ça nous verrons après comment régler ce problème mineur.

Désormais tout marche à peu près correctement, il ne reste plus qu'à voir comment associer le tout avec domoticz. 
Pour ceux qui ont utilisé la solution avec le langage node.js c'est assez simple. Il suffit de reprendre le code donné sur les pages suivantes : 

En ce qui me concerne, je vais réutiliser du code python que j'avais déjà écrit pour mettre à jour la valeur d'un capteur domoticz dont je connais l'index. 

Je créé un capteur virtuel dans l'onglet interrupteur. Je choisi le type "On/Off" avec l'icone "Alarme" qui correspond bien car je peux y associer un délais d'extinction. 




Ensuite on va dans la liste des capteurs utilisés, on récupère l'ID du capteur, chez moi c'est 572 et le tour est joué.



Voila, mis à part la partie programmation que je ne détaillerai pas car chacun fait un peu ce qu'il veut dans ce domaine, je vous ai donné tous les grands principes pour détourner ce magnifique petit jouet qu'est le dash button amazon.

Ayant un compte Prems gratuit pendant un mois, j'en ai profité pour faire une nouvelle commande et commander un autre bouton ! Et divine surprise, l'achat de ce second bouton a été automatiquement remboursé par une réduction de 4€99 dans le montant à payer. J'avais déjà vu cela dans les forums je crois. Je vais donc attendre d'activer ce nouveau bouton et essyer d'en commander un troisième pour voir si j'ai aussi la remise. 
Tant que je gagne, je joue ! 




Pour aller plus loin : 

La page de quelqu'un qui a démonté le bouton : 

Soutenez la blogoculture ...


Le plus simplement du monde, si vous avez un achat à faire sur Amazon, accédez au site à partir de ce lien (que vous pouvez ajouter dans vos favoris)https://amzn.to/2nbe4sm




Soutenez la blogoculture ...


Le plus simplement du monde, si vous avez un achat à faire sur Amazon, accédez au site à partir de ce lien (que vous pouvez ajouter dans vos favoris)https://amzn.to/2nbe4sm


... mais aussi ...


Vous appréciez les articles frais et vitaminés de ce blog et vous voulez faire un geste pour encourager ce partage, saluer le travail, ou parce que vous y avez trouvé des choses utiles ( et que vous êtes sympa ) ?

... c'est possible et vous avez le choix !
Si vous avez un compte Paypal et quelques euros à offrir sans vous mettre sur la paille, subventionnez la culture domotique à l'ancienne !
Vous ne dépenserez pas un radis de plus en faisant un achat sur eBay à partir de ce lien.
Economisez du blé avec Amazon Prime ! Offre d'essais 1 mois gratuit (et renouvelable).
Soyez chou et aidez les petits producteurs de blog à se faire connaitre auprès de vos amis facebook !

Merci

Commentaires