Google Home Mini を使って、声で ESP32 の LED を光らせてみた

ESP32 ( ESP-WROOM-32 )

New Applet 作成 (Google Assistant 側)

IFTTT 登録完了したら、次は New Applet というものを作成していきます。
要するに、Google Assistant と Webhooks を連携させるための設定を作ります。
まずは、Google Assistant 側を設定していきます。

下図の様なところをクリックします。

すると、下図の様になるので、New Applet をクリック

すると、下図の様になるので、「+」マークがついてブルーになったところをクリック

すると、下図の画面になるので、検索欄に「google」と入力すると、可能な Google サービスが出てきます。
そして、Google Assistant をクリックしてください。

すると、下図の画面が出てくるので、「Connect」をクリックします。

すると、別ウィンドウでメールアカウントの選択が出てくるので、Google Home を購入した時に設定したメールアドレスを選択してクリックします。

すると、下図の画面になるので、「許可」をクリックしてください。

すると、下図の4種類のトリガー選択画面になります。

これは、Google Home に喋った言葉をテキストとしてトリガーイベントを発生させるか、喋った言葉を数値として認識してトリガーさせるかどうかを選択する画面です。
この設定はちょっとややこしいので、次で説明します。

IFTTT Google Assistant Applet の Choose trigger について

IFTTT のGoogle Assistant 設定の中の、Choose trigger は何かというと、Google Home に話しかけた言葉を切っ掛け(トリガー)にして、テキストを抽出したり、数値を抽出したりする選択画面ということです。

それぞれ、簡単に説明するとこんな感じです。

1)    Say a simple phrase

テキストフレーズを登録し、「Ok. Google」の後に喋ったフレーズが一致したらトリガーを発生。
例えば、

「LED 点けて」

と、登録すると、「Ok.Google」の後に「LED点けて」と言うと、Google Home が認識して、マイコンにイベントを生じさせます。

2)    Say a phrase with a number

テキストフレーズの中の数値を抽出したトリガーを発生させたい場合に使います。
例えば、

「LED の明るさを 100 にして」

と喋って、100 という数値データを抽出してマイコンに送信したい場合、

「LEDの明るさを # にして」

と、登録します。
後で説明しますが、# 記号の前後には半角スペースを必ず置きます。
この # のところに任意の数値が入ってトリガーが発生します。

3)    Say a phrase with a text ingredient

※Blynk は日本語テキストに対応していませんのでご注意ください。半角英数値のみです。
テキストフレーズに任意のワードを抽出したトリガーを発生させたい場合に使います。
例えば、「LED ON」または「LED OFF」と喋って、「ON」または「OFF」というテキストを抽出したトリガーを発生させたい場合、

「LED $」

と、登録します。
これも、$ 記号の前後は半角スペースを置きます。

4)    Say a phrase with both a number and a text ingredient

※Blynk は日本語テキストに対応していませんのでご注意ください。半角英数値のみです。
2) と 3) を合体させたようなものです。
テキスト抽出と数値抽出したトリガーを発生させたい場合に使います。
例えば、

「LEDをON にして、明るさを50 にして」

というフレーズで、テキストの「ON」と数値の「50」を抽出したい場合、

「LEDを $ にして、明るさを # にして」

というフレーズを登録します。

では、次は、これを実際に設定してみます。

Say a phrase with a number を選択して設定してみる

今回はまず、Google Home に、

「LED 明るさ○○」

と頼んだら、ESP32 の GPIO に接続した LED の明るさを256段階で調節してみたいと思います。

下図の様に入力してみてください。

What do you want to say?
のところで、Google Home が認識できるキーワードを入力します。
数値を喋ったら Google Home ( Google Assistant )が自動的に数値に変換してくれますので、そこの部分は # 記号を入れます。
#記号の前後は必ず半角スペースを入力しておきます。
そうしないと認識しないので要注意です。

今回いろいろテストしてみたところ、キーワードの中間に # を入れるとうまく動作しませんでした。
キーワードの最後に半角スペースを入れて、#記号を入れ、その後は何も入れない方が上手く動作しました。
全角スペースや句読点、助詞などは入れない方が無難です。

また、このキーワードは3種類まで作ることができます。

そして、
What do you want the Assistant to say in response?
のところで、Google Home が返答する言葉を入力します。
# 記号は、Google Home に喋らせる数値になります。
当然ながら、前後は半角スペースにします。
ここはいろいろな砕けた言葉にすると面白いですよ。

そして、言語は Japanese にします。

次は、Webhooks を設定していきます。

コメント

  1. まめ より:

    興味深く記事拝見しました。
    昨日、別記事に投稿したものです。(記名を忘れていました)
    google homeからesp32使ってLEDをON/OFFやらする!夢が広がりますね。
    IoT対応の家電じゃなくても、照明の点灯消灯とかできないかなとか考えちゃいます。
    ただ、私の場合ほとんど何もわかってないのでこれから勉強ですが。

    これからのご活躍もお祈りいたします。

    • mgo-tec mgo-tec より:

      まめさん

      無記名でも全然大丈夫ですよ!

      強電100V を電子工作と連携させることは、この技術の延長なので、リレー機器を使えば実現可能です。
      ただ、、電気工事士資格保有者が施工する方が良いと思います。
      そうでなければ、既製品のIoT 機器を使った方が良いかも知れませんね。

      いろいろコメントありがとうございました。
      m(_ _)m
      ブログ更新は割に合わない辛い作業ですが、何とか維持していきたいと思ってまーす。

  2. juchang より:

    mgo-tec 様

    お忙しいところ、いつもお手数をお掛けし申し訳ありません。
    どうしても Webhooks 設定の画面に移れません。
    「上記の Google Assistant 設定で Create trigger ボタンを押すと…」とありますが、Create trigger ボタンが見つかりません。
    ご教示の程お願いいたします。

    • mgo-tec mgo-tec より:

      juchangさん

      たびたび当ブログにお越しいただき、ありがとうございます。

      Create triggerボタンが見つからないのは謎ですね。
      因みに、「上図の~」というところの文言は誤りで、「前項の図の」が正しいです。
      すみませんでした。
      早速訂正します。

      でもおかしいですね~。
      Say a phrase with a number欄の一番下にCreate triggerボタンがあるはずですが・・。

      他者のWEB記事で調べて見てください。
      私が調べたところ、そういうトラブルが見つかりませんでしたが・・。

  3. juchang より:

    mgo-tec 様

    お手数をお掛けします、解決しました。
    Say a phrase with a number欄の入力を終え、Create triggerボタンを押したところで一旦画面を閉じてしまったため、次の設定画面が表示されていたことを忘れていました。
    お陰様で、Webhooks の設定も終え次のステップへ進む段階となりました。
    今後ともご指導の程よろしくお願い致します。

    • mgo-tec mgo-tec より:

      あー、なるほど。
      それは良かったですね (^^)
      こちらこそ、今後とも当ブログをよろしくお願いいたします。
      m(_ _)m

  4. たい より:

    この記事のとおりに進めていって
    「IFTTT Google Assistant Applet の Choose trigger について」の項で
    「3) Say a phrase with a text ingredient」を選択して、
    数値ではなくテキストをESPに送るのって可能ですかね?
    とりあえず以下のようなプログラムで自分なりにやってみました。

    String text = param[0].asString();
    Serial.printf("%s\r\n", text);
    

    実際にGoogleHomeに「こんにちは」とか「さよなら」「2.1(にーてんいち)」と話しかけましたが、全部「????□」と返って来ます。(単なる文字化けではない?)
    IFTTT(日本語) → Blynk(日本語未対応?) → ESP32(日本語未対応) のやり取りのどこかで(あるいは両方で)テキストがおかしなことになっているんですかね?

    このあたりのことで何かご存知でしたらアドバイスいただけると幸いです。

    • mgo-tec mgo-tec より:

      たいさん

      記事をご覧いただき、ありがとうございます。

      まず、結論から言いますと、Blynk は日本語非対応のようです。
      たいさんのように、IFTTT の
      3) Say a phrase with a text ingredient
      で作成して、Google Home に 「かきくけこ」というメッセージを送信してみました。
      Arduino IDE 側に以下のように、送られてきたデータを16進数でシリアルモニターに表示させてみました。

      String text = param[0].asString();
      
      for(int i=0; i<text.length(); i++){
        Serial.println(text[i],HEX);
      }

      すると、結果はこんな感じで表示されます。

      20
      4B
      4D
      20
      4F
      51
      20
      53

      これは、どうやら UTF-16コードの末尾バイトのみ合っていて、UTF-16コードの先頭バイトがカットされているっぽいです。
      「かきくけこ」のUTF-16は、16進数で以下のようになります。

      0x304B
      0x304D
      0x304F
      0x3051
      0x3053

      本来、WEB上では、UTF-16 の場合、「¥u304B」のような文字で返って来るので、最初の文字列はカットされてしまう可能性が高いです。
      ついでに 30 もカットされてしまうかもしれません。

      因みに、「ABCDEFG 12345678910」とGoogle Home で喋ると、半角英数値は問題無く表示できます。
      ですから、Blynk は半角英数値のみの対応と思われます。

      もし、日本語文字列を取得したいのであれば、Google Cloud Platform , Dialogflow , Firebase を使えば良いと思います。
      ただし、ハードルは劇的に高くなり、うまく動作しないこともしばしばです。
      これはあくまでテストバージョンでしか動作しません。
      そのかわり、かなり自由度が高く、Google Home との連携は殆ど何でもできそうな感じです。
      以下の記事を参照してみてください。

      Google Home と ESP32 で、音声をテキスト表示させた WiFi 電光掲示板を作ってみた

      ESP32 単独で センサー値 を Google Home に喋らせる実験( Google Cloud Platform 設定編 )
      ESP32 単独で センサー値 を Google Home に喋らせる実験( Dialogflow , Firebase , Actions on Google 設定編 )

  5. たい より:

    mgo-tec 様

    すごく丁寧なご返事ありがとうございます。
    Blynk経由では日本語文字列のやり取りは難しいみたいですね。
    別記事で紹介なさっているGoogleCloudPlatformを使う方法なら、日本語も対応してESP32→GoogleHomeでしゃべらせることもできるようなので、少々敷居は高そうですがチャレンジしてみようと思います。
    アドバイスすごく参考になりました。ありがとうございました!

    • mgo-tec mgo-tec より:

      いえいえ。
      こちらこそ、ブログをご覧いただいただけでも感謝です。

      Google Cloud Platform かなり難解なので、がんばってください。

  6. 匿名 より:

    mgo-tec様
    記事を参考にBlynkからeps32を操作することができました。
    丁寧な解説どうもありがとうございます。大変感謝しております。
    なんとかあと少しでGoogle homeからエアコン、TV、照明の操作ができそうです。
    blog界隈も最近はなかなか目に見える形のフィードバックが得られにくいですね。
    せめてアマゾンの商品クリックしまくっておきます。

    • mgo-tec mgo-tec より:

      匿名さん

      記事をご覧いただき、ありがとうございます。

      動いて良かったです。
      こういうのって日進月歩ですから、来年はこの記事通りでは動かなくなっているでしょうね。
      なかなか辛いものがあります。

      自分もフィードバックは正直言って辛いので、BLOG界隈が衰退していくのは良く分かります。
      でも、こういう声を頂くとすごく励みになるので、何とか続けていけそうです。
      こちらこそ、嬉しいコメントありがとうございました。
      m(_ _)m

  7. たらこ より:

    音声でリモコンを操作できるようなリモコンを作るにあたり、この記事を参考にさせて頂いています。ありがとうございます。
    IFTTTのchose trrger「Say a phrase with a text ingredient」を選択し、数値を入れてみたところ負の値(-1,-3など)だった場合に全て0で変数に格納されていました。

    int num = param.asInt();
    Serial.println(num);

    何かご存知でしたらお力をお貸しいただけないでしょうか?

    • mgo-tec mgo-tec より:

      たらこさん

      記事をご覧いただき、ありがとうございます。

      この記事は随分前に書いたもので、久々にBlynk使ったら、なかなかサーバーにつながらなくてアカウントを作り直したり、IFTTTのサイトが少々変わっていたり、なかなか手間取ってしまいました。
      この記事も修正しないといけないなと思いました。
      でも、なかなか時間が無くて、しばらく放置状態です。

      さて、当方で確認したところ、やはりマイナス値が返って来ませんでした。
      IFTTTのアプレットで、「Say a phrase with a number」は負の値は使えないっぽいです。
      ただ、「Say a phrase with a text ingredient」では工夫すれば使えました。

      Google Home へ「明るさ マイナス3」と喋ると、char型で

      num =  - 3

      と返ってきます。
      ハイフンと数値の間に半角スペースがありました。

      BlynkライブラリのasInt()関数は、C言語の atoi 関数で返してくるので、ハイフンと数値の間にスペースがあると、負の数値と認識せず、認識不能になり、ゼロを返す仕様の様です。
      そこで、私なりに以下のコード組んでみました。

      #define BLYNK_PRINT Serial
       
      #include "WiFi.h"
      #include "WiFiClient.h"
      #include "BlynkSimpleEsp32.h"
       
      char auth[] = "xxxxx"; //ご自分のBlynk用 auth コードに書き換えてください
       
      char ssid[] = "xxxxx"; //ご自分のルーターの SSID に書き換えてください
      char pass[] = "xxxxx"; //ご自分のルーターのパスワードに書き換えてください
       
      //*************************************
      void setup()
      {
        Serial.begin(115200);
        Blynk.begin(auth, ssid, pass);
      }
      //**************************************
      void loop(){
        Blynk.run();
      }
      //**************************************
      BLYNK_WRITE(V1){ //Blynk Virtual Pin
        Serial.println("---------------");
        int num = 0;
        String str = String(param[0].asStr());
      
        uint8_t negative_num = str.indexOf("-");
        if(negative_num == 1){
          uint8_t start_num = negative_num + 2;
          uint8_t end_num = str.length();
          String num_str = str.substring(start_num, end_num);
          num_str = "-" + num_str;
          num = atoi(num_str.c_str());
        }else{
          num = atoi(str.c_str());
        }
      
        Serial.print("Receive String = ");
        Serial.println(str);
        Serial.printf("num = %d\r\n", num);
      }
      

      こうすると、シリアルモニタでこのように表示されました。

      ---------------
      Receive String =  - 11
      num = -11
      ---------------
      Receive String =  55
      num = 55
      ---------------
      Receive String =  - 110
      num = -110
      ---------------
      

      ただ、残念なのは、Google Home の返答では「マイナス」と言ってくれません。
      これは、Google Assistant の問題なのか、IFTTTの問題なのかは不明です。
      以上、私が分かるところはここまでです。

  8. たらこ より:

    細かく解説していただきありがとうございます!プログラム言語はかじったことがある程度なので非常に勉強になりました。
    プログラムを書き終えて無事動作させることができました。本当にありがとうございました。

    firebaseやDialogflowにも興味があるのでこちらのブログを参考に勉強させて頂きながらチャレンジしてみたいと思います!

    • mgo-tec mgo-tec より:

      たらこさん

      スミマセン。
      include の記号”<”以降が消えていたのを今気付きました。
      Wordpressの場合、preタグで囲っていたのに消える仕様になっているみたいです。
      失礼しました。
      でも動いて良かったですね。

      FirebaseやDialogflowは更に小難しいですし、今は仕様が変わっているかもしれませんが、ガンバってくださーい。

タイトルとURLをコピーしました