Sympapaの日記

スマートなんとかはスマートじゃない方法でつくられている

Home AssistantからGoogle Homeへトリガーを送る: Assistant Relayの導入

f:id:sympapa:20210822170636p:plain
こんにちは。
Home Assistant初心者のSympapaです。

Home AssistantにはGoogle HomeやAlexaと接続するためのインテグレーションが用意されてますが、Home AssistantからGoogle HomeやAlexaへトリガーを送る方法は標準では用意されていません。
我が家ではスマートロック"Qrio Lock"を使用していますがQrio LockはAPIが公開されていないのでHome Assistantから直接操作することが出来ないんですよね。
なのでHome AssistantからGoogle HomeやAlexaへトリガーを送りGoogle HomeやAlexaを介してQrio Lockを操作したかったわけです。

以前の記事でHome AssistantからAlexaへトリガーを送る方法2種類を書きましたが、今回はHome AssistantからGoogle Homeへトリガーを送ることが出来るようになるアドオン、”Assistant Relay”について書いていきます。
”Assistant Relay”のページはこちらです。
assistantrelay.com
”Assistant Relay”を使うとHome Assistantから「Google Home(Nest)デバイスへのブロードキャスト」「カスタムコマンドの送信」などが出来るようになり、「カスタムコマンドの送信」を使ってGoogle Homeにトリガーを送ることが出来ます。

しかしHome Assistant導入のために初めてラズベリーパイを購入し当然のごとく一発でインストールできるHass.ioを使ってHome Assistantを導入した私には、”Assistant Relay”のインストール方法をみてもさっぱりワケがわかりません(汗
Home Assistantとは関係ないところで”Assistant Relay”を動かしといてHome Assistantから呼び出して使うんだろうと想像しているのですが、そもそもHass.ioにこれをインストールしても動くのかわかりません。
ってか”Assistant Relay”のページのIntroductionの中でHass.io用の”Assistant Relay”なるものを見つけました。
Hass.io用は開発が止まっているようで”Assistant Relay”のバージョンも本家と比べてかなり古いですが、まぁとりあえずこいつをインストールしていきましょう。
github.com

”Assistant Relay for Hass.io”のGithubに書かれたとおりインストールと設定を進めていきます。

1.インストール

Home Assistantのアドオンストアを開きメニューボタンからリポジトリを選びます。
リポジトリ」にhttps://github.com/Apipa169/Assistant-Relay-for-Hassioを追加します。
アシスタントリレーが下に表示されるのでそれをクリックし「インストール」をクリックします。

2.構成

「開始」をクリックしてアドオンを実行します。
[Web UIを開く]をクリックするかブラウザでhttp:// [IP]:[PORT]にアクセスし、表示された指示に従って設定します。
・・・とAssistant Relayの説明に書かれているのでこの記事でも詳細を書かずに丸投げしたいところですが、指示が超絶粗々で初心者にはハードルが高く一度やった自分も記憶だけでまた設定出来る気がしないので書いておきましょう。

  1. Google Assistant Actions Consoleへアクセスする。
  2. [NEW PROJECT]ボタンをクリックする。
  3. プロジェクト名を入力し、言語は日本語、場所は日本を選択して[CREATE PROJECT]ボタンをクリックする。
  4. https://console.developers.google.com/apis/api/embeddedassistant.googleapis.com/overview?authuser=2へアクセスする。
  5. 上にGoogle Cloud Platformと書かれているが、その右にあるプルダウンメニューからさっき作成したプロジェクトを選択する。もし選択肢にさっき作成したプロジェクトが表示されない場合はその右にある検索マーク(Open Search)を押し、さっきのプロジェクト名を検索して検索結果から選べば表示されるようになる。
  6. Google Assistant APIと書かれた下にある[ENABLE]ボタンを押す。これでAPIが有効になる。
  7. 左のメニューから"Credentials"を選ぶ。
  8. 開いた画面の右側にある[CONFIGURE CONSENT SCREEN]ボタンを押す。
  9. 開いた画面でExternalを選ぶ。
  10. App nameの項目に名前をを入力する。
  11. User support emailに自分のメールアドレスを入力する。
  12. Developer contact informationに自分のメールアドレスを入力する。
  13. [SAVE AND CONTINUE]ボタンを押す。
  14. Scopeの画面は何も触らずにそのまま [SAVE AND CONTINUE]を押す。
  15. Test usersの画面でも何も触らずにそのまま [SAVE AND CONTINUE]を押す。※Test Userの設定は必要だが何故かここでは設定できなかった
  16. 左のメニューから再び”OAuth consent screen”を選ぶ。
  17. "Test user"の項目で[ADD USER]を押しAssistant relayで使う予定のGoogleアカウントのGmailアドレスを入力して[SAVE]を押す。もう一回[SAVE]を押す。
  18. "Publishing status"の項目で[PUBLISH APP]ボタンを押す。
  19. 左のメニューからCredentialsを選ぶ。
  20. 上にある[CREATE CREDENTIAL]ボタンを押しOAuth client IDを選択する。
  21. "Application type"のプルダウンメニューから"TVs and Limited Input devices"を選ぶ。
  22. 名前をつける。
  23. [CREATE]ボタンを押す。するとYour Client IDとYour Client Secretが表示されるがメモらなくてもよい。
  24. 右側の窓のOAuth 2.0 Client IDsの中にさっき作った名前のものが現れるので、その右にあるダウンロードボタンを押す。"client_secret_~.json"ファイルがダウンロードされる。
  25. Home Assistantの"Assistant Relay"WEB UIの画面へ戻り"Next"ボタンを押す。
  26. User Name(これは適当に付ければいい)を入力し、"Select file"ボタンを押してさっきダウンロードしたファイルを選択する。
  27. Googleの認証画面が表示されるのでGoogleアカウントでログインして承認する。このアカウントはさっき設定した"Test user"とアカウントと同一でなくてはいけない。
  28. トークンが表示されるのでコピーするなりメモるなりする。
  29. "Assistant Relay"のWEB UIに戻ると「トークンを入れろ」という画面が開いているのでペーストするなり入力するなりする。(ひょっとすると別タブで開いているかもしれないので注意)
  30. うまくいくと全てのGoogle Home(Nest)デバイスが何かしゃべるので注意。

3.やっとこさ使う

RestコマンドからGoogle Homeバイスへブロードキャストしたりカスタムコマンドを送信したりできます。
お目当てのカスタムコマンドはこんな感じでGoogle Homeへコマンドを話すのと同じことが無音で出来るようになります。
URLのIPアドレスはHome Assistantが走っているラズパイのものです。裏でAssistant Relayが走っていてポート3000で呼び出せるということのようですね。よーわかりませんが(汗

rest_command:
  assistant_relay:
    url: http://192.168.11.x:3000/assistant
    method: POST
    content_type: 'application/json'
    payload: '{"command":"キッチンの電気を消して", "user":"sympapa"}'

”Assistant Relay for Hass.io”のGitHubには下のようなExampleが用意されてました。
Rest Commandの中にカスタムコマンドを記述しなくても、オートメーションの作成時にカスタムコマンドを"command"に指定してやればRest Commandは使いまわし出来るよってことですね。
カスタムコマンド以外は試してませんがそのうちGoogle Homeに喋らせるオートメーションも作成したいと考えているので、また試したいと思います。

# Example configuration.yaml
rest_command:
  assistant_broadcast:
    url: http://192.168.10.2:3000/assistant
    method: POST
    content_type: 'application/json'
    payload: '{"command":"{{ command }}", "user":"username", "broadcast":true}'
    
  assistant_converse:
    url: http://192.168.10.2:3000/assistant
    method: POST
    content_type: 'application/json'
    payload: '{"command":"{{ command }}", "user":"username", "converse":true}'

  assistant_relay:
    url: http://192.168.10.2:3000/assistant
    method: POST
    content_type: 'application/json'
    payload: '{"command":"{{ command }}", "user":"username"}'
# Example test lovelace card
type: entities
entities:
  - action_name: Broadcast
    name: test broadcast
    service: rest_command.assistant_broadcast
    type: call-service
    service_data:
      command: hello, this is a test broadcast
# Automation action example (just fill in "command: hello" if you are using the editor)
  action:
  - data:
      command: hello
    service: rest_command.assistant_broadcast


これでHome AssistantからAlexaだけじゃなくてGoogle Homeへもトリガーを送れるようになったので、Google Homeをメインのスマートスピーカーにしている我が家でも色々できそうです。

(後日追記)
と思ったけど、Google Assistant SDKの仕様でGoogle Home標準のアクション(〇〇の部屋の電気をつけてなど)はトリガーできますが、Google Homeのルーティンをトリガーすることはできないようです。なので、どうしてもGoogle Home経由でしか動作させられないデバイスを動かすための機能って感じでしょうか。
それに動作の安定性もいまひとつです。
Alexa Media PlayerからAlexaへトリガーを送る方が使い勝手が良いかもですね。

では。