Google HomeとIFTTTで家電を操作する場合、HTTPでどこかのURLを叩く受け口(Webhook)を用意するのが早道、というか必要です。前回、PioneerのAVアンプはネットワーク操作可能なもののtelnetの受け口しかなかったのでPHPスクリプトを使って橋渡しをしました。BRAVIAの場合はHTTPでXML形式のファイルを送りつけてやるといけるという記事が散見されるのですが、その記事で紹介されているcurl(テキストWebクライアント)を使った方法では成功しませんでした。
結局上手く言ったのは、こちらの記事を参考に、GitHubにあるalanreid氏のNode.jsプロジェクトを使った方法でした。
Node.jsは不慣れなのでいつものmacOS Server機ではなくCentOS仮想サーバーを使用。ちょっと昔すぎて手順は憶えてないですがNode.jsなどはyum installでサクっと入ると思います。
まずAndroid BRAVIA側でIP操作を受け付ける許可とPSK(暗証番号)の設定をします。
- ホーム -> 通信設定 -> ホームネットワーク-> モバイル機器/レンダラー機能を「入」に
- ホーム -> 通信設定 -> ホームネットワーク-> IP コントロール -> 認証 を「Normal and Pre-Shared Key」に
- ホーム -> 通信設定 -> ホームネットワーク-> IP コントロール -> Pre-Shared Keyで4桁の暗証番号を設定
- ホーム -> 通信設定 -> ホームネットワーク-> IP コントロール -> 簡易IPコントロール を「入」に
またルーターもしくはBRAVIA自体の設定を変更し、固定IPアドレスになるようにしておくと良いでしょう。
次に適当なフォルダにalanreid氏のプロジェクトをクローンします。
1 2 3 4 |
# mkdir /var/www/node/bravia/ # cd /var/www/node/bravia/ # git checkout https://github.com/alanreid/bravia.git # npm install |
そのフォルダに、demo.jsやhttp-bravia-echo.jsなどがあると思います。
demo.jsで動作チェック
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
var bravia = require('./lib'); // Accepts two parameters: IP and PSKKey bravia('192.168.0.???', 'xxxx', function(client) { // List available commands client.getCommandNames(function(list) { console.log(list); }); // Call a command client.exec('Netflix'); }); |
???をBARVIAのIPアドレスに変更。xxxxをBRAVIA上で設定した暗証番号に変更します。
これでコマンドラインから、
1 |
# node demo.js |
とすると、画面には利用できるコマンド一覧が表示され(condole.log(list);の結果)、続いてテレビの電源が入ってNetflix画面になる(cluent.exex(‘Netflix’);の結果)はずです。demo.jsはこの2つのコマンドを連続で実行する、まさしくデモ用のファイルです。コマンドライン用の実行ファイルを作るのであれば、これをコピーし、前半のList available commandsのセクションを削除し、Netflixコマンドを他のものに書き換えるだけで良いでしょう。
ブラウザからの操作を受け付ける
本来Node.jsは.jsスクリプトをサーバーとして待ち受けさせて、ブラウザからアクセスがあった時に所定の動作を行わせるためのものです。その為の基本動作を組み込んだのがhttp-bravia-echo.jsです。こちらも自分の環境にあわせてちょっとだけ修正します。
7 8 9 |
const port = 5006 const tvIP = '192.168.0.???' const pskKey = 'xxxx' |
portはブラウザからアクセスする時に必要になります。Webサーバーといえば80番が標準的ですが、セキュリティの問題とか色々あるので避けた方が無難です。特に他とぶつかったりしてなければ標準の5006で良いでしょう。いくつにしたかだけ憶えておきます。???とxxxxは先ほどと同じ、BRAVIAのIPアドレスと暗証番号です。
1 |
# node http-bravia-echo.js & |
します。最後に「&」をつけておくことで、ユーザがコンソールからログアウトしても裏で動き続けるようになります。動作テストの間はつけない方が良いかも知れません。またOSを再起動すると止まってしまいまた同じ様に起動する必要があります。OS起動時に自動起動する方法は別途ググってください。
さて、エラーもなく正常に起動したら、ブラウザから呼んでみます。
1 |
http://192.168.0.???:xxxx/WakeUp |
のようにします。ここでは暗証番号は使わないので注意してください。WakeUpがコマンドになります。電源オンはPowerOnではなくWakeUpでいけるようです。成功するとWebページとしては「OK」とだけ出ます。注意したいのはその操作(ボタン)を受け付ける状態になっていないとOKが返った場合でもなにも起きないということです。例えば「Num1」はテンキーの1ボタンですが、ホーム画面やNetflixアプリを起動している状態ではなにも置きます。先に「Tv」にしておいてから「Num1」にするとチャンネルが切り替わる、という具合です。「OK Google、NHKを映して」みたいなことをしたい場合、IFTTT側ではマクロ操作できないので、スクリプト側でWakeUp->Tv->Num1のように連続的にコマンドを送る必要がありそうです。音量についても1回に1目盛り上げ下げしても仕方ないので、数回繰り返すような処理が必要でしょう。JavaScriptが得意な人はこのhttp-bravia-echo.jpを直接改造すると良いと思います。σ(^^)はPHPの方が得意なので、別にApacheサーバーでホストしたスクリプトから連続で呼び出すようにしようかと思案中です。
IFTTT(インターネットから)呼び出す
IFTTTのサーバーは当然ながら自宅のイントラネット(LAN)の外にあります。なので、IFTTTアプリのWebhookアドレスとして上記の「192.168.x.x」といったアドレスを入力しても到達できません。ルーターのポート開放設定が必要だったり、利便性として固定IPアドレスやダイナミックDNSアドレスなども欲しくなるでしょう。