Skip to content

Instantly share code, notes, and snippets.

@Aractor
Forked from air/arp_to_ifttt.py
Last active March 9, 2017 04:21
Show Gist options
  • Save Aractor/03b5832e558e78b616b7ee332315df9f to your computer and use it in GitHub Desktop.
Save Aractor/03b5832e558e78b616b7ee332315df9f to your computer and use it in GitHub Desktop.
import socket
import struct
import binascii
import time
import json
import urllib2
# Use your own IFTTT key, not this fake one
ifttt_key = 'xxxxxxxxxxxxxxxxxxxxx'
# Set these up at https://ifttt.com/maker
ifttt_url_button1 = 'https://maker.ifttt.com/trigger/button_1/with/key/' + ifttt_key
ifttt_url_button2 = 'https://maker.ifttt.com/trigger/button_2/with/key/' + ifttt_key
# Replace these fake MAC addresses and nicknames with your own
macs = {
'34545555e7ad' : 'dash-btn1',
'48d703450d65' : 'dash-btn2',
}
# Trigger a IFTTT URL. Body includes JSON with timestamp values.
def trigger_url(url):
data = '{ "value1" : "' + time.strftime("%Y-%m-%d") + '", "value2" : "' + time.strftime("%H:%M") + '" }'
req = urllib2.Request(url, data, {'Content-Type': 'application/json'})
f = urllib2.urlopen(req)
response = f.read()
f.close()
return response
def button_1():
print 'triggering button1 event, response: ' + trigger_url(ifttt_url_poop)
def button_2():
print 'triggering button2 event, response: ' + trigger_url(ifttt_url_pee)
rawSocket = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(0x0003))
while True:
packet = rawSocket.recvfrom(2048)
ethernet_header = packet[0][0:14]
ethernet_detailed = struct.unpack("!6s6s2s", ethernet_header)
# skip non-ARP packets
ethertype = ethernet_detailed[2]
if ethertype != '\x08\x06':
continue
# read out data
arp_header = packet[0][14:42]
arp_detailed = struct.unpack("2s2s1s1s2s6s4s6s4s", arp_header)
source_mac = binascii.hexlify(arp_detailed[5])
source_ip = socket.inet_ntoa(arp_detailed[6])
dest_ip = socket.inet_ntoa(arp_detailed[8])
if source_mac in macs:
#print "ARP from " + macs[source_mac] + " with IP " + source_ip
if macs[source_mac] == 'dash-btn1':
button_1()
if macs[source_mac] == 'dash-btn2':
button_2()
else:
print "Unknown MAC " + source_mac + " from IP " + source_ip
@Aractor
Copy link
Author

Aractor commented Mar 9, 2017

Script updated to support multiple Amazon Dash buttons connecting to IFTTT.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment