Fooping が 2021年04月29日01時39分18秒 に編集
初版
タイトルの変更
Obnizで作る築40年フルリノベ物件のスマート鍵監視システム
タグの変更
IoT
スマートホーム
LINE
Node
obniz
メイン画像の変更
本文の変更
# Obnizで作る築40年フルリノベ物件のスマート鍵監視システム 外出時、家を出てからしばらくして「あれ?鍵閉めたっけ?」と不安になり、 家まで戻って確認することってありませんか? そんなときに家の外からでも鍵が掛かっているか確認できればよりスマートな生活をおくれる・・・!!QrioやAkerunなどのスマート鍵を導入できれば万事解決!! といきたいところですが我が家は築40年の築古物件。 玄関鍵が特殊形状につき市販のスマート鍵は適合せず。 さらに共用部である玄関鍵の種類は勝手に変えることができません。 そこで、 現況の玄関鍵をそのままに、家族のLINEグループで「鍵」と呟くと 家の外から鍵の状態を教えてくれるLINE BOT(鍵監視システム)を構築しました。  ## DEMO @[youtube](https://youtu.be/j5Jo3B5XZwA) ## システム要件 * 鍵に物理的にアクセスせずにモニタできること * 家族がシームレスに使えること 鍵の周りに部材を取り付けるとセキュリティ上、 脆弱になる可能性があるため非接触での検出方法を検討しました。 我が家のマンションは築古で鍵形状が特殊なので、この特殊形状を活かし、 超音波距離センサにより鍵稼働部との物理距離を算出して鍵の開閉を検出することとしました。 (とはいえ通常のシリンダータイプの鍵でも同様のことはできると思います) そして家族がシームレスに使えるように家族で運用しているLINEグループにBOTを組み込み、 家族が誰でも簡単に使えるシステムとしました。   (鍵開のときは鍵までの距離が算出される。鍵閉のときは壁までの距離が算出される) 距離センサだけではドアが空いている際に鍵閉と誤認識してしまうため、ドアセンサ(リードスイッチ)によるドアの開閉状態と組み合わせることで鍵の状態を正確に捉えられるようにしました。  ## 構成図  ## 必要な部材 * Raspberry Pi3 Node.jsを稼働しサーバとして使用します。 * Obniz Board 玄関に設置します。 * 距離センサ HC-SR04 鍵の状態(ロックorアンロック)を識別するために使用します。 https://akizukidenshi.com/catalog/g/gM-11009/ * ドアセンサ(リードスイッチ) ドアの開閉状態を検出するために使用します。 https://akizukidenshi.com/catalog/g/gP-13371/ * ピンヘッダ ドアセンサをObnizへ接続するときに使用します。 https://akizukidenshi.com/catalog/g/gC-06192/ * ワイヤ 距離センサをObnizへ接続するときに使用します。 https://akizukidenshi.com/catalog/g/gC-08932/ * モール材 配線を隠すために使用します。ホームセンターやamazonで入手可。 * はんだ付けするための道具類 ピンヘッダとドアセンサの配線を電気的に接続する際に使用します。 (簡易的に実装する場合はミノムシクリップでも可) ## 作り方 ### Obnizの接続 以下のように接続しました。  #### 距離センサの使い方 距離センサHC-SR04の使い方は以下のドキュメントを参考にしました。 https://obniz.com/ja/sdk/parts/HC-SR04/README.md #### ドアセンサ(リードスイッチ)の使い方 ドアセンサは9pinをHi(3.3V)出力、10pinを0V(GND)へプルダウンに設定、11pinで端子電圧を入力しています。以下のドキュメントを参考にしました。 入力 https://obniz.com/ja/doc/reference/common/io/input プルダウン https://obniz.com/ja/doc/reference/common/io/pull-up-down 出力 https://obniz.com/ja/doc/reference/common/io/output https://blog.obniz.com/make/notify-line-mail-arrives ##### 補足:ドアセンサ(リードスイッチ)の回路構成 ドアセンサの回路図は以下のようになっています。  pullすれば繋ぐだけでOK!抵抗もいりません! Arduinoとは違いGND pinをソフトで設定するという行為に面食らいました・・・!(^^;) ## Raspberry Piの設定 ### Raspberry PiでNode.jsを使う Node.jsを使うために以下を参考にRaspberry Piを設定しました。 https://qiita.com/mascii/items/77c685df65c4cbca9315 ### Node.jsからObnizを操作する Raspberry PiのNode.jsからobnizを操作するには以下のドキュメントを参考にしました。 https://obniz.com/ja/doc/guides/nodejs/how-to-run ### Node.jsからLINE MEssaging APIを使う LINE Messaging APIの使い方はこの記事を参考にしました。ngrokの使い方も紹介されています。 https://qiita.com/n0bisuke/items/ceaa09ef8898bee8369d #### 補足:ngrokのインストール ngrokがインストールできず、ハマりました。 Raspberry piにインストールする際は以下のコマンドでインストールできました。(ngrokのインストールページの下の方に記載あり) ``` sudo npm install --unsafe-perm -g ngrok ``` ## JavaScript 最終的に出来上がったスクリプトです。 obniz.js ``` var Obniz = require("obniz"); const obniz = new Obniz("****-****"); // called on online obniz.onconnect = async function () { const hcsr04 = obniz.wired("HC-SR04", { gnd: 0, echo: 1, trigger: 2, vcc: 3, }); obniz.io10.pull("0v"); obniz.io9.output(true); var count_l = 0; var count_u =0; var lock_status = false; exports.lock_status =false; // called while online. obniz.onloop = async function () { //ドアロック状態検出 hcsr04.measure(function (distance) { console.log("distance " + distance + " mm"); lock_status = lock_check(distance); }); //ドア開閉状態検出 var value = await obniz.io11.inputWait(); if (value && lock_status) { //ドア閉+ドアロック count_l++; count_u=0; console.log("DOOR_CLOSE & DOOR_LOCKED ; count_l="+count_l); obniz.display.print("lock="+count_l); } else if(value && !(lock_status)){ //ドア閉+ドアアンロック count_l = 0; count_u++; console.log("DOOR_CLOSE & DOOR_UNLOCK ; count_u="+count_u); obniz.display.print("unlock="+count_u); }else{ console.log("DOOR_OPEN"); } exports.lock_status=lock_status; await obniz.wait(1000); // 1sec wait. obniz.display.clear(); }; }; //ドアロックチェック(true:ロック,false:アンロック) function lock_check(distance) { if (distance > 300) { return true; } else { return false; } } function check_status(){ return lock_status; } ``` server.js ``` 'use strict'; const express = require('express'); const line = require('@line/bot-sdk'); const obniz =require('./obniz.js'); const PORT = process.env.PORT || 3000; const config = { channelSecret: '********', channelAccessToken: '************' }; const path = require('path'); const app = express(); app.post('/webhook', line.middleware(config), (req, res) => { console.log(req.body.events); Promise .all(req.body.events.map(handleEvent)) .then((result) => res.json(result)); }); const client = new line.Client(config); async function handleEvent(event) { if (event.type !== 'message' || event.message.type !== 'text') { return Promise.resolve(null); } let message = ''; if(event.message.text=== '鍵'){ console.log(obniz.lock_status); if(obniz.lock_status){ message='大丈夫、鍵かかってます!'; }else{ message='開いてる!!'; } } return client.replyMessage(event.replyToken, { type: 'text', text: message }); } app.listen(PORT); console.log(`Server running at ${PORT}`); ``` 各種設定を終え、ngrokを起動後に、別ターミナルで以下のコマンドから起動します。 ``` node server.js ``` ## まとめ 簡易ではありますが家の玄関鍵の状態をモニタできるようになりました! 状態変化があったときに通知を飛ばしたり、鍵をかけ忘れているときにアラートを鳴らしたりと、より便利なシステムとなるようにカスタムしていこうと思います。 **そしてまた一歩、新築を超えました。**