HomeKitをメインに使ってスマートホームしているのは、Appleのエコシステムに取り込まれているからです。なのでmacOSばかり使っていて、Windowsは滅多に使いません。それでもたまにWindowsが必要になることがあります。そんなときは、小型のWindowsデスクトップ機に、MacからMicrosoft Remote Desktop経由で使ってます。仮想マシンでWindowsを動かすより高速です。さらに、中古デスクトップなら格安ですし、メーカ品にはWindowsライセンスが付いているので、Windowsを買うより安いです。
ということで、ディスプレイもキーボードも接続していない、小型Windowsデスクトップ機を棚の上に置いてあります。でも必要になった時にそこまで行って電源を入れるのが面倒です。macOSからの操作や、Siriに音声でお願いして電源を入れたいところです。ということで、Windowsマシンの電源投入をHomeKitから可能にすることを考えました。WindowsマシンはEthernetに接続されているので、Wake On LAN (WOL)機能を使って起動するのが簡単そうです。
BIOSをWOL対応する
まずはBIOSレベルで、電源off状態でもLANチップに電源供給されるように設定します。BIOSによって色々な名前になってますが、要するにWOLとかWake On LANなどを有効にするという意味の項目を有効にすれば良いです。
WindowsをWOL対応する
次に、WindowsもWOLに対応させます。「デバイスマネージャ」「ネットワークアダプター」から使用中のEthernetチップを選んで、詳細設定でWake On Magic Packetを有効にします。これ以外はデフォルトのままで良いです。
ただ、手元のマシンでは「Wake On Magic Packet」の項目が現れなくて苦労しました。このマシンには、IntelのI219というチップが搭載されていて、Windowsで最初から用意されているドライバで問題なく動作します。ただ、そのドライバだとWake On Magic Packetの項目が現れないようです。インテルのサイトからWindows用ドライバをダウンロードしてインストールすると、ようやくWake On Magic Packetの項目が現れて設定できました。
Windows 11の高速スタートアップを無効にする
Windows 11のデフォルト設定では、高速スタートアップという機能が有効なのですが、これが動いているとWOLが効かないようです。「コントロールパネル」「ハードウェアとサウンド」「電源オプション」「現在利用可能でない設定を変更します」を選び、「高速スタートアップを有効にする(推奨)」のチェックマークを外します。
Pingに応答させる
後述するHomeKitのWOLプラグインには、pingコマンド応答の有無で電源状態を検出する機能があります。Windowsはデフォルトではpingに応答しないので、応答するように設定しておきます。「コントロールパネル」「システムとセキュリティ」「Windows Defender ファイヤウォール」「詳細設定」「受信の規則」「ファイルとプリンターの共有 (エコー要求 – ICMPv4 受信)」を有効にします。
MACアドレスを調べておく
色々な方法があるとは思いますが、DOS窓からipconfig /allコマンドで調べました。「物理アドレス」の項目に現れる6バイトの16進数です。
WOLを試す
以上でWindows側の準備は整いました。WindowsをWOL対応させる手順は面倒で、一つでも欠けているとWOLしません。でも、ネットで調べるとたくさんの記事が見つかり助かります。
準備が完了したので、Windowsマシンの電源を落として、他のマシン(ここではmacOSのターミナル)から起動できるかどうか試します。WOLでは、LAN全体にマジックパケットというデータを流すことで、電源を入れます。マジックパケットは、0xFFが6個の後に、MACアドレスを16回繰り返した内容のデータです。Pythonでプログラムすると以下のようになります。
#!/usr/bin/python3 import socket s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) s.sendto(b'\xFF'*6+b'\x11\x22\x33\x44\x55\x66'*16, ('192.168.xxx.255', 7))
最近のmacOSではPythonが標準搭載されなくなってしまったので、Homebrewを使ってbrewコマンド
brew install python
でインストールしてあります。その場所が/usr/bin/python3なので、冒頭に書いてあります。sendtoメソッドの引数で、MACアドレス(この例では0x112233445566)と、LANのブロードキャスト用アドレス(最後が255のアドレス)を設定します。これを動かせばWindowsマシンが起動するはずです。pingの応答も確認しました。
% ping 192.168.xxx.xxx PING 192.168.xxx.xxx (192.168.xxx.xxx): 56 data bytes 64 bytes from 192.168.xxx.xxx: icmp_seq=0 ttl=128 time=0.840 ms 64 bytes from 192.168.xxx.xxx: icmp_seq=1 ttl=128 time=0.606 ms
Homebridgeで設定する
次はHomebridgeの設定です。Homebridgeのインストール方法はこちらに書きました。
Homebridgeのプラグインタグでwolを検索すると8個のプラグインが見つかりました。今回は、Homebridge WoLというプラグインを使いました。
設定ボタンを押して、IPアドレスやMACアドレスなどを書き込んでいけば良いです。コンフィグには以下のような内容が追加されました。
{ "name": "Windows", "ip": "192.168.xxx.xxx", "host": "192.168.xxx.xxx", "pingInterval": 3, "pingsToChange": 3, "pingTimeout": 1, "pingCommandTimeout": 0, "mac": "11:22:33:44:55:66", "broadcastAddress": "192.168.xxx.255", "startCommandTimeout": 0, "wakeGraceTime": 45, "wakeCommandTimeout": 0, "shutdownGraceTime": 15, "shutdownCommandTimeout": 0, "log": true, "logPinger": false, "debugLog": false, "returnEarly": true, "accessory": "NetworkDevice" },
この結果、iPhoneやMacのホーム.appに以下のようにWindowsというボタンが現れ、クリックすると電源が投入されました。またpingの応答のある間は、onの状態になります。
Siriにも「ういんどうずを点けて」と話しかけると電源を入れてくれます。Windowsの発音は日本語でokです。HomeKitから電源を切ることはできませんが、Remote Desktop接続などして使用後にシャットダウンすると、pingの応答がなくなるので、ホーム.appの表示もoffになります。
外出先からPCを起動
HomeKitにHomePod, AppleTV, iPadのいずれかが接続されていれば、世界中からHomeKit機器にアクセス可能です。なので外出先からこのWindowsマシンを起動することができます。ルータを設定しておけば、どこからでもRemote Desktop接続を可能な状態にできます。必要な時だけ起動するサーバ、たとえば自分専用のファイルサーバなどとしても活用できます。
コメント