IRKitとは

IRKitは、WiFi機能の付いたオープンソースな赤外線リモコンデバイス。 家庭のエアコンやテレビ、ライトなど、赤外線で操作できる家電を、 WiFiをとおして、iPhoneやiPad,Androidスマートフォンなどから操作できるようにするものです。

IRKitは、 公式iOSアプリ IRKitシンプルリモコン 公式Androidアプリ IRKitシンプルリモコン から操作できるほか、 IRKit iOS-SDK を使えば、 任意のタイミングで赤外線信号を送ることのできるiOSアプリを簡単につくることができます。

例えば

  • 位置情報を使いiPhone/Androidが家の近くに来たら自動でエアコンを付けるアプリ
  • 1ボタンで家中の家電の電源を消すアプリ(寝る前に便利)
  • ソーシャルと連携してFacebook友だちの見ているテレビにチャンネルを合わせるアプリ

など、家電を操作する様々なアプリの可能性があるでしょう。

また、JavaScriptを使ってブラウザから赤外線信号を送ったり
curlを使って黒い画面(Terminal)から赤外線信号を送ることもできます。

IRKitデバイス自体にHTTPサーバがあり、
JSON形式の赤外線情報を HTTP POSTリクエストにのせて送ることで、赤外線信号を送ることができるのです。
また、IRKitと同じWiFiにいなくても、外出先から赤外線信号を送るための、インターネット上にあるサーバのAPIも公開しています。

IRKitデバイスは、Arduino Derivative(派生)のプロダクトです。
未使用のピンは引き出してあるので、温度センサや明るさセンサなどを追加し、ArduinoIDEを使ってプログラムを書き込めば、
よりスマートなリモコンをつくることもできます。

リモコンのどんなところを、諦めていましたか?
どんなふうに家電を操作したいですか?


IRKit iOS SDK

It's as simple as:

#import <IRKit/IRKit.h>

[_signal sendWithCompletion:^(NSError *error) {
    NSLog( @"sent with error: %@", error );
}];

See more on irkit/ios-sdk


IRKit Device Hardware

See more on irkit/device/hardware


IRKit Device Firmware

See irkit/device/firmware


IRKit Device Case

See more on irkit/device/case

IRKit Device HTTP API

IRKitデバイスは、Bonjourを使ってIPアドレスを求めることができます。

% dns-sd -B _irkit._tcp
Browsing for _irkit._tcp
DATE: ---Sat 28 Dec 2013---
23:12:55.623  ...STARTING...
Timestamp     A/R    Flags  if Domain               Service Type         Instance Name
23:12:55.768  Add        2   4 local.               _irkit._tcp.         irkitd2a4
^C

% dns-sd -G v4 irkitd2a4.local
DATE: ---Sat 28 Dec 2013---
23:16:29.698  ...STARTING...
Timestamp     A/R Flags if Hostname                               Address                                      TTL
23:16:29.818  Add     2  4 irkitd2a4.local.                       10.0.1.2                                     10
^C
  • SafariなどBonjourの.localホスト名を解決するクライアントから以下のHTTPリクエストをする場合には上記は不要です。

IPアドレスがわかったら、以下のHTTP APIにアクセスしましょう。

GET /messages

最も新しい受信した赤外線信号を返します。

% curl -i "http://10.0.1.2/messages" -H "X-Requested-With: curl"
HTTP/1.0 200 OK
Access-Control-Allow-Origin: *
Server: IRKit/2.1.3.13.gbe33d36
Content-Type: text/plain

{"format":"raw","freq":38,"data":[18031,8755,1190,1190,1190,3341,1190,3341,1190,3341,1190,1190,1190,3341,1190,3341,1190,3341,1190,3341,1190,3341,1190,3341,1190,1190,1190,1190,1190,1190,1190,1190,1190,3341,1190,3341,1190,1190,1190,3341,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,3341,1190,3341,1190,3341,1190,3341,1190,3341,1190,65535,0,9379,18031,4400,1190]}

GET /messages が完了すると、保存していた赤外線信号は消去します。 同じ赤外線信号を2度、続けてGETすることはできません。

POST /messages

赤外線信号を送ります。

% curl -i "http://10.0.1.2/messages" -H "X-Requested-With: curl" -d '{"format":"raw","freq":38,"data":[18031,8755,1190,1190,1190,3341,1190,3341,1190,3341,1190,1190,1190,3341,1190,3341,1190,3341,1190,3341,1190,3341,1190,3341,1190,1190,1190,1190,1190,1190,1190,1190,1190,3341,1190,3341,1190,1190,1190,3341,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,3341,1190,3341,1190,3341,1190,3341,1190,3341,1190,65535,0,9379,18031,4400,1190]}'
HTTP/1.0 200 OK
Access-Control-Allow-Origin: *
Server: IRKit/2.1.3.13.gbe33d36
Content-Type: text/plain
  • Windowsからcurlを使う場合には、ダブルクオートのエスケープに気をつけましょう。詳しくは コマンド ラインの指定

POST /keys

clienttoken を取得します。 clienttoken を次に IRKit Internet HTTP APIPOST /1/keys へのリクエストにのせることで clientkey, deviceid を取得することができます。 詳しくは IRKit Internet HTTP API 参照

% curl -i "http://10.0.1.2/keys" -d '' -H "X-Requested-With: curl"
HTTP/1.0 200 OK
Access-Control-Allow-Origin: *
Server: IRKit/2.1.3.13.gbe33d36
Content-Type: text/plain

{"clienttoken":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXX"}

POST /wifi

IRKitは家のWiFiアクセスポイントに接続して動作しますが、 そのためには、IRKitは家のWiFiアクセスポイントのセキュリティ(WPA2/WEP/NONE)、SSID、パスワードを知る必要があります。

IRKitにそれを伝えるには、 IRKit自体がWiFiアクセスポイントになり、それに接続し、IRKitにHTTPリクエストを送ります。

家のWiFiアクセスポイントのSSIDなどは、シリアライズしてPOSTリクエストのbodyに入れます。 シリアライズ方法については、 keyserializer test にあるJavaScriptの実装と - (NSString *)morseStringRepresentation にあるObjective-Cの実装を見てください。

% curl -i "http://192.168.1.1/wifi" -H "X-Requested-With: curl" -d '8/49524B6974546573746572/70617373776F7264/0123456789ABCDEF0123456789ABCDEF/2//////46'
HTTP/1.0 200 OK
Access-Control-Allow-Origin: *
Server: IRKit/2.1.3.13.gbe33d36
Content-Type: text/plain

POST /wifi がHTTPステータスコード200のレスポンスを返した後、POST /1/door を呼んでください。

赤外線信号を表すJSONについて

赤外線信号は↑のようなJSONで表します。以下のキーを持ちます。

Key Description
format "raw"のみ
freq 赤外線信号のサブキャリア周波数を表します。38 または 40 のみ。単位 [kHz]
data 赤外線信号は、サブキャリア周波数のオン・オフからなります。IRKitデバイスはオン→オフ間の時間、オフ→オン間の時間を 2MHz のカウンタで数えます。dataには、カウンタで数えた数をオン・オフの回数分ならびます。

IRKit Internet HTTP API

IRKit Device HTTP API は、IRKitデバイスと同じWiFiにつないでいる時のみ、アクセス可能です。 同じWiFiにいない場合には、インターネットのIRKitサーバを通してIRKitデバイスに赤外線を送ってもらうことができます。

概要

インターネットのIRKitサーバを使用する場合には、以下の2つのリクエストパラメータが必要になる場合があります。 誰からのリクエストであるか、どのIRKitへのリクエストであるか、を指定する場合に使います。

Name Description
clientkey クライアントがリクエストに付加し、クライアントを認証するためのキー
deviceid クライアントがリクエストに付加し、リクエスト先のIRKitデバイスを特定するID

clientkey, deviceid を入手するには、2つ方法があります。

既にWiFiに接続済のIRKitがある場合には POST /keys を使用してIRKitデバイスを通して clienttoken を取得した後 POST /1/keys を使います。 IRKitを既に持っていて、家にあるIRKitを使ってライフハックしたい!使いこみたいという場合には、↑こちらを使うとよいでしょう。

まだWiFiに未接続のIRKitがあり、公式iOS/Androidアプリまたは iOS SDK を使用できない場合、 例えば、WindowsPhone向けのIRKit SDKを作成したい!という場合には、以下のAPIを使用します。

POST /1/clients を使用して clientkey を取得した後 POST /1/devices を使って devicekey, deviceid を取得します。

次にIRKitのアクセスポイントに接続し、IRKitを接続する先のWiFiアクセスポイントの認証情報とともに devicekey をIRKitデバイスに送ります(POST /wifi)。 devicekey はIRKitデバイスがIRKitサーバへリクエストする際に使用します。

POST /1/door を使用して、IRKitが正常にWiFiに接続しインターネット上のサーバに接続できたことを確認します。 これで完了です。

POST /1/door のレスポンスに含まれる hostname を使えば、同じWiFiアクセスポイントに接続しているクライアントからは Bonjour を使うことでIPアドレスを求め、 IRKit Device HTTP API にアクセスできます。

POST /1/keys

deviceid を取得するために使います。 clientkey リクエストパラメータを付加すると、この clientkeydeviceid を関連づけてサーバ側に保存します。

取得した deviceid を使えば、POST /1/messages を使って赤外線信号を送信できるほか、 このIRKitデバイスが受信した赤外線信号を GET /1/messages を取得することができます。

curl -i -d "clienttoken=XXXXXXXXXXXXXXXXXXXXX" "https://api.getirkit.com/1/keys"
HTTP/1.1 200 OK
Server: ngx_openresty
Date: Tue, 07 Jan 2014 08:46:06 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 94
Connection: keep-alive
X-Content-Type-Options: nosniff

{"deviceid":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX","clientkey":"XXXXXXXXXXXXXXXXXXXXXXX"}
Request Parameters
Name Required Description
clienttoken o POST /keys を使って取得したもの
clientkey x see 概要 このパラメータがある場合にはこの clientkey にIRKitデバイスを関連づけます。
Response JSON keys
Name Description
deviceid see 概要
clientkey see 概要

POST /1/messages

赤外線信号を deviceid で指定するIRKitデバイスから送信します。

curl -i "https://api.getirkit.com/1/messages" \
     -d 'clientkey=XXXXXXXXXXXXXXXXXXXXXXXXXX' \
     -d 'deviceid=XXXXXXXXXXXXXXXXXXXXXXXXXXX' \
     -d 'message={"format":"raw","freq":38,"data":[18031,8755,1190,1190,1190,3341,1190,3341,1190,3341,1190,1190,1190,3341,1190,3341,1190,3341,1190,3341,1190,3341,1190,3341,1190,1190,1190,1190,1190,1190,1190,1190,1190,3341,1190,3341,1190,1190,1190,3341,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,3341,1190,3341,1190,3341,1190,3341,1190,3341,1190,65535,0,9379,18031,4400,1190]}'
HTTP/1.1 200 OK
Server: ngx_openresty
Date: Tue, 07 Jan 2014 08:52:24 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 0
Connection: keep-alive
X-Content-Type-Options: nosniff
Request Parameters
Name Required Description
clientkey o see 概要
deviceid o see 概要
message o see 赤外線信号を表すJSONについて
  • Windowsからcurlを使う場合には、ダブルクオートのエスケープに気をつけましょう。詳しくは コマンド ラインの指定

GET /1/messages

最も新しい受信した赤外線信号を返します。 このリクエストは、ロングポーリングなリクエストです。 clear を指定すると、過去にIRKitデバイスがサーバに送信しサーバで保存している赤外線信号を消去し、 新しい赤外線信号がIRKitデバイスから届いたらただちにレスポンスを返します。 規定値でタイムアウトすると空のレスポンスを返します。

赤外線信号を学習するシーンでは、最初に clear=1 をつけてリクエストをした後、リクエストがタイムアウトしたら clear パラメータを付与せずに再度リクエストするとよいでしょう。

リクエストパラメータの clientkey と関連するIRKitデバイスが複数ある場合には、 レスポンスに含まれる deviceidhostname を使ってどのIRKitが赤外線信号を受信したかを識別します。

curl -i "https://api.getirkit.com/1/messages?clientkey=XXXXXXXXXXXXXXXX&clear=1"
HTTP/1.1 200 OK
Server: ngx_openresty
Date: Tue, 07 Jan 2014 09:03:59 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 481
Connection: keep-alive
ETag: "-19571392"
X-Content-Type-Options: nosniff

{"message":{"format":"raw","freq":38,"data":[18031,8755,1190,1190,1190,3341,1190,3341,1190,3341,1190,1190,1190,3341,1190,3341,1190,3341,1190,3341,1190,3341,1190,3341,1190,1190,1190,1190,1190,1190,1190,1190,1190,3341,1190,3341,1190,1190,1190,3341,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,3341,1190,3341,1190,3341,1190,3341,1190,3341,1190,65535,0,9379,18031,4400,1190]},"hostname":"IRKitD2A4","deviceid":"FBEC7F5148274DADB608799D43175FD1"}
Request Parameters
Name Required Description
clientkey o see 概要
clear x サーバに保存している赤外線信号を消去してから新しい赤外線信号をIRKitデバイスから待ち受けます。
Response Parameters
Name Description
message see 赤外線信号を表すJSONについて
hostname IRKitデバイスのホスト名。IRKit Device HTTP API を使用する際に .local suffixをつけるとよいでしょう
deviceid see 概要

POST /1/clients

clientkey を作成します。

curl -i -d "apikey=XXXXXXXXXXXXXXXXXXXXX" "https://api.getirkit.com/1/clients"
HTTP/1.1 200 OK
Server: ngx_openresty
Date: Tue, 07 Jan 2014 09:26:52 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 48
Connection: keep-alive
X-Content-Type-Options: nosniff

{"clientkey":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXX"}
Request Parameters
Name Required Description
apikey o see POST /1/apps
Response Parameters
Name Description
clientkey see 概要

POST /1/devices

devicekey, deviceid を作成します。

curl -i "https://api.getirkit.com/1/devices" -d "clientkey=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
HTTP/1.1 200 OK
Server: ngx_openresty
Date: Tue, 07 Jan 2014 09:30:46 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 94
Connection: keep-alive
X-Content-Type-Options: nosniff

{"devicekey":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX","deviceid":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"}

このようにして取得した devicekey を、 IRKitのアクセスポイントを使用して、IRKitを接続するWiFiの認証情報とともにIRKitデバイスに送ります((POST /wifi)。

Request Parameters
Name Required Description
clientkey o see 概要
Response Parameters
Name Description
devicekey see 概要
deviceid see 概要

POST /1/door

IRKitのアクセスポイントを使用して、家のWiFiアクセスポイントの認証情報とともにdevicekeyをIRKitデバイスに送った後(POST /wifi)、POST /1/doorを使用して、IRKitデバイスが正常に家のWiFiアクセスポイントを通してインターネットに接続できたことを確認します。

このリクエストは、ロングポーリングなリクエストです。 IRKitデバイスが正常にインターネット上のAPIサーバに接続できるとただちにレスポンスを返します。 規定値でタイムアウトすると空のレスポンスを返します。

curl -i "https://api.getirkit.com/1/door" \
     -d 'clientkey=XXXXXXXXXXXXXXXXXXXXXXXXXX' \
     -d 'deviceid=XXXXXXXXXXXXXXXXXXXXXXXXXXX'
HTTP/1.1 200 OK
Server: ngx_openresty
Date: Wed, 01 Jan 2014 17:04:59 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 24
Connection: keep-alive
X-Content-Type-Options: nosniff

{"hostname":"IRKitXXXX"}
Request Parameters
Name Required Description
clientkey o see 概要
deviceid o see 概要
Response Parameters
Name Description
hostname Bonjour を使うことで同じWiFiアクセスポイントに接続したクライアントから #{hostname}.local として接続するために使います。

POST /1/apps

apikey を作成します。

curl -i -d "email={ your valid email }" "https://api.getirkit.com/1/apps"
HTTP/1.1 200 OK
Server: ngx_openresty
Date: Wed, 01 Jan 2014 17:04:59 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 92
Connection: keep-alive
X-Content-Type-Options: nosniff

{"message":"You will receive an email shortly, please click the URL in it to get an apikey"}
Request Parameters
Name Required Description
email o 開発者メールアドレス
Response Parameters
Name Description
message -