2017年6月1日木曜日

Raspberry Piと人感センサーで簡易見守りシステム

神田に用事があったので、ちょっと足を伸ばして秋葉原の秋月電子通商で、人感センサー(焦電型赤外線センサーモジュールSB612A)を600円+消費税で買ってきました。お目当は400円の別のもの(通販コード M-09627)だったのですが、在庫切れということで、ほぼ同じようなものを選びました。


http://akizukidenshi.com/catalog/g/gM-08767/

これとRaspberry Piで簡易見守りシステムを作ろうと思います。Rasbperry Piの近くで人が活動したかどうかを検出して、一日に一度だけLINEに通知するシステムです。
  1. 毎朝6:00に見守りを開始
  2. 人の活動を検出したらLINEに通知して終わり
  3. 夜22:00まで一度も人の活動を検出しなかったらLINEに警告を通知して終わり
ポート開放やダイナミックDNSは不要です。半田付けも必要ありませんので、比較的お手軽です。

用意するもの

  • 焦電型赤外線センサーモジュールSB612A
  • ジャンパーケーブル(メスーメス)3本
  • Raspberry Pi
    • SDカードにraspbianインストール済み
      • (2017-04-10-raspbian-jessie-liteを使いました)
    • 有線LANまたは無線LAN
  • ネットワーク環境
    • インターネットに常時接続
  • LINEアカウント
    • メールアドレスが登録されていること

作業1 Raspberry Piにwiringpiをインストール

下記のコマンドでwiringpiをインストールします。
  • sudo apt-get -y install wiringpi

作業2 人感センサーをRasbperry Piに接続

Raspberry Piをシャットダウンして電源オフにします。センサーとRasbperry Piを接続します。
  • 人感センサーの+とRaspberry Piの5V
  • 人感センサーの-とRasbperry PiのGND
  • 人感センサーのOUTとRaspberryPiのGPIO17


センサーを固定する良いアイデアが無いので、ジャンパーケーブルむき出しの状態で適当な場所に置いています。

Rasbperry Piを起動、ログインして、下記コマンドを実行します。
  • while true; do sleep 1; gpio -g read 17; done
部屋に人が居る間は1が、部屋から人が居なくなってしばらくすると0が表示されることを確認します。うまく0に戻らないときは、DELAYダイアルを動かして調整します。部屋に居ても、動かずにじっとしていると0に戻るようです。トイレの自動点灯する照明もそうですね。DELAYは最も短い設定(2秒)でも問題ありません。

余談ですが、実験中に、部屋から出ても延々1が出続ける状況に陥りました。DELAYが長すぎるのかと思ってDELAYダイヤルをあれこれいじってみても変わりません。なぜだろうと首をひねっていたら、いつのまにか猫が部屋に居たというオチでした。人感センサーですが、当然猫にも反応しますよね。


作業3 シナリオ作成

ブラウザからCodyl Connectにログインして簡易見守り用のシナリオを作成します。Connectのアカウント登録がまだでしたら、「新規アカウント登録はこちら」のボタンからアカウントを登録してから以下に進んでください。
  • (1)シナリオタブから「新規シナリオ作成」をクリック
  • (2)わかりやすいシナリオ名(例:人感センサー見守り)に変更
  • (3)説明を書く
  • (4)スケジュール設定を「指定時刻に一度実行」にする
  • (5)実行開始時刻を6:00にする
  • (6)イベントウォーク新規作成をクリック

  • (7)mainの箱の下のプラス記号をクリックしてステートを追加

  • (8)追加されたステート(state2)をクリック
  • (9)「ステートにコネクターを追加」をクリック

  • (10)新しいコネクターを作成を選んで、「WebHook」を選択
  • (11)後でコネクター一覧から選ぶときにわかりやすくするために名前に「(人感センサー)」を追加
  • (12)他は既定値のままでOK、「作成」をクリック



  • (13)メソッドに「TRIGGER: when received」を選択
  • (14)message_TTLを0にする。
  • (15)__output__に「人感センサーが反応しました」と入力。これが人感センサーが反応したときにLINEに通知されるメッセージになります。
  • (16)「ステートにコネクターを追加」をクリック

  • (17)「メソッドバスケット」を選択。リストに無ければ新規作成から「メソッドバスケット」を選択。
  • (18)メソッドに「TRIGGER: at timeout」を選択
  • (19)timeoutを960にする。(16時間×60=960分)
  • (20)__output__に「警告:人感センサーが反応しませんでした」と入力。これが人感センサーが16時間反応しなかったときにLINEに通知されるメッセージになります。
  • (21)「閉じる」をクリック

  • (22)state2の下のプラス記号をクリックしてステートを追加、追加されたステート(state6)をクリック。
  • (23)「ステートにコネクターを追加」をクリック 

  • (24)新しいコネクターを作成を選んで、「LINE通知」を選択
  • (25)「アカウントに接続」をクリック

  • (26)LINEの認証画面が出るので、メールアドレスとパスワードで認証した後、「1:1でLINE Notifyからの通知を受け取る」を選択。
  • (27)「同意して連携する」をクリック
  • (28)メソッドに「ACTION: notify」を選択
  • (29)textに「{{state2.__output__}}」を入力。
  • (30)「閉じる」をクリック
  • (31)上部のリストからシナリオ名をクリックしてシナリオプロパティ画面に戻る
  • (23)スケジュール設定を有効にする

これでシナリオの設定は完了です。

RaspberryPiでWebHookを送信するスクリプトの作成

RaspberryPiにログインして、下記のスクリプトを~/webhook_pir/webhook_pir.shという名前で作成します。実行権限も付与しておきます。




スクリプト中のPOST_URLは、WebHookコネクターの「ConnectのWebHook URL」に書き換えます。コネクター一覧から「WebHook(人感センサー)」を選択すると表示されます。

テスト実行してみます。「人感センサー簡易見守り」シナリオ の「今すぐ実行」ボタンをクリックします。


続いて、Rasbperry Piで先ほどのwebhook_pir.shを起動します。LINEに以下のような通知が届きます。webhook_pir.shはずっと動き続けますので、確認が終わったらCTRL+cで終了させましょう。


うまく動かない場合は、webhook_pir.shで何箇所かコメントアウトしてあるデバッグ用のechoコマンドを有効にして、どこまで処理が進んでいるか確認してみましょう。

自動起動

Raspberry Piでwebhook_pir.shが自動的に起動するように設定します。(2019/06/27修正:$HOMEの参照をやめ、フルパス記述に変更)

  • crontab -e
    • @reboot /home/pi/webhook_pir/webhook_pir.sh > /dev/null 2>&1 &
これで、毎日、見守り結果の通知がLINEで届くようになります。

6 件のコメント:

  1. 同じようなものを作って試験していますが、1日24時間、数年間以上使用する場合の発火の可能性について心配しています。何かご存じありませんか?

    返信削除
    返信
    1. コメントありがとうございます。確かに心配ですね。この手の電子工作の発火のリスクについては誰も保証してくれないので、あくまで自己責任になります。申し訳ありませんが、定量的な判断ができるだけの情報は持ち合わせておりません。可能性の有無で論ずるなら、「有る」と考えるべきだと思います。その上で、燃えやすいものの近くに置かないとか、電源や配線を定期的にチェックするなど、リスクを下げる努力は必要と思います。
      お答えになっていなくてすみません。

      削除
  2. 最近になりこの記事をもとに見守りシステムの構成を始めました。自動起動だけうまくいきません。なにか気をつけるべき点などありましたら情報をいただけませんでしょうか?

    返信削除
    返信
    1. コメントありがとうございます。
      自動起動以外はうまくいくということですので、cronの設定に問題があるのだと思います。
      (1)
      crontab -l
      で、cronの設定が正しく反映されているかを確認してください。

      (2)
      スクリプトファイルのフルパスが、cronに設定したフルパスと同一であるか確認してください。crontab -l の結果からコピペして、ls -l コマンドで確認してみてください。
      ls -l $HOME/webhook_pir/webhook_pir.sh

      (3) crontab -e で設定するスクリプトファイルのフルパスを$HOMEを使わず、そのままフルパスを記述してみてください。
      @reboot /home/pi/webhook_pir/webhook_pir.sh > /dev/null 2>&1 &

      上記のいずれでも解決しない場合は、cronのトラブルシュートが必要です。下記の記事を参考にして、/var/log/cron.logに出力される内容を確認してみてください。

      http://min117.hatenablog.com/entry/2017/08/26/110104

      cron.logが採取できたら、またコメントにて情報いただけると何が悪いか助言できるかもしれません。うまく自動起動できるようになると良いですね。

      削除
    2. 早速のご返信ありがとうございます。
      (3)の表記で改善しました。
      本当に助かりました。

      削除
    3. 改善して良かったです。コメントありがとうございます。他に同じように動作しなくて困って居る人の助けになるかもしれませんので、このようなコメントは歓迎します。
      cronで$HOMEが正しくセットされた状態になるかどうかは、もしかしたらraspbianのバージョンなどによって違うかもしれませんので、本文の方にも注釈をいれておこうかと思います。

      削除

ラズパイでLet's Encryptの証明書更新に失敗

ラズパイを自宅用の各種サーバー(DNS、メール、ウェブ他)として使っています。httpsのサーバー証明書の発行・更新にはLet's Encriptを使っています。今日たまたま証明書を更新しようとすると下記のエラーに陥りました。何度やっても失敗します。 ma...