This is a fun little demo I threw together in an evening. I'm running Raspbian "wheezy".

Wire up a switch (or switches) to your GPIO port. I have switches connected to GPIO pins 22, 23, and 24.




Install RPIO.

sudo apt-get install python-setuptools
sudo easy_install -U RPIO

Install wakeonlan.

sudo apt-get install wakeonlan

Check that you wired your switch up correctly by running ‘rpio-curses' from the terminal. You should see the state of the GPIO pin change when you press the button.


Save the following code to '':

# using the RPIO library and a physical switch to perform WakeOnLan

import RPIO
from subprocess import call

# this dictionary maps gpio pins to MAC addresses, substitute your machine's MAC
gpio_to_mac = { 24: '00:00:00:00:00:00',
                23: '11:11:11:11:11:11',
                22: 'ff:ff:ff:ff:ff:ff'  }

def gpio_callback(gpio_id, val):
    ''' wakes up the appropriate MAC '''
    call(['wakeonlan', gpio_to_mac[gpio_id]])

# setup the GPIO pins.
for gpio, mac in gpio_to_mac.items():
    RPIO.add_interrupt.callback(gpio, gpio_callback, edge='falling')

print('Waiting for GPIO input. Press CTRL+C to quit.')

Run and try it out. Note: the RPIO library requires root access.

sudo python

When you press a button, this is the output you should see:

Sending magic packet to with 00:00:00:00:00:00

 If you have any trouble, you can open up Wireshark and scan for UDP packets. Since UDP is connectionless, it is broadcast to all machines in the subnet. If you can see the WOL UDP packets and your machine isn't waking up, double-check the MAC address. Also, make sure that the machine is setup to accept WOL packets, which might mean a trip to the BIOS to change some settings.

I would like to point out that you could bind any terminal command to a physical button using this technique by simply changing the gpio_callback() function. How cool is that?