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

ESP32 ( ESP-WROOM-32 )

Webhooks 設定

では、次のIFTTT内の連携先として、Webhooks を設定していきます。
Webhooks とは、正直よく分からないのですが、簡単に言うと、トリガーイベントが発生したら、サーバーに HTTP GET やPOSTリクエストを送ることができるサービスです。
ブラウザの URL 欄にアドレスを入力して、ホームページを見るのと同じようなことです。

つまり、これができれば、ESP32 と連携している Blynk サーバーへ GET リクエストできるということになります。

では、先ほど設定した、Google Assistant で受けたトリガーイベントを、Blynk サーバーへ GET リクエストする設定をしていきます。

前項の Google Assistant 設定の一番下にある、 Create trigger ボタンを押すと、下図の様な画面になりますので、「+that」をクリックします。

すると、下図の様な検索画面になるので、webhooks と入力するか、または web とだけ入力すれば、下図の様に Webhooksアイコンが現れますので、それをクリックします。

すると、下図の様になるので、それをクリックします。

すると、下図の様な画面になります。

さて、ここからが大問題でハマりポイントです。

まず、ESP32 と連携設定されている Blynk サーバーの URL アドレスを知らねばなりません。

Blynk Community の以下のページで、Blynk と IFTTT 連携方法が英語で述べられていました。

https://community.blynk.cc/t/blynk-ifttt-details-guide-how-to-connect-both/5772/6

ただ、ここで紹介されている方法を何回やっても上手くいきませんでしたので、いろいろ調べてたどり着いた方法を紹介します。

まず、上記のコミュニティーだと、Blynk クラウドサーバーのホスト URL は
http://cloud.blynk.cc/
http://blynk-cloud.com/
のようなことを書いてありますが、それでは接続できません!

正しい URL を調べる方法は、Windows10 の場合で説明します。

まず、下図の様にコマンドプロンプトを起動します。

すると、下図の様にコマンドプロンプトが開きますので、

ping blynk-cloud.com

と入力し、Enter を押します。

すると下図の様に Blynk サーバーの真の IP アドレスが表示されますので、それをメモっときます。

この IP アドレスがとても大切です。
それと、Blynk を登録した時にメールで送られてきた Auth コードを準備しておいてください

では、先ほどの Webhooks 画面の URL 欄にご自分の Auth コードを含めて入力してみてください。
(My_Auth_code) のところにAuthコードを入力します。

http://188.166.206.43/(MY_Auth_code)/update/V1?value=

V1 は、Arduino IDE スケッチ上で使用する Virtual PIN 1 という意味です。

Webhooks の URL 入力欄に下図の様に入力したら、注意することは value= の後にカーソルを置いておくことです。
その後、Add ingredient ボタンをクリックします。

すると、下図の様になるので、NumberField を選択してクリックします。

すると、下図の様にvalue= の後に
{{NumberField}}
というテキストが入力されます。

ここまでできれば、もう全てができたようなもんです。
ここまでが一番のハマリどころだったんです。
私は、何度も試行錯誤して、疲れ果ててしまいました・・・。

では、他の欄も下図の様に穴埋めします。

全て入力し終えたら、Create action をクリックします。

すると、下図の様になるので、Finish をクリックして終了です。

すると、下図の様な画面になります。修正したい場合や、この Applet ごと削除したい場合は、歯車アイコンをクリックします。
しかし、うまくいかない場合があると思いますので、その場合は、最初からやり直してみてください。

因みに、削除したい場合は、右上端の歯車アイコンをクリックしたら、下図の様に一番下のところの「Delete」をクリックします。

すると、下図の様なウィンドウが開くのでOKをクリックします。

すると、下図の様になりますので、削除理由を特に送信したくない場合は No thanks をクリックすれば、削除できます。

以上、IFTTT の Applet 作成方法でした。

このアプレットを数種類作って、いろいろなキーワードパターンを作ることができますので、試してみて下さい。
次に、Arduino core for ESP32 側のスケッチ入力を説明します。

コメント

  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をコピーしました