また随分と時間が空いてしまいましたが、今回からはテレビの制御です。
SONY BRAVIAにはリモコンと同じ動作をHTTPリクエストで制御できる仕組みが用意されています。電源ONだけはWake Up On LANの仕組みになっているのですが、私のモデル(HX850)が古いのかネットワーク経由では上手く動作しませんでした。そこで今回はHDMIで繋いだ機器を連動させる規格であるCEC(Consumer Electronics Control)を用いて電源ON/OFFを実装します。*1
※全体像および各関連記事へのリンクはこちらから
cec-client
Raspberry Piにcec-clientをインストールします。
$ sudo apt install -y cec-utils
Raspberry PiとテレビをHDMIで繋いでおき、以下のコマンドを実行するだけで動作します。
テレビ電源をONにする場合
echo 'on 0' | cec-client -s
テレビの電源をOFFにする場合
echo 'standby 0' | cec-client -s
プログラムの修正
前回までに作成したプログラムにcec-clientを実行するメソッドを追加し、IoT Hubのダイレクトメソッドと紐づけます。PS4の制御と同様にIFTTT側でコマンドを指定する仕組みとします。
const onSendCecCommand = (request, response) => { console.log(request.payload); let command = request.payload.command; exec(`echo '${command}' | cec-client -s`, (error, stdout, stderr) => { if (error != null) { console.error(error); return; } console.log(stdout); console.error(stderr); }); };
client.openAsync() .then(() => { console.log("iot-hub client opened."); client.onDeviceMethod("sendPS4Command", onSendPS4Command); client.onDeviceMethod("sendCecCommand", onSendCecCommand); // ★追加★ }) .catch(err => console.error(`could not open iot-hub client. ${err.toString()}`));
IFTTTの設定
後は前回までにIFTTTでGoogle Assistantで「テレビをつけて」に対してon 0
を、「テレビを消して」に対してstandby 0
を前回作成したAzure Functionsに対して送信するよう設定するだけです。
{ "endpoint": "https://{IoT Hub名}.azure-devices.net/twins/raspi/methods?api-version=2016-11-14", "policyName": "service", "sharedAccessKey": "{IoT Hubの共有アクセスポリシー「service」の共有アクセスキー}", "data": { "methodName": "sendCecCommand", "payload": { "command": "on 0" } } }
-
ブラビアリンクとかレグザリンクとかビエラリンクとか言われてるやつです。↩