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