外出するときに鍵を閉めたか不安になること、もう一度戻って確認することがよくあった。 そこでそういったことがなくなるようなものを作ってみた。 その方法として、ここではその鍵の状態をデータベースに書き込んで、それを外部サーバーから監視する方法を説明する。
ここでの鍵は内側:サムターン式、外側:鍵のものを想定している。
鍵をそのままキースイッチにしてしまう、あるいはスマートロックを使うなどの方法が考えられるが、
せっかくなのでDIYでやってみる。
まずは電子部品店等でリミットスイッチ(マイクロスイッチ)を手に入れる。
このスイッチはレバーを押すとa接点のほうが入、b接点側が切になる。
そこで以下の写真1のように鍵がかかった状態でスイッチがONになるよう、両面テープで固定した。
ドアの開閉の監視は写真2のような、開閉センサ(おそらく磁石とリードスイッチ)が売られているのでそれを使用した。
ドア、鍵などの監視情報を一旦写真3のようにArduinoに集約してバイナリ情報として上位のコンピューターに渡すことにした。
バイナリ情報とは"0110", "1100"のような0と1の2進数の情報のことで、
この各桁に各スイッチのonなら1をoffなら0をつめて上位のコンピューターに送る。
このときArduinoのデジタル入力にスイッチと3.3 Vまたは5Vの電源を直接つなぐと、
スイッチOFFのときの動作が不安定になるらしいので、
OFF時には抵抗(10 kΩ)を介してGNDに落とすような
プルダウン抵抗を導入したためArduinoの上部は写真3のようになった。
しかし桁数は無限に増やせるわけではなく、一度には1 byte分つまり8桁しか送れない。 つまりスイッチの数が9個以上増えると1度に全ての情報が送れなくなるので分けて送る必要がある。 このとき単にこのスイッチの状態のみを送っていると、せっかく分けた情報の区別ができなくなってしまう。 そこで対策として上位のコンピューターとは会話をするように聞かれたときだけ送る、データの始まりと終わりに目印となるバイナリ情報をおくるなどの工夫が必要(図1)。
ドア、鍵などの監視情報の流れを説明する (図2)。
データベース(MariaDB)は鍵監視用サーバー(Security server)と同じローカルネットワークに繋がっているサーバー(Raspberry pi)にて運用している。
更にRaspberry piは記憶容量が小さいのでUSBで外付けHDDをつないで、データはそちらに書き込まれるようにした。
(執筆中)
監視を行う上で、もし異常事態が起きたときは警告音を発生するようにしてみる。
ただ、扉・窓を開ける際に毎回警告音がなるのはうっとおしいので、
例えばWebアプリ等から監視を一時解除できるようにする。
そこで一時解除は図3のようにWebページから自分のネットワークにMQTTを使って許可を投げるようにした。
また警告音はセキュリティサーバーで常駐させているプログラムが自身が発報した警告情報をMQTT経由で常に見ていて、 警告段階がしきい値を超えた際に音声を鳴らすようにした。
敢えて監視プログラムと警告音再生のプログラムを分けたのは、監視プログラムの監視周期と 音声のループ再生の周期を自由に変えられるというのと、 処理を並列化することでどちらかのプログラムがフリーズしても片方は生き残れるように冗長化ができることである。
前述した監視システムをMQTTをより活用できるように見直した。
具体的には「監視情報をまとめる」、「警報レベルに応じた警告音を鳴らす」、
「監視状態を定期的にデータベースに記録」、「警報レベルが高いときはSlackに報告」といった機能を1つのプログラムから
分けた。
MQTTの利点としてsubscribeが同時に複数アクセスできるので、
処理を複数サーバーに分散させて冗長化、CPU負荷の軽減、警告音の遅延解消ができた。(特に警告音の遅延が問題だった)。