Raspberry Pi 4 と 赤外線センサー(HC-SR501)を使って生存確認システムを構築したことの詳細

0.一人暮らし用生存確認システムをつくった

まず、以下のブログをご覧くださいませ。

ここから下はメモがてらの詳細です。いつか誰かの役に立てたらいいな

1.購入物

必要だったもの

  • Raspberry Pi 4 Model B / 4GB

  • 電源アダプター(たぶんこれ)

  • SDカード(64GB)

  • ラズパイケース

  • ジャンパー線(メスメス)

  • ジャンパー線(オスメス)

  • microHDMI - HDMIケーブル

  • HC-SR501(赤外線センサー)

  • 電源延長コード

  • スマートプラグ(TP-Link製)

  • ケーブルモール(こういうの)

  • 額縁受け金具・長押用(ラズパイ固定用)

  • アクリル板(すごいうすいやつ)

  • アクリルカッター

結果的に不必要だったもの

  • はんだごて

  • はんだ

  • はんだホルダー

  • 超音波センサー(HC-SR04)

  • ジャンパー線(オスオス)

  • ブレッドボード

  • マウス(余ってるのになぜ買った?)

  • ラジオペンチ

総額…?気にしちゃいないです。気にさせないで。お願い。

2.ブログに書くと長くなりそうだったこと

生存お知らせシステムver.βについて

iPhoneのオートメーションで生存確認するシステムですが、平日はアラーム停止でお知らせできるものの土日はどうしてたねん。という話ですが
毎日15時に「生きてますか?」と通知が出てきて、それに応答するとwebhook叩いてdiscordにお知らせしてくれる
ってのを組んでました。これ、通知音が常にオフの僕、全然気づけない。

初期セットアップについて

  • 正直、microHDMI、最初にSSH許可するまでしか使ってない。デフォで許可だとそんなにマズいのかな。Liteで構築すりゃよかったな。

  • とりあえず最初の起動でSSHとVNCを有効にして、それ以降はTera TermからSSHで操作してます。

pythonのコードについて

  • 当初は「初回起動時に読み込むモジュール」「カウントダウンするモジュール」「赤外線センサーが反応したとき用のモジュール」と分けて変数(カウントと生死ステータス)を共有させようと考えていたのですが、モジュール間の変数の共有ってめちゃめちゃダルいことを思い知らされたので、1つのファイルですべて実行するハメになってます。

  • 3つのモジュール自体は6時間ぐらいで出来てたのですが(個人的には時間かかりすぎだと思います)、変数をどう扱うかでググりまくりました。参考サイトの方々本当に感謝してます。

  • マルチスレッド処理を行うためにThreadクラスの継承でどうこうしています。threading.Threadクラスのインスタンスでどうこうしようとしたらうまく動きませんでした。なぜ。

  • 並列処理前の5秒sleep、たぶん要らない。

  • カウンターのリセットもたぶん要らない。

  • カウントダウンするあれこれ、たぶん無駄な条件分岐が多いです。実は秋葉原から帰る電車の中でとってたメモなので、ガバいかも。いや100%ガバいです。

赤外線センサーの誤反応について

  • 赤外線センサーが起動後1分おきぐらいに反応してしまうやつ。

  • カウントダウンと動体検知が表示されるようにしているのですが、「3」,「2」と出た直後に「motion detect!」の文字が。printが実行されるタイミングで何かが起こっているとしか考えられないぐらい本当に直後。

  • ほんんんんんんとうに出てこない。同様の症状が。

  • "hc-sr501 false positive Raspberry Pi"とかでググった気がします。

  • 前日にブレッドボードでテストしたときはどうして出なかったのかいまいち納得いってないため、正直本当にWi-Fiのせいか訝しんでいますが、今んとこ正常に動いているので深堀りはやめておきます。

  • ちなみにジャンパー線の延長はオスメス線でやってます

TwitterAPI利用申請について

  • ブログでは全く触れていませんが、tweepyを使ってツイートがしたいのでいろんなキーをもらわないといけない。はるか昔に取得したやつは何か「もう使えないからね」って書かれてました。

  • つっても昔は申請したらすぐ使える的なイメージだったので気楽に構えていたのですが、調べてみたら大変そう。

  • App作成する→API利用申請する(英文で)→(Readonlyを外すために)OAuth情報を登録する

  • 以上の流れすべて終えてやっと書き込みができるキーがもらえました。めんどくせ~~!!!!

  • やり方はここが一番新しいかも

物理的な設置について

  • ラズパイ本体は長押(なげし。和室の服引っかけるところ)用の額縁受けがジャストフィットだったので、それに引っ掛けてます。テープかなんかで固定しないと地震のとき危ないですね。

  • 真下の電源からケーブルモールで真上にケーブルを伸ばしてそこに繋げました。見た目悪いけどまあ。まあ。

  • ちなみに根っこはスマートプラグで主電源オンオフできるようにしました。"sudo shutdown -h now"なんかで電源切った後に電源入れる手段がコンセントの抜き差ししかないみたいですね。WoLさせてくれ~や

  • 今更ですがLANケーブルは挿してません。

  • ジャンパー線の延長部分はビニテぐるぐるしてます。

  • ふすまとケーブルが当たる部分は軽く保護してますが、ふすまに戸当たりテープ?つけようかなと思ってます。

  • センサー用のケースは無設計図です。行き当たりばったりで作った結果汚くなってます。

systemdを利用したスタートアップ時の実行について

  • 本当にしんどかった。まずrootにtweepy入れてなかった。これはすぐ気づけました。(この時までrootにパスワード無かったのはヒミツね♡)

  • ここからが意味わからなかった。結果、「接続できないところにwebhookを何回も投げようとするんじゃねえ!」って言われていました。

  • 「ネットワーク接続後 systemd」とかで検索して出てくるサイト通りにファイルをいじっても治らない。ここで詰んでました。

  • 結果、"systemd-networkd"と"systemd-networkd-wait-online"をenableにしたのちに、serviceファイル?を下記のように設定しました。

[Unit]
Description=AliveMonitoring
After=network-online.target nss-lookup.target
Wants=network-online.target

[Service]
ExecStart=/usr/bin/python3 hoge.py
WorkingDirectory=/home/johndoe/motion_detect
Restart=always
Environment=PYTHONUNBUFFERED=1

[Install]
WantedBy=multi-user.target
  • どうしてこの結論に至ったかは思い出せませんが、まあ動いたからヨシ!

  • あと念のためコードの最初に15秒待機を入れました。

通知先について

  • 起動確認については自分しか見えないdiscordのチャンネル、死亡ステータス遷移時にはTwitter,discord,LINE(実装予定)に、生存ステータス遷移(復活)時にはdiscordに通知されるようになってます。復活時Twitter入れてないのはなんかTL荒れちゃうかなと思ってるだけです。

  • discordってwebhookの設定簡単だから重宝してます。

  • LINEはすでにIFTTTでwebhookとの連携が済んでいますが、どう通知させるか迷ってます。

ラズパイやプログラム自体の死活監視について

  • 死活監視するものの死活監視問題、あるよね

  • まずMonitorix入れましたが、重くない?みんなもっと軽かったりする?

  • iPhoneアプリでPiHelperってのがあったので入れました。手軽に温度とか見れます

  • プログラム自体が動いているかどうかは、"systemctl status"か"journalctl | grep python"で見ております。serviceファイルで"Environment=PYTHONUNBUFFERED=1"を記述してるので、printで出力された内容がそのままログとして出てきてくれます。

  • プログラム停止時にどうか外に通知させたいです。課題。

赤外線センサーを採用したことについて

  • 結果としてリードスイッチよりも良かったのかなと思ってます。理由は以下。

  • 夏はエアコンの風を色んな部屋に回すためにドア開けっぱだから

  • 長期休暇などで、家に長い間居ないときにセンサーが反応した(「復活しました通知が来た)らそれは不審者がいるってことになるから

死を知らされたフォロワーはどうしたらいいのか問題

LINEで身内には通知されるので、拝んでください。


セブンのハッシュポテト代になる