JavaScript
ifttt
IoT
GoogleHome
スマートスピーカー

Google Homeで家族ごとのテレビ時間を可視化したよ

テレビを見たユーザを判定し、視聴時間をはかる

我が家では、基本的にはこども達にテレビを自由に見せていますが、やっぱり長時間テレビばかり見ているのは避けたいなぁと思い、家族のテレビの視聴時間を可視化してみることにしました。
家族それぞれの視聴時間を計測するには、「誰がテレビをつけたか」を判定しなければなりません。今回、だれがテレビを点けたかの判定にGoogle HomeのVoice Match機能を利用することでうまくいったので記事にかいてみました。
※注:2017年末につくったやつなので、古い内容があるかも知れません:bow:

システム構成

おおまかな全体構成を説明します。家にはIFTTT経由にて赤外線リモコンで家電を操作できるNature Remoと、Raspberry Piがあります。Raspberry PiはHDMIでテレビとつなげてあります。

スクリーンショット 2018-02-12 23.41.11.png

テレビ電源ONから視聴時間計測の流れは次の通りです。

  1. Google Homeに「テレビつけて」で、以下2つのIFTTTアプレットを起動
    • Nature Remoで家のテレビを電源ON
    • 視聴者を判定し、Firebase Realtime Databaseに視聴者の名前を書き込む
  2. Nature RemoはIFTTTに従って、テレビをONにする
  3. Raspberry Pi上のプログラムは、HDMI CECでテレビのON/OFF状態を常時監視
  4. Raspberry Pi上のプログラムは、テレビがONなら、Firebaseから視聴者名を取得し、その視聴者の視聴時間を更新

このシステムではGoogle Homeを使わずにテレビのリモコンで電源ONされるとシステムが機能しません。
そこで、Raspberry Piがテレビ電源ONを検知した際、Firebaseに視聴者名が登録されていなかった場合にはRaspberry Piからテレビの電源をOFFにすることで、必ずGoogle Home経由でテレビをつけることを強制しています。

それでは詳細を以下に説明します。

Voice Matchによる視聴者の判定

視聴者の判定には、題名のとおり、Google HomeのVoice Match機能を利用しました。Voice
Match機能とは、Google Homeに最大6人までユーザを登録でき、ユーザを声で識別してユーザ毎にカスタマイズされた情報(ショッピングリストやその日の予定など)を応答してくれる機能です。
このVoice Match機能で識別したユーザ名をIFTTTに渡すことができれば良いのですが、残念ながら識別したユーザ名をIFTTTに渡す機能はありません。そこで、Google Homeのショートカット機能を利用します。
ショートカット機能は、任意の言葉のショートカットを作る機能です。例えば、「目覚ましを止めて」のショートカットとして「おはよう」と登録しておけば、「おはよう」のあいさつで目覚ましをとめることができるようになります。
実はこのショートカット機能はVoice Matchのユーザ毎に登録することができるため、同じ言葉でもユーザ毎に異なる挙動を実現することができます

Voice Match

今回は上の絵のように、「テレビをつけて」というショートカットを、ユーザ毎に「テレビを太郎がつけます」や「テレビがママがつけます」という言葉に対応させました。
これにより、IFTTTからテレビをつけたユーザを判定することができるようになりました。

Voice Match・ショートカットの設定

アカウント追加

Voice Matchでユーザを判定するには、まず家族全員分のGoogleアカウントを取得します。
その後、スマートフォンのGoogle Homeアプリを開いて、アカウントを追加していきます。
追加方法は下の図をみればわかると思います。

スクリーンショット 2018-02-14 23.13.43.png

Voice Match、ショートカット設定

アカウントが追加できたら、各アカウント毎にユーザの声を認識させます。目的のアカウントを選択してから、設定画面にて「デバイス」を選択します(下図左)。次の画面で「アカウントをリンクしてください」を選択し、指示に従っていけばOKです。途中で「OK, Google」と何回か話しかけ、声を認識させるフェーズがあります。
ショートカットの登録は、設定画面の「その他の設定」、「ショートカット」から登録できます。「テレビをつけて」に対して、ユーザ名を反映させた「テレビをパパがつけます」に変換していますね(下図右)。

スクリーンショット 2018-02-15 0.37.57.png

IFTTTからFirebase Realtime DBの更新

Firebase Realtime DBは、REST APIで値を更新することができるので、セキュリティさえ気にしなければIFTTTから直接に値を更新することができます。
設定の仕方はQiita記事「新着メールを知らせてくれるGoogle Home」と全く同じなので割愛します。

Raspberry Piからテレビの状態検知

Raspberry Piからテレビの状態検知にはHDMIのCEC(Consumer Electronics Control)という機能を利用しました。このCECを使ったHDMI経由でのテレビ制御のやり方はQiita記事「Raspberry PiとテレビをHDMI接続してテレビのON/OFFを確認する」が詳しいです。

テレビ視聴状況の可視化&通知

テレビの視聴状況は、Google-Home-Notifierを使って、テレビの電源ON時にGoogle Homeに喋らせています。「パパの今週のテレビ視聴時間は現在○○時間だよ」という感じです。
グラフでの可視化もしたかったので、react-liquid-gaugeを使って下図のように可視化してみました。一週間7時間を上限としてパーセンテージで表示してます。

スクリーンショット 2018-05-02 12.04.46.png

以上、Voice Matchとショートカットを使うとユーザを識別して動作することができるので、他にも面白いことができそうですね。ぜひ色々やっていきたいです。