GASとESP32で外出先からPCを起動する（Wake On LAN）

## 概要
Google Sheets（スプレッドシート），Google Apps Script（GAS），ESP32を使って外出先から自宅PCを遠隔起動（Wake On LAN，Wake On Wan）する仕組みを作ってみました。
ルータのポートを開放する必要なく，セキュアにPCの電源を入れるための方法を紹介します。

## はじめに
まず，リモートでPCを起動するには「Wake On LAN（WOL）」という技術が必要です。これは，同じLAN内にあるPCを起動する技術ですが，外出先からではネットワークの問題もあり，そのままでは利用できません。

そこで，省電力デバイスである「ESP32」を自宅に設置し，HTTP通信を利用してPCを起動することを考えました。これなら低コストかつセキュアにリモート起動が可能になると判断し，この方法を試すことにしました。

具体的には，スプレッドシートでPCのステータスを管理し，GASの実行可能APIを使用します。ESP32は定期的にこのAPIにアクセスし，PCがオフの状態でシートのステータスが変わった場合にWake On LANパケットを送信してPCを起動する仕組みです。

ここでは，同じLAN内にあるPCを起動するまでの要点をまとめて紹介しています。詳しい内容やこの方法に至った経緯，感想などは，以下のブログで紹介しています。

https://yhotta240.hatenablog.com/entry/2024/09/09/050147?_gl=1*1r5uewz*_gcl_au*NjYyMjcwNDM3LjE3MjU1NTAzMjg


### ESP32について
ESP32は，Wi-FiやBluetooth通信が可能なマイコンです。
他のユーザーもESP32を使ってWake On LANを実装している例が多くまずはこれを試してみました。

秋月電子通商で「ESP32-DevKitC-32E ESP32-WROOM-32E開発ボード 4MB」を購入しました。

https://akizukidenshi.com/catalog/g/g115673/

## 実行環境と設定
PCにWake On LANパケットを送信するために，PCの設定を変更します。
### PCの設定
実行環境
- OS：Windows 11/10
- 接続：有線LAN（イーサネット）に接続している必要がある

必要な設定
1. IPアドレスの固定
1. ネットワークアダプタの設定
1. BIOS/ UEFI の設定
1. シャットダウン/ ハイブリットシャットダウン
1. マジックパケットでの起動を有効にする

必要な情報
- 物理アドレス（MACアドレス）

参考

https://eizone.info/window-wake-on-lan/

### Arduino IDE の設定
Arduino IDEを使ってプログラムを書き込みます。
この時のArduino IDEのバージョンは2.3.2でした。
ESP32を使えるようにするには
「追加のボードマネージャのURL」と「EPS32プラットフォーム」のインストールが必要になります。
1. 追加のボードマネージャのURL
ファイルから「基本設定」を開きます。
安定版リリースリンク:
`https://espressif.github.io/arduino-esp32/package_esp32_index.json`
のURLを「追加のボードマネージャのURL:」にペーストしOKをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680988/97717e60-82ff-e215-b34f-08b0150f472b.png)

2. EPS32プラットフォーム
ボードマネージャから「ESP32」と入力して検索し，esp32 by Espressifをインストール
`esp32 by Espressif`（バージョン 3.0.4）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680988/c27f54f2-b33d-603d-3f1e-88104234c211.png)

▼ 公式ドキュメント

https://docs.espressif.com/projects/arduino-esp32/en/latest/installing.html#installing-using-arduino-ide

接続には，USB 2.0 A-Micro Bケーブルを使用します。
USBケーブルには充電専用と通信用の2種類があるので，通信用ケーブルを使用してください。
初めてESP32を接続した場合，ドライバがインストールされていない可能性があります。
デバイスマネージャ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680988/e4198428-3fc2-e457-e75a-02db598471a2.png)
以下のリンクから，ドライバをダウンロードしてインストールします。

Silicon Labs CP210x USB to UART Bridge Driver

https://jp.silabs.com/developers/usb-to-uart-bridge-vcp-drivers?tab=downloads

Windows OSであれば「CP210x Universal Windows Driver」をダウンロード。

設定が完了すると，「Silicon Labs CP210x USB to UART Bridge（COM5）」が表示されます。


#### ボードとポートの選択
Arduino IDE に戻り，上部のツールメニューを開きます。
ボード > esp32 > ESP32 Dev Module を選択します。
次に再びツールメニューを開き，ポート > COM5（PCによって異なる）を選択します。

<p float="left">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680988/7a32f5b9-d3c7-6deb-1528-2efdc1d42cc3.png" width="49%"  />
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680988/081d7bcd-f04f-4212-332a-4b20fa744dc2.png" width="49%"  /> 
<p>

## PC起動テスト
### Wake on LAN テストプログラムを作成
インストールするライブラリ：
`WakeOnLan by a7md0`（バージョン 1.1.7）
以下のコードを新規スケッチに貼り付けます。
```cpp:wol-esp32-test.ino
#include <WiFi.h>
#include <WiFiUdp.h>
#include <WakeOnLan.h>

// Wi-Fi設定
WiFiUDP UDP;
WakeOnLan WOL(UDP);
const char* ssid = "SSID";  // ここにWi-FiのSSIDを入力
const char* password = "PASSWORD";  // ここにWi-Fiのパスワードを入力


// MACアドレス設定
const char* pcMacAddress = "AA:BB:CC:DD:EE:FF";  // ここに自宅PCのMACアドレスを入力

void setup() {
  Serial.begin(115200);

  // Wi-Fiに接続
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("WiFiに接続中...");
  }
  Serial.println("WiFiに接続完了");
  Serial.println(WiFi.localIP());

  // マジックパケット送信
  WOL.sendMagicPacket(pcMacAddress);  // MACアドレスを使用してマジックパケットを送信
  Serial.println("Wake on LANパケット送信");
}

void loop() {
  // 何も実行しません
}

```

#### プログラムの設定
上記のプログラムを使用する前に
WifiのSSIDとPASSWORD，PCの物理アドレス（MACアドレス）を書き換える


### テストプログラム書き込み・実行

準備ができたら，書き込みボタンをクリック。
書き込みが完了すると，プログラムが自動的に実行されます。

PCがすでに起動している場合は，電源はついたままなので，プログラムが実行されても何も起こりません。PCを一度シャットダウンしてから，Wake On LANを試します。

ESP32につないだUSBケーブルをUSB-ACアダプタにつなげてコンセントに差し込みました。
<div align="center">
 <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680988/28b28cbd-ec1c-0a03-ebb7-ed86d998894d.jpeg" width="60%" /> 
</div>
コンセントに差さすとPCの電源が起動します。

これでESP32からPCを起動することができました。ここまでがESP32を使ってPCを起動するWake On LANを実際に試してみた結果です。


## まとめ
とにかく，ここまで準備が整ったのですが，GASのプログラム作成とAPIの構築，そのAPIを叩くESP32用のプログラムを書き込む作業がまだ残っています。もし興味がある方が多いようなら，続きを書こうと思っています。

### ▼ 続き

https://yhotta240.hatenablog.com/entry/2024/09/10/101132?_gl=1*1ljbcp7*_gcl_au*NjYyMjcwNDM3LjE3MjU1NTAzMjg

https://yhotta240.hatenablog.com/entry/2024/09/12/150101?_gl=1*y89dn7*_gcl_au*NjYyMjcwNDM3LjE3MjU1NTAzMjg