おうちハック Vol.5 帰宅時にアルコール消毒してなかったら教えてくれる

# はじめに
Gravio 4になっていろいろできるようになったので、おうちハックもバージョンアップ。
今回は、**おうちに帰ってきてアルコール消毒を促す**のをやってみたいと思います。

Gravio 3でやった以前のおうちハックの内容はこちら。
※ちなみに、Gravio 4ではイケアの電球を制御できなくなったので2～4はできなくなりました。でもGravio 3でいまも現役稼働中。すごく重宝してます。

* [おうちハック Vol.1 郵便が届いたのをLINEに通知してみた](https://qiita.com/zrock/items/fc397dcc34edb4bcff4a)
* [おうちハック Vol.2 玄関の外灯を防犯ライトにしてみる](https://qiita.com/zrock/items/d86c0795e0880473ea76)
* [おうちハック Vol.3 玄関の防犯ライトを夜だけ動作するようにしてみた](https://qiita.com/zrock/items/1458236efd15f406a992)
* [おうちハック Vol.4 廊下のライトを人感センサーでコントロールしてみた](https://qiita.com/zrock/items/eb051f6dc33f8ebe5563)

# 要件
* 家に帰ってきて、アルコール消毒をしてなかったら消毒を促す
* 警告はわかりやすいように、ライトと音声を使う

# 使用環境

* Raspberry Pi 4 Model B w/4GB RAM
* Ubuntu Server 20.04.1 LTS
* Gravio HubKit v4.1.0-6380
* Gravio Studio v4.1.5432.0
* Gravioライト
* Gravio人感センサー
* Gravioドア・窓開閉センサー
* [Google Nest mini](https://store.google.com/jp/product/google_nest_mini)

※GravioライトとGravioドア・窓開閉センサーはBasicプラン(月額500円)を契約するとレンタルすることができます。

# 概要
* ドアセンサーをアルコール消毒液のポンプに付けて、ポンプを押したときにわかるようにする
* 人感センサーを玄関に設置して、人が帰ってきたらわかるようにする
* 人感センサーが反応したときに、1分以内にアルコール消毒液のドアセンサーがCloseになってなければ警告する
* 警告はCATTを使ってGoogle Home miniに音声に流す
* 音声警告と同時にGravioライトを赤く点灯、10秒経ったら消す

# 手順

## センサーのペアリングと登録
人感センサーとドアセンサー、Gravioライトをペアリングします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/183ed6f3-f924-9c35-d9ad-1fd0b5db7e89.png)

エリア「玄関」を作成し、その中にレイヤー「人感」、「消毒」を作成します。
「人感」のデバイスタイプは「Aqara-Occupancy」、「消毒」は「Aqara-Door」を選んでおきます。
それぞれのレイヤーに先程ペアリングした人感センサーとドアセンサーをバインドして有効にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/c87c8cee-76a5-fea9-8ec0-f57ba0358301.png)

うまくいくとこのようにデータが届くようになると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/78f208dc-ff50-0abc-30a3-1287fca328dc.png)

## アクションの作成
アクション「Alert-Sanitizing」を作成します。
アクションの内容は次のように指定します。
まず、**SensorDataDBIfZero**コンポーネントを配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/156931f1-503c-86ad-fe8d-efd6b0bee6be.png)

| プロパティ | 値 |
|:-----------|:------------|
|エリアID|玄関|
|レイヤーID|消毒|
|From Previous|1|
|タイムスケール|分|

これは、「1分以内に消毒レイヤーのデータが0件の場合」に後続の処理を続けるという設定です。
「1分以内に消毒レイヤーのデータが0件の場合」とは、つまり「1分以内に消毒液のポンプを触っていない」ということとほぼ同じと考えてこうしてあります。

次に**Gravio Light**コンポーネントを配置してライトを赤く点灯します。ちょっと明るさを抑えめにするために輝度を`50`にしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/eea72732-4e7e-770c-9805-cda3ce4370c8.png)

| プロパティ | 値 |
|:-----------|:------------|
|オン|チェックする|
|カラー|赤|
|輝度|50|

次に**Exec**コンポーネントを配置して、Google Nest miniに音声を再生します。音声ファイルは「[Gravio 4で呼び鈴を再バージョンアップしてGoogle Castで家中にアナウンス](https://qiita.com/zrock/items/f001f861c96584298826)」を参考にして作成、アップロードしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/e7f645a4-8e50-53ca-c5fb-78b153e5c81c.png)


| プロパティ | 値 |
|:-----------|:------------|
|コマンド|env LC_ALL=C.UTF-8 LANG=C.UTF-8 catt -d 玄関 cast sanitize.mp3|

コマンドの`玄関`は実際のGoogle Home miniの名前、`sanitize.mp3`は実際のファイル名に合わせてください。

次に**Sleep**コンポーネントを配置します。これはライトを10秒後に消すために配置します。もう少し長めに点灯させる場合は「待ち時間」の値を調整してください。単位はミリ秒です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/d6336c7b-efdf-5b57-7056-2e1c9174cd94.png)

| プロパティ | 値 |
|:-----------|:------------|
|待ち時間|10000|

最後にもう一度**Gravio Light**コンポーネントを配置して、Gravioライトを消灯します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/9bf7b93c-4e99-d889-e956-74e06cf4635a.png)


| プロパティ | 値 |
|:-----------|:------------|
|オン|チェックを外す|

試しに実行してみると、1分以内に開閉センサーが反応していなければ、音声が再生されてライトが10秒間赤く点灯すると思います。開閉センサーを反応させてデータを受信した1分以内に実行すれば、何も起きません。

## トリガーの設定

さて、アクションができたら、人感センサーから実行するためのトリガーを設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/26c806b9-b15d-dc09-7b21-eee11c769f41.png)

適当な名前をつけ、エリアに「玄関」、キーレイヤーに「人感」を指定します。「Motion Detected」には任意の値を指定します。実際には反応したとときに `1`という値を受信するだけなのでこうしておけば十分です。
アクションには先ほど作成した「Alert-Sanitizing」を指定します。
あと、「時間」タブの「間隔」を少し長めに設定しておきます。これは、人感センサーが反応しすぎて警告が何度も発せられるのを防ぐためです。一度実行したタイミングからこの時間内は、アクションが再び実行されることはありません。ここでは`30000`を指定して、30秒間は何もしないようにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/cce2876d-b39e-1117-63c0-c2c684a0c630.png)

保存して有効にしておきます。

さて、ここまでで準備完了です。実際にトリガーがうまく動くか試してみてください。

## 設置
最後に開閉センサーをポンプに設置します。今回はセンサーが見えやすいようにグルーガンを使って開閉センサーをくっつけてみました。実際にはもうちょっとしっかりくっつくようにビニールテープなどを使ってもいいかもしれません。ただ、ボトルを入れ替えるかもしれないことを考えると取り外しできるようにはしておいたほうがいいですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/a2e0be07-f7b5-2ba7-472b-b07de5508432.png)

## 結果

玄関を入ってアルコール消毒をすると何も起きず、アルコール消毒をしないで上がろうとすると無事ライトが赤く点灯して叱られるようになりました（笑）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/cbb36dc7-e895-59a9-8f03-ecc6a56bd88d.png)

# ポイント
* ポンプを使ったかどうかはドアセンサーをポンプのヘッドに付けて、開閉したかどうかで判断する
* 気づかせるにはライトや音声がやっぱり効果的
* 人感センサーのタイミングとドアセンサーのタイミングのタイムラグをうまく調整して最適化する

# 今後の課題
* 玄関を入ってきたときはいいが、人感センサーなので出ていくときも反応してしまう → これは人感センサーだといかんともしがたいですね。。
* ポンプのヘッドがねじれたら反応しなくなる → 動かないようにするか、他のセンサーに変えたほうがいい？
* ポンプをちょっと押しただけのときには反応しない → 他のセンサーに変えたほうがいい？磁力の強い磁石にすることも考える
* Google Nest miniがスリープモードになってしまうと若干のタイムラグがある → そもそもどのタイミングで人感センサーが反応したかはわからないのでそれほど気にならない


# 参考
* [Gravio][]
* [Google Nest mini](https://store.google.com/jp/product/google_nest_mini)
* [Gravio 4で呼び鈴を再バージョンアップしてGoogle Castで家中にアナウンス](https://qiita.com/zrock/items/f001f861c96584298826) - 音声ファイルの作成登録の参考に
* [Gravio Lightコンポーネント](https://doc.gravio.com/manuals/gravio4/1/ja/topic/gravio-light)
* [Sensor Data DB If Zeroコンポーネント](https://doc.gravio.com/manuals/gravio4/1/ja/topic/sensordatadbifzero)
* [Sleepコンポーネント](https://doc.gravio.com/manuals/gravio4/1/ja/topic/sleep-action-component)
* [Execコンポーネント](https://doc.gravio.com/manuals/gravio4/1/ja/topic/runscript-action-component)

# Inspired
* [帰宅後すぐにアルコール消毒しないとアラートが鳴るしくみ！―新型コロナウィルス感染予防対策Part２―＜テレワーク主婦のおうちIoTレポート４＞](https://www.gravio.com/jp-blog-article/2020-07-16-get-home-hand-wash-alarm)
* [IoTエッジウェア“Gravio（グラヴィオ）”が日本テレビ「沸騰ワード10」に取り上げられました！](https://www.gravio.com/jp-blog-article/2020-06-05-featured-futto-ntv)
* [AIカメラで人を高精度に検知、消毒などを促すことで感染症対策にも活用できるGravioとは？](https://www.gravio.com/jp-blog-article/2020-06-05-what-gravio-forwarded-from-inlive)
* [＜Gravioユースケース＞扉開閉センサーとIoT対応電光表示板を使って、新型感染症への対策をあれこれ考えてみた（パート２）](https://www.gravio.com/jp-blog-article/2020-04-28-iot-hand-sanitizer-gate)

[Gravio]:https://www.gravio.com/jp
[Gravio-CO2]:https://www.gravio.com/jp/sensor-setup-guide#Gravio-CO2
[Gravio-HTTPRequest]:https://doc.gravio.com/manuals/gravio4/1/ja/topic/http-post-action-component
[Gravio-Variables]:https://doc.gravio.com/manuals/gravio4/1/ja/topic/available-variables-in-action
[Gravio-Mappings]:https://doc.gravio.com/manuals/gravio4/1/ja/topic/premappings-postmappings