Help us understand the problem. What is going on with this article?

Hubotからテレビの電源を入れる。 (IRKit入門)

More than 5 years have passed since last update.

IRKITが手元にあるので使ってみた感じのメモです。

Chatwork/Hubot->(milkcocoa)->ローカルマシン->(curl/HTTP)->IRKit->(赤外線)->テレビ という連携をしてみました。

はじめに

IRKitは赤外線の信号を記憶して、自由に発信することが出来るガジェットです。公式サイトの説明はこんな感じです。

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

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

IRKit自体にHTTPサーバ機能があり、外部からAPIを叩けるみたいなので、今回はこれを利用して、Hubotからテレビの電源を入れてみたいと思います。

とりあえず動かす

基本的に何ができるのかはアスキーの記事を見ると分かりやすいです。

ちなみにこの時点でかなりハマりました。
どうやら無線LANの設定によって使える場合と使えない場合があるみたいです。会社のWifiではIRKITが使えなかったので焦りました。

ポケットwifiではうまくいったので、 もし最初にハマった方は違うLAN内で使ってみると良いと思います。

ターミナルからAPIを叩いてみる

手順

手順はこんな感じになります。

  1. IRKitの名前(host名)を探す
  2. IRKitのIPを探す
  3. APIを叩いてみる

シンプルに見えて 初っ端からハマりました。

※macなら1と2はLanScanなどで調べてもいいかもしれません。

手順1. STARTING...から進まない

公式サイトをみるとdns-sd -B _irkit._tcpとコマンドを打てば良いみたい。
とりあえずIRKitと同一LAN内のMacから実行。

$ dns-sd -B _irkit._tcp
Browsing for _irkit._tcp
DATE: ---Wed 11 Feb 2015---
23:52:55.195  ...STARTING...

という感じで待ち受け状態になって反応無し。。

ここの記事を見ると、 この待ち受け状態のままIRKitを再起動すると良いみたい。

まだ上手く行かなかった。

他の人の記事を見てるとここで上手くいってるみたいなのですが、私の場合はSTARTINGから全く反応がなかったです。

試しにMacのインターネット共有を使ってルーター化させて、そのLANにIRKitを接続させることにしました。ルーターになっているMacから先ほどのコマンドを実行し、待ち受け状態になったら↑のようにIRKitを再起動したところ。。。



!!!! 来ましたね。
IRKitFEBAってのがこのIRKitの名前みたいです。

ここでやっと手順1のhost名が分かりました。

手順2. IRKitのIPアドレスを発見します。

dns-sd -G v4 IRKitの名前.localという感じでコマンドを打ちましょう。

$ dns-sd -G v4 IRKitFEBA.local


ここでも待ち受け状態のSTATING...から進まなかったのでこの状態のままIRKitを再起動しました。

Addressの列に表示されるIPアドレスがIRKitのアドレスです。

今回の場合は192.168.2.5がIRKitのIPアドレスになります。

手順3. APIを叩いてみます。

curl -i "http://上記IPアドレス/messages"という形式でターミナルから実行してみましょう。

$ curl -i "http://192.168.2.5/messages"
HTTP/1.0 200 OK
Access-Control-Allow-Origin: *
Server: IRKit/2.1.2.0.g424fa95
Content-Type: text/plain

ステータス200が出ればOKです。

リモコンの信号を記憶させる [リモコン ->(記憶)-> IRKiT]

messagesのAPIでは直前に記憶した信号をレスポンスとして返してくれます。

TVのリモコンなどをIRKitに向かってボタンを押しましょう。

その後、もう一度APIを叩いてみます。

$ curl -i "http://192.168.2.5/messages"
HTTP/1.0 200 OK
Access-Control-Allow-Origin: *
Server: IRKit/2.1.2.0.g424fa95
Content-Type: text/plain

{"format":"raw","freq":38,"data":[17421,8755,1190,1037,1190,1037,1190,1037,1190,1037,1190,1037,1190,1037,1190,3228,1190,1037,1190,3228,1190,3228,1190,3228,1190,3228,...]}

こんな感じでjson文字列を返してくれます。dataに入ってる情報(途中省略しています)がリモコンの赤外線電波の情報になります。

IRKitで赤外線信号を発信する [IRKit ->(信号発信)-> TVなどの対象機器]

-dオプションで送信する情報を指定してあげて実行すると発信できます。

$ curl -i "http://192.168.2.5/messages" -d '{"format":"raw","freq":38,"data":[17421,8755,1190,1037,1190,1037,1190,1037,1190,1037,1190,1037,1190,1037,1190,3228,1190,1037,1190,3228,1190,3228,1190,3228,1190,3228,...]}'

HTTP/1.0 200 OK
Access-Control-Allow-Origin: *
Server: IRKit/2.1.2.0.g424fa95
Content-Type: text/plain

先ほど記憶したデータをそのまま指定してあげましょう。電波がIRKitから発信されます。

コマンドを叩いてIRKitが反応すれば成功です。

Node.jsからコマンドを叩く

Hubotから扱ってみたいと思ったのでNode.jsでコマンド実行してみます。

時期的にせっかくなのでiojsでやってみます。

  • 現時点最新のiojsの1.2.0をインストール
$ nodebrew install io@1.2
$ nodebrew use io@1.2
$ iojs -v
v1.2.0

execで先ほどのコマンドを実行します。
先ほどcurlコマンドを実行していたローカルマシン上で実行します。

app.js(ローカルマシン)
var exec = require('child_process').exec;
var data = '{"format":"raw","freq":38,"data":[17421,8755,1190,1037,1190,1037,1190,1037,1190,1037,1190,1037,1190,1037,1190,3228,1190,1037,1190,3228,1190,3228,1190,3228,1190,3228,...]}';
var cmd = 'curl -i "http://192.168.2.5/messages" -d ' + "'"+data+"'";

/*コマンド実行関数*/
function update() {
    return exec(cmd, {timeout: 90000},
        function(error, stdout, stderr) {
            console.log('stdout: '+(stdout||'none'));
            console.log('stderr: '+(stderr||'none'));
            if(error !== null) {
                console.log('exec error: '+error);
            }
        }
    )
};

update();

実行してみます。

$ iojs app.js

IRKitが無事に反応すれば成功です。

Hubotとローカルマシンをmilkcocoaで連携させる

milkcocoaは国産BaaSサービスです。簡単にインタラクティブなものを実現できます。

アプリを作成しましょう。

アプリIDを以下で使っていきます。

milkcocoaのNode.js SDKを使う準備

こちらの記事を参考にセッティングしましょう。

Hubotとmilkcocoa連携(ローカルマシン)

イメージはこんな感じです
Hubot->(milkcocoa)->ローカルマシン

先ほどのapp.jsにmilkcocoaコードを追加します。

app.js(ローカルマシン)
var MilkCocoa = require('./mlkcca'); //milkcocoa SDKパス
var milkcocoa = new MilkCocoa("https://[your-app-id].mlkcca.com");
var ds = milkcocoa.dataStore("nodejs");
var exec = require('child_process').exec;
var data = '{"format":"raw","freq":38,"data":[17421,8755,1190,1037,1190,1037,1190,1037,1190,1037,1190,1037,1190,1037,1190,3228,1190,1037,1190,3228,1190,3228,1190,3228,1190,3228,1190,3228,1190,3228,1190,...]}';
var cmd = 'curl -i "http://192.168.2.5/messages" -d ' + "'"+data+"'";

/*コマンド実行関数*/
function update() {
    return exec(cmd, {timeout: 90000},
        function(error, stdout, stderr) {
            console.log('stdout: '+(stdout||'none'));
            console.log('stderr: '+(stderr||'none'));
            if(error !== null) {
                console.log('exec error: '+error);
            }
        }
    )
};

//sendが発火したらコマンド実行
ds.on('send', function(res){
    update();
});

この状態で実行&待機させておきましょう。

$ iojs app.js

Hubotとmilkcocoa連携(Hubot側)

Hubotスクリプトを記述します。
私が使っているHubot v2.11.0ではscriptsフォルダ内にjsファイルorCoffeeScriptファイルを設置すれば動いてくれます。

ボット名 irkit-tv onとすればIRKit経由でテレビが付くコマンドを作ります。

irkit.js(HubotScript)
var MilkCocoa = require('./lib/mlkcca.lib'); //milkcocoa SDKパス
var milkcocoa = new MilkCocoa('https://[your-app-id].mlkcca.com');
var ds = milkcocoa.dataStore('nodejs');

module.exports = function(robot) {

  robot.respond(/irkit-tv (.+)$/i, function(msg){
    if(!msg.match[1]){
      msg.send('!?');
      return;
    }

    if(msg.match[1] === 'on'){
      ds.send({text:1234});
      msg.send('TV on');
    }
  });

}

Hubotを実行してコマンド実行してみましょう。

> hubot irkit-tv on
TV on

実行するとこんな感じで Hubotコマンドを打つとIRKitが反応してくれます。

ChatworkからTVをつける

最後にChatworkに接続してみます。

HubotとChatworkの連携はこちらの記事を参考にしてください。

ChatworkからLIG子というBotに呼びかけます。


(撮影が難しい...)

やりましたね!!

まとめ

これで Chatwork/Hubot->ローカルマシン->IRKit->テレビ という連携ができました!

色々応用考えたいです。

n0bisuke
プロトタイピング専門スクール「プロトアウトスタジオ」で教えたりしてます。 プロフ -> https://dotstud.io/members/n0bisuke
https://protoout.studio
dotstudio
全ての人がモノづくりを楽しむ世界を目指して活動しています。
https://dotstud.io
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away