Google HomeとIFTTTと自宅のサーバ(Rasberry Piでもok)で簡単家電操作

# 背景
[自宅で動いているubuntu-server経由で任意の文字列をGoogle Homeに喋らせてみた](https://qiita.com/freddiefujiwara/items/4f340c32c86312705c94)　の続きです
Google Homeを買ったはいいもの　家電の操作まではできていませんでした。
そこで声で家電を操作できるようにしました。

# やりたいこと
グーグルホームで下記のことがやりたい

* "暖房つけて" -> エアコンの暖房がつく
* "エアコン消して" -> エアコンが消える
* "テレビつけて" -> テレビがつく
* "テレビ消して" -> テレビが消える
* "番組表" -> テレビの番組表が表示される
* "テレ東" -> テレ東が表示される

#材料
* [RM mini 3](https://goo.gl/D3b2dk)
* Rasberry Piや自宅サーバ等
* iOS と Homeアプリ

# 構成
自宅の環境をざっくり説明するとこんな感じで考えています。
![Google HomeとIFTTTと自宅のサーバ(Rasberry Piでも多分できる)で簡単家電操作.jpg](https://qiita-image-store.s3.amazonaws.com/0/1817/dbc012b0-41e4-1336-8a62-fa1df6ba1367.jpeg)

# タスク
1.まずはコマンドラインでRM mini 3を操作するコマンドを作り。セットアップ
2.HTTP経由で1のコマンドを叩ける用にする。
3.IFTTTを使ってGoogleHomeと接続

# タスク1.コマンドラインでRM mini 3を操作するコマンドをセットアップ
## コマンドをインストール
[コマンド](https://github.com/freddiefujiwara/broadlinkjs-rm-cli)を作りましたので　npm 経由でインストールします

```
npm i -g broadlinkjs-rm-cli
```
## 赤外線信号を調査
[RM mini3(eRemote mini)とHomebridgeを使ってSiriでリモコン制御する](https://qiita.com/canadie/items/3110a0f0ff4f4749e039)
を参考に

* ペアリング
* RM mini3のIPアドレスとMACアドレスを探す
* homebridgeとプラグインをインストール
を上から順にこなし
リモコンの文字列（16進数列）をコピーするところまで進めてください

## 設定ファイル作成
[broadlinkjs-rm-cli](https://github.com/freddiefujiwara/broadlinkjs-rm-cli)は $HOME/.broadlinkjs.config.js をデフォルトの設定ファイルとしていますのでそのファイルを作成します
先程調査した赤外線信号を下記のように記載してください

```.broadlinkjs.config.js
module.exports = {                                                                                                                                                             
    "heat":"[エアコン暖房ボタンの赤外線信号]",                                                                                                                    
    "cool":"[エアコン冷房ボタンの赤外線信号]",                                                                                                                    
    "airoff":"[エアコンオフボタンの赤外線信号]",                                                                                                                  
    "tv":"[テレビ電源の赤外線信号]" ,                                                                                                                                                          
    "light":"[ライトの赤外線信号]"                                                                                                                                                        
};
```

## 使い方
下記のようにすると　エアコンの暖房がつきます。

```bash
broadlinkjs-rm-cli 192.168.1.3 heat # 暖房をつける
```
操作できましたか？

# タスク2.HTTP経由で1のコマンドを叩ける用にする。
前回でも登場しましたnginxのアクセスログを監視して、リクエストパスをコマンド実行するようなデーモンを使います
[altd](https://github.com/freddiefujiwara/altd) 
## インストール方法

```bash
npm i -g altd
```
## 使い方
下記のようにすると　/var/log/nginx/access_logを
broadlinkjs-rm-cliとlsコマンドだけ許可した状況で監視しはじめます

```bash
altd /var/log/nginx/access_log -w broadlinkjs-rm-cli,ls
```
例えば
http://example.com/broadlinkjs-rm-cli/192.168.1.3/airoff
にアクセスすると

```bash
broadlinkjs-rm-cli 192.168.1.3 airoff
```
に変換され
エアコンが消えます

```bash                                                                              
command airoff -> Device 192.168.1.3(11:22:33:44:55:66)              
```
のようなアウトプットがコンソールに表示されます

## nginx設定の注意点
IFTTTは200OKを返さないと　何回かトライするような動きをしています

```/usr/share/nginx/example.com/index.html 
OK
```
こちらを用意した上で

```/etc/nginx/sites-available/example.com.conf
try_files $uri $uri/ /index.html; 
```

例えば上記のような設定を入れて常に200 OKを返すようにしましょう

# タスク3.IFTTTを使ってGoogleHomeと接続
1.[IFTTTのmy appletページに行き](https://ifttt.com/my_applets)
2."New Applet"をクリック
3."This"をクリック
4.検索ボックスに"google"と入力すると　結果の一番左側にGoogle Assistantがあるのでそれをクリック
5."Say a simple phrase"をクリック
6.下記の用に設定し完成させる
![airoff.png](https://qiita-image-store.s3.amazonaws.com/0/1817/8ccb7512-538a-d635-f556-b61ae4f6a93f.png)
7.次は"That"をクリック
8.検索ボックスに"web"と入力すると　結果にWebhooksがあるのでそれをクリック
9.下記の用に設定し"Finish"
![airoffhook.png](https://qiita-image-store.s3.amazonaws.com/0/1817/56b1597b-a9f4-387a-a006-637b97279a59.png)

完成させたら　Google Homeに早速話しかけてみましょう

# 注意事項
今の構成だと、セキュリティ的な防御はまったくなく、誰でも自宅の家電を操作出来てしまいます。
また、altdもホワイトリスト方式でコマンドを制限してますが、なんか怖いですよね^^;
あと、試してないですが みなさんが試されているようにRaspberry Piでも同じ構成で実現できるんじゃないかと思います。
また、下記どちらも何か有りましたらpull requestでFBいただけると幸いです
- [broadlinkjs-rm-cli](https://github.com/freddiefujiwara/broadlinkjs-rm-cli)
- [altd](https://github.com/freddiefujiwara/altd) 

最後まで読んで頂きありがとうございました。