Raspberry Pi とGoogle HomeでTVを音声操作しよう!完結編

予想以上に時間がかかってしまいましたが、一旦目標としていた、「Google Homeへの音声指示でTVを操作」するところまでできました。

今までのまとめも含めて、解説していきます。

全体像を見ながら一旦まとめ

いままで、いろいろやってきましたが、データの流れに沿って対応しているわけではないので、自分でも混乱してきました。

今回の対応の前に、一旦

  • 今まで対応した事
  • 今回対応する事

をまとめておきます。

全体像は下の図のとおり

Raspberry Pi TV操作フロー

対応した順番に解説すると、

  1. Raspberry Pi自体の購入~インストール等の準備。
    https://po-what.com/raspberry-pi-os-install
  2. Raspberry PIを操作するにあたって、SSH接続&Sambaでファイル共有する環境構築。
    https://po-what.com/raspberry-pi-ssh-from-windows
  3. Raspberry PiからHDMIケーブル経由で信号送ってみたり。
    https://po-what.com/raspberry-pi-tv-control-failed
  4. ADRSIRから赤外線信号でTVを操作してみたり。
    https://po-what.com/raspberry-pi-adrsir
  5. Google Homeに発声。その内容をIFTTT → Beebotteに伝えるまで。
    https://po-what.com/raspberry-pi-google-home-ifttt-beebotte
  6. そして、BeebotteからRaspberry Piへの伝送 → Raspberry Piで解釈してADRSIRから赤外線信号の発信 ※これが今回の記事

ざっとこんな感じで、一旦今回で完結させます。

今回やること

Beebotteから、mqttをRaspberry Piで受信。そいつをパターンごとに分岐。そして、ADRSIRから赤外線信号発信!

この処理を、Node-REDを使って構築します。

そして、TVの操作できる所まで確認することが目的です。

Node-REDの環境構築

Node-REDのインストール

Raspberry Piに、Node-REDをインストールします。

Raspberry Piに入って、下記コマンド実行。

$ bash <(curl -sL https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/update-nodejs-and-nodered)

結構時間かかりますよ。。。。

こんなかんじで、状況表示されます。

Node-RED インストール結果

Node-redを早速起動してみましょう

下記コマンドを実行

$ node-red

筆者の場合、Windows PCからアクセスしているので、

ブラウザーを起動して下記URLを表示

http://[raspberry pi のIP]:1880

こんな感じで表示されます。GUIでいいですね~

無事、インストール完了しているようです。

Node-RED

Node-REDに処理を実装していきます

MQTTを受け取る所を作る

mqttをドラッグして、フィールドに配置

ドラッグして配置したmqttをダブルクリック

mqtt配置

編集画面が表示されるので、

トピック:google_home/voice

と、とりあえず入れておいて、サーバのところにあるペンのアイコンをクリック

mqttノード編集

表示されたダイアログの接続タブで、

サーバ:mqtt.beebotte.com

ポート:8883

SSL/TLS接続を使用:チェックを入れる

mqtt接続設定

次に、セキュリティタブを開いて、

ユーザ名:beebotteのChannel Tokenをコピーしてきて、貼り付け

mqttセキュリティ設定

追加ボタンをクリック

ノード設定

受け取ったデータをJSONに変換

機能の下にあるjsonをドラッグして適当な場所に配置しておく

json配置



Debugを設置して、データ受信を確認してみる

今度は、出力の下にあるdebugをドラッグして設置

debug設置

灰色のマーク同士をドラッグして、接続する

Node接続

右上にある、デプロイボタンをクリックして、Raspberry Piに反映しておきます。

デプロイ

成功したようです。

デプロイ結果

デバッグアイコンをクリックして、

デバッグ

Google Homeに設定した文言を発声してみると

デバッグ結果

ちゃんと来てます。

分岐を設置

TVを消音にする命令をIFTTTに登録しましたが、実は裏でいろいろ設定しておきました。(消音だけしてもつまらないですしね)

というわけで、それぞれのRequest内容で分岐するところを作ります。

機能の下にある、switchで分岐します。こちらを配置して

switch配置

こんな感じで、分岐の設定をしてください。

分岐設定

解説すると、IFTTTのところでのBody情報で、こんな情報をセットしたと思います。

{“data”:[{“device”:”regza”,”action”:”silence”}]}

device は、 regza

action は、silence

上の例だと、プロパティのところで、payload.data[0].device と書いて、deviceに何が設定されているか判断しよう!として

lightだったり、今回設定したregzaだったりが来たら、それぞれ1と2に処理が分岐しますってこと。

こんな感じで、actionでの分岐も設定して、分岐部分は最終的にこんな感じになりました。

actionの分岐はこんな感じですね。プロパティでdeviceだったところをactionにして、入ってくる値で判断しています。

switchプロパティ

ADRSIRへの処理

いよいよ、最後の処理を実行するところですね!

その他のところにある、execを配置して

exec配置

中身は、こんな感じ。

execプロパティ

python3で、ファイルを実行して

引数のところで、オプションの 「t」 と、ダブルクオーテーションで囲んだ赤外線コード

引数のところの msg.payloadはチェック外しておきます。

名前のところは適当にわかりやすいものを。

これを、switchの分岐からそれぞれ対応したexecにつなげてください。

最後にデプロイ

上記設定が終わったら、デプロイして設定を反映させてください。

そして、node-redをCtrl+cで、終了。

下記コマンドで、Node-REDを起動しっぱなしにします。

$ node-red-start

ちなみに、上記を終了させる場合は、

$ node-red-stop

Google Homeで動作確認

Google Homeに「OK Google 消音」・・・・

はい。消音できました。長かった。。。。

追加対応

これまでの対応で、Google HomeからのTV操作はできるようになりました。

次回、BeebottteにHTMLからHTTPリクエストをだして、スマホやPCのブラウザからTVを操作できるようにしてみようと思います。