So there has been a lot of buzz lately regarding hacking the Dash button. My friend and coworker, who is a real American hero, wrote a post just yesterday summarizing his genius pizza-dash button integration. Of course original credit still goes to Ted Benson.
While hearing about Brody's adventures, I was curious to try it myself, so when my dash button arrived I too played around with turning it into something handy.
I ran into several gotchas while attempting to follow Ted's post that I wanted to capture here in case it helps any other fellow hackers!
Getting it all working
Note: I am on Mac OS X Yosemite, and I already had XCode 7 and command line tools installed.
Installing Scapy wasn't bad (I did
brew install wget first so I could easily follow their instructions):
$ wget scapy.net $ unzip scapy-latest.zip $ cd scapy-2.* $ sudo python setup.py install
The problem was, even with Scapy installed, the python script from Ted to capture Arp packets did not run due to missing dependencies. I got an error saying the pcap module wasn't found, then after fixed an error about dnet. This blog post helped me out:
Install PCAP python module:
$ wget http://downloads.sourceforge.net/project/pylibpcap/pylibpcap/0.6.4/pylibpcap-0.6.4.tar.gz $ tar xfz pylibpcap-0.6.4.tar.gz $ cd pylibpcap-0.6.4 $ sudo python setup.py install
Install dnet python module:
$ wget https://github.com/dugsong/libdnet/archive/libdnet-1.12.zip $ tar xfz libdnet-1.12.tgz $ cd libdnet-1.12 $ ./configure $ make $ sudo make install $ cd python $ sudo python setup.py install
Python server kept stopping
Another big gotcha was the example python script that listens for ARP requests has this line:
print sniff(prn=arp_display, filter="arp", store=0, count=10)
count=10 at the end means after it sniffs out 10 arp packets it will exit, printing
 to the screen! That was definitely confusing for me, as I expected this script to listen in an infinite loop for requests, so when I was testing it out with my dash button, half the time I would fine the program had already shut down. Simply remove that last argument in the
Putting it all together
Once you get the arp packet hook working for your specific Dash's MAC address, you can kick off any task or home automation event (that you are able to script from your laptop, of course).
I played around with play/pause of Sonos, since I often find myself in a room with our Sonos but without my phone (or I don't want to unlock phone, find the app, and click play).
Here was my simple script:
# dash-listen.py from scapy.all import * import requests import time ZIPLOC_MAC_ADDR = '...' def play_pause_sonos(): print("Triggering Play Sonos script") os.system("osascript play-sonos.scpt") def arp_display(pkt): print "incoming packet" if pkt[ARP].op == 1 or pkt[ARP].op == 2: #who-has or is-at (request) if pkt[ARP].psrc == '0.0.0.0': # ARP Probe if pkt[ARP].hwsrc == ZIPLOC_MAC_ADDR: play_pause_sonos() else: print "ARP Probe from unknown device: " + pkt[ARP].hwsrc print sniff(prn=arp_display, filter="arp", store=0)
-- play-sonos.scpt tell application "System Events" tell process "Sonos" set frontmost to true keystroke "p" using command down end tell end tell