Raspberry PI に接続したUSB赤外線リモコンを制御するスクリプトを書いてみる
これを制御するスクリプトを書いてみました。
http://bit-trade-one.co.jp/BTOpicture/Products/005-RS/
とは言っても、メインの処理はGithubで公開されている、以下のものを使います。
https://github.com/kjmkznr/bto_ir_cmd
これをビルドしたのち、以下のスクリプトで制御します。
#!/bin/bash while [ $# -gt 0 ]; do line=$1 # 引数をバラした値をシェル変数に入れる処理。 # 赤外線送信するデータの取得 ircmd=${line##*:} # sleep, cmd 等、最初の指定の取り出し cmdtype=${line%%:*} # 繰り返し回数の取得 cmdtmp=${line#*:} count=${cmdtmp%:*} echo -n "$line " # 制御の実行 case "$cmdtype" in # 赤外線送信処理 cmd) cmdlength=$( echo $ircmd | wc -c ) # 赤外線送信するコマンドが15文字を超える場合は拡張モードに切り替える。 if [ $cmdlength -gt 15 ]; then cmd_ext="-e" else cmd_ext="" fi # 指定回数分の送信を実施する。 # for j in $( seq 1 $count ) ; do echo -n "." # 1回の送信につき、bto_ir_cmd を 10 回呼び出している。 # bto_ir_cmd を1回実行しただけでは機器側が反応しないケースが出たため、 # 連続で複数回送信するようにしている。 for i in $( seq 1 10 ) ; do /usr/local/bin/bto_ir_cmd $cmd_ext -t $ircmd > /dev/null done sleep 1 done ;; # スリープ処理 sleep) # 単純に sleep $count でも良いのだけど、 # progress 表示を出したかったので、あえて1秒の sleep を $count 回実行する。 for i in $( seq 1 $count ) ; do echo -n "." sleep 1 done ;; esac echo "" shift done
こんなふうに使えます。
10秒まつ
send_ir.sh sleep:10
ソニー製のテレビの電源を入れる信号を1回送信する。
send_ir.sh cmd:1:33950000000000
コマンドは複数個続けて指定できますので、たとえば crontab で以下のように設定しておくと、直前のテレビの状態によらず、朝6時にソニー製のテレビ BRAVIA EX30R|26V の電源を入れて、リモコン1チャンネルに切り替えることができます。
59 5 * * * /usr/local/bin/send_ir.sh cmd:1:33950000000000 sleep:10 cmd:1:33E00000000000 sleep:10 cmd:7:33B30000000000 cmd:2:33B40000000000 cmd:1:33E50000000000 cmd:1:33800000000000
各コマンドの意味は以下のとおり。
33950000000000 | 電源ボタンを1回。元々 on なら切れる。off なら電源入る。 |
33E00000000000 | ホームボタンを1回。直前の電源ボタン操作との組み合わせにより、ここで必ずホーム画面に遷移する。 |
33B30000000000 | 右ボタンを6回。これで確実にホーム画面の右端にいる。 |
33B40000000000 | 左ボタンを2回。この時点で地デジが選択される。 |
33E50000000000 | 決定ボタンを1回。これで地デジに確実に切り替わる。 |
33800000000000 | ch1 ボタン。 |
微妙に複雑な手順のように見えますけど、この手順通りに信号を送れば、確実に1chに切り替わります。テレビの電源が確実に落ちていることが保証されるなら、もっと簡単な手順があります。だけどリモコン操作は一方的な通信ですからテレビ側の状態が分からない。そこでどんな状態でもOKな手順をいろいろ考えて試行したら、最終的にこれに落ち着きました。
ただし上記の設定だけでよいかというと、そんなわけはありません。この設定は誰かが在宅中か否かによらず発動します。でも不在時に電源が入ったまま、つけっぱなしとかになると困ります。だから念の為に朝10時に電源を切る指示を入れておきます。たとえばこんなふうに。
00 10 * * * /usr/local/bin/send_ir.sh cmd:1:33E00000000000 sleep:10 cmd:1:33950000000000
上記では最初にホームボタン操作を行ってテレビの電源を入れた上で、電源ボタンで切るという操作をおこなってます。
ack が返ってこない機器を制御するのって、いろいろと頭つかいますね。
さて、ここで思いついたのだけど、Bluetooth や WiFi でスマホの存在を検知して在宅状態と判定するようにすれば、不在の時にテレビの電源が入る事故は防げるかもですね。