The jonki

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

朝起きると自動でTVとtorneが起動して朝ドラが見れて嬉しいの巻

  • 【追記】2014/05/17 コードを修正、内容は同じですがmodule.exportsなどを利用して読み込むように。jsのお作法===や.を使ったjsonオブジェクトのプロパティアクセスを使うように

前回のPS3起動の記事をパワーアップさせました。私は平日の朝は朝ドラを見てるのですが、起きたらもうTVがついていて、更にtorneでTVを起動しているようにしました。動画を見ていただくとわかりやすいです。PS3のトルネアプリの位置が常に決まっているから出来る技になります。

Auto wake up tv and torne!

macro.js

いくつかのコマンドを組み合わせて呼び出せるようにするための設定ファイルです。node app.js <マクロ名>で指定するようにしています。5000とか書いてあるのは次のコマンドまでの時間(msec)です。たとえばPS3は起動に時間がかかるので38秒待機してからPS3のカーソルコマンドを発行しています。結構遅めにアクセスしないと命令が詰まってしまって失敗したため、どれも長めにWaitするようにしています。
動画のコマンドは"tv-on_torne-on"になります。TVがHDMI入力になっているとは限らないので、一旦地デジの1chにして、入力切替でHDMIにしています。バッドノウハウですが自前なので良しとします。

module.exports = {
  "tv-on_torne-on" : [
    {"command" : "data/tv/power", "compTime" : 5000},
    {"command" : "data/tv/1", "compTime" : 2000},
    {"command" : "data/tv/changeInput", "compTime" : 2000},
    {"command" : "data/ps3/ps3_power", "compTime" : 38000},
    {"command" : "data/ps3/ps3_left", "compTime" : 3500},
    {"command" : "data/ps3/ps3_left", "compTime" : 3500},
    {"command" : "data/ps3/ps3_left", "compTime" : 3500},
    {"command" : "data/ps3/ps3_down", "compTime" : 3500},
    {"command" : "data/ps3/ps3_enter", "compTime" : 35000},
    {"command" : "data/ps3/ps3_enter", "compTime" : 3500},
    {"command" : "data/ps3/ps3_enter", "compTime" : 3500}
  ],
  "ps3-on" : [
    {"command" : "data/ps3/ps3_power", "compTime" : 30000}
  ],
  "tv-on" : [
    {"command" : "data/tv/power", "compTime" : 5000}
  ],
  "dock-on" : [
    {"command" : "data/dock/power", "compTime" : 5000}
  ],
  "dock-play" : [
    {"command" : "data/dock/play", "compTime" : 5000}
  ],
  "dock-ipod" : [
    {"command" : "data/dock/ipod", "compTime" : 5000}
  ],
  "dock-on_ipod-play" : [
    {"command" : "data/dock/power", "compTime" : 15000},
    {"command" : "data/dock/ipod", "compTime" : 6500},
    {"command" : "data/dock/play", "compTime" : 5000}
  ],
  "dock-on_fm-play" : [
    {"command" : "data/dock/power", "compTime" : 15000},
    {"command" : "data/dock/fm", "compTime" : 0}
  ]
}
settings.js

irkitのセキュリティキーをファイルに書き出しておきます。twitterは特に何もしてないですが、こんな感じで設定を増やせます。

module.exports = {
  "irkit" : {
    "clientkey" : "xxxx",
    "deviceid"  : "yyyyy"
  },
  "twitter" : [
  ]
}
app.js

Node.jsのメインプログラムです。IRのコマンドリストやIRKitのセキュリティキーを読み込んでいます。

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

var baseUrl = 'https://api.getirkit.com/1/messages';
var requestDelay = 0;

// read command list
if (process.argv.length !== 3) {
  console.log('usage: node app.js <macro command>');
  return;
}
// var macroJson = JSON.parse(fs.readFileSync('macro.json', 'utf-8'));
var macroJson = require('./macro');
var macroCommand = process.argv[2];
var commandList = macroJson[macroCommand];
if (commandList === undefined) {
  console.log('macro command "' + macroCommand + '" is node defined in macro.json.');
  return;
}

// read security file
var settingJson = require('./settings');
var irSettings = settingJson.irkit;

commandList.forEach(Post);

function Post(data, index) {
  var message = fs.readFileSync(data.command, 'utf-8');
  console.log(message);
  setTimeout( function()  {
    request.post(
      baseUrl, 
      { 
        form: { 
          clientkey : irSettings.clientkey,
      deviceid  : irSettings.deviceid,
      message   : message
        } 
      },
      function (err, res, body) {
        console.log(index + ': ' + data.command + ", " + data.compTime);
        if (!err && res.statusCode == 200) {
          console.log('request succeeded: ' + index);
        } else {
          console.log('post error: ' + err);
        }   
      }   
      );
  }, requestDelay);
  requestDelay += data.compTime;
}
cronで平日の朝7時50分に実行する

cronでスクリプトを実行するようにします。私はシェルスクリプト越しに実行していますが、直パス指定でも良いと思います。

# crontab -e
50 7 * * 1-5 /home/jonki/nodejs/ir/run.sh 2>&1
run.sh
#!/bin/sh
cd /home/jonki/nodejs/ir/
/home/jonki/.nodebrew/current/bin/node app.js tv-on_torne-on
ソースコード

githubに使い方も含めてアップしています。
2014/06/01 リポジトリ名を事情により変更しました。

最後に

IRKitで自宅の家電が多く簡単に操作できるようになって快適な我が家になってきました。スマートハウスも自前でここまでできる時代になってきましたね。

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

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