Google Home とIRKitとArduinoでホームオートメーション

下記記事を読ませていただいて、ウチはIRKitでホームオートメーションをしているので、
もしかしたら需要あるかもと思ったので書いてみます。
[Google Home からSmartでない家電を動かす](https://qiita.com/yukoh/items/49831e2de5f07d4e4228)
[Google Homeとスマートでない家電を接続する](https://qiita.com/akuroda/items/c0fecf532b614287fada)

また、今回は全くスマートでない「壁スイッチ照明」のコントロールをします。
Arduinoとサーボモータを使用して、こんなかんじのゴリ押しです。スマートでない感極まります。

↓Youtubeです
[スマートでない壁スイッチをarduinoとIRKitとGoogleHomeで動かす。](https://youtu.be/NdWjBWLUpOM)
[![スマートでない壁スイッチをarduinoとIRKitとGoogleHomeで動かす。](http://img.youtube.com/vi/NdWjBWLUpOM/0.jpg)](https://youtu.be/NdWjBWLUpOM)

照明のオンオフと調光ができます。
Arduinoに赤外線受光器を取り付け、赤外線で制御しています。

#Arduino
こちらの記事が参考になること極まれりだったので、参考（丸パクリ）にさせていただきました。
誠にありがとうございます。
[赤外線通信の実験パート２
(赤外線リモコンを送信器にして何か動かす)](http://www.geocities.jp/zattouka/GarageHouse/micon/InfraredCOM/InfraredCOM2.htm)

Sketchはこんな感じです。

```java
#include <Servo.h>
//モーターを定義しておきます。
Servo servo1;
Servo servo2;

#define IR_PIN      11    // 赤外線受信モジュール接続ピン番号
#define DATA_POINT  3           // 受信したデータから読取る内容のデータ位置

// 初期化処理
void setup()
{
  Serial.begin(9600) ; // パソコン(ArduinoIDE)とシリアル通信の準備を行う
  pinMode(IR_PIN, INPUT) ; // 赤外線受信モジュールに接続ピンをデジタル入力に設定
}
// メインの処理
void loop()
{
  int ans ;

  ans = IRrecive() ;                      // 赤外線リモコンのデータを受信する
  if (ans != 0) Serial.println(ans, HEX) ; // リモコンからデータを受信したら表示する
  if (ans != 0) {
    switch (ans) {
      //caseで赤外線信号の値を指定してあげます。
      case 0x86: //ライトオン
        //ライトスイッチ
        servo1.attach(9);
        servo1.write(105);
        delay(500);
        servo1.write(90);
        delay(100);
        servo1.detach();
        //dim
        servo2.attach(5);
        servo2.write(0);
        delay(500);
        servo2.detach();
        break ;

      case 0x87: //ライトオフ
        //dim
        servo2.attach(5);
        servo2.write(180);
        delay(500);
        servo2.detach();
        delay(100);
        //ライトスイッチ
        servo1.attach(9);
        servo1.write(70);
        delay(500);
        servo1.write(90);
        delay(100);
        servo1.detach();
        break ;
    }
  }
}
// 赤外線リモコンのデータを受信する処理関数
int IRrecive()
{
  unsigned long t ;
  int i , j ;
  int cnt , ans ;
  char IRbit[64] ;

  ans = 0 ;
  t = 0 ;
  if (digitalRead(IR_PIN) == LOW) {
    // リーダ部のチェックを行う
    t = micros() ;                          // 現在の時刻(us)を得る
    while (digitalRead(IR_PIN) == LOW) ;  // HIGH(ON)になるまで待つ
    t = micros() - t ;          // LOW(OFF)の部分をはかる
  }
  // リーダ部有りなら処理する(3.4ms以上のLOWにて判断する)
  if (t >= 3400) {
    i = 0 ;
    while (digitalRead(IR_PIN) == HIGH) ; // ここまでがリーダ部(ON部分)読み飛ばす
    // データ部の読み込み
    while (1) {
      while (digitalRead(IR_PIN) == LOW) ; // OFF部分は読み飛ばす
      t = micros() ;
      cnt = 0 ;
      while (digitalRead(IR_PIN) == HIGH) { // LOW(OFF)になるまで待つ
        delayMicroseconds(10) ;
        cnt++ ;
        if (cnt >= 1200) break ;    // 12ms以上HIGHのままなら中断
      }
      t = micros() - t ;
      if (t >= 10000) break ;      // ストップデータ
      if (t >= 1000)  IRbit[i] = (char)0x31 ;  // ON部分が長い
      else            IRbit[i] = (char)0x30 ;  // ON部分が短い
      i++ ;
    }
    // データ有りなら指定位置のデータを取り出す
    if (i != 0) {
      i = (DATA_POINT - 1) * 8 ;
      for (j = 0 ; j < 8 ; j++) {
        if (IRbit[i + j] == 0x31) bitSet(ans, j) ;
      }
    }
  }
  return ( ans ) ;
}
```

#IFTTT側の設定
Google Homeちゃんに、「電気つけて」って言ったら電気がつくようにしたいです。
IFTTT経由で、IRKitにHTTPリクエストすることで実現できそうです。

[IRKit公式サイト](http://getirkit.com/)のIRKit Device HTTP APIの項目を読んで、
Clienttoken/DeviceIDを取得＆つかう赤外線信号を取っておきましょう。

<img width="1240" alt="スクリーンショット 2017-11-18 18.24.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/214491/11355d57-5945-f400-075d-efc63f1515db.png">
IFTTTにログインして、New Appletで、まずはThisを選択しましょう。

<img width="1058" alt="スクリーンショット 2017-11-18 18.24.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/214491/aa494d13-8a11-597e-b9fa-6e7bd6baaed5.png">
Google Assistantを選択します。

<img width="1411" alt="スクリーンショット 2017-11-18 18.26.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/214491/0c4714c0-e57d-edfc-631f-38c08b1ec272.png">
今回は、"Say a simple phrase"をつかいます。
決まった言葉に対してトリガーしてくれる機能です。

<img width="495" alt="スクリーンショット 2017-11-19 19.07.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/214491/12ce0339-b4c2-973b-7287-00372a4601b6.png">
"What do you want to say?"にトリガーにしたい言葉を入れます。
今回は「電気つけて」にします。
その下の(optional)と書いてあるところには、言葉のバリエーションを指定できます。
"What do you want the Assistant to say in response"には、
トリガーがかかったらGoogle Homeに返してほしい言葉を入れます。

最後のLanguageはJapaneseにしておきます。

<img width="766" alt="スクリーンショット 2017-11-18 18.35.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/214491/4cc0882c-5d9e-4756-3c36-8994425e4d56.png">
次はThatです。

<img width="525" alt="スクリーンショット 2017-11-18 18.36.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/214491/9ea4b98f-c86d-80a4-5f54-924170c6cb8b.png">
ThatにはWebhooksを指定します。

<img width="716" alt="スクリーンショット 2017-11-19 14.53.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/214491/467e3b74-167f-83cf-e6de-d1761c64192c.png">
Make a Web requestを選択して、、

<img width="498" alt="スクリーンショット 2017-11-19 19.13.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/214491/cb1d4988-724b-5e86-9f65-2327d4bfa7dc.png">
URLには https://api.getirkit.com/1/messages を
MethodはPOST
Content Typeは application/x-www-form-urlencodedを指定します。
最後にBodyに、

```
clientkey=クライアントトークンを入れる&deviceid=デバイスIDを入れる&message={"format":"raw","freq":38,"data":[取得した赤外線信号の配列]}
```
を入れて、Create action→FinishでOKです。

これで、設定ができたはずなので、Google Homeちゃんに話しかけてみましょう！
「OK Google, 電気つけて」
「すみません、お役に立てそうにありません」
.....もごもご発音をきれいにしないとですね。

ということでこの記事は終わりです。