自動化厨のプログラミングメモブログ │ CODE:LIFE

Python/ExcelVBA/JavaScript/Raspberry Piなどで色んなことを自動化

Raspberry PiからPythonでWEB経由でWoLしてみる

前回はAndroidアプリの「Wol Wake on Lan Wan」からグローバルIPを指定してポートフォワーディングでマジックパケットを転送していました。

しかし、これではルーターに穴を開けることになるのでセキュアじゃない。

ような気がするので自宅で常時起動しているRaspberry Piを経由してWOLすることにします。

あと、なんか9月になってから「Wol Wake on Lan Wan」が公開停止になってるし。

できるようになること

  • Google Homeなどから音声コマンドでPCを起動

用意するもの

  • Raspberry Pi
  • IFTTTアカウント
  • Beebotteアカウント
  • Google Assistantが使える端末
  • WoLできるようにしたPC

WoLできるようにする設定は前回の記事の「PCのMACアドレスを確認」までを参照ください。

code-life.hatenablog.com

まずはPythonのライブラリをインストールしてテスト

wakeonlan

https://pypi.org/project/wakeonlan/

① ラズパイにwakeonlanをインストール

$ sudo pip install wakeonlan

② 対象PCがWOLできるかテスト

Pythonコンソールを起動

$ python

モジュールをインポートしてマジックパケットを送信してみる

>from wakeonlan import send_magic_packet

>send_magic_packet('XX:XX:XX:XX:XX:XX')

XX:XX:XX:XX:XX:XXは対象PCのMACアドレスに置き換えてください。

※もしImportError: No module named wakeonlanなどと表示された場合はインストールしたPythonのバージョンが異なるかもしれません。Python3のようにバージョンを指定して起動しましょう。

無事に起動したらあとはRaspberry Piがこのスクリプトを実行するためのトリガーをWEBから受信できるようにします。

IFTTT→Beebotte→Raspberry Piで外部トリガーを作る

IFTTTがあれば何でもWebhooksできるので起動条件にGoogle Homeを使うもよし、Slackを使うもよし。 しかし、IFTTTを直接Raspberry Piに紐付けるような設定は現状ありません。そのためBeebotteを中継機として利用します。

f:id:maru0014:20180916233635p:plain

①Beebotteを設定

新規Channelを作成

f:id:maru0014:20180916234138p:plain

設定項目
Channel Name wol
Channel Description WakeOnLanのトリガーを待機
Resources Name ifttt
Resources Description IFTTTからのWebhooks

生成されたChannel Tokenを控えておく

f:id:maru0014:20180916234151p:plain

②IFTTTトリガーを設定

やはりここは音声コマンドで起動したほうが楽しい!のでGoogle Assistantをトリガーにします。

this・・・Google Assistantの「Say a simple phrase」を選択

設定項目
What do you want to say? PC起動
What's another way to say it? (optional) Wake on Lan
And another way? (optional) ウェイクオンラン
What do you want the Assistant to say in response? 自宅のPCを起動します

that・・・Webhooksの「Make a web request」を選択

設定項目
URL https://api.beebotte.com/v1/data/publish/wol/ifttt?token=token_XXXXXXXXXXXXXXXXXXXX
Method POST
Content Type (optional) application/json
Body (optional) {"data":"XX:XX:XX:XX:XX:XX"}

token_XXXXXXXXXXXXXXXXXXXXは①Beebotteを設定の時のトークンに置き換えてください。

XX:XX:XX:XX:XX:XXは対象PCのMACアドレスに置き換えてください。

③IFTTTからBeebotteでデータを受信できているか確認

Account Setting→Access Management→Secret Keyをコピー

f:id:maru0014:20180916234218p:plain

Console→Secret Keyを貼り付け SubscribeのChannelに「wol」、Resourcesに「ifttt」と入力して「Subscribe」ボタンを押す。

f:id:maru0014:20180916234322p:plain

この状態でIFTTTでトリガーを起動してBeebotte ConsoleのMessageにIFTTTからのデータが表示されればOK。1.5秒前後の時差があるようです。

f:id:maru0014:20180916234331p:plain

④PythonでBeebotteとRaspberry Piをつなぐ

pipでpaho-mqttをインストール

$ sudo pip install paho-mqtt

raspiwolフォルダを作成して該当フォルダに移動→証明書をダウンロード

$ cd raspiwol

~/wol $ curl -O https://beebotte.com/certs/mqtt.beebotte.com.pem

以下のPythonスクリプトを書いて同フォルダに保存しておく。

token_XXXXXXXXXXXXXXXXXXXXは①Beebotteを設定の時のトークンに置き換えてください。

raspiwol.py

# -*- coding: utf-8 -*-  
  
from wakeonlan import send_magic_packet  
import paho.mqtt.client as mqtt  
import json  
  
HOST = 'mqtt.beebotte.com'  
PORT = 8883  
CA_CERTS = 'mqtt.beebotte.com.pem'  
TOKEN = 'token_XXXXXXXXXXXXXX'  
TOPIC = 'wol/ifttt'  
  
  
def on_connect(client, userdata, flags, respons_code):  
    print('status {0}'.format(respons_code))  
  
  
def on_message(client, userdata, msg):  
    mac = json.loads(msg.payload.decode("utf-8"))["data"]  
    send_magic_packet(mac)  
    print('Send Magic Packet: ' + mac)  
  
  
if __name__ == '__main__':  
    client = mqtt.Client()  
    client.on_connect = on_connect  
    client.on_message = on_message  
    client.username_pw_set('token:%s' % TOKEN)  
    client.tls_set(CA_CERTS)  
    client.connect(HOST, PORT)  
    client.subscribe(TOPIC)  
    client.loop_forever()

実行

~/wol $ python raspiwol.py

status 0と表示されていればBeebotteとの接続は完了。

あとは「OK Google PC起動」でWOLがうまく行けばいつでもスマホからPCを起動できます!IFTTTトリガーを変更して「帰宅したらPCを起動」とかもいいですねー。

このIFTTTとBeebotteの組み合わせがあればなんでもRaspberry Pi経由で操作できそうなので色々実験中です。