ClovaとNefryBT(ESP32)を連携させてみよう
こんにちは、代表のn0bisukeです。
LINEのスマートスピーカーClova(正式にはAIアシスタントの名前)がIFTTTに対応したのでNefry BT(ESP32)と連携してみました。(実は結構前から対応してたんだけど試せてなかった)
先日作った勤怠システムについては以下の記事をご参照ください。
ちなみにこの勤怠システムは割と運用できてます。今の所は。
Clovaって?
ClovaはLINEが開発したAIアシスタントです。Clova FriendsやClova Friends mini、Clova Waveなどの対応スマートスピーカー端末が販売されています。
- 公式サイト: https://clova.line.me/
GoogleのGoogle アシスタント(Google Home)やAmazonのAlexa(Amazon Echo)などと同じ並びの立ち位置という認識で大丈夫です。
LINEといえばスタンプやキャラクターが特徴的ですが、Clova Friendsに関してもLINEが提供しているということもあり、 キャラクターをベースにしたデバイスが特徴的です。
─ ちなみにこの写真は先日のLINE CONFERENCE 2018で発表があったミニオンズモデル
この記事の執筆時点(2018年7月7日)ではまだ開発用SDKは公開されていませんが、IFTTTに対応したというリリースが出ているのでIFTTT経由で色々なサービスと接続することが出来ます。
出勤するとClovaがしゃべる
今回作ったものはこんな感じです。
試してるのはアルバイトの佐々木さんです。ドヤ顔は素です。
先日作った勤怠システムと連携してキーパッドのボタンを押して出勤登録するとClovaに通知がいきます。
Nefry BTとClovaを連携してみよう
IFTTTのWebhookを用いてNefry BTからPOSTリクエストを送り、Clova側に通知させます。
イメージはこんな感じです。
IFTTTでアプレットの登録
アプレットとは連携させるサービスとサービスの組み合わせのことを指します。
IFTTTのユーザー登録などを完了したらアプレット作成のページから新規のアプレットを作成します。
まずthis
を押すとトリガーとなるサービスを選択します。
Webhookを選択しましょう。
任意のEvent Nameを指定します。clova_things
としました。
次にthat
を押してアウトプットとなるサービスを選択します。
clovaを選択しましょう。
メッセージ内容の箇所にValue1
を指定します。これはNefry BTから受け取る1つ目の値を指します。
Create action
のボタンを押して次のページでFinish
で完了です。
curlで試してみる
IFTTTのWebhooksの設定画面を見てAPI KEYを確認しましょう。
https://maker.ifttt.com/use/xxxxxxxxx
というURLが表示されていると思いますが、xxxxxxxxx
の箇所がAPI KEYになります。
curlでは以下のように試せます。
$ curl -X POST -H "Content-Type: application/json" -d '{"value1":"てすと"}' https://maker.ifttt.com/trigger/clova_things/with/key/xxxxxxxxx
リクエストするURLはこのような形です。
https://maker.ifttt.com/trigger/{{Event Name}}/with/key/{{API KEY}}
Event Nameは今回の場合は任意の名前としてclova_things
としていて、API KEYはxxxxxxxxx
の部分です。
Nefry BT側のコード
勤怠システムの記事のコードとほぼ同様です。
適宜読み替えてください。
#include <WiFiClientSecure.h>
WiFiClientSecure client;
const int HTTP_PORT = 443;
//途中省略
//・
//・
//・
void iftttClovaPost(String message){
const char* HOST = "maker.ifttt.com";
String url = "/trigger/clova_things/with/key/xxxxxxxxx";
url += "?value1="; //value1にデータを送る
url += StrPerEncord(escapeParameter(message).c_str()); //勤怠システム記事参照
Serial.print("connecting to ");
Serial.println(HOST);
if (!client.connect(HOST, HTTP_PORT)) {
Serial.println("connection failed");
return;
}
client.println("POST " + url + " HTTP/1.1");
client.println("Content-Type: application/json");
client.println("Content-Type: application/x-www-form-urlencoded");
client.println("Host: " + String(HOST));
client.println("Connection: close");
client.println();
unsigned long timeout = millis();
while (client.available() == 0) {
if (millis() - timeout > 5000) {
Serial.println(">>> Client Timeout !");
client.stop();
return;
}
}
// Read all the lines of the reply from server and print them to Serial
while(client.available()) {
String line = client.readStringUntil('\r');
Serial.print(line);
}
Serial.println();
Serial.println("closing connection");
}
全体コードはこちらです。
試し方と使う際の注意点
さて完成したら試してみます。
キーパッドを押すとClovaに通知がいき、「通知を読み上げて」とClovaに話かけてあげると読み上げてくれます。
はじめはWebhooksで通知するとそのままClovaが喋ってくれると思ったのですがそうではないので注意です。
clovaのifttt試してみてるけどぜんぜん喋ってくれない… なんだろう
— のびすけ / sugawara (@n0bisuke) 2018年7月6日
通知が来た時点で何も喋ってくれないのは分かりにくいですね。現時点だと「通知を読み上げて」と言わないと読み上げてくれないので注意ですね。
まとめ
Nefry BTをClovaを繋げることが出来ました。
IFTTTに繋がると実質何とでも繋げられるので嬉しいですね。
人間が「通知を読み上げて」と言わなくても喋ってくれるように機能追加してくれることに期待です。