Python script that will monitor ARP commands from Amazon Dash buttons and send them to IFTTT. This was a fork from the coding from aaronbell.com. This fork will monitor for duplicate ARP commands within 15seconds and ignore them as the dash seems to randomly send 1-4 ARP commands.
import socket | |
import struct | |
import binascii | |
import time | |
import json | |
import urllib2 | |
import time | |
oldtime = time.time() | |
print oldtime | |
# Use your own IFTTT key, not this fake one | |
ifttt_key = '9cn3847ntc8394tn8-ab' | |
# Set these up at https://ifttt.com/maker | |
ifttt_url_poop = 'https://maker.ifttt.com/trigger/baby_pooped/with/key/' + ifttt_key | |
ifttt_url_pee = 'https://maker.ifttt.com/trigger/baby_peed/with/key/' + ifttt_key | |
# Replace these fake MAC addresses and nicknames with your own | |
macs = { | |
'34545555e7ad' : 'chromebook', | |
'48d703450d65' : 'macbook', | |
'ec3454354536' : 'nexus6', | |
'2c3453455541' : 'apple_tv', | |
'6c7092236348' : 'airport_express', | |
'74234223434a' : 'dash_glad', | |
'7234234417c2' : 'dash_tide' | |
} | |
# 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 record_poop(): | |
print 'triggering poop event, response: ' + trigger_url(ifttt_url_poop) | |
def record_pee(): | |
print 'triggering pee 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) | |
arp_header = packet[0][14:42] | |
arp_detailed = struct.unpack("2s2s1s1s2s6s4s6s4s", arp_header) | |
# skip non-ARP packets | |
ethertype = ethernet_detailed[2] | |
if ethertype != '\x08\x06': | |
continue | |
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_glad': | |
if time.time() - oldtime > 15: | |
record_poop() | |
oldtime = time.time() | |
else: | |
print "duplicate ignored" | |
if macs[source_mac] == 'dash_tide': | |
if time.time() - oldtime > 15: | |
record_pee() | |
oldtime = time.time() | |
else: | |
print "duplicate ignored" | |
else: | |
print "Unknown MAC " + source_mac + " from IP " + source_ip |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment