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

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

# システム構成
おおまかな全体構成を説明します。家にはIFTTT経由にて赤外線リモコンで家電を操作できる[Nature Remo](https://nature-jp.myshopify.com)と、Raspberry Piがあります。Raspberry PiはHDMIでテレビとつなげてあります。

<img width="916" alt="スクリーンショット 2018-02-12 23.41.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/160451/ad5973f7-3c39-65d2-4232-250ab96471c1.png">

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

1. Google Homeに「テレビつけて」で、以下２つの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](https://support.google.com/googlehome/answer/7323910?hl=ja)機能を利用しました。Voice
 Match機能とは、Google Homeに最大６人までユーザを登録でき、ユーザを声で識別してユーザ毎にカスタマイズされた情報(ショッピングリストやその日の予定など）を応答してくれる機能です。
このVoice Match機能で識別したユーザ名をIFTTTに渡すことができれば良いのですが、残念ながら識別したユーザ名をIFTTTに渡す機能はありません。そこで、Google Homeのショートカット機能を利用します。
ショートカット機能は、任意の言葉のショートカットを作る機能です。例えば、「目覚ましを止めて」のショートカットとして「おはよう」と登録しておけば、「おはよう」のあいさつで目覚ましをとめることができるようになります。
実は**このショートカット機能はVoice Matchのユーザ毎に登録することができるため、同じ言葉でもユーザ毎に異なる挙動を実現することができます**。

<img width="924" alt="Voice Match" src="https://qiita-image-store.s3.amazonaws.com/0/160451/5e2c662a-c61c-9f16-5ca0-3d1c13501af0.png">

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

## Voice Match・ショートカットの設定
### アカウント追加

Voice Matchでユーザを判定するには、まず家族全員分の[Googleアカウントを取得](https://accounts.google.com/SignUp?hl=ja)します。
その後、スマートフォンの[Google Homeアプリ](https://itunes.apple.com/jp/app/google-home/id680819774?mt=8)を開いて、アカウントを追加していきます。
追加方法は下の図をみればわかると思います。

<img width="450" alt="スクリーンショット 2018-02-14 23.13.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/160451/42a9fe5c-a2cb-3bf5-0994-22d2bacea8f2.png">

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

<img width="408" alt="スクリーンショット 2018-02-15 0.37.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/160451/8ad39564-c1ed-0856-c89f-7011faa22e24.png">


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

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

# テレビ視聴状況の可視化＆通知
テレビの視聴状況は、Google-Home-Notifierを使って、テレビの電源ON時にGoogle Homeに喋らせています。「パパの今週のテレビ視聴時間は現在○○時間だよ」という感じです。
グラフでの可視化もしたかったので、[react-liquid-gauge](https://github.com/trendmicro-frontend/react-liquid-gauge)を使って下図のように可視化してみました。一週間７時間を上限としてパーセンテージで表示してます。

<img width="988" alt="スクリーンショット 2018-05-02 12.04.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/160451/c012d75c-0d59-c65a-a9ea-a73fa5258f88.png">

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