Skip to content

Instantly share code, notes, and snippets.

@ericpulvino
Last active July 31, 2016 01:06
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save ericpulvino/7d2661306589ba8534cf to your computer and use it in GitHub Desktop.
#!/usr/bin/python
import sys
import time
import socket
import struct
import logging
import binascii
import subprocess
logging.basicConfig(filename='/var/log/dashbutton.log',
level=logging.INFO,
format='%(asctime)s %(message)s', datefmt='%Y-%m-%d %H:%M:%S -- ')
discover_mode=False
if len(sys.argv) > 1:
if sys.argv[1] == "discover": discover_mode=True
rawSocket = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(0x0003))
buttons={"00bb3aff6aea_192.168.1.00":["Button One",0,["/home/pi/scripts/WEMO/send_wemo_commands.py","sendall.toggle"]],
"747548bd4908_192.168.1.255":["Button Two",0,["/home/pi/scripts/WEMO/send_wemo_commands.py","kitchensink.toggle"]]}
logging.info(' ### Dash Button Service Started ### ')
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])
dest_ip = socket.inet_ntoa(arp_detailed[8])
identifier=source_mac+"_"+str(dest_ip)
if discover_mode:
logging.info("We saw an arp from MAC: " + str(source_mac) + " ip: " + str(dest_ip)+ "\n")
continue
if identifier in buttons:
buttons[identifier][1] += 1 #iterate the count of button presses
logging.info(buttons[identifier][0] + " Pressed " + str(buttons[identifier][1]) + " times.\n")
subprocess.Popen(buttons[identifier][2],stdout=subprocess.PIPE).communicate()[0]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment