1回のOK,Google!で複数のコマンドを受け付け、kintoneへ連携（Dialogflow ）

# 1回の OK,Google! で複数のコマンドを受け付け、kintoneに記録する

Google Home で独自のコマンドを実行する場合、IFTTT が便利です。
しかし、1回の OK,Google! で1つの受付しかできません。
また受付時の文言は、3つまでしか設定できません。

本記事では、1回の OK,Google! で複数のコマンドを受け付けられる
ピカチュウ召喚のような仕組みを構築します。
（OK,Google! ピカチュウ と言ってみてください。）
また、データを kintone に蓄積します。

![１.png](https://qiita-image-store.s3.amazonaws.com/0/235420/72f8e88e-8786-9fb8-6423-4fa7e051ccf9.png)



## 動作
「OK,Google 応援アプリ」で起動します。
「頑張れｘｘ」「いけいけｘｘ」「おーｘｘ」などと話しかけると、
「ｘｘですね」とアシスタントが返答します。
また同時に、kintoneに「ｘｘ」を記録します。
終了する場合は、「おわり」と話しかけます。
もしくは放置、定義されていない言葉を3回程度投げかけると終了します。


## 全体構成
１．Dialogflow での受付
本構成では、IFTTTではなく、Dialogflow を利用します。
Dialogflow でコマンドを受け付けます。
Dialogflow では、コマンドの受付と、受付時の返答を設定することができます。
また、Webhook を設定することができます。
今回は、IBM Cloud（Node-RED）へ Webhook します。

２．IBM Cloud（Node-RED）
Dialogflow からの Webhook を受け付けます。
受け付けたのちは、受付時の返答を Dialogflow へ返すとともに
kintoneへの書き込みを実施します。
コマンドの受付痔の返答は、Webhook 先にて設定されたものが採用されます。
Dialogflow が Webhook との通信にタイムアウトした場合は、
Dialogflow に設定された返答が採用されます。

３．kintone への書き込み
Node-RED から kintone へ REST API でデータを書き込みます。

## Dialogflow での受付
Dialogflow にログインします。
[Dialogflow ](https://console.dialogflow.com)


![img_001223.JPG](https://qiita-image-store.s3.amazonaws.com/0/235420/5e472772-beb1-eaf9-b6d0-efed9aab566e.jpeg)


### Agent の作成
「Create Agent」から Agent を作成します。
今回は以下のように設定しました。

| 項目      |       値 |
|:-----------------|:------------------|
| name           |  cheering|
| DEFAULT LANGUAGE         |  Japanese-ja|
| DEFAULT TIME ZONE           |  Asia/Tokyo|

![img_001224.JPG](https://qiita-image-store.s3.amazonaws.com/0/235420/c1f9b059-13ed-46e4-a8ff-fffcee5b1170.jpeg)

### Entities の作成

「頑張れｘｘ」「いけいけｘｘ」の「頑張れ」「いけいけ」の部分を定義します。
漢字、ひらがな、カタカナなど区別されます。

・応援の Entities
synonyum の設定が Dialogflow で受け付ける文言となります。

| 項目      |       値 |
|:-----------------|:------------------|
| name           |  cheering|
| reference value         |  頑張れ|
| synonyum         |  頑張れ<br />がんばれ<br />がんばれー<br />ガンバ<br />おー<br />いけいけ<br />いけ<br />いけー<br />応援|

![img_001277.JPG](https://qiita-image-store.s3.amazonaws.com/0/235420/e79fb0f7-5c0a-2893-041d-1b83edc27426.jpeg)


・終了の Entities
synonyum の文言を受け付けた場合、アプリを終了させます

| 項目      |       値 |
|:-----------------|:------------------|
| name           |  end|
| reference value         |  終わり|
| synonyum         | 終わり<br />おわり<br />終り|

![img_001229.JPG](https://qiita-image-store.s3.amazonaws.com/0/235420/f783baea-ba8f-0029-a952-007108c1c126.jpeg)

### Intents の作成（応援）
IFTTTのアプレットのような設定です。
受付の設定と、受付時の返答を設定します。

・Training phrases 
受け付ける文言を設定します。
「頑張れTarget」と入力します。
「頑張れ」を選択し、プルダウンから Entities で作成した「@cheering」を選択しますy。
「Target」を選択しプルダウンから「@sys.any」を選択します。

![img_001241.JPG](https://qiita-image-store.s3.amazonaws.com/0/235420/a942f29a-cdf3-e71b-67e5-9f82ea19264f.jpeg)

![img_001242.JPG](https://qiita-image-store.s3.amazonaws.com/0/235420/ff6466a0-7dd5-f0f8-c992-9b971833518c.jpeg)

![img_001244.JPG](https://qiita-image-store.s3.amazonaws.com/0/235420/a38f19c8-dcf8-268a-c7a9-e081d29c4af8.jpeg)


・Action and parameters 
変数を設定します。

| PARAMETER NAME      |  ENTITY |VALUE |
|:-----------------|:------------------|:------------------|
| cheering           |  @cheering|$cheering|
| any        |  @sys.any|$any|

![img_001278.JPG](https://qiita-image-store.s3.amazonaws.com/0/235420/304a1324-980d-2af2-4917-52da4fcd5837.jpeg)

・Responses
Dialogflow からの応答を設定します。
「ｘｘだー！」と応答するようにします。
「Text response」に「$any だー！」を入力します。

![img_001266.JPG](https://qiita-image-store.s3.amazonaws.com/0/235420/df18af4a-15e5-24b7-9734-e035c41bbcd0.jpeg)

入力が完了したら「SAVE」します。


### Intents の作成（終了）
「Intents の作成（応援）」と同じ要領で、終了の Intent を作成します。
「Responses」にて「Set this intent as end of conversation」を有効化することによって、
本Intentが実行された際に、アプリを終了させることができます。

![img_001237.JPG](https://qiita-image-store.s3.amazonaws.com/0/235420/c1b98f7f-bd64-07e1-b961-4d38dfa71cea.jpeg)

![img_001239.JPG](https://qiita-image-store.s3.amazonaws.com/0/235420/e9ae3888-f0e1-1ba5-47fa-7606679339f1.jpeg)


### Intents の修正（ Default Welcome Intent ）
本アプリを起動する設定です。
標準では、「OK,Google!テスト用アプリ」などで起動します。
今回は、「OK,Google!応援アプリ」など、「@cheering アプリ」で起動するようにします。
Intents「Default Welcome Intent 」のTraining phrases を設定します。

![img_001270.JPG](https://qiita-image-store.s3.amazonaws.com/0/235420/8069b135-cca4-8f97-9881-931e70900eb7.jpeg)


## 動作確認１
Google Assistant で動作確認します。
「Integrations」から「Google Assistant」の「TEST」を選択すると Simulator が起動します。
Simulator では、「テスト用アプリにつないで」と打ち込むと、アプリが起動します。

「頑張れ日本」と打ち込むと、「日本だー！」と応答があれば正しく動作しています。

![img_001252.JPG](https://qiita-image-store.s3.amazonaws.com/0/235420/01642547-58d1-dde5-aef9-118ead5e7f6a.jpeg)

![img_001253.JPG](https://qiita-image-store.s3.amazonaws.com/0/235420/1f95b288-38f6-85b9-0834-3d1055c59a78.jpeg)

![img_001256.JPG](https://qiita-image-store.s3.amazonaws.com/0/235420/52882f42-2c4f-0ce6-8fbd-cbd16475c827.jpeg)


## IBM Cloud（Node-RED）の設定
IBM Cloud の Node-RED を起動し、HTTP（POST）を受け付けるフローを作成します。
![img_001257.JPG](https://qiita-image-store.s3.amazonaws.com/0/235420/5b3ef528-774c-1a89-e344-d3e684997c31.jpeg)

### Node-RED のフロー作成
・http in ノード
Dialogflow からのアクセス先となります。

| 項目      |       値 |
|:-----------------|:------------------|
| メソッド          |  POST|
| URL       |  /google|

![img_001258.JPG](https://qiita-image-store.s3.amazonaws.com/0/235420/f42b3cd0-dd27-1398-4bfc-2ac113218101.jpeg)

・change ノード
受信したJSONから、「ｘｘ」の部分を抽出します。
「msg.payload.result.parameters.any」の内容を「msg.data」へ代入します。

![img_001259.JPG](https://qiita-image-store.s3.amazonaws.com/0/235420/6cdaa31c-fefe-68ab-7d0f-69e6d0f65c00.jpeg)

・template ノード
Dialogflow へ返信し、Dialogflowに応答させる内容を記述します。
今回は、「ｘｘですね」と応答するようにします。

~~~response.json
{ 
    "speech": "{{data}}ですね"  ,
    "displayText": "{{data}}ですね"
    
}
~~~

![img_001260.JPG](https://qiita-image-store.s3.amazonaws.com/0/235420/e830188e-7086-5273-79ac-93463b293c50.jpeg)

・http response ノード
返答します。
標準設定のままで可能です。

![img_001261.JPG](https://qiita-image-store.s3.amazonaws.com/0/235420/b813f364-32a1-6287-2ae1-717390524a1b.jpeg)

### Dialogflow での Webhook 設定
Dialogflow から IBM Cloud（Node-RED）への Webhook を設定します。

・Webhookの設定
「Fulfillment」で「Webhook」を有効化します。
「URL」に IBM Cloud（Node-RED）で作成した http in のURLを指定します。
今回は、以下のようになります。

例：https://xxxxxxxxx.mybluemix.net/google

![img_001264.JPG](https://qiita-image-store.s3.amazonaws.com/0/235420/a607ee22-94cb-da84-173e-8599f32d010e.jpeg)

・Entitie での Webhookの有効化
応援 の Entitie の 「Fulfillment」で「Enabele webhook call for this intent」を有効化します。

![img_001267.JPG](https://qiita-image-store.s3.amazonaws.com/0/235420/2e83fac7-71d7-78d5-8fad-17ce6fc21f3c.jpeg)


## 動作確認２
「頑張れ日本」と問いかけ、「日本ですね」と応答があれば正しく動作しています。

![img_001275.JPG](https://qiita-image-store.s3.amazonaws.com/0/235420/a9256db6-e060-7f48-037a-a5b265af1a35.jpeg)

Node-RED では、JSONを受信し、msg.data には「日本」が代入されています。

![img_001276.JPG](https://qiita-image-store.s3.amazonaws.com/0/235420/b420364c-c9c1-63e2-7af6-b0798d518f33.jpeg)


## kintone への書き込み
以下の記事をご参照ください。

書き組むデータは、「msg.data 」に代入されています。
[Raspberry Pi から kintone にデータを書き込む](https://qiita.com/minatomirai21/items/a6ea55ff10fc3754c834)

かなり雑ですが、一通り動くと思います。