y.takky てくめも

web技術について勉強会の参加メモだったり、本を読んだメモだったりを載せる予定

IRKitでエアコンのON/OFFをcurl経由でする

この記事について

睡眠をエンジニアリングするための前準備
IRKitを利用して curl経由でエアコンをON/OFFしてみる。

といっても

IRKit - Open Source WiFi Connected Infrared Remote Controller

通りにやればON/OFFは簡単にできるはず。

準備

IRkitの準備

AndroidIphoneのIRkitのアプリをDLして初期設定しておく。

IRkitのIPを調べる

Bonjourで調べることができる

$ dns-sd -B _irkit._tcp
Browsing for _irkit._tcp
DATE: ---Thu 12 Jan 2017---
21:58:58.624  ...STARTING...
Timestamp     A/R    Flags  if Domain               Service Type         Instance Name
21:58:59.498  Add        2   4 local.               _irkit._tcp.         iRKit66C9
$ dns-sd -G v4 iRKit66C9.local
DATE: ---Thu 12 Jan 2017---
22:00:39.768  ...STARTING...
Timestamp     A/R Flags if Hostname                               Address                                      TTL
22:00:40.062  Add     2  4 irkit66c9.local.                       192.168.0.10                                 10

ここでiRkit66C9は 一つ前のコマンドで取得したInstance Nameを指定する。

IRkitのIP Addが192.168.0.10ということがわかる

pingでも打って確認してみる

$ping 192.168.0.10
PING 192.168.0.10 (192.168.0.10): 56 data bytes
Request timeout for icmp_seq 0
64 bytes from 192.168.0.10: icmp_seq=1 ttl=255 time=51.590 ms
64 bytes from 192.168.0.10: icmp_seq=2 ttl=255 time=4.337 ms
64 bytes from 192.168.0.10: icmp_seq=3 ttl=255 time=617.344 ms
64 bytes from 192.168.0.10: icmp_seq=4 ttl=255 time=7.138 ms

赤外線を取得する

GET /messageで取得できる

$curl -i "http://192.168.0.10/messages" -H "X-Requested-With: curl"

APIのENDPOINTは上で取得したIRKitのIP Add

最後にIRKitで受信した信号を取得できる。

$curl -i "http://192.168.0.10/messages" -H "X-Requested-With: curl"
HTTP/1.0 200 OK
Access-Control-Allow-Origin: *
Server: IRKit/3.0.0.0.g85190b1
Content-Type: text/plain

{"format":"raw","freq":38,"data":[18031,8755,1150,1150,1150,3228,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,3228,1150,3228,1150,1150,1150,3228,1150,3228,1150,1150,1150,3228,1150,3228,1150,1150,1150,1150,1150,3228,1150,3228,1150,1150,1150,1150,1150,3228,1150,1150,1150,3228,1150,3228,1150,1150,1150,1150,1150,3228,1150,3228,1150,1150,1150,3228,1150,1150,1150,65535,0,16832,16832,4400,1150,65535,0,65535,0,62212,18031,4400,1150]}
{"format":"raw","freq":38,"data": ~

が赤外線信号になる。 エアコンのON/OFFの信号をメモっておこう。

赤外線を送信する

POST /messagesで送信できる

curl -i "http://192.168.0.10/messages" -H "X-Requested-With: curl" -d '{"format":"raw","freq":38,"data":[18031,8755,1150,1150,1150,3228,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,3228,1150,3228,1150,1150,1150,3228,1150,3228,1150,1150,1150,3228,1150,3228,1150,1150,1150,1150,1150,3228,1150,3228,1150,1150,1150,1150,1150,3228,1150,1150,1150,3228,1150,3228,1150,1150,1150,1150,1150,3228,1150,3228,1150,1150,1150,3228,1150,1150,1150,65535,0,16832,16832,4400,1150,65535,0,65535,0,62212,18031,4400,1150]}'
HTTP/1.0 200 OK
Access-Control-Allow-Origin: *
Server: IRKit/3.0.0.0.g85190b1
Content-Type: text/plain

注意するのは -dで赤外線情報を送るときに''で囲むこと 忘れがち。

これで赤外線信号を送ってON/OFFできる。

ローカルにサーバを立てて送るのであればこれで済むが、外部ネットワークから送りたいと思う。

そのためにIRKit Internet HTTP APIが用意されている。

IRkit Internet HTTP API

IRKit Internet HTTP APIのエンドポイントは

https://api.getirkit.com

client tokenの取得

POST /keysでリクエストを送ることでclienttokenが取得できる。 clienttokenは漏れないようにしよう

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

{"clienttoken":""}

deviceidの取得

IRkit Internet HTTP APIに対して POST /1/keys でリクエストを送ることでdeviceidが取得できる。 その際に上で取得した client tokenが必要

curl -i -d "clienttoken=" "https://api.getirkit.com/1/keys"
HTTP/1.1 200 OK
Server: openresty
Date: Thu, 12 Jan 2017 13:15:18 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 94
Connection: keep-alive
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: X-Requested-With
X-Content-Type-Options: nosniff

{"deviceid":"","clientkey":""}

IRkit Internet HTTP APIではdeviceidとclientkeyを認証キーとして使用する。

IRKit Internet HTTP APIを用いた赤外線情報の送信

POST /1/messagesに対してclientkeyとdeviceidと赤外線情報を与えてPOSTすることで、
Internet HTTP API経由で赤外線情報を送ることができる。(つまりエアコンのON/OFFができる)

$curl -i "https://api.getirkit.com/1/messages"  \    
-d 'clientkey='  \   
-d 'deviceid='   \
-d 'message={"format":"raw","freq":38,"data":[18031,8755,1150,1150,1150,3228,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,3228,1150,3228,1150,1150,1150,3228,1150,3228,1150,1150,1150,3228,1150,3228,1150,1150,1150,1150,1150,3228,1150,3228,1150,1150,1150,1150,1150,3228,1150,1150,1150,3228,1150,3228,1150,1150,1150,1150,1150,3228,1150,3228,1150,1150,1150,3228,1150,1150,1150,65535,0,16832,16832,4400,1150,65535,0,65535,0,62212,18031,4400,1150]}'
HTTP/1.1 200 OK
Server: openresty
Date: Thu, 12 Jan 2017 13:21:50 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 0
Connection: keep-alive
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: X-Requested-With
X-Content-Type-Options: nosniff

これでIRKit Internet HTTP API経由で赤外線を送信できる。
クラウドサーバから送ったり、Google Apps Scriptから送ったりとできる。

ここまでで、IRKitの準備を行った。
次の記事ではMESHについて紹介する。