Create a gist now

Instantly share code, notes, and snippets.

@air /arp_to_ifttt.py
Last active Jul 11, 2017

What would you like to do?
import socket
import struct
import binascii
import time
import json
import urllib2
# 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)
# 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_glad':
record_poop()
if macs[source_mac] == 'dash_tide':
record_pee()
else:
print "Unknown MAC " + source_mac + " from IP " + source_ip

laborspy commented Sep 5, 2015

I forked ... update includes a method to remove duplicate ARP commands as the Dash button seems to randomly send 1-4 which ads duplicate lines to the Google Sheet.

I'm on a MAC and replaced AF_PACKET with AF_INET, but my scripts never gets triggered when I press the button. I've setup my dash just like in the post. Any idea why it might not be showing up?

Owner

air commented Dec 29, 2015

Updated to fix issue with non-ARP packets.

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