# プロジェクト詳細
個人プロジェクトです。去年の頭に、エアコンのリモコンの効きが悪くなりすぎて、頭にきて作成しました。
GoogleHome から、音声入力で家電を操作するシステムです。またSlackで外部から操作することもできます。
## 構成
### 入力
音声、もしくはSlackからコマンドを入力します。
音声入力と銘打っていますが、IFTTT経由でSlackに所定のメッセージをPOSTしているだけです。
* GoogleHome
* IFTTT経由で、音声コマンドごとに、Slackに所定のメッセージをポストする
* Slack
* SlackbotにDMで `req <command1> [<command2>...]` の形式でメッセージを送る。
例: `req aircon.off plug.off`
* Arp scan script
* 帰宅を検出するために、同一ネットワーク上に iPhone が接続されているかどうかを arp-scan を使って
ポーリングするスクリプトです。帰宅時に所定のコマンドを要求します。
### 出力
入力コマンドに応じて、下記のいずれかを実行する
* eRemote mini (学習リモコン)
* コマンドに応じて赤外線を送出する
* curl
* コマンドに応じて [IFTTT webhook](https://ifttt.com/maker_webhooks) にPOSTする
### 構成図
```
+--------------------------------------+
| |
| +------------------------------+ |
+-------------------------+ Rest api | |
| | +---+-------------+-------^----+ |
| | | | | |
| | | | | |
| +-------+ | +----+-----+ +----v----+ | |
| | Slack +---------> SlackBot | | RM mini|| | |
| +---+---+ | +----------+ +---------+ | |
| ^ | | |
| | | | |
| | | | |
| +------+-------+ | +-------------+ +------+------+ |
| | Post Message <----------|Google Home | | Scan iPhone | |
| +--------------+ | +------^------+ +-------------+ |
+---> Webhook | | | |
+----IFTTT-----+ | +-----+-----+ |
| | User (Me) | |
| +-----------+ |
| |
+-------------My Home------------------+
```
## 技術的なアピール点
Slackbot, Rest APIを提供するサーバー、DB(Redis)、iPhoneスキャン用のスクリプトをそれぞれ別のDockerコンテナ上で起動しています。最初は巨大なSlackBotだったのですが、Wifi監視スクリプトを追加しようとしたところで破綻の兆しが見えたので、コマンドの受信部(SlackBot)と実行部(Rest API)を分離して、ついでに勉強のためにDB(Redis)で赤外線コマンドを管理するようにしました。
Rest APIサーバーは再設計中です。お正月に読んだTDDの本に感銘を受けたので、テストファーストで作り直しています。
## 課題
* フロントエンドが弱い。ブラウザからコマンドの学習、一覧取得、送信とかができたら素晴らしい。
* 音声コマンドを追加するために、いちいちIFTTTにアプレットを登録する必要があるので面倒くさい。
* 帰宅の検知が弱い。iPhoneは画面を見ないとWi-fiに接続されないので、ポケットに入れっぱなしのときに検知できないことがある。あと不在時に延々 arp-scan をするのは素敵じゃない。