電源をoffにしたhackintoshをWake On LANの機能によって起動する記事を少し前に書きました。今回は、WOL機能をSiriから呼び出して「Hey Siri, マックをつけて」で電源投入できるようにしました。hackintoshに限らず大抵のコンピュータ(ただし本物のMacは除く)に使える手法です。
Table of Contents
Siriでショートカット呼び出し
Apple製品に搭載されたSiriは、HomeKit対応デバイス(アクセサリ)に直接接続して、色々なコントロールをしてくれます。HomeKit対応デバイスには、照明器具とか学習リモコンとかデロンギのヒーターなどがあります。なのでWOLのマジックパケットを送出するコンピュータを、HomeKit対応サーバとして設定すれば、これをSiriから操作することも可能です。でも今回はこれはやりません。
HomePodとWatchは特定のiPhoneと紐付けられているので、SiriはそのiPhoneに登録したショートカットも実行できます。ショートカットとは、一連の操作を記録したiOS版バッチファイルのようなものです。macOSだとApple ScriptやAutomator.appのような存在です。なのでショートカットからWOLできるように設定すれば、これをSiriから起動することが可能です。今回は、iPhoneショートカットを利用する方法で、SiriからWOLします。
Siri (HomePod mini) --> iPhone short-cut --> WOL起動
iOS用にWOLを行ってくれる無料アプリにRemoteBoot WOLがあります。これもショートカットに対応しているので、RemoteBoot WOLを起動してWOLを実行するショートカットを作れます。これで設定しておけば、iPhoneのSiriならば音声でお願いしてWOLを起動させることが可能です。
Siri --> iPhone short-cut --> RemoteBoot WOL --> WOL
ただとても残念なことに、HomePod miniのSiriからこのショートカットを起動すると「コンパニオンデバイスで続きの操作を行う必要があります」と言われてしまい、この後iPhoneでの画面操作が必要になります。結局はiPhoneを使用することになるので、HomePodを使う意味がありません。そこで、「コンパニオンデバイス (iPhone) で続きの操作を行う必要」の無いショートカット作りを目指します。
全体の流れ
RemoteBoot WOLを利用したショートカットでは、その後のiPhone操作が必要になりました。もっと単純なショートカット、例えば単に特定のURLにアクセスするだけのショートカットならば、iPhoneでの操作は不要なのではと考えました。以下に示すように、実際にiPhone画面操作不要のショートカットが作れました。
そこでURLアクセスされるとWOLのマジックパケットを送出するNode.jsサーバを作ることにします。全体の流れは、Siriに「Hey Siri, マックをつけて」と音声でお願いすると、iPhoneのショートカットが起動して、Node.jsが動くサーバが反応し、WOLを発動させます。以下に順番を示します。
Siri --> iPhone short-cut --> Node.js --> WOL
なので以下のものが必要です。
- Siriを動かすHomePod、Apple Watch、iPhoneなど
- ショートカットを実行するiPhone
- Node.jsが常時動いているサーバ (Raspberry Piなど)
- WOLで起動するコンピュータ (hackintoshなど)
1. と4.が必要なのは当然ですね。HomePodを使う上でiPhoneは必須なので2.はあるはずです。HomePodはiPhoneの機能を呼び出す端末のような存在なので、動作中にもiPhoneが必要です。
3.に関して、今回はたまたまNode.jsを使いますが、他にも実現方法はたくさんあります。いずれにしてもSiriからの命令を受け付けるために待機するサーバが必要です。実際には、macOSマシンでも、Windowsでも、Linuxマシンでも良いです。Intel CPU搭載のQNAPのNASもNode.jsが提供されているので、それでも良いです。今回は、安価・省電力に実現するためにRaspberry Piを使いました。将来色々と活用したいところですが、今の所WOLのためだけのサーバなので、できる限り簡単なものにしたかったです。インストールしたLinux (Raspbian) もCUIだけです。
Node.jsを使う
Node.jsをインストールする
WebアクセスするとWOLのためのマジックパケットを送出するサーバをNode.jsを使って作ります。そのためにまずはNode.jsをインストールします。macOSならばHomebrewでインストールできます。
$ brew install nodejs Updating Homebrew...
Raspberry PiやWindowsのWSLなどのLinux環境ならaptを使います。
$ sudo apt install nodejs
Node.jsでHello World!
Node.jsをインストールするとnodeコマンドが使えるようになります。Node.jsはサーバーサイドでのJavaScript実行環境です。って言われてもなんのことかピンと来なかったのですが、乱暴に言ってしまうと普通のプログラミングに使えるJava Scriptインタプリターです。pythonコマンドとかrubyコマンドと同じようにnodeコマンドでJava Scriptファイルを実行できます。例えば、hello.jsというテキストファイルに
console.log("Hello World!");
という1行のJavaScriptプログラムが書かれていた時、シェル環境からnodeコマンドを使うと
% node hello.js Hello World!
のように実行できます。nodeコマンドのパスを1行目に書いて、
#!/usr/local/bin/node console.log("Hello World!");
のような内容のテキストファイルを作って、実行パーミッションを与えておけば、shellスクリプトファイルとして実行することもできます。
通常、Java Scriptはクライアント側のwebブラウザで実行するので、ファイルアクセスやハードウェアアクセスに制限があります。サーバ機能も書けません。一方で、nodeコマンドで実行すると、制限無しで普通のプログラミングができます。サーバーサイドの実行環境と言われる所以です。
Node.jsでWOL
Node.jsでは色々なパッケージをnpmコマンドでインストールしたり、削除したり、管理します。Wake on LANをサポートしてくれるパッケージもあります。その名もwake_on_lanです。これをインストールするには、
$ npm install wake_on_lan
とします。npmが無いと言われたら、homebrewやaptなどで
$ sudo apt install npm
というようにしてインストールします。これでWOLに関する機能が使えるようになります。WOLさせたいコンピュータのMACアドレスが例えば11:22:33:44:55:66の場合、
var wol = require('wake_on_lan'); wol.wake('11:22:33:44:55:66');
というプログラムでWOLを機能させることができます。
Node.jsでサーバーアプリ
nodeコマンドは、webサーバー側でJava Scriptを動かすコマンドですので、webサーバの機能もあります。そもそもNode.jsが作られた目的がサーバ機能だったようです。例えば、以下のようなJava Scriptプログラムを用意して、nodeコマンドで動かしておきます。
var http = require('http'); var server = http.createServer(function(req,res){ res.write("Hello world!\n"); res.end(); }); server.listen(8080);
このプログラムを起動しておいて、このコンピュータのアドレスのポート8080番にhttpアクセスすると(例えばhttp://192.168.xxx.xxx:8080にアクセスすると)、Hello world!の文字列を返します。curlコマンドでアクセスするとこんな結果になります。
$ curl http://192.168.xxx.xxx:8080 Hello world!
SafariでこのURLにアクセスすると以下のような表示になります。
このようにプログラミングすれば、特定のURLに対して、決められた処理を実行するプログラムが簡単に書けます。
URLアクセスでWOL
上で紹介したWOLのサンプルと、サーバアプリのサンプルを組み合わせると、特定のURLにアクセスした時にWOLするプログラムが書けます。例えば、
var http = require('http'); var wol = require('wake_on_lan'); var server = http.createServer(function(req,res){ wol.wake('11:22:33:44:55:66'); res.write("Wake on LAN.\n"); res.end(); }); server.listen(8080);
というプログラムを起動しておきます。すると、他のコンピュータからこのコンピュータのアドレス、http://192.168.xxx.xxx:8080にアクセスすることで、WOLを発動させることができます。このときWOLが動いたことがわかるようにWake on LAN.と返答するようにしておきました。
Raspberry Piに固定IPアドレスを設定して、このプログラムを実行しておけば、Raspberry PiがWOLを発動するサーバになります。サーバとして動かしたい場合は、Raspberry Piからログオフしても動いていて欲しいので、
$ node hello_server.js &
というように最後に&をつけて実行します。これを終了するときはps -xコマンドでPIDを調べてkillします。動作が確認できたら、Raspberry Piの起動時に自動的に実行されるよう設定すると良いでしょう。ちなみに、
- /etc/rc.localに書き込む
- crontab -eの@reboot行に書く
などの方法があります。
iPhoneショートカットでWOLする
次に、上で作ったNode.js WebサーバにiPhoneからアクセスするショートカットを作ります。iOSにはショートカットというアプリが標準で入ってます。こんなアイコンのアプリです。
ショートカットは、macOSだとAutomator.appに相当するソフトで、iOS操作やプログラム実行を自動化するショートカットを作成します。ここでは、上で作ったWOLサーバにアクセスするショートカットを作り、それに「マックをつけて」という名前を付けます。ショートカット作成後に「ホーム画面に追加」という設定を行うと、iPhoneの画面にショートカットアイコンが現れます。
最初に、ショートカットアプリの中で、「すべてのショートカット」を閲覧すると、右上に+のボタンが現れます。これを押すと新規ショートカットが作れます。
ここでは、URLを指定して、それを開くという2個のアクションを追加します。まずは最初のアクションを追加します。
アクションの候補が出てくるので、検索窓にurlと打ち込んで、URL関連のアクションを検索します。
すると、「URL」というアクションがあるので選びます。URLを指定するアクションです。
ここで、WOLサーバのアドレスと、ポート番号を示すURLを指定しておきます。さらにその下の+ボタンを押して、次のアクションを追加します。
ここでは、「URLを開く」もしくは「URLの内容を取得」あたりのアクションが使えそうです。URLを開くは、実際にはSafariが起動します。これを試したところ、iPhoneでの操作が必要で、Siriには「コンパニオンデバイスで続きの操作を行う必要があります」と言われてしまいました。RemoteBoot WOLの場合と同じで、これでは元の木阿弥です。
一方で、「URLの内容を取得」アクションの方は、最初の起動で確認を求められるものの、以降はiPhoneの操作なしで実行できました。なので、こちらを選びます。
これで完成です。URLを指定して、その内容を取得する手順となりました。URLの内容には意味がなくて、アクセスさえしてくれれば良いのです。この後、名前をつけて保存します。この名前は、Siriに依頼する時の名前になります。「マックをつけて」にしました。
これで「マックをつけて」ショートカットが完成します。最初に起動すると、先に述べたように、アクセスの設定を求められます。ここでOKを押しておけば、以降は何もしなくても実行してくれるようになります。
Hey Siri, マックをつけて
これで、HomePod miniに「Hey Siri, マックをつけて」と話しかけてみます。iPhoneのショートカットが反応し、WOLサーバが応答し、hackintoshが起動するはずです。本物のMacだと電源遮断の状態からのWOLは出来ないらしいので、これはhackintoshならではの機能です。
iPhoneショートカットを呼び出す機能は、iPhoneと連携して動くHomePodとWatchのSiriでのみ可能です。macOSのSiriにお願いするとこんな返事が返ってきます。もしかしたらハンバーガー屋さんの方を探そうとしてくれているのかもしれません。
まとめ
HomePod miniに話しかけてhackintoshの電源を投入できるようになりました。そのために、Raspberry PiにNode.jsをインストールして、WOLを発動するサーバとし、これにアクセスするショートカットをiPhone上に作成しました。Siriからプログラムを起動させたい場合、以前はHomeKit互換のデバイスとして構築する必要がありました。今はショートカットが使えるので、楽になりました。