鍵閉めたっけ？妖怪を退治する方法を考える

この記事は[おうちハック Advent Calendar 2015](http://qiita.com/advent-calendar/2015/ouch-hack)の21日目の記事です。

昨日は[interestor](http://qiita.com/interestor)さんの、[ビールクズ製造機で幸せにおうち飲みをする](http://interestor2012.hatenablog.com/entry/2015/12/21/004910)でした。
おうちハックに家飲み最強ですね。

#はじめに
皆さん、こんな経験はありませんか・・・。

残業続きの毎日、疲れ切った体を奮い立たせ、会社へ向かうために冷たく重い扉をあけて一歩を踏み出す。
時間はギリギリ、急ぎ足で駅に向かう。

しかし、しばらくしてふと頭をよぎる一抹の不安。
**「あれ？家の鍵閉めたっけ・・・」**
時間がない、でも不安だ。戻るか、ギリギリ間に合うはずだ。いや、だが確かに閉めたはずだ。。。

**そうこれは妖怪の仕業なんです。。。**

そんなアニメが流行ってますね。まぁ、そんな妖怪がいるか、○怪ウォッチは見てないので知らないですが、実際、私も一人暮らしをしてる時はよくありました。

この話は、[MBSハッカソン](http://www.mbs.jp/hackathon/)に参加した際に、お世話になったうちのチームの担当さんとのハッカソン中の会話でも出てきました。じゃぁ、これを防止する仕組みをつくってみようと思った次第です。

#さぁみんなでやってみよう
ということで、やってみます。
コンセプトは「できるだけ簡単に作れる」ことにしました。
MBSの担当さんにも作ってもらいたいからです。
###採用したデバイス
---
ということで選定したのが、Aplixさんの[MyBeacon Fun MB005](https://www.aplix.co.jp/product/mybeacon/mb005ac/)です。
いわゆる「ビーコン」といわれるものです。

このデバイスがいいところは、
1. 安い(1個1000円くらい)
2. ボタン電池(3v)でも動く
3. [簡単な制御でON/OFFを制御できる](https://www.aplix.co.jp/product/mybeacon/mb005ac/makers-zone/)
という点です。
今回注目したのは、この3.の項目の機能の１つで、WAKEというピンに電圧かけてあげれば、30秒間の間だけBeacon送信してくれるモードを利用します。

###ターゲットとする鍵の形状
----
鍵の形状は多種多様かと思います。うちのはこんな感じ。
![keytype.jpg](https://qiita-image-store.s3.amazonaws.com/0/51272/9303e271-0c2b-9171-8a14-8fe5c6508eb8.jpeg)

多分、最近はこのタイプが多いのじゃないでしょうか。
スマートロックの[Akerun](https://akerun.com/)の説明画像でもこのタイプなので、これをターゲットにしても特殊なケースじゃないと思ってます。
このタイプは、鍵が空くと「つまみ」が縦（｜）に、閉めるとつまみが横（－）になります。
そのに注目して選んだセンサーが、傾斜スイッチの[AT-407](http://akizukidenshi.com/catalog/g/gP-02349/)です。
![AT407.jpg](https://qiita-image-store.s3.amazonaws.com/0/51272/3da7ef5e-fc85-e84c-7ddc-fbfc02baaf2b.jpeg)

空き状態(1)が、閉めた状態(2)になればスイッチがONになります。
![スイッチ.jpg](https://qiita-image-store.s3.amazonaws.com/0/51272/3d8adcfc-e6d9-9ba0-87ab-0c346489ea7a.jpeg)

なので、このAT-407の片側と電池の＋に、もう片側をWAKEにつなげあげるだけです。
とっても簡単！
ちなみに、傾斜スイッチは30°の傾斜角が必要なので三角形のスペーサをつけます。

###システムの全体概要
---
このMB005から送信されたBeacon信号を、Raspberry piにつけたBluetoothドングルで受信します。システムの全体は以下のようになります。
**（注意）すいません、時間がなくてクラウド側はまだできてないのでここはまだ構想レベルですm(_ _)m**
![system.jpg](https://qiita-image-store.s3.amazonaws.com/0/51272/723ad060-8329-42ae-d15c-65a5d5c19d16.jpeg)

Raspberry piのBluetoothの受信には、node.jsと[noble](https://github.com/sandeepmistry/noble)というライブラリを使用します。

次に、これをスマートフォン側に通知する仕組みですが、ニフティさんの[mobile backend](http://mb.cloud.nifty.com/)の[プッシュ通知](http://mb.cloud.nifty.com/doc/current/dashboard/push.html)を使います。
そのためにRaspberry piには[mobile backendのJavaScript SDK](http://mb.cloud.nifty.com/doc/current/introduction/quickstart_javascript.html)をインストールして使用します。
[Raspberry pi 2にnode.jsとmobile backendのJavaScript SDKを入れる記事](http://qiita.com/lutecia16v/items/63cc34e97d12c66c2080)は以前に書いたので、そちらを参照ください。

スマホのアプリケーションはmobile backendとの連携がしやすい[Monaca](https://ja.monaca.io/)を使って作ってみようと思います。
###デバイス側の制作
---
デバイスの接続はこんな感じです。
![device.jpg](https://qiita-image-store.s3.amazonaws.com/0/51272/0d2d1bf7-1c91-7282-f5e1-4f97bc2ad8d5.jpeg)

実際に作ってみたのはこんな感じです。
![device_real.jpg](https://qiita-image-store.s3.amazonaws.com/0/51272/6165d539-d869-6304-96e9-81daaf66e7cb.jpeg)

ケースはダイソーで見つけた100円キッチンタイマーを流用しました。(100均大好きです)
![case.jpg](https://qiita-image-store.s3.amazonaws.com/0/51272/003a9453-adbd-c6bb-b3c3-6493b1e4fbf2.jpeg)

タイマーの基盤を外してボタン電池を格納します。
![battery.jpg](https://qiita-image-store.s3.amazonaws.com/0/51272/9e23bdee-f4a9-025b-e1a4-a5c27ba345cf.jpeg)

電池とMB005を[ハサミで切れる!薄型ユニバーサル基板](http://www.marutsu.co.jp/pc/i/159860/![base.jpg](https://qiita-image-store.s3.amazonaws.com/0/51272/86635324-4634-1d58-c3cc-195a06c0aff5.jpeg)
)でつなげて
![base.jpg](https://qiita-image-store.s3.amazonaws.com/0/51272/f6503901-a9ec-fc92-8040-c2ea0bf1537a.jpeg)

ケースにつっこんでテープで固定しました。
![comp.jpg](https://qiita-image-store.s3.amazonaws.com/0/51272/e6b00591-1431-349d-e7e9-36248225da33.jpeg)

で、裏向けると、なんと電池ボックスからピンがきっちりでてます。
![pins.jpg](https://qiita-image-store.s3.amazonaws.com/0/51272/b888aeac-4b24-42a8-613f-a823a793fa8d.jpeg)

左上にある丸く白っぽいのは磁石なので、このまま金属の扉につけることが可能です。
※少し磁力が弱めなので、テープ磁石を追加して固定するのがよいかも

ケーブルは以下のようなQIピンのヘッダのついてないケーブルを使うと
![QI.jpg](https://qiita-image-store.s3.amazonaws.com/0/51272/9a9fdf73-391e-9852-1350-2f6ad1a03713.jpeg)

こんな感じで先を折り曲げれば簡単につなげます。
![QI2.jpg](https://qiita-image-store.s3.amazonaws.com/0/51272/ebf4ed05-71d9-af44-03d0-7c7a88f6e63a.jpeg)

###Raspberry piでのビーコンの受信
---
(2015/12/23更新)
まずは、Bluetoothを使えるようにBluezをインストールします。
 > $ sudo apt-get install bluez

その後、Bluetooth 4.0対応のドングル をRaspberry piに差します。

 > $ hciconfig

と入力して、hci0というインタフェースが表示されれば、ドングルは認識されています。
注意点として、表示される情報の３行目あたりが"DOWN"となっていれば認識はされているがインタフェースが有効になっていないので、

 > $ sudo hciconfig hci0 up

と入力して有効にします。その後、先ほどの３行目あたりが"UP RUNNING"となっていればＯＫです。

次に、nobleをインストールします。

 > $ npm install noble

いろいろとエラーが表示されますが、最終的にはインストールはできるようです。
念のために、[nobleのGitHub](https://github.com/sandeepmistry/noble)にあるサンプルのadvertisement-discovery.jsを使って確認します。
そのままコピペすると動かないので、１行目を以下のようになおします。

```lang:advertisement-discovery.js
var noble = require('noble');
```

 > $ sudo node advertisement-discovery.js

で実行(sudoをつけることに注意)し、傾斜スイッチを傾けてONにすると

>peripheral discovered (XXXXXXXXXXXX with address \<XX:XX:XX:XX:XX:XX, public>, connectable false, RSSI -55:
　　hello my local name is:
　　　　undefined
　　can I interest you in any of the following advertised services:
　　　　[]
　　here is my manufacturer data:
　　　　"4c000...(略)...cc"

と表示されればうまく受信しています。XXXXXXXXXXXXはビーコンのアドレスで、対象のビーコンを判定するために後ほど使うので記録しておいてください。
他のBLE機器があれば複数表示されるので、スイッチのONのタイミングで表示されるものを記録しておいてください。
###mobile backendでのプッシュ通知
---

(後日更新予定)

#最後に
これで、鍵閉めたっけ？妖怪は退治できると思います。（ホントか！？）

なるべくお手軽にできるように考えてみたのですがいかがでしょうか。
傾斜スイッチの部分を別のものに変えることで適用範囲は広がると思いますので、いろいろやってみたいと思います。

今年も時間切れで、一部未実装な部分が残ってしまいました。来年こそは。。。

では、メリークリスマス！（まであと３日）