📺

Raspberry Piでテレビを操作する

2024/11/01に公開

Raspberry Piを使用して、HDMI CEC (Consumer Electronics Control) を活用し、テレビを操作する方法を紹介します。全てのリモコンボタンを再現できるわけではありませんが、ここで紹介しているようなことはCEC対応であればできると思います。

環境

  • デバイス: Raspberry Pi 4 Model B+
  • OS: Debian GNU/Linux 12 (bookworm)

事前準備

  • Raspberry PiがテレビにHDMI接続されている
  • HDMI CECに対応したテレビが接続されている(モニターは不可)
  • テレビの設定でCECの連動をONにしている

手順

1. cec-utilsのインストール

まず、CECプロトコルを利用するためのユーティリティであるcec-utilsをインストールします。以下のコマンドを実行してください。

sudo apt install cec-utils -y

2. CECコマンドの実行

以下のコマンドを使用して、テレビを操作します。

テレビをオンにする
echo "on 0" | cec-client -s
テレビをオフにする
echo "standby 0" | cec-client -s
テレビの音量を上げる
echo 'volup' | cec-client -s
HDMI1に入力切換する
echo "tx 1F:82:10:00" | cec-client -s

解説

tx 1F:82:10:00というコマンドは以下のように分解できます:

  • 1F: 送信元アドレス。1Fはブロードキャストアドレスで、すべてのデバイスに対して信号を送ることを意味します。
  • 82: 指定された入力ソースに切り替えるコマンド。
  • 10:00: HDMI 1ポートを指定するためのパラメータ。
    テレビが00:00、HDMI1~3が10:00~30:00となるようです。

HDMI-CECデバイスをスキャンする

$ echo "scan" | cec-client -d 1 -s
log level set to 1
opening a connection to the CEC adapter...
requesting CEC bus information ...
CEC bus information
===================
device #0: TV
address:       0.0.0.0
active source: yes
vendor:        Toshiba
osd string:    TV       ←テレビ
CEC version:   1.4
power status:  on
language:      jpn

device #1: Recorder 1
address:       1.0.0.0
active source: no
vendor:        Toshiba
osd string:    CECTester ←ラズパイ
CEC version:   1.4
power status:  on
language:      eng

この情報から、テレビへの入力切替は以下のコマンドで可能なはずですが、私の環境では動作しませんでした。

echo "tx 1F:82:00:00" | cec-client -s

その他のコマンドはこちら

cec-o-matic

使用例

  • 毎朝7時にテレビを付ける
crontab -e
0 7 * * * echo "on 0" | cec-client -s
  • 平日の夜9時にテレビを付け、HDMI3に切り替える
    以下のPythonスクリプトを作成します。
tv_on_3.py
import subprocess

def turn_on_tv():
    subprocess.run('echo "on 0" | cec-client -s')
    subprocess.run('echo "tx 1F:82:30:00" | cec-client -s')

if __name__ == "__main__":
    turn_on_tv()
crontab -e
0 21 * * 1-5 python home/(username)/tv_on_3.py

参考リンク

ラズパイでテレビを操作する - Qiita

Discussion