はじめに
外出時、家を出てからしばらくして「あれ?鍵閉めたっけ?」と不安になり、
家まで戻って確認することってありませんか?
そんなときに家の外からでも鍵が掛かっているか確認できればよりスマートな生活をおくれる・・・!!QrioやAkerunなどのスマート鍵を導入できれば万事解決!!
といきたいところですが我が家は築40年の築古物件。
玄関鍵が特殊形状につき市販のスマート鍵は適合せず。
さらに共用部である玄関鍵の種類は勝手に変えることができません。
そこで、
現況の玄関鍵をそのままに、家族のLINEグループで「鍵」と呟くと
家の外から鍵の状態を教えてくれるLINE BOT(鍵監視システム)を構築しました。
デモ動画
システム要件
- 鍵に物理的にアクセスせずにモニタできること
- 家族がシームレスに使えること
鍵の周りに部材を取り付けるとセキュリティ上、
脆弱になる可能性があるため非接触での検出方法を検討しました。
我が家のマンションは築古で鍵形状が特殊なので、この特殊形状を活かし、
超音波距離センサにより鍵稼働部との物理距離を算出して鍵の開閉を検出することとしました。
(とはいえ通常のシリンダータイプの鍵でも同様のことはできると思います)
そして家族がシームレスに使えるように家族で運用している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
補足:ドアセンサ(リードスイッチ)の回路構成
ドアセンサの回路は以下のようなイメージです。
ドアセンサが導通していればHi、オープンならLoが入力されます。
ソフトでpull設定にしてプルアップ/ダウンしています。繋ぐだけでOK!抵抗いりません!
ハードウェアをほぼ意識させないobnizすごい。(逆にハードウェアどうなってんねん!と最初戸惑いました)
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
おわりに
家の玄関鍵の状態をモニタできるようになりました!
今後、状態変化があったときに通知を飛ばしたり、鍵をかけ忘れているときにアラートを鳴らしたりと、より便利なシステムとなるようにカスタムしていこうと思います。
そしてまた一歩、新築を超えていきます。
投稿者の人気記事
-
Fooping
さんが
2021/04/29
に
編集
をしました。
(メッセージ: 初版)
-
Fooping
さんが
2021/04/29
に
編集
をしました。
-
Fooping
さんが
2021/04/29
に
編集
をしました。
-
Fooping
さんが
2021/04/29
に
編集
をしました。
-
Fooping
さんが
2021/04/29
に
編集
をしました。
(メッセージ: セクション追加)
-
Fooping
さんが
2021/04/29
に
編集
をしました。
-
Fooping
さんが
2021/04/29
に
編集
をしました。
ログインしてコメントを投稿する