Google Homeでビールオーダー

## やりたいこと
Google Homeでビールを注文できたら飲食店の接客が少し楽になると思ったので、
Google Homeに「ビールを注文したい」と言ったら注文できるActionを作ってみました。

※2018/1に作成した記事の転記です

ActionとはAlexaのSkillのようなもので、わかりやすい比較表がありました。
https://qiita.com/hayao_k/items/d1f258533ae0d5719f7f

今回はオーダーをLineに通知する、Chatworkに通知するという
2つの方法で試します。

## Lineに通知する（所要時間：15分）

Lineに通知するのは、IFTTTの設定だけでActionは作らずにできました。
まずは、[IFTTT](https://ifttt.com/)にGoogle Homeで利用しているアカウントでSign inします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15074/f8d88378-2564-763e-99cb-a48c4fb42455.png" width=50%>

MyAppletの新規作成ボタンを押し、thisにはgoogle assistantを選択します。
 
4つ出てきますが、ビールの個数が欲しいので、左から2番目の
Say a phrase with a numberを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15074/a07065ce-50d8-d570-d299-6d5f3fb78d93.png)

トリガー文言や応答文は下記のように設定しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15074/796647c9-4dba-113f-4ea1-f7af04d38c28.png)


thatには、Lineを選びます。Lineは1つしか選択肢は出てきません。
設定はこのように、Lineの通知が来るグループを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15074/912a7f70-4027-06e4-d078-2ec1e9b8f112.png)


あとは、Finishボタンを押せばOKです。

LineとIFTTTを連携させると、LINE Notifyというユーザーからメッセージがきます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15074/e57b84b8-4e01-2f95-c98f-0ae0b841007f.png" width=50%>


このユーザーをIFTTTで設定したグループに入れて、
Google Homeに対して、「OK, Google ビールを6個ください」と言うと
Lineのグループに下記のようにメッセージが届きます！！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15074/2c4fbb5a-3c1b-f5f0-0dd0-0d4e79937093.png" width=80%>

こんなに簡単にできるなんて、嬉しい！

### だけど、IFTTTだと問題が2つあります。

問題1、どのGoogle Homeから注文が来たかわからない！

Google HomeのアカウントをGoogle Homeごとに分けて、
それごとにIFTTTのアカウントを作って、メッセージに卓番とか入れれば、
わかるといえば、わかるけどムムム。

問題2、「ビールを3個ください」って言えない

完璧に定型文に沿って言わないといけないので、「を」とか忘れちゃいます。
いっぱいパターン作ればいいかもしれませんが、現実的ではありません。

お客さんのアクションによって、必要なことを聞き返したりして、
注文に至る感じにしたい。

そこで、

## Chatworkに通知する（所要時間：1時間）

まずは、Actions on GoogleでActionを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15074/5f835012-71a1-eefb-e149-0734e54f19ed.png)


Google assistantアプリのプロジェクトを作成したら、
custom appを選択します。今回はDialogflowを選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15074/83203ae6-ba04-6a6f-190b-87b62c634381.png)


Dialogflowの設定は後回しにして、アプリの設定を一通りしてしまいます。
「OK Google, XXXXX」のXXXXXを設定したり、アプリの画像を設定したら
TEST DRAFTと言うボタンが押せるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15074/1d9cfaf0-0e2c-a212-3097-25710beaf288.png)


"Press TEST DRAFT to test your app in the simulator or on your devices.Submit your draft for review when you are ready to publish your app."
と書かれており、自分のGoogle HomeとWebのシミュレーターで
アプリを公開しなくても作成したActionの動きが試せます。

次に、Dialogflowを設定します。

まずはIntentの設定です。Intentではユーザーがどんな意図の発言をしたか
判別し、応答メッセージやFulfillmentを使うか、Actionの終了などを設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15074/9329a117-3551-0e61-ae94-a59668bfe5f3.png)


 今回はIntentが判定できなかった場合のDefault Fallbackに
「何杯飲みますか？」を設定し、[何個]という注文数を識別する
インテントを作りました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15074/690731dd-f99d-b946-a53e-9fcb56ec015d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15074/4706d097-b4e1-1853-b559-2e983868f934.png)


User Saysで想定される回答を入力し、numberというパラメーターを学習させます。




Actionではアクション名を設定します。これはFulfillmentで使用します。


DefaultのResponseはFulfillmentを使用する場合は必要ありません。
Fulfillmentを使用しない、単純な応答をするだけなら、
Defaultに設定した値をランダムで応答してくれます。




End conversationはActionを終わらせますが、Fulfillmentを使用した場合は、
Fulfillment内でapp.tellの関数を実行することで、Actionを終了させます。

次にFulfillmentの設定をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15074/5ce6ad25-eb20-6355-351e-78bacffd3aa3.png)


index.js、package.jsonを編集して、Google Homeからのインプットで
[何個]のIntentで定義したnumberというパラメーターがある場合に、Chatworkにメッセージを送る処理を入れます。

ちなみに、FulfillmentのログはFirebase ConsoleのFunctionsのログに出力され、
プランもCloud Functionsの制約が適応されているようです。
https://firebase.google.com/pricing/
外部APIを呼ぶ場合は、Blazeプランに変更します。

以上で、設定は終了です。




Google assistantアプリのプロジェクト設定を入力し、TEST DRAFTのボタンを押したら、シミュレーターで会話してみます。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15074/c1a6fcfa-07f2-64f1-caf7-c3a00d1fe2d7.png)


 個数まで入れると、Chatworkにメッセージが飛んできました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15074/8a10ba12-7b25-4fe6-f485-08ffa781027d.png)

これで席にGoogle Homeを置いておけば、ビールのオーダーができます！
とても嬉しい！

IFTTTで問題だった、どのGoogle Homeかを判別するのは、
Google assistantのaccount linkingの設定をしてから、アカウント情報を取得することで、
一意に判定できそうです。（アカウント単位になってしまいますが。。）
https://qiita.com/flatfisher/items/1f39de99728d8717c73b


Dialogflowではある程度の揺らぎは拾ってくれるし、学習させていけるので、
必要な情報を集められます。

今後はEchoとかGoogle Homeなどの、
スマートスピーカーをインプットとしたIoTサービスの仕事が増えそうな気がします。

## こんな感じです
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/n8kq4BKqKAU/0.jpg)](http://www.youtube.com/watch?v=n8kq4BKqKAU)