真面目なブログはこっち 👉 blog.s64.jp

苦しんで実現するホームオートメーション、の台本

VOYAGE GROUPさんのLT大会「システムライトニングトーク!」で「苦しんで実現するホームオートメーション - あるいは、HTTP経由でHIDを操作する話」というタイトルで出させてもらえることになったので、それの台本。

LTにしてはけっこう長い内容になってしまったので、話し切れなかった時にお蔵入りさせないための保険でもあります。

苦しんで実現するホームオートメーション 

「苦しんで実現するホームオートメーション - あるいは、HTTP経由でHIDを操作する話」というタイトルでお話します。よろしくおねがいします。中盤のブレイクタイム感覚で気楽にお聞きいただければと思います。 

自宅の紹介

f:id:S64:20190124211201p:plain

今回は交流会とのことでしたので、趣味の話として まずは自宅の紹介します。

Slack経由でオートロックが開く

f:id:S64:20190124211300p:plain

うちなんですけど、Slack経由でオートロックが解錠できるようになってます。こちらデモ動画ですね。

ほかにも エアコンとか照明とかカーテンとか、いろいろ繋げてあります。

自己紹介

f:id:S64:20190124211420p:plain

申し遅れましたが自己紹介しますと、私 吉岡と申します。

現在フリーランスでして、fluctさんでAndroid向け広告SDK開発のお手伝いさせてもらったり、あと高校でプログラミングの授業をやらせてもらってます。

テレビをSlackから操作しようとした話

f:id:S64:20190124211440p:plain

んで今回なんですけど、テレビをSlack経由で操作したかったんですよね。

なぜSlack経由で操作したい?

f:id:S64:20190124211502p:plain

なぜかって話をすると、まあ朝起きたらテレビ点ければ時間もわかるし いい目覚ましなるじゃないですか。あとは外出時にも気兼ねなく一括消灯とか。

んでそれをSlack経由にすれば、ジョブの管理が集約できるし、ウチよく帰宅難民が来るんですけど、そういった客人向けの権限付与だったりAudit Logとしても使えるよねって判断です。

前提

f:id:S64:20190124211602p:plain

さて前提をお話すると、ウチで使ってるのは PIX-SMB400 というAndroid TVです。すなわち、当初は自分の専門領域でカバーできるかなって思ってたんですよね。

アイデア1: アプリ作って外からイベント発火

f:id:S64:20190124211633p:plain

というわけで、当然アプリを作って外部からイベントを発火しようという発想に至るわけです。

アプリNGの理由1: バックグラウンド処理

f:id:S64:20190124211717p:plain

でもコレだめだったんですよね。

Android 8.0からバックグラウンド処理の制約がメチャ厳しくなっちゃって、アイドル状態のプロセスを任意のタイミングで起こしたり、何か処理を走らせるの難しくなったんです。

ざっくり言えば、アプリがバックグラウンドにいる時は デーモンプロセスみたいなモノが速攻でkillされちゃうってことですね。

アプリNGの理由2: FCM

f:id:S64:20190124211741p:plain

そしたら当然プッシュ通知で実現しようとなり、Android標準のFCMです。

が、こちらもまた難しい問題がありまして、アプリがフォアグラウンドに居れば通知が来たタイミングで処理を走らせることができますが、バックグラウンドだと "通知がトレイに表示される" に留まってしまい、ロジックでキャッチできないんです。

どうしよう

f:id:S64:20190124211800p:plain

どうしようと。

f:id:S64:20190124211819p:plain

そこで考えた結論として、

f:id:S64:20190124211839p:plain

リモコン作ればいいんじゃないか、

アイデア2: リモコンを作る

f:id:S64:20190124211857p:plain

というのが本題です。

要はAndroid TVのリモコンって、Bluetoothアクセサリなんですよね。すなわちKeyEventを発火できればよいと。

イベント発火さえできれば、当然物理キーもいらないわけです。

PCから操作できる無線キーボード

f:id:S64:20190124211922p:plain

というわけで

f:id:S64:20190124211945p:plain

作ってみました。

構成

f:id:S64:20190124212004p:plain

構成はこうです。マイコンボードがWi-Fi経由でバックエンドのイベントをSubscribeして、バックエンドはリクエストを受け取ったらそれを流す。マイコンボードはBLEでAndroid TVに接続されていて、HID、つまりキーボードとしてキーの押下を再現します。

マイコン

f:id:S64:20190124212023p:plain

ちなみにコレを選んだのは、単に家に余りが積んであったからです。

バックエンド

f:id:S64:20190124212042p:plain

バックエンドはScalaで書いてますが、まあ多分なにで作っても関係ないです。

とってもシンプル

f:id:S64:20190124212103p:plain

見たとおり難しいロジックは介在せず、超素直な数行のコードだけで実現しています。

Slackで特定キーワードが出たらWebHook扱いでバックエンドを叩く

f:id:S64:20190124212131p:plain

というわけでDemoです。

こうしてSlack上でキーワードを投稿すると、WebHookとしてリクエストが投げられるわけですね。

私はこれで

f:id:S64:20190124212310p:plain

私はこれで、朝起きれるようになったし、リモコンを無くしても困らなくなったし、おかげさまでリモコンの場所がわからなくなりました。

www.irasutoya.com

 まだまだ課題山積

f:id:S64:20190124212330p:plain

とはいえまだまだ課題がヤマズミになっていて、たとえば長時間放置すると動かなくなったりします。
つまりどういうことかというと、さっきの「朝起きれるようになった」というのはウソです。

鋭意開発中

f:id:S64:20190124212409p:plain

というわけで、鋭意開発中です。

今回のおもちゃはこちら

f:id:S64:20190124212453p:plain

なお今回のコードはこちらで公開してありますので、ご興味あればぜひどうぞ。

github.com

おわり

※ 空白のページ

以上です、ご清聴ありがとうございました。

Appendix: 実は

f:id:S64:20190124212530p:plain

実は Androidはadb経由でkeycodeを送ることができます。
なので宅内にサーバを置いて上手く制御してあげれば、今回のように作らなくても動いたりします。