omohayui blog

おも‐はゆ・い【面映ゆい】[形][文]おもはゆ・し[ク]《顔を合わせるとまばゆく感じられる意》きまりが悪い。てれくさい。

DevFest 2020 で Local Home SDK を使った開発の話をしました

これは何か?

先日、GDG DevFest Tokyo 2020 と言うイベントで、
「Local Home SDK を使った Local Fulfillment とオリジナルホームデバイスの開発について」という話をしてきました。

DevFest は、Google Developer Group (GDG) コミュニティによって世界各地で開かれるデベロッパー向けイベントです。
そんな規模の大きいイベントに登壇させていただけるのは恐縮なのですが、せっかくなので話した内容をより詳しく記事にしようと思います。

発表自体は Youtubeに上がっているので、気になる方は Google Home のマイクをオフにして、ご視聴ください(私が発表内で「OK Google」を連呼した為に、複数の視聴者が被害に遭われました。。。)

youtu.be

発表内容詳細

Agenda

  1. Smart Home Action について
  2. Smart Home 統合フロー
  3. Local Fulfillment を使った構成
  4. Local Fulfillment を使うメリット
  5. Local Home SDK を使った開発方法
  6. オリジナルホームデバイスのデモ
  7. 使ってみた感想など

Definition of the term

本資料での用語定義💡

※ 注意したいのは、デベロッパーとは Google Assistant 本体を開発している人でなく、ホームデバイスを開発している人です。

Smart Home Action

f:id:omohayui:20201021235520p:plain
smart home action

Smart Home Action を構築すると、ユーザーが “OK Google 電気をつけて” と自宅の Google Home に話かけると、デベロッパーの Cloud Fulfillment が呼び出され、ユーザーの自宅にあるホームデバイスを制御できるようになります。 また、ユーザーはボイスコントロールだけでなく、iOSAndroidなどのスマートフォンGoogle Home アプリからリモコン操作のように各デバイスを制御することもできます。

Smart Home Controls

Smart Home Control
これは余談ですが、Android11 では電源ボタン長押しでホームデバイスの操作ができるようになりました。
これでさらにホームデバイスの操作が簡単になったかと思います。

Smart home integration flow

Google Home からホームデバイスを管理できるようになるまでの Smart Home のフローを説明していきます。

Sync Device

f:id:omohayui:20201022000438p:plain
Sync Device
まずユーザーは Google Home アプリでホームデバイスを登録します。
このタイミングで、アシスタントはデベロッパーの Fulfillment に SYNC インテントを送信して、ホームデバイスの情報と Traits と言うデバイスが持っている機能のリストを取得します。
本来はこの前にデベロッパーのサービスを認証するためにデベロッパーが用意した Authorization URL, Token URL にアクセスし、アシスタントは OAuth Token を取得する必要などがありますが、この図からは省略しています。
今この図を見ると、SYNC インテントに対して Cloud Fulfillment が、デバイスタイプ LIGHTで、ON/OFFの traits が使えるよという情報を返しているのが分かると思います。

  • Device Type - ホームデバイスの種別
    • CAMERA, DISHWASHER, DRYER, LIGHT, OUTLET, PHONE, REFRIGERATOR, SPEAKER, SWITCH, THERMOSTAT, TV, VACUUM, WASHER など
  • Traits - デバイスが持っている機能のリスト
    • OnOff, StartStop, Brightness, ColorSpectrum, ColorTemperature, Dock, TemperatureSetting など

SYNCインテントに返す Device Type, Traits はデベロッパーが自由に指定できるものではなく、Google Assistant 側で予め定義されたものです。 自分で作ったホームデバイスを、どの DeviceType にして、どの Traits を受け取るようにするか決める前に、ドキュメントで定義されたものの一覧を確認することをおすすめします。

Execute Command

f:id:omohayui:20201022000856p:plain
Execute Command

ユーザーが Google Home に “OK Google 電気をつけて” と話しかけるとデベロッパーの Fulfillment は電気をONにする実行コマンドを含む EXECUTE インテントを受け取ります。
そして、Fulfillment はユーザーの自宅にあるホームデバイスに対して電気をONするというリクエストを行います。

Query Device Status

f:id:omohayui:20201022001019p:plain
Query Device Status

「リビングの電気は点いてる?」とユーザーが Google Home に質問したり、「音量を上げる」「明るさを上げる」のような相対的なコマンドを処理するときに、アシスタントは QUERY インテントデベロッパーの Fulfillment にリクエストします。
そして、Fulfillment はデバイスの状態をアシスタントに返してあげます。
この図だと、デバイスは今、ONになっているよというのをアシスタントに返しています。

Smart Home with Local Fulfillment

f:id:omohayui:20201022001143p:plain
Smart Home with Local Fulfillment

一連の流れで、ホームデバイスを操作するには、デベロッパーは Execute Command を受け取ってホームデバイスへそれを伝える Cloud Fulfillment を作成する必要がありました。 ですが、Local Home SDK を利用すると、Local Fulfillment を作成し Google Home 上でデベロッパーが書いた JavaScript を動かし、ホームデバイスを制御することができます。 また、Cloud Fulfillment は Local Fulfillment が機能しなかった際の fallback としても機能します。

Benefits of using Local Fulfillment

ホームデバイスを提供する企業としてのメリット🏭

  • Cloud Fulfillment を経由しないので、遅延が少ない、安定稼働できる
  • Local Fulfillment が動かない時は Cloud に fallback させることができる

オリジナルホームデバイスを作成する個人のメリット👩‍💻

  • ローカルネットワークからデバイスを操作できるので、マイコンボードで作ったデバイスと連携が簡単
  • バイスはローカルネットワークからしか叩かれないのでセキュリティリスクが下がる

How to use Local Home SDK

Implement Local Fulfillment app

Local Fulfillment に必要な Handler

  • IDENTIFY handler
  • EXECUTE handler
  • REACHABLE_DEVICES handler (only Hub)

※ REACHABLE_DEVICES Handler は、IDENTIFY Handler がアクセスするホームデバイスをプロキシとして利用したい場合にのみ必要になります。

IDENTIFY handler

f:id:omohayui:20201022001630p:plain
IDENTIFY handler

Google Homeバイスが再起動時に、ローカルネットワーク上で未確認のデバイスを検出すると、IDENTIFY handler をトリガーします。
このとき Google Home がスキャンする構成は、Actions console で設定した値に基づいてデバイスを探しに行きます。
IDENTIFY Handler は、ホームデバイスがスキャンに対して返すデータ(local device id)を取得し、これをアシスタントに送信します。
そして、IDENTIFY Handler からの verificationId が前述に登場した SYNC インテントが取得した other Device Ids のいずれかと一致する場合、アシスタントはホームデバイスの関連付けを確立します。

EXECUTE handler

f:id:omohayui:20201022001813p:plain
EXECUTE handler

アシスタントは、Cloud Fulfillment への EXECUTE Intent と同じ入力値を EXECUTE handler に渡します。 同様に、EXECUTE hander は、EXECUTE Intent の処理と同じ形式で出力データを返します。
また、Localfulfillment は、デバイスIPアドレスに直接アクセスできません。 代わりに、CommandRequestインターフェイスを使用して、UDPTCP、またはHTTPのいずれかのプロトコルに基づいてコマンドを実行します。

How to debug Local Fulfillment

Google Home 上で動いている Javascript をどうやってデバッグして開発するのか?というところを説明します。
Actions console 上の Testing URL に、自分で作成した Local Fulfillment を実行する HTMLページのURLを追加すると、 Google Home 上で実行される JavascriptデバッグChrome の DevTools 上で出来ます。

f:id:omohayui:20201022002155p:plain
Actions console

f:id:omohayui:20201022002312p:plain
Chrome DevTool

Demo

youtu.be

1.スマホGoogle Home アプリからデバイスを追加します。
今回は Otter Light というデバイスを Otter Smart Home というスマートホームアクションに作成しているので、最初に Otter Smart Home というサービスとアカウント連携をします。
アカウントをリンクさせたら、追加するデバイスを選んで、ホームを選んで、部屋を選んで、すると、Otter Light がアプリ上から操作できるようになります。

2.次に、Google Home 上で動作するJavaScriptデバッグします。
Chrome の DevTool の inspect を開いて、Nest Audio の inspect のリンクをクリックします。
すると Console Log に Nest Audio を再起動したタイミングだったり、一定間隔でリクエストしてきた IDENTIFY hander のログが確認できます。

3.アプリから実行してみます。 ラズパイ上で動いている UDP サーバが、Nest Audio から Execコマンドを受け取り、赤外線が送られて電気がついたり、消えたりしてます。
4.最後に Google Home から声で実行してみます。

使ってみた感想

  • Local Home SDK は手軽に Google Home や Home アプリと連携ができて便利
  • QUERY Intent を処理しようとすると Cloud Fulfillment 上でデバイスのステータスを管理しなくてはいけない
    • Cloud ↔ Home Deviceのやり取りは無くならない、元々 Fallback は必要な前提だと思われる
  • Local Fulfillment の修正を反映するのに時間がかかる
    • Google Home を再起動してから反映されるまで10, 20分待つこともある

おまけ

Twitter で「(デモで使っている赤外線が)結構遠くまで届いてそうだったので何を使っているのか気になる」という話が上がっていたので、赤外線学習リモコンモジュールという強力で便利なやつを紹介しました。

[Amazon] BitTradeOne ラズベリーパイ専用学習リモコン基板 [ 完成品 ] ADRSIR