ymmooot

テレビの電源 on/off に古のオーディオ機器を連動させる

やりたいこと

現代のテレビには CEC(Consumer Electronics Control) と呼ばれる、HDMI 接続された機器を制御する機能がある。しかし、古いオーディオ機器にはこの機能に対応してない。対応してないというか、HDMI 端子を備えていない。そこで、Raspberry Pi を使って、テレビの電源 on/off に連動してオーディオ機器の電源を on/off することにした。

構成

  • Raspberry Pi
  • CEC 対応テレビ
  • 古のオーディオ機器
    • 赤外線リモコンで制御できるもの
  • Nature Remo mini

まず、テレビと Raspberry Pi を HDMI で接続する。Raspberry Pi はテレビから CEC の信号を受け取り、適当なハンドリングでオーディオ電源制御のトリガーとする。Nature Remo mini はクラウドを経由せずとも、それ自体がローカルネットワーク上で API サーバーとして動作するので、Nature Remo mini に対してリクエストを送り、赤外線でオーディオ機器の電源を制御する。

実装

自分の Raspberry Pi はすでに Python のプログラムが動作しているので、今回もとりあえず Python で書いた。
subprocess で cec-client とか curl を呼び出しているだけなので、別になんの言語でもいい。

main.pyimport subprocess

def call_nature_remo_api():
    subprocess.call('curl -XPOST Remo-mini12345.local/messages -H "X-Requested-With: local" -d \'{"format":"us","freq":38,"data":[8915,4463,中略,532]}\'', shell=True)

def should_trigger_remo_api(output):
    trigger_strings = [
        "TV (0): power status changed from 'standby' to 'on'", 
        "TV (0): power status changed from 'on' to 'standby'",
        "TV (0): power status changed from 'standby' to 'in transition from standby to on'",
        "TV (0): power status changed from 'in transition from standby to on' to 'standby'",
    ]
    return any(string in output for string in trigger_strings)

def monitor_cec_output():
    process = subprocess.Popen(['cec-client'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)

    try:
        while True:
            output = process.stdout.readline()
            if should_trigger_remo_api(output):
                call_nature_remo_api()

    except KeyboardInterrupt:
        print("exit")
        process.kill()

if __name__ == '__main__':
    monitor_cec_output()

Nature Remo mini に送るべき HTTP リクエストはこの記事が参考になる。👉 Nature Remo Local API でローカルからリモコン信号を送る
自分が持っているオーディオ機器は赤外線リモコンの電源ボタンがトグル式で冪等性がないので、同じリクエストを on と off の両方に使う必要がある。そのため手でオーディオの電源だけ付けたりすると逆になってしまう。


trigger_strings に関しては standby / on がテレビのリモコンで電源操作をした際のログで、standby / in transition from standby to on がゲーム機器や Chromecast with Google TV など、他の機器によって電源が切り替わった際のログだった。もっとスマートな判定方法があるかもしれないけど、とりあえずこれで期待通り動いている。

ちなみに

自分が使っている古のオーディオ機器は ONKYO の CR-S1 という2009年発売の CD レシーバーで、高校生の時にスピーカーとセットで買った記憶がある。対応物理メディアは CD のみでデザインがすっきりしている上、光デジタル入力を2つ備えており、現在でも十分使える。

CR-S1。納まりが良い。
CR-S1。納まりが良い。