Usual Software Engineer

よくあるソフトウェアエンジニアのブログ

Amazon Echo(Alexa)とIRKitをIFTTTで連携してホームオートメーション

なかなかハマったので軽くまとめておきます。

一年ほど前に Amazon Echo と Google Home のこんなエントリを書きましたが

innossh.hatenablog.com

とうとう日本にも Amazon Echo が発売されましたね!テンション上がってさっそくゲットしました。 ひとまずテレビの電源を Echo で操作するために、もともと持っていた IRKit と Alexa を連携させることにしました。 Alexa の強みはスキルベースでそのスキルを公開できるプラットフォームがあることかと思いますが、 一般ユーザ的にはゼロ開発で簡単に設定できることがとても大事ですよね。 というわけでカスタムスキルも開発も全くなしで Google Home と同じように、 Alexa の IFTTT 連携によって IRKit を操作してみましょう。

必要なものは

になります。ゼロ開発なので AWS Lambda も不要です。

1. Amazon Echo をセットアップする

Alexa の iOS アプリと Android アプリがストアにあるので、そちらに従うとセットアップができます。 Wifi の繋がる PC でセットアップしたい場合、Amazon アカウントが JP (amazon.co.jp) の場合はこちらから http://alexa.amazon.co.jp 、 US (amazon.com) の場合はこちらから http://alexa.amazon.com でもセットアップできます。

僕は iOS アプリでセットアップを行い、何故か初回の Wifi 設定がエラーで ID パスワード 入れ直してもうまくいかなかったのですが、アプリを再起動して最初からやり直したらうまく Wifi に繋がりました。困ったときの再起動。

2. IRKit で赤外線データを取得する

IRKit はそのデバイスだけでなく、パブリックなインターネットから繋がる API を提供しています。これを使うことで IFTTT からおうちの IRKit に指示を送ることができるのです。 IRKit のセットアップも Amazon Echo と同じく定番の方法で、 ストアにある IRKit のアプリに従い Wifi の設定を行うだけです。 赤外線データの取得は公式 http://getirkit.com に丁寧に書かれていますので、よく読みましょう。コマンドに慣れていない人はハマるところかもしれません。

やることをまとめますと、

  • IRKit アプリで IRKit を Wifi に接続する
    • 例えばテレビの電源の赤外線を記憶させてボタン登録し、スマホからテレビが操作できるか試しておく
  • http://getirkit.com に従って IRKit の IP アドレスを特定し、必要な情報を取得する
    • GET /messages で表示されたテレビの電源の赤外線のデータをメモしておく
      • 不安なら POST /messages でテレビの電源が操作できるか確認しておく
    • POST /keysclienttoken を取得する
  • http://getirkit.com に従って IRKit Internet HTTP API で必要な情報を取得する
    • POST https://api.getirkit.com/1/keys上記で取得した clienttoken を使い、 deviceidclientkey を取得してメモしておく

という感じです。 deviceidclientkey と赤外線データは次の IFTTT の設定に使用します。

3. IFTTT に Alexa のトリガーを登録する

IFTTT は様々な Web サービスを連携し、アプレットと呼ばれる "もしこれなら、それをする" というルールを設定することでたくさんのことを実現できるサービスです。アカウントを持ってない人は登録しましょう。

IFTTT には Amazon Alexa の Service https://ifttt.com/amazon_alexa があるのでこれを使います。 また、 IRKit の操作には Webhooks https://ifttt.com/maker_webhooks の Request を使います。 Webhooks はもともと Maker と呼ばれていたものと同一で、 "if this then that" の "if this" の方のトリガーを受け付ける API としても、 "then that" の方の HTTP リクエストを発行する機能としても利用することができます。

ともかく必要なのは

になります。アプレット登録については詳しく説明していきます。

f:id:innossh:20171121013932p:plain

まずは "if this" の部分です。 Alexa を選んでから "Say a specific phrase" を選び、好きなフレーズで操作できるようにします。

f:id:innossh:20171121013943p:plain

今回はテレビの電源なので "テレビ" としておきましょう。もともとの作りが英語用なので大文字の英語は入力できないようになっていますが、日本語は問題ないようです。

f:id:innossh:20171121013952p:plain

続いて then の部分いきましょう。

f:id:innossh:20171121014002p:plain

Webhooks を選んで、 "Make a web request" を選びます。

f:id:innossh:20171121014011p:plain

ここで IRKit で取得した情報を入力します。

  • URL: https://api.getirkit.com/1/messages
    • https を使うように気をつける
  • Method: POST
  • Content Type: application/x-www-form-urlencoded
  • Body: clientkey=XXXXXXXXXXXXXXXX&deviceid=YYYYYYYYYYYYYYYY&message={"format":"raw","freq":99,"data":[99999,...]}
    • clientkeydeviceid は取得した通り
    • message には赤外線データの json を入力

f:id:innossh:20171121014020p:plain

最後はアプレットの名前を入力します。

f:id:innossh:20171121014033p:plain

これで全てできましたね。わくわく!

f:id:innossh:20171121014040p:plain

4. Amazon Echo に話しかける

IFTTT の Amazon Alexa の Service の説明によると "Alexa trigger xxxxxx" と話しかけることで IFTTT に連携できるわけですが、これは英語用の仕様です。 日本語の場合は、どうやら "アレクサ xxxxxx トリガー" や "アレクサ xxxxxx をトリガー" などと言う必要があるようです。 それでは大きな声で

「アレクサ テレビ トリガー!」

「イフトに送信します」と返されて、テレビの電源がついたはずです。 Congratulations!! 他の家電を操作する場合も同じ手順でアプレットを増やしていけば良いです。アプレットを duplicate するボタンがあったような気がしましたが見つからないので My applets から New Applet で一つ一つ登録しましょう...

僕は amazon の US アカウントを IFTTT に設定してしまったために何度も "そんな IFTTT トリガーはありません" と怒られて涙目になりましたが、上記の手順でできます。 なのでうまく動かない場合は、 IRKit 単体で POST リクエストに対してテレビの電源がつくか、 IFTTT で Alexa と Email のアプレットを作って Alexa に "アレクサ テレビ トリガー" と言うとメールが送れられるか、などと一つ一つの動作確認を行うと良いでしょう。

これから快適な Alexa ライフが始まりますね!

余談ですが「アレクサ、面白い話をして」はなかなかクセになって愛着が湧いてきます。「アレクサ、歌を歌って」も洗脳されてきて毎日聴きたくなります。

Add Starcaligari69iyuichinotsumestudiosilkHAYA0920
  • id:caligari69

    はじめまして。記事拝読させていただきました。早速で申し訳りませんが質問があります。こちらの記事通り設定し使用していたのですが1日目は問題なく動いていたのですが2日目の夜頃から急にIFTTTを送信しましたのあとirkitも光らず無反応になってしました。自分なりに調べたのですがclienttoken・deviceID・clientkeyが変わっていたのでそれを変更し再度試したところそれでも無反応でもう一度確認したらまたID等々が変わっておりました。1日ほど正しく動いていた時にID等を確認していなかったのでこれが原因かはわからないのですがもしアドバイスがいただけるならと思いコメントさせていただきました。そもそもclienttoken・deviceID・clientkeyはリセット以外で変わるものなのかそうだとしてIFTTTは追従するのかもわからなくて。。。
    初心者でばからしい質問をしていたらすいません。

  • id:innossh

    id:caligari69 コメントありがとうございます。 IRKitの仕様を詳しくは知りませんが、挙動を確認したところ想像していたものと違っていたので、少しハマりやすいのかもしれませんね。 `clienttoken` も、それで取得できる `deviceid, clientkey` も固定なものではないようなので、複数回取得した場合にどういう挙動になるのか正直わかりません。が、取得したどの `deviceid` と `clientkey` の組み合わせでも正しく動いたので、一度最初から手順をやり直してみると良いと思います。 ポイントとしてはいきなり IFTTT に登録せず、 `POST /1/messages` で IRKit が光るのを確認することでしょうか。 http://getirkit.com/#IRKit-Internet-POST-1-messages

    もし何も設定を変更していないのに一定期間後に動かなくなるのであれば、最後に取得した `deviceid, clientkey` 以外は期限切れになるみたいな仕様も考えられますが、今のところそのような挙動は見られませんでした。

  • id:caligari69

    ご返信ありがとうございます。開発者様にお聞きしたところdeviceid等は要求する度に新しいものを取得できるようで背面のリセットボタンを押すと過去の発行分が破棄されるようです。あれから色々やってみたらアプリからの信号は上手く行っていたのですが一度電源を抜いて挿し直すとIFTTT経由の信号が一気にirkitから放たれましたw原因はわかりませんがファームウェアのアプデートと電源周りのケーブル等を交換し再設定して今の所上手くいっております。
    お騒がせいたしました。ありがとうございます。

  • もっと読む