iPhoneのショートカットで外出先から自宅のPCを起動する

# iPhoneのショートカットで外出先から自宅のPCを起動する

## 概要
iPhoneのショートカットからbeebotteへHTTP POSTを送信し、beebotteを監視しているRaspberry piがデータを受け取り、wakeonlanコマンドでマジックパケットを送信することで起動させる。

## 背景
外出先でChrome Remote Desktopで自宅のWindowsマシンに接続して使用したいが、電源OFFやスリープだと使用できないので遠隔で起動したい。しかしポート開放はセキュリティ的に却下、ということでRaspberry piを活用する。


## 使用したものと環境

- 遠隔起動したい自宅のPC
    - windows10 Home edition バージョン20H2
- raspberry pi 4 Model B 4GB RAM
    - LABISTSのスターターキット
- iPhone
    - ios14.4



## Wake on LAN の設定

PCがマジックパケットを受け取ったら起動/スリープ復帰するように設定する。
PCには、ルーターから有線でネットワーク接続する。

### スリープ/シャットダウンの設定
コントロールパネル > ハードウェアとサウンド > 電源オプション > プラン設定の変更 > 詳細な電源設定の変更 > スリープ > ハイブリッドスリープを許可する をオフにする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/938209/b081a287-3a59-ad6e-76ff-7a2ba4782aa5.png)

コントロールパネル > ハードウェアとサウンド > 電源オプション > 電源ボタンの動作を選択する > 「現在利用可能ではない設定を変更します」をクリック > 「高速スタートアップを有効にする(推奨)」のチェックを外し、変更を保存する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/938209/6f7c9a06-f80c-a6e6-6522-26d0a32a3b6b.png)


### OSの設定
デバイスマネージャー > ネットワークアダプター　から使用している有線のアダプターを選択しダブルクリック、または右クリックでプロパティを開く。
電源の管理で、スタンバイ解除に関する項目にチェックを入れる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/938209/cf07fc84-79b1-e7a0-79d8-45b468c5904d.png)

詳細設定から、Wake On Magic Packetを有効にする。(名称が多少違う可能性があります。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/938209/3cb3dc31-2bea-a7d0-1258-57b4028c7193.png)

### BIOS/UEFIの設定
PCを「完全シャットダウン」する。

PCの電源を入れた直後に、Del,F2,F10,F12等のキーを連打するとBIOS/UEFIメニューが開く(使用しているPCやマザーボードのメーカーのマニュアル等を参照)。自分の場合はDelキーで出来た。

以下のような設定項目を探して有効化する。

<details>
<summary>設定項目名</summary>
<div>

・ACPI (Advanced Configuration and Power Interface)
・APM (Advanced Power Management)
・APM Configuration
・Power Management
・PME Event Wake Up
・PM Wake Up Event
・Remote Wakeup
・Remote Power On
・Auto Power On
・Wake-up on LAN
・Wake Up Event Setup
・Wake on LAN from S4/S5
・Wake on PME
・Power On By PCI/PCIE Devices
・Power on by PCI devices
・Power on by PCIE devices
・Power on by PME
・PCIPME Power On Control
・Resume By PCI Device
・Resume By PCI-E Device
・PCIEによる電源ON

[こちらのサイト](https://n-archives.net/software/nwol/wol-pc-setting/bios-setting.html)から引用

</div>
</details>

節電モード/省エネモードがあったら無効化する。

<details>
<summary>設定項目名</summary>
<div>

・Deep Sleep
・Deep Sleep Control
・ErP
・ErP Ready
・S5最大省電力 (HP)

[こちらのサイト](https://n-archives.net/software/nwol/wol-pc-setting/bios-setting.html)から引用

</div>
</details>

### PCのIPアドレスの固定
windowsキー > 設定 > ネットワークとインターネット > アダプターのオプションを変更する > 使用するネットワーク(自分の場合はイーサネット)を右クリックしプロパティを開く > 「インターネットプロトコルバージョン4(TCP/IPv4)」をクリックしプロパティを開く > 「次のIPアドレスを使う」と「次のDNSサーバーのアドレスを使う」を選択し、指定したいIPアドレスやその他数値を入力する。

### Wake on LAN設定の確認
LAN内から適当なWOL用アプリを使用して、PCが起動するかを確認する。コマンドプロンプトで<b> ipconfig /all </b>などでIPアドレスやMACアドレスを確認し、アプリ内に入力して実行すれば確認できる。この時点で起動しない場合、ここまでの設定のどこかにミスがある可能性が高い。

## beebotteの設定

[RaspberryPi使って遠隔地から自宅PCをスリープ復帰させる](https://qiita.com/panpanpanyasan/items/6f70bfdb941dfff286aa#beebotte%E3%81%AE%E8%A8%AD%E5%AE%9A)

こちらの記事を参考にbeebotteのアカウントを作成し、チャンネルを作成する。このとき、channel name, resource name, channel Tokenをメモしておく。

### Pythonでコードを書く
Raspberry pi上でPythonを使用してbeebotteを監視し、beebotteに"wol_win10"というメッセージが届いたらwakeonlanを実行し、windowsPCを起動させるようにする。

raspberry piにライブラリをインストールする

```
sudo pip3 install paho-mqtt
```

以下のコードを作成した。表示が見やすいようにいろいろprintしている。また、実行された日時も表示させたかったので入れた。

```python:wol.py
import paho.mqtt.client as mqtt
import json
import subprocess
import datetime

TOKEN = "token_XXXXXXXXXXXXXXXX" # channel Tokenを入れる
HOSTNAME = "mqtt.beebotte.com"
PORT = 8883
TOPIC = "channel_name/resource_name" # それぞれ入れる
CACERT = "mqtt.beebotte.com.pem"


def on_connect(client, userdata, flags, response_code):
    print("==============================")
    print("status {0}".format(response_code))
    print("==============================\n")
    client.subscribe(TOPIC)


def on_message(client, userdata, msg):
    data = json.loads(msg.payload.decode("utf-8"))["data"]
    print(str(datetime.datetime.now()))
    print("data = " + data)
    if data == "wol_win10":
        wol_win10()
    print("\n==============================\n")


def wol_win10():
    for _ in range(10):
        subprocess.call("sudo wakeonlan -i 192.168.x.xxx XX:XX:XX:XX:XX:XX", shell=True)
        # 起動したいPCのipアドレス/MACアドレスを入れる
    print("Windows10 is booting...")


client = mqtt.Client()
client.username_pw_set("token:%s" % TOKEN)
client.on_connect = on_connect
client.on_message = on_message
client.tls_set(CACERT)
client.connect(HOSTNAME, port=PORT, keepalive=60)
client.loop_forever()

```

サーバーにアクセスするためには証明書が必要らしいので、このリンクからダウンロードし、プログラムファイルと同じディレクトリに置いておく。
https://beebotte.com/certs/mqtt.beebotte.com.pem


ターミナルでのwakeonlanコマンドは次のように書いて実行するので、これをPythonから実行している。

```
wakeonlan -i <IPアドレス> <MACアドレス>
```

ターミナルでwakeonlanコマンドが実行できない場合は下記コマンドでインストールする。

```
apt-get install wakeonlan
```


作成にあたり参考にしたサイトは以下。
[RaspberryPi使って遠隔地から自宅PCをスリープ復帰させる](https://qiita.com/panpanpanyasan/items/6f70bfdb941dfff286aa#raspberrypi%E3%81%8B%E3%82%89beebotte%E3%82%92%E7%9B%A3%E8%A6%96%E3%81%99%E3%82%8B)
[IFTTTとBeebotteを使ってGoogleHomeからRaspberryPiを操作する](https://qiita.com/msquare33/items/9f0312585bb4707c686b#raspberry-pi-%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97)
[OK Google, パソコンつけて。](https://nexusuica.hatenablog.jp/entry/2018/08/22/080242)
[Raspberrypi2でWakeOnLAN。外出先から家のパソコンを起動してアクセス。](https://i-think-it.net/raspberrypi2-wakeonlan-remote-access/)

## beebotteとraspberry piの動作を確認する
ここまでの動作を確認する。Pythonファイルを動作させた上で、以下のページを参考にbeebotteのコンソールからメッセージを送信し、受信できているかを確認する。Pythonはraspberry pi以外で動かしていても問題ない。PublishするときのDataに入れた文字が、Pythonの出力の data = XXXX になっていれば成功。

[beebotteの使い方メモ.md](https://gist.github.com/yoggy/28196ba084f9c406c75967289fbb3dca)


## iPhoneショートカットからbeebotteにメッセージを送信する
ここまで来たら、あとはショートカットでメッセージを送信するようにすれば、やりたかったことが実現する。

ホーム画面にアイコンでショートカットを設置したかったのだが、実行前に確認ボタンを押すようにしておこうということで最初にアラートを表示するようにした。OKを押すと実行を開始する。

アクションを追加 > アラートを表示 を選択し、好きなメッセージを指定する。(この部分は動作には不要なため省略可能)

アクションを追加 > Web > URL を選択。beebotteのリクエストURLを入力する。リクエストURLは以下。

```
http://api.beebotte.com/v1/data/publish/<channel_name>/<resouece_name>?token=token_<channel Token>
```

アクションを追加 > Web > URLの内容を取得 を選択。「方法」は「POST」を選択。「ヘッダ」は特に入力しなくて良い。「本文を要求」は「JSON」を選択。新規フィールドを追加し、テキストを選択。「キー」に「data」と入力し、「テキスト」に「wol_win10」と入力する。この部分が、Pythonがdataという変数で受け取る部分となる。

ここで必要な部分は終わりだが、実行したことを通知するようにしたかったので、さらに追加した。

アクションを追加 > スクリプティング > 通知を表示 を選択し、好きなメッセージを指定する。(この部分も動作には不要なため省略可能)

以上でショートカットの作成は完了。アイコンを追加して、ホーム画面に設置した。

![95FD6F5E-4C6D-4F9C-A962-1DAB9F064C17.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/938209/6de7dcaf-bbb9-ce2a-b288-60a861463853.jpeg)


参考にしたサイトは以下。
[202013Raspberry PiとMQTT使ってマンションのオートロックを解錠してやんよ!!!（後編)](http://tokidoki-web.com/2020/01/raspberry-pi%e3%81%a8mqtt%e4%bd%bf%e3%81%a3%e3%81%a6%e3%83%9e%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%b3%e3%81%ae%e3%82%aa%e3%83%bc%e3%83%88%e3%83%ad%e3%83%83%e3%82%af%e3%82%92%e8%a7%a3%e9%8c%a0%e3%81%97-2/)
[Beebotte のメッセージを Node-RED で受ける](https://qiita.com/HeRo/items/9978bedf353fc790a5b5)

---
ここまでの設定がすべて正しく完了していれば、raspberry piでPythonファイルを常時実行しておくだけで、外出先からでもiPhoneのショートカットから自宅のPCが起動できるようになった。ポート開放していないためセキュリティ的にも心配ないし、PCの電源が切れていたりスリープになってしまっていても、遠隔で起動し、外出先で自由にMacbookやスマホからChrome Remote Desktopで自宅のPCを使用できるようになった。


# 関連記事

https://qiita.com/tatsuki1119/items/cfcd9220e2c20b01bbf6