自宅の監視

外出するときに鍵を閉めたか不安になること、もう一度戻って確認することがよくあった。 そこでそういったことがなくなるようなものを作ってみた。 その方法として、ここではその鍵の状態をデータベースに書き込んで、それを外部サーバーから監視する方法を説明する。




鍵の監視方法


ここでの鍵は内側:サムターン式、外側:鍵のものを想定している。
鍵をそのままキースイッチにしてしまう、あるいはスマートロックを使うなどの方法が考えられるが、 せっかくなのでDIYでやってみる。
まずは電子部品店等でリミットスイッチ(マイクロスイッチ)を手に入れる。 このスイッチはレバーを押すとa接点のほうが入、b接点側が切になる。 そこで以下の写真1のように鍵がかかった状態でスイッチがONになるよう、両面テープで固定した。
ドアの開閉の監視は写真2のような、開閉センサ(おそらく磁石とリードスイッチ)が売られているのでそれを使用した。

limit_sw
写真1 キースイッチの設置
door_sw
写真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)。

Arduino_upview
写真3 実際のArduino
serial_example
図1 シリアル通信の例

監視情報の流れ


ドア、鍵などの監視情報の流れを説明する (図2)。
データベース(MariaDB)は鍵監視用サーバー(Security server)と同じローカルネットワークに繋がっているサーバー(Raspberry pi)にて運用している。 更にRaspberry piは記憶容量が小さいのでUSBで外付けHDDをつないで、データはそちらに書き込まれるようにした。

  1. ドア、鍵の状態をスイッチのON/OFF信号として一旦Arduinoに集約
  2. 上位にあるSecurity serverにシリアル通信でバイナリデータを渡す
  3. 得られたbitデータを同じネットワーク内にあるMariaDBに書きこむ
  4. ホームページにて稼働しているwebアプリが自宅のMariaDBに書き込まれたデータを見に行く
  5. Webアプリにより現在の監視状況を表示
data_flow
図2 データの流れ

(執筆中)

警告音の再生


監視を行う上で、もし異常事態が起きたときは警告音を発生するようにしてみる。
ただ、扉・窓を開ける際に毎回警告音がなるのはうっとおしいので、 例えばWebアプリ等から監視を一時解除できるようにする。
そこで一時解除は図3のようにWebページから自分のネットワークにMQTTを使って許可を投げるようにした。

mqtt_accept
図3 MQTTの流れ

また警告音はセキュリティサーバーで常駐させているプログラムが自身が発報した警告情報をMQTT経由で常に見ていて、 警告段階がしきい値を超えた際に音声を鳴らすようにした。

mqtt_alert
図4 警告状態のMQTTの流れ

敢えて監視プログラムと警告音再生のプログラムを分けたのは、監視プログラムの監視周期と 音声のループ再生の周期を自由に変えられるというのと、 処理を並列化することでどちらかのプログラムがフリーズしても片方は生き残れるように冗長化ができることである。

MQTTを用いた監視(2023/3/15 追記)


前述した監視システムをMQTTをより活用できるように見直した。
具体的には「監視情報をまとめる」、「警報レベルに応じた警告音を鳴らす」、 「監視状態を定期的にデータベースに記録」、「警報レベルが高いときはSlackに報告」といった機能を1つのプログラムから 分けた。
MQTTの利点としてsubscribeが同時に複数アクセスできるので、 処理を複数サーバーに分散させて冗長化、CPU負荷の軽減、警告音の遅延解消ができた。(特に警告音の遅延が問題だった)。

mqtt_schematics
図5 MQTTの監視システム
また、mqttは同じネットワーク内からは簡単に覗けてしまうので、TLS通信を使って傍受を難しくした。 TLSを用いたMQTT通信については今後MQTTのページに記載予定。