Watson IoT Platform を利用して TJBot を制御

これは２０２０年６月２５日（金）「[IBM User Group Conference 2020](https://iugc.connpass.com/event/176351)」 にて紹介させていただいた「TJBot Zeroの活用例」の内容です



# 目標
Watson IoT Platform 経由で
手元のTJBot にデータを送信する

# 知識材料 
- [Node-RED](https://nodered.jp/)
- [Watson IoT Platform](https://cloud.ibm.com/catalog/services/internet-of-things-platform) (今回は [Quickstart](https://quickstart.internetofthings.ibmcloud.com/) でお手軽に試します)

# 利用環境
- [Slack](https://slack.com/intl/ja-jp/)
- [IBM Cloud Node-RED ](https://cloud.ibm.com/login)
- [TJBot Zero](https://github.com/tjbotfan/tjbotzero-raspbian)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311258/a2d9fac4-202a-b6d2-3f4c-47948880ec5a.png)

# 今回のゴール
Slack に投稿したテキストメッセージを TJBotZero に喋らせる

# アプリケーションサーバ Node-RED 準備
slack からメッセージが送信されるアプリケーションサーバを設定する。

## IBM IoT App ノード追加
Node-RED メニューの `パレットの管理` から `ノードを追加` を選び、
**node-red-contrib-scx-ibmiotapp** を追加する
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311258/f5050b2e-c866-f2b2-c9e6-e60c2d5d2a6f.png)

## フローを作成する
以下のノードを画像のように接続する。

- http in
- function
- ibmiot out
- (debug

![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311258/56cc74d1-75d4-1a05-7f43-756a4b691679.png)


### http in ノード
メソッドを `POST` に設定し、HTTPエンドポイントのURL を適切に設定する。(例では /slack/tjbot)
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311258/e940131e-d6c0-1882-d9c8-4757a8866f5d.png)

### function ノード
slack から送信されるメッセージにコマンドが含まれるため、コマンド部分を取り除いたメッセージを TJBot zero に送信するようにスクリプトを記述する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311258/1ee34ad0-c17b-e50e-dd01-6331a32c0725.png)

```js:function.js
msg.payload = {
    'd' : msg.payload.text.replace("tjbot", "")
};
return msg;
```
### ibmiot out ノード
`Authentication` を **Quickstart** に設定する。`Device ID` に、ユニークとなる文字列を設定する。`Event Type` も任意の文字列を設定しておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311258/94e22f86-b2ec-c177-e360-5e97ff81b932.png)


# Slack 準備
## アプリを管理する
Slack 画面の左上メニューから `設定と管理` → `アプリを管理する` を選択する。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311258/d06328da-8b6e-476c-c9d7-26feed07185e.png)

## Outgoing Webhook を追加
App 管理画面上部の `App ディレクトリを検索` で **outgoing** を検索し、`Outgoing Webhook` カスタムインテグレーションを追加する。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311258/f6fd7606-1126-3273-13c4-6a5216062906.png)

## Outgoing Webhook の設定
- チャンネル ... どのチャンネルで反応するか
- 引き金となる言葉 ... TJBot にメッセージを送信するコマンド
- URL ... Slack からのメッセージを受信するアプリケーションURL (今回はNode-REDのURL)
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311258/7e0a1863-be53-c659-2192-1a2b82f696dd.png)

適切に設定がおわったら、画面下部の「設定を保存する」ボタンをクリックする。

# TJBot Zero 準備
## IBM IoT App ノード追加
Watson IoT Platform からメッセージを受信するために、
Node-RED メニューの `パレットの管理` から `ノードを追加` を選び、
**node-red-contrib-scx-ibmiotapp** を追加する
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311258/f5050b2e-c866-f2b2-c9e6-e60c2d5d2a6f.png)

## フローを作成する
以下のノードを画像のように接続する。

- ibmiot in
- change
- openjtalk
- (debug
- 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311258/6fc37b32-866f-5a42-46da-2840a03d33aa.png)

### ibmiot in ノード
`Authentication` を **Quickstart** に設定する。`Input Type`を **DEvice Event** に設定する。`Device ID` に、アプリケーションサーバで設定した文字列を設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311258/2a99864c-32dc-e45a-34c9-57e4bcdc6e21.png)

### change ノード
アプリケーションサーバから Watwaon Iot Platform を経由して送信されたメッセージを、msg.payload に格納するように設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311258/ae5b3df6-9a09-db98-8ca2-e05b34c7210c.png)

# 実行と結果
slack で `tjbot` 文字列の後ろにスペースを入れて、TJBot にしゃべらせたい言葉を入力し送信する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311258/996693cb-aa93-abbc-0c9b-31cba5953ec4.png)

TJBot が「こんにちわ」とお話してくれる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311258/a855d54d-84bc-fc0d-5f50-84c7cc767f13.png)

# TJBot 側 応用フロー
Watson IoT Platform in ノード の後ろに GPIO を制御するノードをつなげると、メッセージをおしゃべりすると当時に、手を動かしたりLEDを光らせて通知させることもできる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311258/dc97d2f0-5f97-46aa-956d-872e9e1190c1.png)

## まとめ
Watson IoT Platform と TJBot を接続すると、外部のサービスから簡単にTJBot を制御できるようになる。
処理結果の通知やリマインドなどいろいろなことに活用できる。