Amazon hat vor 3 Tagen begonnen in Deutschland Dash Buttons zu verkaufen. Ich habe direkt einen bestellt und probiert, wie man statt Ariel zu bestellen Kommandos auf dem Raspberry Pi auslösen kann. Hier sind die ersten Ergebnisse.
Im Prinzip sind die Infos im Netz vorhanden. Allerdings gibt es doch einige Fallstricke. Da es mittlerweile zwei Hardware Versionen des Dash Buttons gibt, sind die meisten Anleitungen nicht mit der in Deutschland verkauften Version JK29LP kompatibel. In diesem Beitrag wird der Dash Button so wie in den allermeisten Internet Einträgen nicht ge-„hackt“. Der Button selbst wird also nicht verändert.
Was ist an dem neuen Dash Butteon JK29LP anders?
Zunächst einmal ist eine andere Hardware verbaut, wie dieser Blog Beitrag zeigt.
In Kürze:
- Der neue Button enthält jetzt auch einen Bluetooth Chip, über den er (zumindest bei Android) konfiguriert wird.
- Die Batterie ist nicht mehr fest verlötet.
- Der verwendete Chipsatz ist jetzt von Atmel.
Amazon hat aber auch eine Reihe von Änderungen vorgenommen, die den Einsatz am Pi verändern und zum Teil auch erschweren:
1. Der Dash Button ist ohne Trick nicht mehr deaktivierbar ohne dabei die WLAN Konfiguration zu löschen.
2. Der Button meldet sich im Netz nicht mehr per Address Resolution Protocol (ARP), sondern per UDP Bootstrap Protokoll (bootp) an.
Hier also ein Vorgehen, das klappt:
MAC-Adresse des Dash Buttons herausfinden:
Die meisten Router zeigen im Log an, welche WLAN Geräte sich mit dem Netz verbinden. Wenn man den Dash Button normal per Amazon App einrichtet, so sind beim Abschuss der Einrichtung die letzten Einträge vom Dash Button.
Bei der Fritzbox: System->Ereignisse->WLAN; aber vorher noch „Auch An- und Abmeldungen protokollieren“ anhaken.
Internet Zugriff des Dash Buttons nach Konfiguration sperren:
Wie schon erwähnt beruhen die meisten Infos im Netz auf dem alten Dash Button und einer alten Firmware. Dieser Idee der Hacks ist es, den konfigurierten und im WLAN registrierten Dash Button in der Amazon-App auf „keine Bestellung“ zu setzen. Diesen Eintrag gibt es bei dem neuen Button und der aktuellen App nicht. Entweder ein Button ist für einen Kaufvorgang konfiguriert, oder er muss deaktiviert werden. Wenn man einen Dash Button in der Amazon App deaktiviert und den Button das nächste Mal drückt, so nimmt der Button ein letztes Mal Kontakt mit dem Amazon-Server auf. Der Amazon-Server teilt dem Button dann mit, dass er deaktiviert wurde und der Button löscht die bestehende WLAN Konfiguration. Damit ist der Button nicht mehr im heimischen WLAN registriert und auch nicht mehr nutzbar.
Der Trick: Den Button normal per App aktivierten. Dann in der Router Konfiguration den Internet Zugang des Dash Buttons unterbinden. Bei einer Fritzbox geht dies, in dem man den Button in den Einstellungen für die Kindersicherung auf „gesperrt“ stellt. Der Button kann jetzt noch in das lokale Netzwerk, aber nicht mehr mit Amazon kommunizieren. Der Dash Button behält dann seine WLAN Konfiguration, weil das Löschkommando nicht kommt. Um diese Einstellung vornehmen zu können, braucht man die MAC Adresse des Dash Buttons.
Wenn man die MAC erfolgreich gesperrt hat, leuchtet der Dash Button nach dem Drücken zunächst weiss auf und blinkt dann rot (=Bestellung nicht erfolgreich).
LED Verhalten des Dash-Buttons:
Zur Fehlersuche habe ich hier noch kurz das LED Blink/Leuchverhalten notiert, soweit es sich mir erschlossen hat.
LED leuchtet nach einem Tastendruck
nur rot -> Button ist nicht konfiguriert (oder hat das Deaktivierungskommando bekommen und ist somit nicht mehr konfiguriert).
blau -> Button wurde lange gedrückt und ist im Konfigurationsmodus für die Amazon App
weiss, dann grün -> Button hat erfolgreich eine Bestellung bei Amazon getätigt.
weiss, dann rot -> Button hat sich ins WLAN eingeloggt, konnte aber keine Bestellung bei Amazon auslösen.
Der „Hack“ auf dem Pi:
Die üblichen „Hacks“ beruhen auf dem Verhalten des Dash Buttons. Der Button ist ohne Tastendruck in einem Schalfmodus und nicht im WLAN. Wenn man die Taste drückt, loggt sich der Button im WLAN ein. Diesen Vorgang kann man im Netzwerk erkennen und darauf reagieren. Es finden sich im Netz eine Menge python Scripte, die dies für ARP leisten. Diese Protokolle funktionieren mit dem aktuellen Button nicht mehr, da dieser per bootp arbeitet.
Bevor wir loslegen können, muss man zwei Pakete nachladen; dies geht per:
sudo apt-get install scapy
sudo apt-get install tcpdump
Nach der Installation läuft das folgende Script; einfach als dash.py ablegen. Der Code ist an einigen Beispielen im Netz orientiert und macht den Pi zu einem Netzwerksniffer, der auf das passende Paket wartet.
import datetime import logging import urllib2 # Constants timespan_threshhold = 3 # Globals lastpress = datetime.datetime(1970,1,1) logging.getLogger("scapy.runtime").setLevel(logging.ERROR) from scapy.all import * def button_pressed_dash1(): global lastpress thistime = datetime.datetime.now() timespan = thistime - lastpress if timespan.total_seconds() > timespan_threshhold: current_time = datetime.datetime.strftime(thistime, '%Y-%m-%d %H:%M:%S') print 'Dash button pressed at ' + current_time urllib2.urlopen('http://pi:8083/fhem?cmd.LED=set%20LED%20toggle&room=Haussteuerung') lastpress = thistime def udp_filter(pkt): options = pkt[DHCP].options for option in options: if isinstance(option, tuple): if 'requested_addr' in option: # we've found the IP address, which means its the second and final UDP request, so we can trigger our action mac_to_action[pkt.src]() break mac_to_action = {'ac:63:be:ac:23:1c' : button_pressed_dash1} mac_id_list = list(mac_to_action.keys()) print "Waiting for a button press..." sniff(prn=udp_filter, store=0, filter="udp", lfilter=lambda d: d.src in mac_id_list) if __name__ == "__main__": main()
WICHTIG: In dem Script die MAC des eigenen Dash Buttons eintragen und auf KLEINSCHREIBUNG der Buchstaben achten.
Änderung 21.12.2016: Code erweitert, um wiederholte Login Versuche abzufangen. Teilweise gab es mehrere Events aufgrund eines Tastendrucks.
Dann wie folgt starten:
sudo python dash.py
Ein Druck auf den Dash Button sollte jetzt innerhalb von ca. 2 Sekunden erkannt werden. So lange dauert die Registrierung im WLAN.
Beispiel: fhem Server mit dem Dash Button ansteuern
Wenn man das Script um zwei Zeilen ergänzt, kann man zum Beispiel einem fhem Server Kommandos geben.
Bei den Imports ergänzen:
import urllib2
Hinter dem print im Erfolgsfall ergänzen:
urllib2.urlopen('http://127.0.0.1:8083/fhem?cmd=set%20Wohnzimmer_Lampe%20toggle')
Wer etwas anderes auslösen will, kann an dieser Stelle ansetzen.