arrow-right hamburger logo-mark social-facebook social-github social-twitter
2018.07.10

ClovaとNefryBT(ESP32)を連携させてみよう

のびすけ

オフィスなう。

こんにちは、代表のn0bisukeです。

LINEのスマートスピーカーClova(正式にはAIアシスタントの名前)がIFTTTに対応したのでNefry BT(ESP32)と連携してみました。(実は結構前から対応してたんだけど試せてなかった)

先日作った勤怠システムについては以下の記事をご参照ください。

ちなみにこの勤怠システムは割と運用できてます。今の所は。

Clovaって?

ClovaはLINEが開発したAIアシスタントです。Clova FriendsやClova Friends mini、Clova Waveなどの対応スマートスピーカー端末が販売されています。

GoogleのGoogle アシスタント(Google Home)やAmazonのAlexa(Amazon Echo)などと同じ並びの立ち位置という認識で大丈夫です。

LINEといえばスタンプやキャラクターが特徴的ですが、Clova Friendsに関してもLINEが提供しているということもあり、 キャラクターをベースにしたデバイスが特徴的です

1 ─ ちなみにこの写真は先日のLINE CONFERENCE 2018で発表があったミニオンズモデル

この記事の執筆時点(2018年7月7日)ではまだ開発用SDKは公開されていませんが、IFTTTに対応したというリリースが出ているのでIFTTT経由で色々なサービスと接続することが出来ます。

出勤するとClovaがしゃべる

今回作ったものはこんな感じです。

試してるのはアルバイトの佐々木さんです。ドヤ顔は素です。

Nefryとclovaをつないでみた。 #nefry #clova

n0bisukeさん(@n0bisuke)がシェアした投稿 -

先日作った勤怠システムと連携してキーパッドのボタンを押して出勤登録するとClovaに通知がいきます。

Nefry BTとClovaを連携してみよう

IFTTTのWebhookを用いてNefry BTからPOSTリクエストを送り、Clova側に通知させます。

イメージはこんな感じです。

2

IFTTTでアプレットの登録

アプレットとは連携させるサービスとサービスの組み合わせのことを指します。

IFTTTのユーザー登録などを完了したらアプレット作成のページから新規のアプレットを作成します。

3

まずthisを押すとトリガーとなるサービスを選択します。

Webhookを選択しましょう。

5
任意の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");
}

全体コードはこちらです。

試し方と使う際の注意点

さて完成したら試してみます。

Nefryとclovaをつないでみた。 #nefry #clova

n0bisukeさん(@n0bisuke)がシェアした投稿 -

キーパッドを押すとClovaに通知がいき、「通知を読み上げて」とClovaに話かけてあげると読み上げてくれます。

はじめはWebhooksで通知するとそのままClovaが喋ってくれると思ったのですがそうではないので注意です。

通知が来た時点で何も喋ってくれないのは分かりにくいですね。現時点だと「通知を読み上げて」と言わないと読み上げてくれないので注意ですね。

まとめ

Nefry BTをClovaを繋げることが出来ました。

IFTTTに繋がると実質何とでも繋げられるので嬉しいですね。

人間が「通知を読み上げて」と言わなくても喋ってくれるように機能追加してくれることに期待です。