#もくじ
その1 ~システム概要
その2 ~GPIOを利用したスイッチの状態検知
その3 ~アルゴリズム設計 ←本記事です
その4 ~ハードウェアの準備
その5 ~自動メール送信でハマる
その6 ~キャリアグレードNAT下の端末に外部からSSHでアクセスする
その7 ~総括
#はじめに
前回はRaspberry PiのGPIOを利用したスイッチの状態検知について述べました。
今回は,実際にその状態検知機能を活用するプログラムのアルゴリズムについて書いてみようと思います。
#大方針
改めて今回やりたいことを書き出すと
- 宅内に複数設置されたSOSボタンが押されたときに,SOSボタンが押された場所(脱衣所,トイレ,台所,etc.)と緊急連絡先等の情報をあらかじめ設定された宛先にメールで送信する(緊急発報機能)
- 12時間ごとにドア(玄関,トイレ,冷蔵庫,etc.)が開かれた回数をあらかじめ設定された宛先にメールで送信する(定時発報機能。システムの動作確認を兼ねる)
- 遠隔地からソフトウェアのメンテナンスが可能
となります。3つ目はひとまず置いておいて,上の2つを考えてみると,ドアセンサやSOSボタンの状態を監視しつつ,その状態の変化に応じて動作させる機能(緊急発報機能)と,12時間ごとに動作させる機能(定時発報機能)とがあることになります。
状態監視はsleep関数を使って一定時間(例えば0.5秒おき)に実施するようなことをぼんやりと考えましたが,12時間ごとに行う定時動作を,例えば「状態監視を86400回行ったら実行する」などとして実現しようとすると,機器の負荷率によって発報間隔にばらつきが出たり,だんだんと発報時刻がずれていくことなどが考えられます。そこで今回は以下のような構成で開発を進めることにしました。
- 緊急発報,定時発報ともに同一のプログラム(メインプログラム)で実現する
- 定時発報は,定時発報要求フラグをたてるサブプログラムをcronで走らせ,それをトリガにしてメインプログラムで実現する
#メインプログラム
メインプログラムのアルゴリズムについては以下のようにしました。
ドア回数についてはファイルに記録することで,途中の状態を確認できるようにしています。
緊急発報メールは,例えば「居間のSOSボタンが押されました」や「居間のSOSボタンがリセットされました」のような内容のものです。
今回はさらに追加の情報として,家主及びそのご近所さんの連絡先を含めることにしました。
これは,メールを受け取った側のアクションがスムーズに行われることを期待したものです。
定時発報メールは,例えば「過去12時間以内にトイレのドアが1度も開けられていません」や「過去12時間以内にトイレのドアが〇回開けられました」のような内容のものです。
前者の場合には,体調の異変で体が動かせない状態になっている可能性があるので,緊急発報メールの場合と同様に連絡先の記載を含めるようにしています。
#サブプログラム
サブプログラムについては,フロー図を描くほどのものでもないほどシンプルなものです。
このプログラムを,cronを使って決まった時刻に走らせます。
#小ネタ
Raspberry PiのSDカードの寿命を最大限に延ばすため,今回のシステムの運用中に生成/更新されるファイルについては,ログファイルを除いてRAMディスク領域(/dev/shm/)に置くことにしました。
#次回予告
プログラムの内容が固まったので,次回はハードウェアについて紹介したいと思います。