pslaboが試したことの記録

はてなダイヤリーからはてなブログに引っ越してきました

この日記は現在実行中の減量記録を含む個人的なメモとして始めましたが、最近はコンピュータやガジェット、ハック、セキュリティネタのほうがメインになっております。

はてなダイヤリー時代はカテゴリ分けが適当だったのですが、これはそのうち直します。


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 が返ってこない機器を制御するのって、いろいろと頭つかいますね。


さて、ここで思いついたのだけど、BluetoothWiFiスマホの存在を検知して在宅状態と判定するようにすれば、不在の時にテレビの電源が入る事故は防げるかもですね。