Google Home を使って、Bluemix の node-RED 経由で raspberry pi 上で動く赤外線リモコンを操作する

# はじめに

「OK Google, 電気つけて」をやってみたかった。ただそれだけ。

[Raspberry pi 3 を使って、 LINE から 赤外線リモコンを操作](https://qiita.com/na59ri/items/aea452f2487a393537dd) のエントリーで
無理やり　ルータのポート変換　を用いて、raspberry piにサーバーを立て家の外から
やり取りすることができるようになったが、ルータのポート変換はセキュリティホールになるため
別手段についてうっすら考えていたところ、
勉強会にて、node-RED の web socket を用いることで
ルータのポート変換　を利用せずに、今回の構成が実現可能であることがわかった。

今回は IFTTT を使って、Google Home から node-RED へ接続をする。

# 環境
Google Home mini
[IFTTT](https://ifttt.com/)
[Bluemix](https://console.bluemix.net/) node-RED
※ 今回利用するのは、Bluemix　上で動作している node-RED.
※ node-RED 自体は、処理をGUIで記載可能な オープンソース.
OS: Raspbian 9.1
赤外線リモコンデーモン：lircd 0.9.4c

# 構成
Google Home → (Google Assistant) → IFTTT → (Webhooks) → Bluemix(node-RED) → (WebSocket) → Raspberry pi(赤外線リモコン)

# 手順
## Bluemix(node-RED) の登録
@KURO-BLACK さんの記事 [「Bluemixでnode-redを立ち上げる」](https://qiita.com/KURO-BLACK/items/77af2c98940320ca6ce9)
がわかりやすかったので、参考にして登録してみてください

## Bluemix(node-RED) と Raspberry pi を繋げる
### Raspberry pi で赤外線リモコンを動かす
過去の記事、[Raspberry pi 3 を使って、 LINE から 赤外線リモコンを操作](https://qiita.com/na59ri/items/aea452f2487a393537dd) にて、
irsend コマンド　を使えるようにしてください

### Bluemix(node-RED)で 通信処理を作成
空の http request を受け、　WebSocket サーバとして、WebSocket クライアント に文字列を送る　仕組みを作成する。

#### http request、および、WebSocket のブロックをフィールドに置く
![node-Red1.png](https://qiita-image-store.s3.amazonaws.com/0/232494/9f31a4b3-4f56-4770-7403-445ec26ce44f.png)

#### 処理を記載するために、template ブロックをフィールドに置く
![node-Red2.png](https://qiita-image-store.s3.amazonaws.com/0/232494/a3d212bb-3da5-0037-98b1-68b50c83b373.png)

#### ブロック間での処理を繋げるため、線で結ぶ
![node-Red3.png](https://qiita-image-store.s3.amazonaws.com/0/232494/c4d036ed-608d-1bba-c92a-e679f274803c.png)

#### html request ブロックの内容を記載する
URL 項目は IFTTT の設定で利用する
![node-Red4.png](https://qiita-image-store.s3.amazonaws.com/0/232494/60b60384-b36d-44e9-c5af-0a5c985949ca.png)

#### template ブロックの内容を記載する
websocketにて、クライアントに送りたい本文を テンプレートの中に記載する。
ここでは、 on を言う本文を記載する。
![node-Red5.png](https://qiita-image-store.s3.amazonaws.com/0/232494/095d68e9-f68b-034f-46d7-0ab161323acc.png)

#### websocket ブロックの内容を記載する
URL 項目は raspberry pi にて、websocket クライアント の実装で利用する
![node-Red6.png](https://qiita-image-store.s3.amazonaws.com/0/232494/a97ecee3-29be-997d-4209-12f830f78bcf.png)

#### 処理を有効化する
![node-Red7.png](https://qiita-image-store.s3.amazonaws.com/0/232494/8fe69b8f-026b-daf8-abed-23c9ef69ea45.png)

### websocketクライアントの作成
参考のソースコードを [github](https://github.com/na59ri/wslight/blob/master/wslight.py) にアップしました。
ソースコードの　変更必要なポイント　は以下の通りです。
xxxxxxxx ：　node-Red でアクセスしていた、ホスト名を入れる
yyyyyyyy ：　node-Red 上で、websocket に指定していた　パス名　を入れる
※ 上の例だと、 app = ws.WebSocketApp('ws://xxxxxxxx.mybluemix.net/ws/light'　となる

```python:wslight.py
         # xxxxxxx is your name of Bluemix site.
         # yyyyyyy is url in websocket setting of node-RED
         app = ws.WebSocketApp('ws://xxxxxxxx.mybluemix.net/yyyyyyyy', 
                                     ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・) 
```


raspberry pi と bluemix との接続　は以下のコマンド　で行います。
Crtl + c で処理を終了できます。

```terminal:terminal
$ python wslight.py
```

## IFTTT 経由で Google Home と Bluemix(node-RED) を繋げる
### IFTTT へログインする
[IFTTT](https://ifttt.com/) にアクセスし、「Continue with Google」を選択。
Google Home に登録した Google アカウントでログインする

### アプレットの作成

#### 新規作成
画面の上にある　「My Applets」を選択すると画面が切り替わり
「New Applet」ボタン　が現れるので、選択する。

#### トリガーの設定
以下の画面に切り替わるので、「+ This」 を選択する。
![スクリーンショット 2018-05-26 7.55.31.png](https://qiita-image-store.s3.amazonaws.com/0/232494/e9c5a2c7-0d86-5d2d-e122-8aef19cc0e43.png)

検索窓（Search Service） に、「Google Assistant」 と入力して
現れたサービスを選択すると、選択できる項目が４つ現れ、
「Say a simple phrase」を選択する。

以下の画面の通り、今回は「電気をつけて」で喋りかけると、「電気つけるぜ」と返し、
「日本語」を設定する。
終了後、「Create Trigger」ボタンを選択する。
![スクリーンショット 2018-05-26 8.03.48.png](https://qiita-image-store.s3.amazonaws.com/0/232494/6aa5988a-8053-7708-c147-14690dde1fa4.png)

#### アクションの設定
以下の画面に切り替わるので、「+ That」 を選択する。
![スクリーンショット 2018-05-26 8.16.19.png](https://qiita-image-store.s3.amazonaws.com/0/232494/621bf545-afe9-856a-af2c-283f6fbc6a23.png)

検索窓（Search Service） に、「Webhooks」 と入力して
現れたサービスを選択すると、選択できる項目が現れ
「Make a web request」を選択する。

以下の画面の通り、URLの項目に、「Bluemix(node-RED)の設定画面のホスト名」＋「Bluemix(node-RED)の http requestで設定した URL」 を設定する。
Methodの項目に、「Bluemix(node-RED)の http request で設定した メソッド」 を設定する。
Content Type に「text/plain」を設定する。
終了後、「Create Action」ボタンを選択する。

![スクリーンショット 2018-05-26 8.26.46.png](https://qiita-image-store.s3.amazonaws.com/0/232494/0f87d90b-abbd-e14e-d5c7-0d15832f99a0.png)

「Finish」ボタンを選択する。

## しゃべってみる
Google Homeに、
「OK Google, 電気つけて」　としゃべりかけると、
「電気つけるぜ」　と返答し　電気がつく
これで　できあがり！！！

## 課題
一晩越えると、websocket がタイムアウト後、再接続しないことがあり、
次は タイムアウト　しない仕組みを考える。

# 参考URL
- [Bluemix で node-red を立ち上げる](https://qiita.com/KURO-BLACK/items/77af2c98940320ca6ce9)
- [Bluemix のサイト](https://console.bluemix.net/)
- [IFTTT のサイト](https://ifttt.com/)