Note: This post and the accompanying software packages have been updated several times since this was originally posted. The most up-to-date releases and instructions can always be found in the GitHub Repo. Update notes are appended to the end of this blog post. The V3 Beta release automates most of the setup process, incorporates Dynamic DNS Auto-Updating, and supports signed HTTPS.
I have a very power hungry desktop computer. When I’m travelling with my laptop, I can’t carry all my files and data with me, so I occasionally use “remote desktop” to access my desktop from the road. I also use a Plex Media Server to stream content from my desktop computer. However, the computer has to be on for me to be able to do this. This means I need to leave the computer on all the time, just in case I need to access it. This wastes power, costs me money, and harms the environment. My Raspberry Pi, on the other hand, consumes a minuscule amount of power, and is always on anyways, serving other purposes. In this tutorial, I’ll show you how to run a simple mobile-friendly website from your Raspberry Pi that will allow you to remotely wake up your power-hungry computer, so you can remotely access it. When you’re done, just put it back to sleep from within the remote desktop service (or use the mobile app plus a small background server running on your desktop to put it back to sleep – this is described in the instructions). The app pings the computer from the Raspberry Pi to inform you of when the computer has woken up and established network connectivity. Follow along after the break…
Once you’re done setting up your Pi-Powered Wake/Sleep on LAN Server, here’s how it will work…
- From wherever you are in the world, navigate to your unique, dynamically updating URL (wol.example.com)
- You’ll be presented with a screen that looks like the one below (note, you may get a security popup first, if you choose to use a self-signed certificate to enable HTTPS – this is described in the instructions). From this screen, you can select which machine you want to control, and you can view its state (awake or asleep). You can add as many machines that you want to control. Here, you can see that “Phoenix Desktop” is currently awake, and I have the option to put it to sleep:
- Next, you’ll enter a passphrase that you’ve pre-chosen. If the wrong phrase is entered, a “denial” note will pop up, and you’ll be able to try again. If you enter the right phrase, the Raspberry Pi can send a “Wake Up” or “Sleep” command to the remote machine. It will then ping that computer and display the results in real-time, so that you know when the computer has finished booting or when it has finished going to sleep. Here, you can see what that screen looks like when I put “Phoenix Desktop” to sleep remotely:
- You’ll receive a confirmation message when the computer has finished waking up or going to sleep. If you just woke it up, you can now perform normal remote access tasks, like SSH, FTP, or Windows Remote Desktop.
Ready to set this up for yourself? Visit the GitHub Project Wiki to follow the detailed installation instructions.
- 7/20/2013: Added the ability to put the computer back to sleep using the mobile webapp. Instructions updated on the Wiki.
- 12/15/2013: The app now includes a dropdown that allows you to pick a computer. You can now Wake/Sleep as many computers as you want! Thanks to GitHub user ahodgey for submitting a Pull Request with most of this functionality (I made some updates to his pull request, and merged it into the master repository branch).
- 09/14/2015: The Raspberry Pi WOL software now supports self-signed SSL encryption, meaning you can connect over HTTPS using a self-signed certificate. Additional security measures have also been implemented to reduce the risk of XSS vulnerabilities. Thanks to GitHub user felixrr for the Pull Request! You can still use ordinary HTTP if desired, and updated instructions can be found on the Wiki.
- 01/24/2015: Software bumped to v2.0. Fixed lots of bugs, and confirmed working latest Raspbian Jessie release, with Apache 2.4.x (which had a bunch of breaking changes).
- 01/31/2021: An x86 Docker Image is now available for this application (for Desktop, not Raspberry Pi). I have not independently validated its performance, but it pulls directly from my Repo. It’s available on DockerHub here.
- 02/21/2021: The V3 Beta release automates most of the setup process, incorporates Dynamic DNS Auto-Configuration, and supports signed HTTPS. Follow the V3 Wiki Instructions to install it!
Supporting Documentation and Code
This project is licensed the GNU GPL v3. Please Attribute and Share-Alike. You can download the source directly from the GitHub Repository linked below.
please help me out!! i am facing a lot of trouble in developing a remote desktop display for my raspberry pi.
and am not able to update my raspberry pi..
You need to be more specific. What’s the error?
Sir.. got it started using Xming Software.. thanks for your reply)
may you upload tutorials about how to start with raspberry pi…
I reference several in this tutorial, and this is also an entry-level tutorial.
Your app is perfect! Thanks
I can’t see what could be better…. or maybe to be able to wake up more than one device :-)
That could be added very easily. Consider forking the GitHub repo and adding that functionality.
I followed all the steps as directed, but When I load the page I only receive a blank webpage, the page loads and the port forwarding is correct. I suspect it has to deal with the program not running correctly on my Pi. Any ideas?
You should enable PHP error printing by putting these lines at the top of your index.php file, in the section:
That should help you figure out what’s wrong.
Thank you very much for your work. I have been thinking about doing something like that for a long time. But due to a lack of time and the fact that I’m not that familiar with linux, webserver and php5, I never got around to actually doing it. But with your work I have a solid starting point and can build on that to make it my own (incl. more than one computer, choosing the kind of “shutdown” and especially using the GPIO to control a relay to cut off the power completely). And for a newbie like me it’s also a good starting point for adding environmental sensors.
Keep up your good tutorials (I started with your Arduino tutorials :))!
Great! Be sure to publish any improvements you make that others might benefit from!
I will definitely do that. In the meantime maybe somebody reads this and thinks … “Well, it would be nice to have an Android app for that.” … In would be awesome to have a starting point there as well ;).
I don’t get it. Why so complicated solution ? Why not simply ssh to router and run etherwake ? Rapberry PI is superfluos.
I wanted a dedicated interface for this, and I wanted it to be pretty, with feedback about the current state of the machine. This was mostly a learning exercise for me.
This was an excellent article and me being new to RPi and linux i found this very interesting.
I followed all the steps closely but when I go to the webpage, my passphrase is always denied.
Any ideas on what could be the issue and how to fix it?
That means that it’s not matching the hash you generated. Were you sure to rename the config file and put in your generated hash?
This is an amazing article. I have a localised problem, is there anyway to exclude the $COMPUTER_LOCAL_IP from the config. My router seems to block any direct reference to an IP address. I can WOL my PC from an app on my iPad just using the MAC address. Would be grateful if you can help?
Weird. What router are you using? I don’t see how or why it would block direct references to an IP address. What happens if you want to set up file sharing on your network?
This is brilliant. One question though if you don’t mind? I think due to the prescence of another index file (index.html), after I press wake up it returns to the “orignal” index page. Is there a way to repoint this reversion and for example rename index.php to wol.php and have the software acknowledge this?
Why not just delete the index.html file? You shouldn’t have two index files, even if they are different file types. If you are using index.html for something else, you can rename this file wol.php, and change the form action to point to wol.php instead of “/”
Hi. As you mention, I am using the index.html file for something else and could do with altering your index.php file really.
Am I right in saying the reason when I press wakeup it returns to index.html is something in your code? Which would therefore require repointing to (eg) wol.php?
I am a learner and so any help is much appreciated.
Find this line: “
All sorted. Thanks for your help.
Can I get this working with openelec somehow?
I’m stuck with the passphrase. I created a passphrase used the hash calculator to create a hash for the passphrase and copied the hash to the config.php file.
Restarted the webserver but still getting denied message.
Were you sure to rename the config sample file to config.php?
Thanks for your fast response. Yes I’ve renamed the sample.
You can check my config on the following url. http://sdrv.ms/15j66i5
Got it working. Just re-installed everything and now it works!
Hi, thaaank you so much! Your stuff is awesome and you inspired me to build a raspberry pi and I’m going to make something awesome with it.. :)
I have problems. I follow the manual and i have no errors in the installation-procedure but i doesnt see any homepage.
What have i done?
I also define on my router a portforwarding “port:5000” -> ip-adresse from pi -> to “port:80” (its the same procedure i have made for my ipcam and this portforwarding works – i check this also).
I enter in my win7-pc in the inet-explorer my “dyndns-adress:5000” but i doesn’t see anything?!
Is it necessary to start or restart the wake-on-lan-server? and how does this work?
What are the default ports in this example? 5000? 3389? 80? 7760?
I hope you can help me!
I think i found my failure – i put the hash-code in the file but without the “”! Now i see the site and so i can check this WOL-Server! :)
Awesome – enjoy!
Which OS distribution you are using on your Raspberry PI?
Debian or Raspbian
Thanks for your response and writing this blog Jeremy!
Hey Jeremy have you any tutorials about doing this with the arduino and ethernet shield. Looking for a good full tutorial but can,t find one online. Keep up the good work very enjoyable.
The last chapter of my book focuses on this topic. I’m not sure if/when I’m going to make a video about it.
Thanks for the reply Jeremy. Ah go on make a video for me its something i’ve been looking to do for years and I would really appreciate it. Please !!
On the firt page i always have the error
Notice: ob_end_flush(): failed to delete and flush buffer. No buffer to delete or flush in /var/www/index.php on line 18
Any reply was really appreciate.
Hmmm, that means output buffering isn’t working (this is what allows the page to update as it loads with ping updates).
try adding the following line to an .htaccess file in the same directory:
php_value output_buffering “0”
How can I specify the port I want to use? And how do I start or stop the service/run it on start up?
Are you referring to the windows Sleep on LAN app? Just open the app preferences and set those options.
I need a bit of help on this!
Followed all the instructions with no error but when trying to access the start page I get “The page can’t be displayed”.
Error reporting is enabled in the index.php file (was enabled by default) but I don’t see any errors.
To check if the webserver and PHP were installed OK I created a simple index.php file which I put in the www directory (temporarily moved the one that came with WOL). This says ‘Welcome …’ and I can access this both from local IP and from my dynamic dyns URL.
So webserver and php seem to be running.
Have tried to totally reinstall but still no success.
Any suggestions greatly appreciated – would love to get this running!
Found my error!
Managed to find the location of the error log /var/log/apache2/error.log and saw that it was the hash in the config.php file that was causing the problem.
First I had forgotten to put it in ” ” and then when I did it didn’t become active until I rebooted.
Working well now – thanks for a great tool!
Glad to hear you got it working!
I too would like to see this done on an arduino uno step by step if you could. Thanks Shane
This is not feasible to do with an Arduino.
Oh I thought earlier you said your not sure if you’ll make a video about how to do it on Arduino. So I presumed it was feasible. Thanks anyway
Hmm it seems to work on my LAN, but not outside my LAN.
I als use the PI al proxy true port 1194 (as many tutorials) so normally i need go to my publicip:1194 ?
can you give a good example of what the config file should look like?
ie should the mac and ip addresses be in double quotes? single quotes? no quotes?
Leave all quotes as they are – just replace the contents.
Thanks for this nice solution to remote wake/sleep my server :)
I installed the php on my synology. The webpage is working well.
But when i go to the page the webapp tells me the computer is allready awake while its powered off.
What could be wrong?
Sleep-On-Lan works but the webapp thinks its still awake.
It tells the sleep command succeeded.
Then pings 10times > Still Awake
Then i get an FAILED. But my server is a sleep :)
I think my NIC stays alive. Can this be?
That’s what it seems like. If it says it is awake when it is off, then the ping must be getting a reply, which means the NIC is fully awake. What OS is the server? What kind of computer? You may be able to adjust the sleep settings in the Bios (try lowering it from S1 to S3, for instance).
Os is server 2008 r2 on a hp dc 7900 usdt.
I cant find anything in the bios what could keep the nic awake.
Thanks 4 your help m8 :)
I did some troubleshooting today and i found out that de webapp is saying the pc is awake even when the pc has no power source.
Ok, well the Raspberry Pi is just running a ping command and checking for a reply. SSH in the the Raspberry Pi, and try pinging the computer’s IP address directly to see what happens. Are you sure you’ve se the right IP for the computer you are trying to wake up?
Start with windows doesnt work :(
I’ve been looking for some way to do this literally for years. Some things I noticed though are that with my connection the pings happen so fast that I have to do 100 to be sure the computer reports back that it is up. It would be nice if their were either a delay set between pings, or better, if the pings were just posted over each other (old one erased) so that only one line of text would show up no matter how many pings occurred. I usually get in the 80’s.
For anyone wanting to wake up more than one computer, the trick is to make several copies of the files on your raspberry pi web server in separate folders and set each one to wake a different computer. It looks like you should be able to put the bootstrap folder one level up to have less duplication if you specify it’s location in thee configuration file. Would be nice though if one of the variables in the configuration file set a title so we could mark which computer was being woken up.
Thanks for the feedback Tom! Would you consider posting your idea for the ping delay as an issue on the GitHub Repo? That will remind me to work it into the next version of the code release. https://github.com/sciguy14/Remote-Wake-Sleep-On-LAN-Server/issues
Fair play you’ve created a great project.
I’m just wondering , I’ve 3 different devices and wondering if its possible to add a list to be able to choose which device to power on?
I’m planning to add that functionality. https://github.com/sciguy14/Remote-Wake-Sleep-On-LAN-Server/issues/2
“find the Dynamic DNS (DDNS) updating screen in your router’s administration panel, and enter your account info”
what do you do if your router doesnt support DDNS? Can you use the Linux no-ip DUC on the RPI?
Yes, that is what I am doing and it works well, although my IP hasn’t changed for a long time even though it is dynamic.
Thanks for the mention. Love the tool :)
Thanks for being an open source software contributor!
in my var/www directory is still another webinterface. How can I change the Port to a random one? I don’t need to get from net via portforwarding to the Wake on Lan page. My iPhone is connected via VPN, so i want to get via Browser (192.168.x.x/wakeonlan.php) to the landing page, for example.
You don’t need to change the port. Just change the file name from index to something else, like wol.php. The script should still work just fine (this was fixed in a commit about a month ago).
thank you very much, i have not seen this commit.
Very nice tool.
nice tool :)! Is it possible to make a cronjob for waking up my Windows pc every week at 02:00 o’ clock pm to make a Backup?
Yes, you should actually be able to do that within windows task scheduler.
i thought I can impelment the wake up job into my raspberry pi cron scheduler and when my client is up acronis makes a backup (with a specific schedule) every week for example. Windows task scheduler is not able to start a pc?
Sure, you should be able to do that. Use “crontab -e” to edit the cronjob on your pi. add a line with the desired weekly time, and run the “wakeonlan” command with the right arguments.
When i git clone it asks for a user password??
Give this a shot:
git clone git://github.com/sciguy14/Remote-Wake-On-LAN-Server.git
Hi Jeremy, first of all excellent work! I installed your wol-server on a raspberry pi using the arm version of arch linux and got it working, with slightly different package names of course. When I start the wol script my server wakes up but isn’t detected as awake. I’m getting 10x still down, so something with the pings isnt working yet. When I ssh into the pi and do a “ping -c 1 computerip” I get this reply:
PING 192.168.178.35 (192.168.178.35) 56(84) bytes of data.
64 bytes from 192.168.178.35: icmp_seq=1 ttl=64 time=0.451 ms
— 192.168.178.35 ping statistics —
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.451/0.451/0.451/0.000 ms
Any ideas how to solve this?
Thanks in advance!!
Hmm…. Try confirming that the exec command from PHP is working okay by adding “echo $pinginfo;” after the following line. If nothing shows up, then exec must be failing, and it may have something to do with permissions differences on arch linux.
$pinginfo = exec(“ping -c 1 ” . $COMPUTER_LOCAL_IP[$selectedComputer]);
Nevermind, figured it out. I replaced the if condition with (strpos($pinginfo,’64 bytes’) == true).
I made it through your exellent guis, but having trouble getting my computer to sleep. I got the following Error: Fatal error: Call to undefined function curl_init() in /var/www/index.php on line 199
Could you help me out?
Thanks a lot!
Did you run apt-get install php5-curl?
It’s great solution. It’s possible to run it on ngnix instead of apache?
*Is it possible ? :)
It should be possible.
Hi, I am really grateful for your awesome work on this.
It just works flawlessly, and the tutorial was easy to follow.
Since I only want to wake (not put to sleep) my PC, is there any way to easily get rid of the Sleep! Button? I messed with the PHP so it doesnt do anything anymore, but the Button remained in place. Also: Is there a way to remove the dropdown menu, since I only use it for my main PC?
These are more css and html related questions, but if you could help me with what lines to modify I would be so happy :)
The sleep and multiple-pc functionality was added as features after the original release. So, you can download a version of the app before I added these features if that’s what you prefer. GitHub saves the day with version control!
That’s all I could have asked for. I am new to the wolrd of linux (and github), so thank you for the advice. Working great as of now!
Have a good weekend!
Hi and thank you for such a nice tutorial.
I have a problem, maybe you could help?
My ISP blocks all of the incoming traffic below 1024. But I think your solution listens to port 80? So I’m stuck again by my ISP…
Is there a way to change that port number so I can access the Pi over WAN?
Redirect a different external port to internal port 80. So, instead of forwarding port 80 to port 80, you might forward 5000 to 80. Then just navigate to http://www.Youraddress.com:5000
Hi, thanks for the reply!
But I can’t do that with the modem/router I have to use with my ISP :(
Never mind, I found it.
I had to change the Apache port on the Pi to listen to 8080.
Now it works :D
Very nice app for the pi, works perfectly!
I’m loving what you’ve done, and the tutorial is awesome I had it up and running really quickly. While I have it working, I still don’t have the full functionality I need.
I’ll explain my setup – my house uses WiFi for all connections to the router, this complicated any WoL attempts, requiring other ethernet connected hardware. That’s where raspberry Pi comes in to the rescue. I had a my Pi connected to the wifi network, with a direct ethernet connection to the laptop. This worked sometimes, but even with fixed IP on both ends it wasn’t reliable, especially after a few hours off period. Current set up is with a second router/switch. The raspberry pi remains connected to the modem router by WiFi, it is then also connected to the second switch by ethernet. The laptop is also connected by ethernet to the second switch.
This setup allows me to wake the laptop wirelessly, from my phone. I have a tasker task which switches to the second network and sends the WoL packet. My problem is that I can’t make your WoL Server send the command onto the second network. Sub domains are 192.168.0.XXX and 192.168.254.XXX for networks 1 and 2 respectively. Is it possible for your server to run off one network interface, but send the WoL command out on another?
Hmmmm….. That may be a bit tricky. The web server is running on only one of the network interfaces. What happens if you run the wakeonlan linux app directly from the shell; does that work?
I keep getting this error when I want to sleep it.
Fatal error: Call to undefined function curl_init() in /var/www/index.php on line 199
Did you install CuRL for PHP as I instructed above?
sudo apt-get install php5-curl