Google Home、快適です。Android BRAVIAを制御できないので悔しくて、対応も待ちきれず結局Chromecast Ultraも買っちゃいました。で、BRAVIAのHDMI入力が足りなくなり、AVアンプと配線を見直し。ウチのAVアンプPioneerのVSA-1124はHDMI1,2とBDが4K/60pの4:4:4に対応、あとは4:2:2対応です。
というかHDRに対応したHDMI2.0aではないので、AVアンプを経由するとせっかくのChromecast Ultraのメリットが一部活かされません。ということでUltraをBRAVIAに直結し、4K関係ないNintendo SwitchをAVアンプ経由に。
しかしこの組み合わせで問題なのは、HDMI-CECによる自動入力切替がイマイチちゃんと働かないという点。Switchを起動しても自動で映ってくれません。仕方ないのでこれもGoogle Home + IFTT + Nature Remoで制御しようと思い、(普段iPhoneアプリから操作してるので)使ってなかった赤外線リモコンを発掘してみると、なんとHDMI選択が順送りボタンのみで、ダイレクトに特定のHDMI番号を指定できませんでした…
これででは例えばHDMI1のSwitchに切り換えたいとしても今が何番かによってボタン押下回数が違ってくるので、Nature Remoからの単純な赤外線信号では一発変更できないことになります。というか事実上無理。
なんか手はないかなぁと思って、iPhoneアプリから操作できるんだからなにかしらのTCP/IPプロトコルによる制御、あわよくばWebhookで叩けるんじゃね?ってことで検索。もともと80番ポートは空いてて、ブラウザから設定画面を呼び出せるんですが、残念ながら操作関係は不可能。なんとtelnetで制御しているということがわかりました。
以下のような感じで、telnetし、認証もプロンプトもありませんが、「?P」と打つと今の電源状態(ONならPWR0など)が返ってきます。「?V」なら音量がわかるし、HDMI1に切り替えたい時は「19FN」という感じです。なんと親切なことに米Pioneerが仕様書PDFまで公開してくれてます。
1 2 3 4 5 6 7 8 9 10 |
$ telnet 192.168.0.28 Trying 192.168.0.28... Connected to 192.168.0.28. Escape character is '^]'. BridgeCo AG Telnet server ?P PWR1 ?V VOL049 19FN |
残念ながらIFTTTでtelnet制御ができるレシピはありませんし、(IFTTTから到達可能なように)外向けにtelnetポートを空けたくもありません。自宅内WebサーバーにPHPスクリプトを置き、そこからAVアンプにtelnetしてHDMIポート変更コマンドを送りつけてみることにしました。
PHP用のtelnetライブラリですが、ざっと探して最初に見つけたのは使えず、こちらで成功しました。Installの項目にあるようにcomposerでインストールを済ませた後、こんなコードで切換に成功しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
<?php require 'vendor/autoload.php'; $commands = array ( 'poweron'=>'PO', 'poweroff'=>'PF', 'bd'=>'25FN', 'hdmi1'=>'19FN', 'hdmi2'=>'20FN', 'hdmi3'=>'21FN', 'hdmi4'=>'22FN', 'hdmi5'=>'23FN', 'hdmi6'=>'24FN', ); $cmd = filter_input(INPUT_POST, 'cmd', FILTER_SANITIZE_SPECIAL_CHARS); $cmd = str_replace(" ","",$cmd); //無駄な半角スペースを削除 //IFTTTからの日本語入力名を置換する switch ($cmd) { case 'レコーダー': $cmd = "hdmi1"; break; case 'スイッチ': $cmd = "hdmi2"; break; case '前面端子': $cmd = "hdmi3"; break; case 'アップルtv': $cmd = "hdmi4"; break; case 'appletv': $cmd = "hdmi4"; break; } $client = Graze\TelnetClient\TelnetClient::factory(); $dsn = '<AVアンプのIPアドレス>:23'; $prompt = ''; $promptError = 'ERR'; $lineEnding = "\r\n"; //改行コードを指定 $client->connect($dsn,$prompt,$promptError,$lineEnding); $resp = $client->execute($commands[$cmd]); ?> |
自分に必要な機能しか実装してません。$commandsの中でPOSTでcmd変数にセットされるコマンドと実際の制御コードの対応付けを定義しています。これで「OK Google, アンプの電源を入れる」といったGoogle Assistantサービスの「Say a simple phrase」を使った固定コマンドなら、そこからWebhookでこんな感じにすれば動きます。Body欄の=の右辺が指定したいコマンドです。
少し応用的な使い方として音声コマンド中の文字列をコマンドとして渡す「Say a phrase with a text ingredient」も試してみました。HDMIの入力毎にアプレットを作るのが面倒なので、1つで済まそうという狙いです。「アンプを(入力名)に切り換え」みたいにすると、PHPスクリプトに入力名の部分が渡されるので、それを使ってswitch文のところでコマンドに置き換えています。「What do you want to say?」欄で「avアンプを $ に切換」のようにします。$の両側には半角スペースを空けます。avを小文字にしたのは、スマホのGoogle Homeアプリで実際にしゃべってみた時に出る認識文がそうなっているので合わせました。
THEN側はこんな感じにBody欄に入れます。<<<>>>で囲った部分がURLエンコードされます。TextFieldというプレースホルダは「Add ingredient」ボタンを使って挿入できます。PHPスクリプトのswitch文の中の対応付けも、Google Homeアプリでしゃべってみてどうテキストになるかを参考にします。基本的には英単語は半角小文字になるようです。「スイッチ」のようなカタカナ語はそのまんま。「ぴーえすふぉー」だと「ps 4」のように半角スペースが入りますが、入ったり入らなかったりで揺れると面倒なので、スクリプト側で半角スペースを除去しています。結果として「apple tv」は「appletv」になります。時にカタカナで「アップル tv」と認識されることもあったので両方ともhdmi4に対応付けています。このあたりはスマホのGoogle Homeアプリで色々しゃべってみて結果を反映させましょう。
これで一応設定は完了なんですが、Google Homeで認識させると全く同じ「avアンプをスイッチに切り替え」となるのに、IFTTTコマンドとして認識される時と、Web検索になってしまう(ハードのGoole Homeだと「すみません(ry」)ことがあり、成功率が低いです。コマンドを長くしてみてもあまりかわりません。IFTTTで設定してから反映されるまでに若干タイムラグがあるような感じもします。
結局どうやっても必ずIFTTTコマンドとして認識されるようにはできなかったので、Google Homeのショートカットで「スイッチに切り替え」や「スイッチを表示」を「avアンプをスイッチに切り替え」に置き換わるようにしてみたところ、成功率が上がりました。ショートカットに色々書くなら最初から「Say a phrase with a text ingredient」で入力別にアプレットを作っても一緒じゃないか、って気もしますが、IFTTTのGoogle Assistantは言い換えが3種類までなのに対し、ショートカットならもっとバリエーションを持たせられるとか、修正フローが若干楽とかで、メンテナンス性は良い気がするので良しとします。
繰り返しになりますが、上手くいかない時は、
- スマホアプリ版Google Homeでどうテキスト化されるか調べる
- テキストとしては通ってるのに音声コマンドとして認識されない時はショートカットで定義する
などを試して見るといいでしょう。またPHPスクリプトが上手く動かない時は、一旦MethodをGETにして(URL欄に「スクリプト名?cmd=<<<TextField>>>」とし、スクリプトもfilter_inputの部分をPOSTからGETにする)、ブラウザから叩いてみるといいかも知れません。GETのままでもいいんですが、日本語コマンド名が長いと255文字(だっけ)超えるかもなと思ってPOSTにしています。
予想外に苦労しましたがなんとかなりました。Google HomeとPioneerアンプというレアな(?)組み合わせの話であまり参考にできる人はいないかもですが覚え書き(telnetでなにかしたい時にはいいかも?)。