前回は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アドレスを確認」までを参照ください。
まずは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を中継機として利用します。
①Beebotteを設定
新規Channelを作成
設定項目 | 値 |
---|---|
Channel Name | wol |
Channel Description | WakeOnLanのトリガーを待機 |
Resources Name | ifttt |
Resources Description | IFTTTからのWebhooks |
生成されたChannel Tokenを控えておく
②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をコピー
Console→Secret Keyを貼り付け SubscribeのChannelに「wol」、Resourcesに「ifttt」と入力して「Subscribe」ボタンを押す。
この状態でIFTTTでトリガーを起動してBeebotte ConsoleのMessageにIFTTTからのデータが表示されればOK。1.5秒前後の時差があるようです。
④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経由で操作できそうなので色々実験中です。