読者です 読者をやめる 読者になる 読者になる

The jonki

呼ばれて飛び出てじょじょじょじょーんき

IRKitからPS3を電源起動からtorne起動までNode.jsでやってみた

IRKitPS3の赤外線アダプタが届いたので前回の記事の続きでtorneを起動するところまでやってみました。

動画はこちらです。

Wake up PS3 and torne with IRKit

CYBER・リモートコントローラ (PS3用)

CYBER・リモートコントローラ (PS3用)

準備

あらかじめ利用したいコマンドを保存しておきます。それを'data/ps3/ps3_power'といった風にファイルに保存しておきます。

$  curl -i "http://XX.XX.XX.XX/messages" > data/ps3/ps3_power
{"format":"raw","freq":38,"data":[4713,1150,2368,1150,1150,1150,2368,1150,1150,1150,2368,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,2368,1150,2368,1150,1150,1150,1150,42612,4713,1150,2368,1150,1150,1150,2368,1150,1150,1150,2368,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,2368,1150,2368,1150,1150,1150,1150,42612,4713,1150,2368,1150,1150,1150,2368,1150,1150,1150,2368,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,2368,1150,2368,1150,1150,1150,1150]}
Node.js

ファイルをリストとして読み込んでforEachとsetTimeoutで実行しています。PS3の電源起動は時間がかかるので2つ目以降のコマンドは30秒のオフセット時間を入れています。ひとまず動くか見たかったのでif文で判定していますが、もう少し汎用的な命令体系を整備する必要がありそうです。

var request = require('request');
var fs = require('fs');

var baseUrl = 'https://api.getirkit.com/1/messages';
var filePathList = [
    'data/ps3/ps3_power',
    'data/ps3/ps3_left',
    'data/ps3/ps3_left',
    'data/ps3/ps3_left',
    'data/ps3/ps3_down',
    'data/ps3/ps3_enter',
];

var dataList = new Array();
filePathList.forEach(function(filePath) { dataList.push(fs.readFileSync(filePath, 'utf-8')); });
dataList.forEach(Post);

var delay = 0;
function Post(data, index) {
    console.log(index);
    if(index > 0) {
        delay = 30000;
    }
    setTimeout( function()  {
        request.post(
                baseUrl,
                {
                        form: {
                                        clientkey : 'xxx',
                                        deviceid  : 'yyy',
                                        message   : data
                                }
                },
                function (err, res, body) {
                        if (!err && res.statusCode == 200) {
                                console.log('request succeed: ' + index + ', ' + filePathList[index]);
                        } else {
                                console.log(err);
                        }
                }
        );
    }, 1000 * index + delay);
}

最後に

torne起動はずっと面倒だと思っていたのでこれでだいぶ楽になりました。具体的にどう使うかは考え中ですが、IFTTT連携で色々なことをトリガーにできているので、夢は広がります。