きっかけ
大学のオープンキャンパスで発表した話なのですが、記事にしていない事に気づいたのでここで公開。
私は今の大学には3年次編入したのですが、その際に高校の頃の友人に半ば強引に部活に加入させられました。そしてある相談を持ちかけられました。友人の主張は次のようでした。
- A棟に到着したら3階まで登る
- 鍵が開いていない!
- 1階まで下る
- B棟まで行って鍵を借りる
- またA棟に行って3階まで登る
- 解錠
この手間を楽にできる方法はないか、ということです。
Akerunなどのスマートロックを導入してしまえば鍵の管理などもできて最も手っ取り早いですが、インテグラル錠タイプのドアノブ(いわゆる回して開けるドアノブ)なので、この方法は使えません。
よくよく考えてみると、これらの手順における問題点を解決したいのであれば「誰かが入室した際に通知する」といった具合で十分解決できそうです。
最初は赤外線センサーを使用した方法などを思いつきましたが、Raspberry Pi Zero WをLINE Beacon化して、Beaconで入退室管理をすることにしました。この方法であれば誰がいるのかも識別することが可能だからです。あと導入コスト安いし。
とりあえず構成はこんな感じ。(オープンキャンパスの際に使ったスライドそのままです)Raspberry Piにはアドバタイズを飛ばしてもらって、LINEでの挙動はHerokuに上げたPHPアプリケーションで管理します。今思えばこれはIoTではなくて”T”ではないのか?と思いましたがまあいいや。
コードを書く
Raspberry Pi上での設定は「さっそく、LINE Simple BeaconをRaspberryPi3で試してみました #iotlt #botawards – Qiita」の内容を丸パk…お借りすることでクリア。
PHPアプリケーション側ですがLINEはPHP用のSDKを用意していることもあり、
$composer require linecorp/line-bot-sdk
と叩けばすぐに使えるのでとても便利ですね。LINE側から送られてくるJSONを見ながら適当にコードを書いてherokuにデプロイします。
こんな感じで個人チャットの時にメッセージが来たらOKですね。
あとは、このbotをグループチャットに入れてあげれば…
OKじゃない!応答してくれない!何も反応しないわけです。
{ "events": [ { "message": { "id": **********8357", "text": "おもしろいなあ", "type": "text" }, "replyToken": "**************************537a", "source": { "groupId": "***************************fd9c", "type": "group", "userId": "***************************1738" }, "timestamp": 1504782028450, "type": "message" } ] }
JSONを見ればわかりますが、グループチャットの場合はgroupIdというキーが指定されています。このキーを使ってグループチャットに発言したら良いわけです。
後はbotを部員全員に友だち登録してもらい、LINE Beaconを有効にしてもらいます。これを行わないと検知できませんからね。
これにより、部員が入るとbotが通知するため、「誰かが入ったってことは開いているんだな?」となるのでわかりやすくなったかと思います。ですがBluetoothの電波が飛びすぎるといった問題もまだ抱えているのでそこらへん解決して精度を上げたいですね。