「Hey Siri, マックをつけて」で電源を投入する

電源をoffにしたhackintoshをWake On LANの機能によって起動する記事を少し前に書きました。今回は、WOL機能をSiriから呼び出して「Hey Siri, マックをつけて」で電源投入できるようにしました。hackintoshに限らず大抵のコンピュータ(ただし本物のMacは除く)に使える手法です。

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

なので以下のものが必要です。

  1. Siriを動かすHomePod、Apple Watch、iPhoneなど
  2. ショートカットを実行するiPhone
  3. Node.jsが常時動いているサーバ (Raspberry Piなど)
  4. 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互換のデバイスとして構築する必要がありました。今はショートカットが使えるので、楽になりました。


AliExpress: Raspberry Pi Zero

4件のコメント

  1. これNFCタグからのショートカット起動も組み合わせるとかなり便利になりそうですね。

  2. いつも参考させてもらってますが、今回は考えていることが同じだったので、私の例もご紹介します。

    1. Homekit 対応のスマートプラグ MSS110HKKIT に、Raspberry Pi をつないで、ショートカットの App ホームからシーンとアクセサリを設定で電源をオンできるようにする。

    2. iPhone のショートカットから、スクリプティングのシェルからSSH経由でスクリプトを実行を選び、Raspberry Pi にログインするように、ホスト、ユーザー、認証を設定して、スクリプトに “wakeonlan 12:34:56:78:90:ab” と書く。

    3. 2つのショートカットをスクリプティングの制御フローの待機でつなぐ。

    と、書きましたが、ホームハブを持っていないので、実際は、ホームアプリから Raspberry Pi スィッチをオンにしてから、wakeonlan のショートカットを実行するという感じですかね。

    記事を読んで、HomePod mini が欲しくなりました。

  3. HomePodはiPhoneと違って、いつもその場所にあるという安心感が良いですね。

  4. Apple TV か HomePod がないと、外からホームをコントロールできないだけでなく、ショートカットも作成できないと分かった時は、Alexa にしようかと思いましたが、HomeKit は専用アプリなしでインストールを知って調べていました。
    もう少し、安くなれば…

返信を残す

メールアドレスが公開されることはありません。