CAMPHOR- Advent Calendar 2014
4日目です!
四期代表しております、@kohey18です!:bow: :bow:
CAMPHOR-の運営メンバー内でもSlack上で、Hubotを利用し、また様々な使い方をしているのですが、
このような感じで僕に関するワードが入ると「Super Swift Engineer」とかbotが言います。
メンバーが勝手にマージしました(おこ)。もちろん、Swiftは書けません(:bow:)。
Swiftしてる
— こへにゃんです。 (@kouhei18) 2014, 11月 13
このツイートが事の発端でしょう。
さて、今回のタイトルの通りHubotに対して「hubot start tv」って打つと部屋のテレビの電源が付くのをやってみようと思います!
用意するもの
iRemocon
iRemoconとは、ネットワーク接続型の高機能学習リモコンのことです!
要するに、リモコンの赤外線を学習し、それをネットワークを通じて制御できるみたいな感じです!
Hubot
赤外線で動く家電機器(リモコン付き)
node.js
最終的にiRemoconの制御をnode.js上から行います。
以下も、もちろん前提とします。
ネットワーク環境(有線LAN), PC(今回はMacBook Air OS X 10.9.5)
設計
こんな感じです。
赤外線を学習させよう
まずはiRemoconからTVに対して、赤外線を発信するために、赤外線リモコンを学習させます。
その前にまずiRemoconのコマンド仕様書はこちらになります。
iRemoconコマンド仕様書
まずは自分のローカルPCからiRemoconに入るためにtelnetコマンドを叩きます。
> telnet yourIremoconIp yourIremoconPort(iRemoconデフォルトのポートは51013)
そして、リモコンを学習させるためには
より、ic;1とかにしますか。
ic;1と打ったあとに、iRemoconに対して直接学習させてあげてください!
iRemocon学習 from kohey on Vimeo.
すると、
のようにokがreturnされます。
仕様書によるとiRemoconのipを探すにはアプリを使うそうです!
ちなみにアプリのスクショはこんな感じです!
赤外線を発信させよう
学習完了したら、isコマンドで学習した赤外線が発信されるか確認しましょう。
学習した赤外線を発信 from kohey on Vimeo.
nodeからiRemoconを制御しよう
ここまできたら、もうほとんど終わりです。
次にnode.jsでこのiRemoconを制御するのを作成します。(express利用します)
app.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
var express = require('express'); var app = express(); var Manage = require('./manage'); app.get('/manage/:appId', function (req, res) { var appId = req.params.appId; var host = "192.168.3.18"; var manage = new Manage(host); manage.emit(appId, function(err, results) { res.send(results); }); }); app.listen(3000); |
manage.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
var connect = require('net'); function Manage(host) { var port = "51013"; this.client = connect.connect(port, host); } module.exports = Manage; Manage.prototype.emit = function(num, cb) { var self = this; var cmd = "is;" + num; self.client.on('connect', function() { self.client.write(cmd + '\r\n'); self.client.destroy(); cb(null, true); // TODO: エラーハンドリング }); }; Manage.prototype.register = function(num, cb) { var self = this; var cmd = "ic;" + num; self.client.on('connect', function() { self.client.write(cmd + '\r\n'); self.client.destroy(); cb(null, true); }); }; |
これでlocalhost:3000/manage/1
でiRemocon上ではis;1のコマンドを打つこととなり、学習した赤外線が発射されます。
Hubotから制御してみよう
あとはHubotのスクリプトを以下のようにしましょう
script/example.coffee
1 2 3 4 |
robot.hear /start tv/, (msg) -> robot.http("http://localhost:3000/manage/1") .get() (err, res, body) -> msg.send "OK, I just turn on TV now!" |
それでは、hubot start tvと打ってみましょう!
hubot start tv from kohey on Vimeo.
見難くて申し訳ないのですが、
上記のデモ動画は
左側が
「hubot start tv」と打っていて
右が
「node app.js」で立ち上げています!
で、PCの右側に有線LANに繋がったiRemoconがあります。
これでhubot start tvで家庭内のTVを制御することが出来ました!
(部屋汚いのは触れないでください:bow:)
その他のリモコンを制御したい場合は
telnet接続 → 学習コマンド(ic;◯) → 発信コマンド(is;◯) → manage.js,app.jsの修正 → hubotスクリプトを書く
の一連の流れかと!
CAMPHOR- HOUSEのエアコン制御とかに応用したいなぁとかメンバーとも話していたのでいつか実現したい!
次回はShtr28が担当です!