大人のおもちゃ箱

Google HomeとRaspberry pi(HDMI-CEC soap)でテレビを完全にコントロールする

Google HomeとRaspberry piを使って、テレビの視聴時間の制限機能を構築しています。

まとまった時間ができた時に、いろいろなことを試してベストな構築を目指します。子供のYouTube閲覧を制限する為に、面倒ではありますが最後まで続けたいですね。

前回までで一通り必要なハードの環境は揃ったので、今回からソフト面を開発していきます。

機能のおさらい

  • Google Homeにテレビリモコンの指示
  • iftttで家のRaspberry piをキック
  • Raspberry piで制限時間を確認し、各ボタンの指示を実行

※一日の視聴可能時間を超えている場合は、Google Homeからその旨をメッセージで喋らせる

まあ、やりたいことはシンプルに!をテーマで進めていきます。

今回開発する機能は

iftttから受けた指示をRaspberry piで処理し、テレビを操作するまでを構築します。

当初は、Raspberry piからテレビを操作するのは、HDMIを使って全て行う予定でしたが、いろいろと調べた限りではHDMI-CECではチャンネルなどのボタン操作が行えない?と分かりました。

HDMI-CECの機能を使うために、cec-utilsをインストールしました。

cec-utilsの使い方例

■電源・ON

echo ‘on 0’ | cec-client -s

■電源・OFF

echo ‘standby 0’ | cec-client -s

■ボリューム・UP

echo ‘volup’ | cec-client -s

■ボリューム・DOWN

echo ‘voldown’ | cec-client -s

上記のようにcec-utilsには、大まかなコマンドが用意されています。

当初はこの流れで、txコマンドと 目的のコードを組み合わせることで、チャンネルの操作ができると考えていました。

http://www.cec-o-matic.com/

のコード一覧を確認するサイトをいくら見ても、チャンネルボタンの操作に関する内容を見つけることができませんでした。

自分の調べ方が悪いのかもしれませんが・・・

確かにビデオカメラ、デジカメ、ブルーレイレコーダーをHDMIケーブルで接続した時も、電源のON・OFF、ボリューム、入力画面の操作以外は必要なさそうですからね・・・

あれ?企画終了?う~ん。

そう言えば、以前にnode.jsからブラビアテレビ(SONY Bravia)を操作した時に、利用したライブラリを思い出しました。

https://github.com/alanreid/bravia です。

HTTPからリクエストを送って、テレビ操作ができ初めて使って遊んだ時は、なにげに感動したものです。

ただ、テレビの電源をON・OFFする機能が、WOL(Wake On LAN)であり家の環境では動作しない為、本格的に使って遊ぶのをやめてしまった経験があります。

(WOLは、無線LANでは動作しない仕様らしいです)

電源のON・OFFは使えなかったけど、その他操作は十分にできたので、電源のON・OFFはcec-utils(cec-client)を使い、その他のボタン操作はHTTPリクエストをcurlで実行して対応することにしました。

(また、cec-utilsでHDMIのアクティブステータスを確認し、視聴時間を集計するためcec-utilsは必ず使います)

Curl(HTTP)からブラビアを操作

curl -X POST -d '
<?xml version="1.0" encoding="utf-8"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:X_SendIRCC xmlns:u="urn:schemas-sony-com:service:IRCC:1">
<IRCCCode>$IRCCCode</IRCCCode>
</u:X_SendIRCC></s:Body></s:Envelope>'
http://$BRAVIA_IP/IRCC

$IRCCCode のコード一覧

PowerOff = AAAAAQAAAAEAAAAvAw==
PowerOn = AAAAAQAAAAEAAAAuAw==
※↑WOLを使わなくても、上のコードから電源のON・OFFは可能?
VolumeUp = AAAAAQAAAAEAAAASAw==
VolumeDown = AAAAAQAAAAEAAAATAw==
Mute = AAAAAQAAAAEAAAAUAw==
Input = AAAAAQAAAAEAAAAlAw==
GGuide = AAAAAQAAAAEAAAAOAw==
EPG = AAAAAgAAAKQAAABbAw==
Favorites = AAAAAgAAAHcAAAB2Aw==
Display = AAAAAQAAAAEAAAA6Aw==
Home = AAAAAQAAAAEAAABgAw==
Options = AAAAAgAAAJcAAAA2Aw==
Return = AAAAAgAAAJcAAAAjAw==
Up = AAAAAQAAAAEAAAB0Aw==
Down = AAAAAQAAAAEAAAB1Aw==
Right = AAAAAQAAAAEAAAAzAw==
Left = AAAAAQAAAAEAAAA0Aw==
Confirm = AAAAAQAAAAEAAABlAw==
Red = AAAAAgAAAJcAAAAlAw==
Green = AAAAAgAAAJcAAAAmAw==
Yellow = AAAAAgAAAJcAAAAnAw==
Blue = AAAAAgAAAJcAAAAkAw==
Num1 = AAAAAQAAAAEAAAAAAw==
Num2 = AAAAAQAAAAEAAAABAw==
Num3 = AAAAAQAAAAEAAAACAw==
Num4 = AAAAAQAAAAEAAAADAw==
Num5 = AAAAAQAAAAEAAAAEAw==
Num6 = AAAAAQAAAAEAAAAFAw==
Num7 = AAAAAQAAAAEAAAAGAw==
Num8 = AAAAAQAAAAEAAAAHAw==
Num9 = AAAAAQAAAAEAAAAIAw==
Num0 = AAAAAQAAAAEAAAAJAw==
Num11 = AAAAAQAAAAEAAAAKAw==
Num12 = AAAAAQAAAAEAAAALAw==
Tv = AAAAAQAAAAEAAAAkAw==
Hdmi1 = AAAAAgAAABoAAABaAw==
Hdmi2 = AAAAAgAAABoAAABbAw==
Hdmi3 = AAAAAgAAABoAAABcAw==
Hdmi4 = AAAAAgAAABoAAABdAw==
Google = AAAAAgAAAMQAAAA7Aw==
ActionMenu = AAAAAgAAAMQAAABLAw==
ChannelUp = AAAAAQAAAAEAAAAQAw==
ChannelDown = AAAAAQAAAAEAAAARAw==
SubTitle = AAAAAgAAAJcAAAAoAw==
ClosedCaption = AAAAAgAAAKQAAAAQAw==
Enter = AAAAAQAAAAEAAAALAw==
DOT = AAAAAgAAAJcAAAAdAw==
Analog = AAAAAgAAAHcAAAANAw==
Teletext = AAAAAQAAAAEAAAA/Aw==
Exit = AAAAAQAAAAEAAABjAw==
Analog2 = AAAAAQAAAAEAAAA4Aw==
AD = AAAAAgAAABoAAAA7Aw==
Digital = AAAAAgAAAJcAAAAyAw==
Analog = AAAAAgAAAJcAAAAuAw==
BS = AAAAAgAAAJcAAAAsAw==
CS = AAAAAgAAAJcAAAArAw==
BSCS = AAAAAgAAAJcAAAAQAw==
Ddata = AAAAAgAAAJcAAAAVAw==
PicOff = AAAAAQAAAAEAAAA+Aw==
Tv_Radio = AAAAAgAAABoAAABXAw==
Theater = AAAAAgAAAHcAAABgAw==
SEN = AAAAAgAAABoAAAB9Aw==
InternetWidgets = AAAAAgAAABoAAAB6Aw==
InternetVideo = AAAAAgAAABoAAAB5Aw==
Netflix = AAAAAgAAABoAAAB8Aw==
SceneSelect = AAAAAgAAABoAAAB4Aw==
Mode3D = AAAAAgAAAHcAAABNAw==
iManual = AAAAAgAAABoAAAB7Aw==
Audio = AAAAAQAAAAEAAAAXAw==
Wide = AAAAAgAAAKQAAAA9Aw==
Jump = AAAAAQAAAAEAAAA7Aw==
PAP = AAAAAgAAAKQAAAB3Aw==
MyEPG = AAAAAgAAAHcAAABrAw==
ProgramDescription = AAAAAgAAAJcAAAAWAw==
WriteChapter = AAAAAgAAAHcAAABsAw==
TrackID = AAAAAgAAABoAAAB+Aw==
TenKey = AAAAAgAAAJcAAAAMAw==
AppliCast = AAAAAgAAABoAAABvAw==
acTVila = AAAAAgAAABoAAAByAw==
DeleteVideo = AAAAAgAAAHcAAAAfAw==
PhotoFrame = AAAAAgAAABoAAABVAw==
TvPause = AAAAAgAAABoAAABnAw==
KeyPad = AAAAAgAAABoAAAB1Aw==
Media = AAAAAgAAAJcAAAA4Aw==
SyncMenu = AAAAAgAAABoAAABYAw==
Forward = AAAAAgAAAJcAAAAcAw==
Play = AAAAAgAAAJcAAAAaAw==
Rewind = AAAAAgAAAJcAAAAbAw==
Prev = AAAAAgAAAJcAAAA8Aw==
Stop = AAAAAgAAAJcAAAAYAw==
Next = AAAAAgAAAJcAAAA9Aw==
Rec = AAAAAgAAAJcAAAAgAw==
Pause = AAAAAgAAAJcAAAAZAw==
Eject = AAAAAgAAAJcAAABIAw==
FlashPlus = AAAAAgAAAJcAAAB4Aw==
FlashMinus = AAAAAgAAAJcAAAB5Aw==
TopMenu = AAAAAgAAABoAAABgAw==
PopUpMenu = AAAAAgAAABoAAABhAw==
RakurakuStart = AAAAAgAAAHcAAABqAw==
OneTouchTimeRec = AAAAAgAAABoAAABkAw==
OneTouchView = AAAAAgAAABoAAABlAw==
OneTouchRec = AAAAAgAAABoAAABiAw==
OneTouchStop = AAAAAgAAABoAAABjAw==
DUX = AAAAAgAAABoAAABzAw==
FootballMode = AAAAAgAAABoAAAB2Aw==
Social = AAAAAgAAABoAAAB0Aw==

テレビ操作に関する機能は、この2つで実現できそうです。

これらを使ってベースとなる機能を開発していきます。

一応ほぼ出来上がったのですが、現在はiftttから送られてくるテキストの処理・分木を柔軟に対応するための方法を模索中です。

Google Homeを操作するのは子供なので、キーワードが毎回バラバラになるのを想定しての対応です。

(テレビリモコン)で、1チャンネルにして、
(テレビリモコン)で、1チャンにして、
(テレビリモコン)で、1チャンネル、
(テレビリモコン)で、1チャン、
(テレビリモコン)で、1チャンネルに変えて、
(テレビリモコン)で、1チャンに変えて

などなど

正規表現で対応するのが1番?なのかもしれませんが、頑張って多くのキーワードを登録しても、結局は取りこぼしが多そうなので・・・

何らかかのベストな方法を考えてみます。

関連記事