Sympapaのスマートホーム日記

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

Qrio Lock(4): Home AssistantからQrio Lockを施錠する

Sympapaです。

我が家ではスマートホームバイスの統合にHome Assistantを使っています。

そしてスマートロックはQrio Lockを使っていてとても気に入っています。
1.5年使用したレビューを書いているのでQrio Lockに興味があればご覧いただければと思います。

しかしQrio LockはAPIが公開されていないのでHome AssistantからHttpをPostして施錠したり解錠したりすることはできません。
Google HomeやAlexaから施錠することができるので、Home Assistant → Google Home / Alexa → Qrio Lockというリレーで施錠することが出来そうな気がしますが、Google Homeはそもそも外部のサービスをトリガーとして受け付けないし、Alexaは定型アクションのトリガーとして連携した一部の外部サービス上のデバイスが使えますがHome Assistant上のスイッチなどはAlexaの定型アクションのトリガーとして使用できません。

そこで今回は、Home Assistantのカスタムコンポーネントなどを使いHome AssistantからGoogle HomeやAlexaを経由してQrio Lockを施錠する方法を書きたいと思います。
と言っても過去の記事で紹介している方法なんですが3種類まとめて紹介します。
ちなみに解錠はGoogle Homeからは出来ず、Alexaでは一応出来ますがパスワードを喋る必要があるので、今回紹介する方法では解錠は出来ません。

■とりあえずQrio Lockシリーズ記事まとめ

Qrio Lockシリーズ記事まとめ
Qrio Lock(1): 1.5年間使用レビュー(今更)
Qrio Lock(2): ドア開閉センサーを追加してロック状態を取得する

Qrio Lock(3): ハンズフリー解錠されている時にお知らせしてくれるようにする
Qrio Lock(4): Home AssistantからQrio Lockを施錠する←今回
Qrio Lock(5): 家の前を通過しただけなのにハンズフリー解錠された時に再施錠してくれるようにする
Qrio Lock(6): オートロックを一時無効化した後自動的に再有効化してくれるようにする(記事焼き直し)
Qrio Lock(7): Qrio Key Sレビュー

■方法1: 通称Alexa Switch

ひとつめの方法はその界隈で「Alexa Switch」と呼ばれており、ここで見つけました。
community.smartthings.com
この方法ではHome Assistant → Samsung Smart Things → Alexa → Qrio Lockという経路でHome AssistantからQrio Lockを施錠します。
Smart Things上に作成した仮想スイッチをHome Assistantから操作することが出来てAlexaでは定型アクションのトリガーとして使えるため、Home AssistantからAlexaの定型アクションをトリガーできるというものになります。
Home Assistantで仮想スイッチを作れば同じことが出来そうなもんですが、何故かAlexaのトリガーに出来ないんですよねぇ。
あ、前提としてAlexaからQrio Lockを操作する時にはAlexaのサーバー上だけでは完結できず音声のフィードバックが必須のようで、Echoデバイスが必要となります。

導入方法と使い方はどこかのページにお任せしようと思いましたが、Alexa SwitchのGithubには導入方法が書かれておらずググっても見つからないので備忘録としても必要だし書きます(汗

  1. Samsung Smart ThingsのIDEのページへアクセスしログインします。SmartThings Groovy IDE(アカウントが無い場合は作成します。また(12)の手順でロケーションを選ぶ必要があるので、ひょっとすると事前にSmart Thingsのアプリにログインしてロケーション"家"とかを登録しておく必要があるのかもしれません。)
  2. Device HandlersをクリックしCreate New Handlersをクリックします。
  3. 次に開いたページでFrom Codeタブを押します。
  4. いかにもコードを入れろというフォームが出るのでこのページのコードをコピペします。コードはトグルスイッチとON/OFFスイッチの2タイプあります。コードの16行目の"name"は適当に変えるなどします。最終的にAlexaやHome Assistantから見える名前は後で付けることになります。
  5. 何やら警告が出るかもしれませんがSaveを押します。
  6. Publishを押してFor Meを選択するとDevice type published successfullyと表示されます。
  7. トップページに戻ってMy Devicesを押しDeviceを新規作成(何故か時々日本語)を押します。
  8. Nameを入力します。これがAlexaやHome Assistantから見える名前です。
  9. device Network IDを入力れます。device Network IDはたぶん何でも良さそうです。Nameと同じでも問題なさそうです。
  10. TypeのプルダウンメニューからさっきDevice Handlersで作成したやつを選びます。コード16行目の"name"で付けた名前で表示されます。
  11. Versionはpublishedを選びます。
  12. ロケーションを選びます。
  13. Createを押しcreatedと表示されたら完了です。

あとはHome AssistantでSmart Things インテグレーションを設定しAlexaでSmart Thingsスキルを設定すれば、双方でスイッチとして認識できるようになり、Home Assistant側でON/OFFするとAlexaでもON/OFFが切り替わるようになります。
Alexa SwitchをトリガーにしてQrio Lockを施錠する定型アクションを作りHome AssistantからAlexa SwitchをオンにすればQrio Lockが施錠されます。

■方法2: Alexa Media Player

Home Assistantのカスタムコンポーネント:Alexa Media Playerを使う方法です。
github.com

この方法ではHome Assistant → Alexa → Qrio Lockという経路になります。
Alexa Media Playerを使うとAlexaに対して疑似音声コマンドを投げることが出来ます。要はAmazon Echoに向かって「アレクサ、鍵を閉めて」と言ったのと同じことをHome Assistantから無音(といってもEchoからの音声フィードバックがありますが)で実現できます。
こちらもEchoデバイスが必要となります。

Alexa Media PlayerをHome Assistantに導入する方法や使い方はAlexa Media Playerのページに誰でもわかる丁寧さで書かれていますので割愛します。
あ、Amazonのアカウントログインがうまくいかない場合はログイン方法が確か5つくらい用意されていたので別のを試すとうまくいくかもしれません。私は標準の方法ではうまくいきませんでした。

■方法3: Assistant Relayを使う

Home Assistantのカスタムコンポーネント:”Assistant Relay”を使う方法です。
assistantrelay.com
こちらの方法ではHome Assistant → Google HomeQrio Lockという経路になります。
”Assistant Relay”を使うとHome AssistantからGoogle Homeに対し無音で疑似音声コマンドを投げることが出来ます。要はNestスピーカーデバイスに向かって「OK Google、鍵を閉めて」と言ったのと同じことをHome Assistantから無音で実現できます。
※但し、ルーティンのトリガーとして設定したカスタムフレーズは実行できません。Google側の仕様のようです。

しかし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”の開発は止まっているようで”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}'


Qrio Lockを施錠するHome Assistantスクリプトの例

3つの方法はどれもちょっと安定性に欠けるというか100%確実には動作してくれないので、玄関が施錠されるまで3つの方法を順に1分間隔で使い施錠するスクリプトを組んでみました。
玄関のロック状態は追加したドア開閉センサーで取得しています。
ドア開閉センサーを追加しなくてもQrio Lockのロック状態をAlexaの定型アクションのトリガーにすることができるのでAlexa経由でHome Assistantへロック状態を取得させることも出来ますが、結構なタイムラグがあるのでドア開閉センサーで取得した方が良いと思います。

alias: 玄関を施錠する
sequence:
  - repeat:
      until:
        - type: is_not_open
          condition: device
          device_id: 玄関のロック状態を取得するために設置したドア開閉センサーのID
          entity_id: binary_sensor.玄関のロック状態を取得するために設置したドア開閉センサーのID_on_off
          domain: binary_sensor
          for:
            hours: 0
            minutes: 0
            seconds: 1
      sequence:
        - type: turn_on
          device_id: Alexa SwitchのID
          entity_id: switch.alexaswitch
          domain: switch
        - delay:
            hours: 0
            minutes: 1
            seconds: 0
            milliseconds: 0
        - type: is_open
          condition: device
          device_id: 玄関のロック状態を取得するために設置したドア開閉センサーのID
          entity_id: binary_sensor.玄関のロック状態を取得するために設置したドア開閉センサー_on_off
          domain: binary_sensor
          for:
            hours: 0
            minutes: 0
            seconds: 1
        - service: media_player.play_media
          target:
            device_id: EchoのID
          data:
            media_content_id: 〇〇の鍵を閉めて
            media_content_type: custom
        - delay:
            hours: 0
            minutes: 1
            seconds: 0
            milliseconds: 0
        - type: is_open
          condition: device
          device_id: 玄関のロック状態を取得するために設置したドア開閉センサーのID
          entity_id: 玄関のロック状態を取得するために設置したドア開閉センサー_on_off
          domain: binary_sensor
          for:
            hours: 0
            minutes: 0
            seconds: 1
        - service: rest_command.assistant_relay
          data:
            command: 〇〇のロックを閉めて
        - delay:
            hours: 0
            minutes: 1
            seconds: 0
            milliseconds: 0
        - type: is_open
          condition: device
          device_id: 玄関のロック状態を取得するために設置したドア開閉センサーのID
          entity_id: 玄関のロック状態を取得するために設置したドア開閉センサー_on_off
          domain: binary_sensor
          for:
            hours: 0
            minutes: 0
            seconds: 1
mode: single

■まとめ

今回はHome AssistantからQrio Lockを施錠する方法、というかHome AssistantからGoogle HomeやAlexaへ指示を出す方法について書いてみました。
次回のQrio Lockシリーズでは、今回紹介した方法とAndroidアプリ:Taskerを使用し、家の前を通過しただけなのにハンズフリー解錠された場合に再施錠してくれる自動化を構築したいと思います。

それでは。