はじめに
先日,Google Home Miniを購入しました.
Google関連のサービス・製品*1を多く利用しているので,それらと連携出来たら便利そうだと感じたのと,どうやらAPIを通して機能を拡張できそうだと分かったのが購入の決め手です.
さて,せっかくGoogle Homeを購入したので,音楽を再生したり,ニュースを聞いたりする他にシーリングライトなどの家電を制御したりしたくなってきます.
Google Homeには,元々家電などを制御する機能が搭載されていますが,これを利用することができるのはPHILIPS Hueなどの一部のスマート家電のみです.
残念なことに,我が家で使用しているシーリングライトはHueではなく,一般的な,リモコンで操作するタイプのLEDシーリングライトです.そのため,そのままではGoogle Homeから制御することができません.
そこで目を付けたのが,APIを通した機能の拡張です.調べたところ,Google Homeの中身*2はGoogle Assistantであり,Dialogflow上でアプリを作成してActions on Google経由で呼び出すことによって機能を拡張することができるようです.
dialogflow.com
しかし,この方法で作成したアプリは起動のために毎回「テスト用アプリに接続」というようなコマンドを言わないと使用することができない*3ようです.部屋の明かりを点けるために毎回そうしたコマンドを言うのは面倒ですし,何より直感的ではありません.
そこで次に調べたのが,IFTTTを使用する方法です.IFTTTを使用して連携する場合には,どういう訳か*4「テスト用アプリに接続」というようなコマンドを言わずに,直接制御用のコマンドを認識することが可能なようです.シーリングライトの制御という目的を考えれば,アプリにはそれほど高度な機能は求められず,せいぜいWebhookが使えれば十分なので,今回はIFTTTを使用することにしました.
ifttt.com
次に問題になるのが,Webhookを受け取った後に,どうやってシーリングライトを制御するかという点です.先述の通りHueなどのスマート家電ではないので,制御するためにはリモコンを使用するほかなさそうです.そこで,リモコンの信号を解析し,その通りに真似してしゃべることで制御することができるのではないかと考えました.ちょうど秋月通販で買い物をする予定があったので,ついでに赤外線受信器や赤外線LEDなどを買いそろえました.
さて,リモコン信号の解析ですが,手元にArduinoもどき*5があったので,それを使用することにします.調べたところ,ArduinoのライブラリにIRremoteというものがあり,リモコン信号の送受信をサポートしていたのでこれを使用することとしました.
github.com
こんな感じのスケッチで,受信したリモコンの信号を出力させます.
IR Receive.c
gist.github.com
回路図なんかは,ググればいくらでも出てくると思うので,そちらを参照してください.
一つ注意が必要な点として,我が家で使ってるシーリングライト*6はリモコンの信号が長いようで,IRremoteライブラリそのままでは全ての信号を受信しきれなかったため, IRremoteInt.h
ファイルの43行目にある #define RAWBUF
の値を500ぐらいの大きな値に変更しています.
そして,受信した信号を元に次のようなスケッチを作成しました.このコードは,デジタル入力の2ピンと4ピンを監視し, HIGH
になった場合にはそれぞれリモコンの全灯と消灯の信号を送信しています.
IR Send.c
gist.github.com
Webhookを受信して,Arduinoに伝えるのはRaspberry Piを使用しました*7.C#で簡易HTTPサーバを書き,アクセスに応じてGPIOを制御してます.
ひとまず,モノとしてはこんな感じになりました.
最後に,IFTTTでこんな感じのアプレットを作成して完成です.
出来上がったもの
実際に動かしている様子は次の通りです.
システム全体の構成図はこんな感じ.Google HomeとWebサーバより右側が我が家の中です.
終わりに
とりあえず家にあるもので作ったので,ラズパイとかArduinoのあたりが煩雑になってる気がする.既製品のスマートリモコンの類を利用したり,ESP-WROOM-02みたいなWi-Fiマイコンを使ったりするともっとスマートに仕上がりそう.
Amazon.co.jp: スマートリモコン
akizukidenshi.com
最初のうちは,つい今までの習慣で自然とリモコンに手が伸びてしまいますが,すぐに慣れました.両手がふさがってても明かりを点けられたり,消し忘れた際に遠くから喋るだけで明かりを消したりできるので最高です.
今後は,何か良さそうなものがあれば他のものも制御してみたいです.
Splatoon2向けの何かを作ったりもしてみようと思ったのですが,ログイン周りの処理が変わってからは iksm_session
を自動生成できないようなので保留してます.