工作と競馬

電子工作、プログラミング、木工といった工作の記録記事、競馬に関する考察記事を掲載するブログ

概要

Google HomeとIFTTTとIRKitで家電操作ができるか試し、無事動作することを確認した。


背景と目的

先日発売されたばかりのGoogle Homeを入手したが、残念ながら私の家には対応家電が1つもない。しかし、私の家にはIRKitがあり家電操作ができるようになっている。そこで、Google Homeの音声コマンドを活用し、家電操作をできるようにしてみる。


詳細

0.方法の検討

  • Google Homeは、IFTTTのGoogle Assistantチャンネルと連携し、音声コマンドをIFTTTのトリガとして利用できる
  • IRKitは、インターネット経由で赤外線発信を制御できる(IRKit Internet HTTP API)
  • IFTTTには、任意のURLにWebhookを送信するWebhookチャンネル(これは、少し前までMakerというチャンネルのアクションだった気がするが・・・名前変わった???)がある

したがって、

  • Google Assistantチャンネルをトリガーとし、音声コマンドでトリガーが発行されるように設定する
  • Webhookチャンネルをアクションとし、IRKit Internet HTTP APIにWebhookを送信する

となるAppletを作れば、家電操作ができそうだ。


1.IFTTTの設定

1.1 Google Assistantチャンネル

トリガーとしてGoogle Assistantチャンネルのトリガのうち、今回は一番左の"say a simple phrase"を選択する。

20171008134847

そして、下図のように音声コマンドと、応答音声、言語の設定をしてCreate triggerを押せば、設定完了。

20171008134836

1.2 Webhookチャンネル

次に、アクションとしてWebhookチャンネルのMake a web requestを選ぶ。

20171008135300

今回は、操作対象をテレビの電源とするため、あらかじめ読み取り済みのコード情報をBodyとして設定。なお、Content-TypeやBodyの記入の仕方はこちらを参照するとよい。

request


2.動作テスト

Google Homeに対して、"OK Google,テレビを消して"と呼びかけたところ、"わかりました"と応答音声が発せられ、テレビの電源が消えた!ちゃんと動いた!


まとめ

とりあえず自前の環境で既存の家電操作ができるようになった。今後、Googleから赤外線リモコンを学習できるデバイスも発売されるとのことだが、まずはこんな感じで音声操作ができることが確かめられてよかった。

概要

ESP-WROOM-32で、HTTPSサイトにアクセスしてみた。


背景と目的

ESP-WROOM-32を使ってWebサービスと連携するため、arduino-esp32のサンプルWiFiClientSecureを使ってHTTPSサイトにアクセスしてみる。


詳細

1.コーディング

いきなりだが、以下の通りコーディング。

接続先は、どこでもいいのだが、AWSのAPI Gatewayで、jsonで"Hello world"が返ってくるだけのリソースを作成しておいたので、そこにGETリクエストしてみる。


#include 

const char* ssid     = "your_network_ssid";     // your network SSID (name of wifi network)
const char* password = "your_network_password"; // your network password
const char* server = "*************"; // "www.google.co.jp"など
const char* path = "/"; // サーバー名に続くパス, "/"から始める

WiFiClientSecure client;

void setup() {
  //Initialize serial and wait for port to open:
  Serial.begin(115200);
  delay(100);

  // Wi-Fiに接続
  Serial.print("Attempting to connect to SSID: ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    // wait 1 second for re-trying
    delay(1000);
  }
  Serial.print("Connected to ");
  Serial.println(ssid);

  // サイトにアクセス
  Serial.println("\nStarting connection to server...");
  if (!client.connect(server, 443))
    Serial.println("Connection failed!");
  else {
    Serial.println("Connected to server!\n");
    // Make a HTTP request:
    client.println("GET " + String(path) + " HTTP/1.1");
    client.println("Host: " + String(server)); // HTTP1.1で必須のヘッダ, アクセス先サーバーとしておく(そうしないとクロスドメインアクセスになる)
    client.println("Connection: Keep-Alive");
    client.println();

    if (client.connected()) {
      // ヘッダの受信
      Serial.println("--- Header ---");
      while (1) {
        String line = client.readStringUntil('\n');
        Serial.println(line);
        if (line == "\r") {
          break; // ヘッダの末尾は\r\nだからそこで終了
        }
      }
      // ボディの表示
      Serial.println("--- Body ---");
      while (client.available()) {
        char c = client.read();
        Serial.write(c);
      }
    }
    client.stop();
  }
  Serial.println("\n\nfinish.");
}

void loop() {
  // do nothing
}

2.動作確認

動作させたときのシリアルコンソールの出力は以下。ちゃんとアクセスできた。

Attempting to connect to SSID: your_network_ssid
..Connected to your_network_ssid

Starting connection to server...
Connected to server!
--- Header ---
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 42
Connection: keep-alive
Date: Sat, 16 Sep 2017 10:29:44 GMT
: (省略)

--- Body ---
{"event": {}, "contents": "Hello, world."}

finish.


まとめ

ESP-WROOM-32で、HTTPSサイトにアクセスできた。これで、セキュアにデータのやり取りをすることができそうだ。

  // macアドレスの表示
  // WiFi.beginを実行してから呼ぶ
  byte mac_addr[6];
  char buf[20];
  WiFi.macAddress(mac_addr);
  sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X", mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
  Serial.println(buf);

概要

ESP-IDFのversion2.1で、WiFiとBluetoothを同時に使用しようとしたら、変数名/関数名が被っていてコンパイルエラーが出たので、どうにか修正してみた。


背景と目的

ESP-IDFのversion2.1(2017/09/06での最新版)において、WiFiとBluetoothを同時に使用しようとすると、

20170907021644

というエラーが起きてしまう。そこで、これを解消する。


詳細

1.状況

ESP-IDFのversion2.1(2017/09/06での最新版)において、WiFiとBluetoothを同時に使用しようとすると、

  • WiFi制御系のesp-idf/components/lwip/include/lwip/apps/dhcpserver.h
  • Bluetooth制御系のesp-idf/components/bt/bluedroid/osi/include/list.h

の2つがインクルードされるが、

  • dhcpserver.hでlist_nodeのという変数の型が定義されている
  • list.hでlist_nodeという関数が定義されている

ため、コンパイルエラーを生じてしまう。

具体的には、

  • dhcpserver.hでは、
typedef struct _list_node {
	void *pnode;
	struct _list_node *pnext;
} list_node;
  • controller.hでは、
// Returns the value stored at the location pointed to by the iterator |node|.
// |node| must not equal the value returned by |list_end|.
void *list_node(const list_node_t *node);

なので、これらの名前が被らないように、変更してやればよい。ライブラリを修正するのは少し気が引けるが、エラーが出ていては始まらないし、どうせ自分の開発環境だから弄るのは自由なので、とにかく修正してみよう。


2.修正

方針としては、どちらかの名前を変えればいいのだが、dhcpserver.hの変数の型名list_nodeを変更するほうが簡単そうなので、こちらを変更する。具体的には、まあ何でもいいのだが、例えばLIST_NODEという大文字にしてみる。

typedef struct _list_node {
	void *pnode;
	struct _list_node *pnext;
} LIST_NODE;

すると、dhcpserver.cでもともとlist_nodeという型の変数を参照しているものがすべて参照不可能になりエラーが出るので、テキストエディタ等で、dhcpserver.c内の"list_node"を"LIST_NODE"に置換する。


3.コンパイルしてエラーが出ないことを確認

2の修正を施したものを、再度コンパイルしてみると、無事エラーが消えてコンパイル成功!というわけで、2の作業によって問題が回避できた。

ところで、このような問題は、そのうち修正版が出るだろうが、とりあえず、今はその場しのぎで対応しておくことにする。


まとめ

ESP-IDFのversion2.1でのコンパイルエラーを解消できた。

このページのトップヘ