おうちハック Vol.2 玄関の外灯を防犯ライトにしてみる


Gravioを使ったおうちハック第２弾！
我が家はすでに築20年近いので人が近づいたときにパッとつくライトなんてのはそもそもない。防犯ライトを買ってつけてもいいけど、そこはやはりIoTでもっとインテリジェントにやってみよう。

# 使ったもの

- Gravio Hub w/HubKit 3.7
- Gravio Studio
- 人感センサー
- IKEA TRADFRI ライト

今回使ったのは人感センサーとIKEAで売ってるTRADFRI（トロードフリ）というスマートライト。スマートライトというとPhilipsのHueが有名ですが、こちらをGravioで利用するにはHue Bridgeというゲートウェイが必要なんですね。IDをとったりするのもちょっと面倒なんです。
![IMG_20200311_180202.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/b5e54851-6af8-486b-d119-169ad255c22f.jpeg)

IKEAのTRADFRIというスマートライトは実はHue互換。で、お値段お得。たぶん半額くらい？IKEAもHue Bridgeと同じようなスマートホーム用のコントローラーも売ってて、Google HomeやAmazon Echoなどと連携してライトをコントロールできたりもするんですけど、いかんせんいまいち。なのでGravioの出番ですよ。

実は以前はTradfri用のコンポーネントもあったのですが、V3になって仕様変更で使えなくなったのですが、代わりにGeneralLightコンポーネントというエクスペリメンタルコンポーネント（β版のようなもの）を使えば制御できるんです。というわけで今回はIKEA TRADFRIを利用することにしました。

# IKEA TRADFRIライトと人感センサーをペアリング

## 人感センサーのペアリング
![IMG_20200311_180235.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/a50cccf0-ee04-f6bc-e236-4b6d0cef56ed.jpeg)

いつものようにこのあたりを参考に人感センサーをペアリングします。
https://doc.gravio.com/manuals/gravio-setup-guide/1/ja/topic/zigbee
https://www.gravio.com/jp/sensor-setup-guide#Motion

## TRADFRIのペアリング

TRADFRIの方は、電源を6回オン・オフを繰り返すとペアリングモードになります。同じようにペアリングしてください。

TRADFRIの場合、ペアリングするとこのようにモデル名が表示されずにアドレスが表示されます。
![editsensorname0.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/5bfe1996-1bb2-7933-73e7-e164295591d2.png)
これだと分かりづらいので、「編集」ボタンをクリックして表示名を変更しておきましょう。スマートライトの場合、この表示名を使って個々のライトを制御できるようになります。複数使う場合はわかりやすい名前にしておきましょう。
![editsensorname.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/7224fee8-33c6-4148-3449-da473a993194.png)



# アクションを作る

今回は３つのアクションを使います。

* 外灯の点灯
* 外灯の消灯
* 人がいるかのチェック

![actionlist.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/3b5e27e0-679b-22ce-9fcb-3f0341cdeb83.png)

１つ目と２つ目は分かりやすいですね。TRADFRIライトを点けたり消したりです。３つ目は？

実は今回使うGravioの人感センサーは、人がエリアに入ってくるとデータを送信します。つまり人がいないときには何もしないので、人がいなくなったことが分からないんですね。

そこで、ちょっとテクニックを使って人がいないことを検出し、ライトを消さなければなりません。

世の中には人がいなくなったことを教えてくれる（データを送信してくれる）センサーもあるんですが、高額ですし、おうちハックには向いてないんですね。なので、今回も、ゆるく、早くのおうちハックでいきます。

# TRADFRIライトを点けるアクション

TRADFRIを点けるアクションは簡単です。

まず、前準備としてベータコンポーネントを使えるようにします。

Hubリストの画面で、ユーザーアイコンをクリックするとメニューが出てきますので、そこで「設定」を選びます。するとダイアログが出てきますので、項目にチェックしてください。これだけです。
![experimental.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/0268ec6c-8e53-18bd-3dca-7074dad76afb.png)

ちなみに、ベータコンポーネントはβ版なので将来仕様が変わったりなくなったりすることも考えられますので注意しましょう。

次に、アクションですが、GeneralLightというコンポーネントを使います。上の設定でチェックしておくと下のようにGeneralLightが選べるようになっていると思います。
![generallight.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/0b01d073-4f6d-014b-887f-5b62550c1942.png)

GeneralLightを追加すると、設定は簡単です。`Is On` をチェックすればライトが点きます。チェックを外せばライトが消えます。これだけ。
![lighton.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/bb2be172-3576-ecdb-b86e-2e2de2189ed9.png)

あと、このあとライトを増やす予定なので、制御するライトを絞っておきます。先程ペアリングしたときにつけた表示名を `Light選択式`に指定します。厳密にはここは正規表現で指定することになりますが、ひとつなのでそのまま書けば問題ないでしょう。

以上で完了です。テスト実行してライトが点くことを確認しておきましょう。

# TRADFRIライトを消すアクション

TRADFRIを消すアクションもほぼ同じです。
![lightoff.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/446872d7-1d57-52c2-e7e4-c726d5099d13.png)

先程書いたように、`Is On`のチェックを外してください。`Light選択式`も指定しておきましょう。できたら、テスト実行して消えることを確認してください。

# 人がいるかチェックするアクション

これが今回の一番の工夫ポイントです。

先程も書いたように人感センサーは人の動きを検知したときだけデータを送信します。つまり、人がいなければデータを受信しません。そこで、次のように考えます。

* 一定時間内に人感センサーから受信したデータを取得する
* 取得したデータが０件＝一定時間内に人感センサーが人を検出しなかった
* だったら、０件のときにライトを消せばいいじゃない

プログラム書けば簡単そうですねー。じゃー、ノーコードでどうやりましょう？Gravioなら簡単にできるんですね。そう、Gravioならｗ

まず、SensorDataDBというセンサーデータを取得するコンポーネントを使います。

設定は下のような感じです。対象となるエリア、レイヤーを指定して取得するデータを決めます。ここでは人感センサーですね。
![checkaction1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/6c52e6bc-9be8-3443-2fe5-5d52b91901e5.png)

次に直近どのくらいの期間のデータを取得するかを指定します。ここは設定が難しいところです。ここで指定した時間内のデータを取得する、つまり、指定した時間内にデータがなければ消灯するので、人がいないと判断するための時間を指定することになります。通常、Gravioの人感センサーは、動きがあれば比較的反応しますがじっとしてると何も反応しないことがあります。経験ではだいたい２分～３分程度が丁度いいくらいでしょうか。まぁ、しばらく消えなくても困りはしないですし、防犯目的と考えると１０分程度にしておいてもいいかもしれませんね。

最後に、これが肝にもなりますが、`Enable Time Rounding`のチェックを外しておきます。これは今回深くは言及しませんが、チェックしておくといい感じに取得範囲を調整してくれます。チェックを外すと実行タイミングからの直近○分間のような形で取得してくれます。なので、今回はチェックを外します。

これで直近○分間のデータを取得する設定ができました。あとは、データがないときに消灯アクションを実行するための設定です。これは、**例外処理**を指定します。例外処理とは、簡単に言うとエラー処理ですね。SensorDataDBコンポーネントは、取得したデータが０件だと例外を発生させます。つまりエラーとなるわけですが、このときに別のアクションを実行できるようにするのです。**プロパティ**の下の**例外処理**をクリックすると、右に`Invalid Property`と`No records`というのが表示されてます。この`No records`の方のドロップダウンリストで、`Go to action`、その右に表示されるドロップダウンで消灯用のアクションを選択します。
![checkaction2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/b4718dc9-ad66-6ed1-1e54-3ae4033059c7.png)

あと、今回は取得したデータは必要ないですが、ステップ出力が必要になりますので、適当に追加しておくか、面倒なら**ステップ変数**のよこのコピーアイコンでマッピングをコピーしておいてくださいね。でないとエラーになりますよ。

さて、これで試しに実行してみてください。この記事を読みながら設定してたらきっと人感センサーの反応はなくなってるでしょうから、うまく動けばTRADFRIライトが消えるはずです。

# 人が来たら点灯するためのトリガー

さて、あと少しです。人感センサーと点灯アクションを紐付けます。

トリガー一覧の画面に移動して、トリガーを下のように作成してください。特に難しいところはないですね。
![lighttrigger.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/e436b758-fee6-eb82-d584-6b1d48f2f3f2.png)



# タイマーで人が来てるかチェックする

人が来てるかのアクションはどう実行しましょう？Gravioにはタイマー機能があるので、これを使って定期的にチェックすることができます。

タイマー一覧の画面に移動して下のようなスケジュールを作成してください。ここでは毎分このアクションを実行するようになってます。

![lightofftimer.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/813b16d2-df90-6c13-8b2d-8462a6c5681d.png)


# 完成！

これでGravio流防犯ライトができあがりです。
![IMG_20200312_110122.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/c31d225b-3c2e-535f-999a-45f80d2daf84.jpeg)
ポイントは次の２つです。ぜひトライしてみてください。

* IKEA TRADFRIライトはベータコンポーネントのGeneralLightで利用できるよ
* Gravioの人感センサーで人がいないときに何かしたいときは、タイマー＋SensorDataDB＋No records例外処理でなんとかなるよ

あと、もうひとつ、人感センサーは意外とセンシング範囲が広いので、角度を狭めたいときはビニールテープなどで目隠しするといい感じになりますよ。