Wake on LAN (WOL) Support?

question

#1

I’m wondering if it’s currently possible to issue a Wake on LAN Magic Packet using Scriptable? As far as I’m aware all that is required is to be able to send a UDP packet containing a payload 6 bytes of all 255 (FF FF FF FF FF FF in hexadecimal) followed by 16 repetitions of the target computer’s MAC Address.

I currently do this using Shortcuts + Pythonista and another solution that involves using Homebridge + a WOL plugin running on my NAS, however, it would be nice to be able to use Scriptable as I could activate it with Siri and have it execute in the background and not have to rely on an external server running.


#2

Hi Marc,

I‘m wondering whether you found a solution to your problem? I‘d like to send WOL packets through Scriptable (and by extension Shortcuts and Siri) as well.

Thanks and Greetings to Australia


#3

I wasn’t able to figure out how to do this in Scriptable. Currently I’m achieving this by using Homebridge with the homebridge-wol plugin. This basically puts a button in the Home app that allows me to turn on my PC. (You can also setup a script for turning off, but I prefer to make it harder to do this and do it manually). As it uses HomeKit you can also use Siri to turn on your PC.

An alternative is to use an online service that allows you to send WOL packages, although that involves providing your public IP, MAC address, Port etc to a third party service. If you are comfortable with that someone has created a Shortcut on Reddit that does this. It uses the following website for sending the WOL packets behind the scenes:

https://www.depicus.com/wake-on-lan/woli

Personally, I’m waiting for Ole Zorn to release his update to Pythonista, which he mentioned on Twitter would include Shortcuts support. I’m hoping to be able to replace my current setup with this as I currently have WOL working in Pythonista - just without the Siri & background Shortcuts support.


#4

That’s too bad. Could you share the script you‘re using in pythonista? Thank you!
I find it so odd that none of the dozens of WOL apps on the AppStore have integrated Siri or Shortcuts.


#5

Yes - I looked on the App Store, but was surprised that none of them had integrated with Siri Shortcuts (that I could find anyway).

Here’s my Pythonista code:

wol.py - Goes in your site-packages folder

# -*- encoding: utf-8 -*-

"""
Small module for use with the wake on lan protocol.

"""

from __future__ import absolute_import
from __future__ import unicode_literals

import socket
import struct


BROADCAST_IP = '255.255.255.255'
DEFAULT_PORT = 9


def create_magic_packet(macaddress):
    """
    Create a magic packet which can be used for wake on lan using the
    mac address given as a parameter.

    Keyword arguments:
    :arg macaddress: the mac address that should be parsed into a magic
                     packet.

    """
    if len(macaddress) == 12:
        pass
    elif len(macaddress) == 17:
        sep = macaddress[2]
        macaddress = macaddress.replace(sep, '')
    else:
        raise ValueError('Incorrect MAC address format')

    # Pad the synchronization stream
    data = b'FFFFFFFFFFFF' + (macaddress * 16).encode()
    send_data = b''

    # Split up the hex values in pack
    for i in range(0, len(data), 2):
        send_data += struct.pack(b'B', int(data[i: i + 2], 16))
    return send_data


def send_magic_packet(*macs, **kwargs):
    """
    Wakes the computer with the given mac address if wake on lan is
    enabled on that host.

    Keyword arguments:
    :arguments macs: One or more macaddresses of machines to wake.
    :key ip_address: the ip address of the host to send the magic packet
                     to (default "255.255.255.255")
    :key port: the port of the host to send the magic packet to
               (default 9)

    """
    packets = []
    ip = kwargs.pop('ip_address', BROADCAST_IP)
    port = kwargs.pop('port', DEFAULT_PORT)
    for k in kwargs:
        raise TypeError('send_magic_packet() got an unexpected keyword '
                        'argument {!r}'.format(k))

    for mac in macs:
        packet = create_magic_packet(mac)
        packets.append(packet)

    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
    sock.connect((ip, port))
    for packet in packets:
        sock.send(packet)
    sock.close()

I think I got it from GitHub originally wakeonlan.py, and the code seems to have changed slightly since I last used it. Might be best to work from the latest code.

Then I created the following which calls the above code:

wake.py

# coding: utf-8
import dialogs
import sys
import wol

# Debug
for arg in sys.argv:
	print(arg)

# sys.argv[1]: Mac Address
mac = sys.argv[1]
# sys.argv[2]: IP Address
ip = sys.argv[2]
# sys.argv[3]: Port
try:
	port = int(sys.argv[3])
except IndexError:
	port = 9
wol.send_magic_packet(mac, ip_address=ip, port=port)

dialogs.hud_alert('Magic Packet sent')

sys.argv[1] - mac address, sys.argv[2] - ip address and sys.argv[3] - port are parameters which are passed to Pythonista from the Shortcuts app.

This is an example of a Shortcut to call the Pythonista wake.py script, which in turn uses wol.py to send the wake on LAN request.

I haven’t tested this method recently as I haven’t used it in a while, so if something isn’t working, let me know.


#6

FYI - Ole Zorn has released the first Beta of the next version of Pythonista which has Shortcuts support. I haven’t tested the WOL script yet, but here’s the link to the Beta sign up if you’re interested:


New Pythonista Beta!
#7

I’ve got it working with the new Pythonista Beta 3.3. These are the steps to follow to get it working:

  1. Download wakeonlan.py and put it in your site-packages folder.
  2. Create a file called wake.py in your iCloud folder:
    # coding: utf-8
    import sys
    from wakeonlan import send_magic_packet
    
    # Debug
    #for arg in sys.argv:
    #   print(arg)
    
    # sys.argv[1]: Mac Address
    mac = sys.argv[1]
    # sys.argv[2]: IP Address
    ip = sys.argv[2]
    # sys.argv[3]: Port
    try:
        port = int(sys.argv[3])
    except IndexError:
        port = 9
    
    send_magic_packet(mac, ip_address=ip, port=port)
    
    print('Magic Packet sent')
    
  3. With the wake.py file open tap Spannner IconShortcuts…Siri & Search Shortcut+
    • Script: iCloud/wake.py
    • Arguments: MAC_ADDRESS IP_ADDRESS PORT_NUMBER
    • Run in Background: On
  4. Tap Add
  5. Tap Microphone Icon and record a phrase e.g. “Turn on my PC”
  6. That’s it, you can now turn on your PC with Siri:


#8

Yes! Thanks so much, especially for the detailed description! Works like a charm.

Finally I can remotely boot and shutdown my PC.

Merry Christmas :slight_smile:


#9

I got this option and don’t know what I wrote wrong.
Can be because I’m not connected to the same internet?


#10

Quotes around the MAC address?


#11

As @sylumer mentioned you will likely need single quotes around the MAC address if you are putting the MAC address in the wake.py file rather than passing it in as an argument.

Also it won’t work outside your home network unless you setup port forwarding on your router.

Port forwarding works by routing traffic sent to a specific port of your external IP address to a local IP address and port on your local network. To find out what your external IP address is you can search for ip on Google although keep in mind that this can change so you may need to use a Dynamic DNS provider to keep this updated. (Make sure you do this while connected to your wifi to get the right IP address)


#13

Why this don’t work anytime? Like I woke up today and tell siri to turn in my pc, I don’t got any errors but the pc don’t woke up, if I turn on the pc manually and turn it off Siri Shortcut work.


#14

There can be several reasons, often it is something to do with power saving working against the NIC.

Here’s just a few sample links that might help.


#15

Exist a source code to turn it off too?


#16

If you mean sleep a computer that’s probably more of an OS specific task. You could run a script over SSH on a Mac for example. But I don’t think triggering a power save/off has an equivalent magic packet. It would need to be interpreted at the OS level for actions rather than just purely asking the motherboard to increase power levels.