ホーム » 「cec-client」タグがついた投稿
タグアーカイブ: cec-client
homebridge-gsh と cec-client
homebridge-gshで、google-homeからHomeKit(homebridge)を制御
自宅で homebridge-config-ui-x で、家電制御の設定が楽になり、homebridge-gsh にて、Google Home から Apple の HomeKit の制御を呼び出せるようにしてみた。今までは赤外線リモコンベースなので、テレビのON/OFFがトグル動作で怪しかったが、HomeKit 経由だと、TVにつなげた HDMI 接続のRaspberry-Pi から HDMI 接続の他の機器に、ON/OFF を明示的に制御ができるようになる。
cec-client で 電源ON/OFF ができなくなった
無事、homebridge-gsh が動き出したのに、CATVSTB の電源が ON/OFF できない。入力切替は正しく動いているのに…
cec-client の動作状況を表示させながらうごかすと、定番の 「echo “on 1” | cec-client -s」で動かない。メッセージを見ると、対象機器がうまく選べないのが原因みたい。
CEC では、物理機器番号と論理機器番号で管理されていて、物理機器番号が決まらないのに on はできない…といったのが原因みたい。cec-client のバージョンがあがり、その辺がいいかげんなコマンドが送れないようになったようだ。
しかたがないので、CEC-O-MATIC のページにて、他の方法を試すと、以下のコマンドなら、正しく電源のON/OFFができた。
$ echo "tx 26:36" | cec-client -s # チューナーをけす Recording2 → Tuner2 standby $ echo "tx 26:44:6C" | cec-client -s # Recording2 → Tuner2 User Control Pressed Power Off $ echo "tx 26:44:6D" | cec-client -s # Recording2 → Tuner2 User Control Pressed Power On
ということで、cec-client を呼び出す処理を、上記のコマンドを使うようにして、無事 google-home から HomeKit 呼び出しに成功。
google-home に、”NHK をつける” と話しかけると、homebridge-gsh 経由で homebridgeが呼び出され、「地デジ切替と1チャンネルの赤外線信号」をだすし、”チューナーを消す”と言えば、cec-client 経由でtx 26:44:6c を送ってチューナーの電源が切れる。超便利。
(追記)
“tx 2X:44:6D” による電源ONは、HDMIの電源連動機能が動かないみたい。”on Y” だと、(TVで連動ON設定が必要だけど)チューナーの電源を入れれば、TVも連動してONになっていた。しかし、”tx 2X:44:6D”ではテレビがつかない。TV側の連動機能を知らないうちにOFFにしたのかと思ったけど、リモコンでチューナーをつければテレビ付くし。
ということで、cec-client を使って電源操作するシェルスクリプトに、TVの電源ON動作を行う機能を追加しておいた。
cec-clientのデバイス番号とアドレス番号
自宅では、テレビやケーブルテレビチューナーやレコーダを赤外線リモコンで制御できるようにしているが、電源はトグル動作でON→OFFかOFF→ONという制御ができない。そこで、HDMI端子経由のチャンネル制御を行っている。
この際に、デバイス番号とcecのアドレス番号を使うが、デバイス番号が時々変化している。
しかたがないので、cecのscan処理でデバイス番号とアドレス番号の対応情報を保存するようにしてみた。
#!/usr/bin/perl my $cec = "/usr/bin/cec-client -d 1 -s" ; open( my $fd , "/bin/echo 'scan' | $cec |" ) || die( "Can't open $cec\n" ) ; open( my $ft , "> /home/xxxxxxxx/lib/cec-table.sh" ) || die( "Can't open cec-table.sh\n" ) ; my $device = "" ; my $dev_str = "" ; my $address = "" ; my $osd_str = "" ; print $ft "#!/bin/bash\n" ; while( my $line = <$fd> ) { if ( $line =~ /^device\s+#(\d+):\s+(.*?)$/ ) { $device = $1 ; $dev_str = $2 ; } elsif ( $line =~ /^address:\s+(\d+)\.0\.0\.0$/ ) { $address = $1 ; } elsif ( $line =~ /^osd\s+string:\s+(.*?)$/ ) { $osd_str = $1 ; print $ft "DEV[$address]=$device\n" ; print $ft "OSD[$address]=\"$osd_str\"\n" ; } } close( $fd ) ; close( $ft ) ;
cec-client と cec-o-matic
自宅のAV機器の制御は、eremote-RM で色々できるようになったけど、cec-client もうまく使えば、便利な使い方ができるな
$ echo "tx 2f:36:00:00" | cec-client -d 1 -s # 全部の電源を切る(standby) $ echo "tx 20:44:xx:00" | cec-client -d 1 -s # テレビに xx の制御コードを送る $ echo "tx 2f:82:xx:xx" | cec-client -d 1 -s # xx:xxのデバイスに入力切替
だけど、cec-client は、起動時にデバイス調査の処理を色々するので、反応が悪い(1.5秒ほどのタイムラグ)。このため、サクサクとリモコン操作という感じにならない。
入力の切替は、リモコンでもできるけど、押すたびに次の入力に変わる相対的変更ため、チューナーに切り替えるといった絶対的な切替えができない。この点、”tx 2f:82:xx:xx” は絶対的入力指定ができるので、cec-client の価値がある。