VOYAGE GROUPさんのLT大会「システムライトニングトーク!」で「苦しんで実現するホームオートメーション - あるいは、HTTP経由でHIDを操作する話」というタイトルで出させてもらえることになったので、それの台本。
LTにしてはけっこう長い内容になってしまったので、話し切れなかった時にお蔵入りさせないための保険でもあります。
「苦しんで実現するホームオートメーション - あるいは、HTTP経由でHIDを操作する話」というタイトルでお話します。よろしくおねがいします。中盤のブレイクタイム感覚で気楽にお聞きいただければと思います。
今回は交流会とのことでしたので、趣味の話として まずは自宅の紹介します。
うちなんですけど、Slack経由でオートロックが解錠できるようになってます。こちらデモ動画ですね。
— 断食失敗 (@shuma_yoshioka) January 19, 2019
ほかにも エアコンとか照明とかカーテンとか、いろいろ繋げてあります。
申し遅れましたが自己紹介しますと、私 吉岡と申します。
現在フリーランスでして、fluctさんでAndroid向け広告SDK開発のお手伝いさせてもらったり、あと高校でプログラミングの授業をやらせてもらってます。
んで今回なんですけど、テレビをSlack経由で操作したかったんですよね。
なぜかって話をすると、まあ朝起きたらテレビ点ければ時間もわかるし いい目覚ましなるじゃないですか。あとは外出時にも気兼ねなく一括消灯とか。
んでそれをSlack経由にすれば、ジョブの管理が集約できるし、ウチよく帰宅難民が来るんですけど、そういった客人向けの権限付与だったりAudit Logとしても使えるよねって判断です。
旧Slackと新Slackの比較 pic.twitter.com/KbdyEfCnfe
— 断食失敗 (@shuma_yoshioka) January 17, 2019
さて前提をお話すると、ウチで使ってるのは PIX-SMB400 というAndroid TVです。すなわち、当初は自分の専門領域でカバーできるかなって思ってたんですよね。
というわけで、当然アプリを作って外部からイベントを発火しようという発想に至るわけです。
でもコレだめだったんですよね。
Android 8.0からバックグラウンド処理の制約がメチャ厳しくなっちゃって、アイドル状態のプロセスを任意のタイミングで起こしたり、何か処理を走らせるの難しくなったんです。
ざっくり言えば、アプリがバックグラウンドにいる時は デーモンプロセスみたいなモノが速攻でkillされちゃうってことですね。
そしたら当然プッシュ通知で実現しようとなり、Android標準のFCMです。
が、こちらもまた難しい問題がありまして、アプリがフォアグラウンドに居れば通知が来たタイミングで処理を走らせることができますが、バックグラウンドだと "通知がトレイに表示される" に留まってしまい、ロジックでキャッチできないんです。
どうしようと。
そこで考えた結論として、
リモコン作ればいいんじゃないか、
というのが本題です。
要はAndroid TVのリモコンって、Bluetoothアクセサリなんですよね。すなわちKeyEventを発火できればよいと。
イベント発火さえできれば、当然物理キーもいらないわけです。
というわけで
作ってみました。
構成はこうです。マイコンボードがWi-Fi経由でバックエンドのイベントをSubscribeして、バックエンドはリクエストを受け取ったらそれを流す。マイコンボードはBLEでAndroid TVに接続されていて、HID、つまりキーボードとしてキーの押下を再現します。
ちなみにコレを選んだのは、単に家に余りが積んであったからです。
バックエンドはScalaで書いてますが、まあ多分なにで作っても関係ないです。
見たとおり難しいロジックは介在せず、超素直な数行のコードだけで実現しています。
というわけでDemoです。
— 断食失敗 (@shuma_yoshioka) January 19, 2019
こうしてSlack上でキーワードを投稿すると、WebHookとしてリクエストが投げられるわけですね。
私はこれで、朝起きれるようになったし、リモコンを無くしても困らなくなったし、おかげさまでリモコンの場所がわからなくなりました。
とはいえまだまだ課題がヤマズミになっていて、たとえば長時間放置すると動かなくなったりします。
つまりどういうことかというと、さっきの「朝起きれるようになった」というのはウソです。
というわけで、鋭意開発中です。
なお今回のコードはこちらで公開してありますので、ご興味あればぜひどうぞ。
※ 空白のページ
以上です、ご清聴ありがとうございました。
実は Androidはadb経由でkeycodeを送ることができます。
なので宅内にサーバを置いて上手く制御してあげれば、今回のように作らなくても動いたりします。