Foopingのアイコン画像
Fooping 2021年04月29日作成 (2021年04月29日更新)
製作品 製作品 閲覧数 1340
Fooping 2021年04月29日作成 (2021年04月29日更新) 製作品 製作品 閲覧数 1340

Obnizで作る築40年フルリノベ物件のスマート鍵監視システム

Obnizで作る築40年フルリノベ物件のスマート鍵監視システム

はじめに

外出時、家を出てからしばらくして「あれ?鍵閉めたっけ?」と不安になり、
家まで戻って確認することってありませんか?

そんなときに家の外からでも鍵が掛かっているか確認できればよりスマートな生活をおくれる・・・!!QrioやAkerunなどのスマート鍵を導入できれば万事解決!!

といきたいところですが我が家は築40年の築古物件。
玄関鍵が特殊形状につき市販のスマート鍵は適合せず。
さらに共用部である玄関鍵の種類は勝手に変えることができません。

そこで、
現況の玄関鍵をそのままに、家族のLINEグループで「鍵」と呟くと
家の外から鍵の状態を教えてくれるLINE BOT(鍵監視システム)を構築しました。

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の接続

以下のように接続しました。
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

補足:ドアセンサ(リードスイッチ)の回路構成

ドアセンサの回路は以下のようなイメージです。
Obniz-ドアセンサ(リードスイッチ)の接続回路
ドアセンサが導通していれば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

おわりに

家の玄関鍵の状態をモニタできるようになりました!
今後、状態変化があったときに通知を飛ばしたり、鍵をかけ忘れているときにアラートを鳴らしたりと、より便利なシステムとなるようにカスタムしていこうと思います。
そしてまた一歩、新築を超えていきます。

1
1
Foopingのアイコン画像
愛知県のちくわ好きなエンジニア
ログインしてコメントを投稿する