我が名はなんとか菜である!

主に技術系の記事を書きますが、ポエムも混入します。

Google Home mini からパソコンの電源を入れられるようにした【Google Assistant + IFTTT + Raspberry Pi】

我が家にもGoogle Home miniが来たので、色々遊んでみました。 ざっくりこういう仕組みです↓

仕組み
GoogleHomeから家のパソコンを起動する仕組み

1. パソコンの電源ボタンに触らずにパソコンを起動するには?

Wake On LAN という仕組みを使います。

qiita.com

我が家のPCはマザーボードが対応済みのものだったので、これを使うことにします。
うちはルーターが外からのパケットをブロードキャストしてくれないみたいで、直接WOLマジックパケットを送信するのは不可能だったので、LAN内にウェブサーバーを立てて、そいつに対してリクエストを送信することで間接的に送ってもらう、という仕組みにすることにしました。

2. GoogleHomeからHTTPリクエストを送信するには?

IFTTT というウェブサービスを使います。

ifttt.com

IFTTTは、ウェブを介したいろんなアクションをトリガーとして、いろんなアクションを起こしてくれるウェブサービスです。
いろんなってなんやねん、と思うかもしれませんが、本当に色々出来るのでとても便利です。「Amazonからメールが来たらTwitterで自分にリプライを送る」といった動作を一行もコードを書かずに実現出来るので大変お手軽。

で、IFTTTは「Ok, Google」でお馴染みGoogle Assistantとも連携できるのですが、Google Homeは基本的にこのGoogle Assistantを介して受け答えをしています。
つまり、Google Homeを使えばGoogle Assistantを介してIFTTTにトリガーを送信する事ができるということです!!!
次に何をアクションにするのかというと、ずばり「Webhook」を使います。
これは「アクションをきっかけに、指定したURLに指定したHTTPリクエストを送信する」というものです。つまりやりたい放題です。
まとめると「Google Assistantの特定のキーワードをトリガーに、指定したURLにHTTPリクエストを送信する」というアクションを設定する、ということになります。

3. リクエストをどうやって受ける?

ウェブサーバーであればなんでもいいのですが、パソコンを起動したいということはメインのパソコンは当然使えないので、別にサーバー用パソコンが必要ということになります。
今回はどこのご家庭にもある Raspberry Pi 3 を使いました。ラズパイであれば、常時起動していても電気代に優しそうです。
ラズパイ上にHTTPサーバーを立てる手順は割愛しますが、ここで一つ注意したいのは、外からの通信を中継するということは 「外から家のパソコンの電源をONに出来る状態になる」 ということです。
電源をONにされる程度と言ってしまえばそうですが、やはり勝手に何かいたずらをされるのはとても困るので、セキュリティ対策はしっかりとしておきましょう。
HTTPサーバーを立てるポートを80番以外にしたり、GETリクエストではなくPOSTリクエストで受けるようにしたり、BASIC認証を掛けたり、IFTTT以外からの通信は拒否したり…など、取れそうな対策は何通りかあります。出来る限り組み合わせることでセキュリティは高めておきましょう。HTTPSも設定しておくとだいぶ安心だと思います。

個人的にこの手順が一番厄介で、Linuxの知識が中途半端にしかない僕は色々苦労しました。

  • Wake On LAN を送信するコマンド ether-wakeが管理者権限でしか動作しないので、sudoersをちょこっといじったり
  • すでにHTTPサーバーを立てている状態だったので、VIrtualHostを使ってポートで読み取るディレクトリを切り替えるようにしたら、httpd.confの記述不足や、ディレクトリのパーミッション設定を間違えていて403が返ってきたり
  • HTTPSを導入しようとLet's Encryptの設定スクリプトを使おうと思ったら、インストールされているOSが32bitなせいで動作対象外だったり

インフラ屋さんはすげえなぁ・・・

終わりに

まあ、そんな感じで、我が家にも少しずつIoTの風が吹いてきました。
Google Assistant + IFTTT + Raspberry Pi の組み合わせは無限に面白いことが出来そうなので、何か面白い物ができたらまた記事を書こうと思います。

それではまた。