先日、卒業研究用にラズベリーパイ 4B を買ってきたのですが、卒業審査が終わったら放置状態になっていました。LAN 内クラウドストレージを構築する以外に、以前ちょっと OpenCV を勉強したことがあったので、カメラと人感センサーを買ってきてラズベリーパイに接続し、シンプルな「おはよう」プッシュ機能を作ってみました。毎朝、机に座ったタイミングで WeChat に「おはよう」メッセージと天気予報を送ってくれます。

おはようメッセージ&天気予報
全体の設計はこうです。毎朝 7 時にラズベリーパイが Python スクリプトを起動し、人感センサーで机の前に人がいるかチェック。人がいたらカメラを開いて本人か判定し、本人なら WeChat にメッセージをプッシュ。発想はシンプルで、コードもすんなり書けて大きなハマリはありませんでした。ただし、人感センサーのプラス・マイナスを間違えて逆に差してしまい、センサーを 1 個燃やして手をちょっとヤケドしました∠( ᐛ」∠)_
事前準備
🖥️ OpenCV + Mediapipe 環境が入ったラズベリーパイ 1 台
📹 カメラ 1 台
✋ 人感センサー(複数可)
🔌 オス-オス ジャンパ線 適当に
🎤 Wecom 醤 が動いているサーバー(ラズベリーパイ内でも可、お好みで)
人感センサー
人感センサーは淘宝で適当に買って OK ですが、検知距離が短いもの(1 m 程度)をおすすめします。ここで買ったのは 5〜10 m タイプで、最小に絞っても日常使いではちょっと敏感すぎました。

ラズベリーパイ ピン配置&人感センサー ピン
センサーの VCC ピン → ラズベリーパイ 4 番 5 V ピン、GND ピン → 6 番 GND ピン、OUT ピンはどの GPIO ピンでも OK、ここでは 38 番 GPIO.28 に接続します。
NoteVCC と GND を逆に差すと即死なので注意。VCC を 3.3 V にするか 5 V にするかはセンサーの動作電圧を見てください。

センサー配線
以下のコードをラズベリーパイに放り込んで実行:
順調なら、手をセンサーの前に出すと HIGH が出力され、設定した遅延時間だけ維持されます。反応がなければ LOW。これでセンサーの動作チェック完了です。

人感センサー出力
顔認識の事前準備
顔認識には OpenCV + Mediapipe でカメラ映像から顔画像を切り出し、それを API で曠視の Face++ プラットフォーム にアップロードして認識結果を得る方式を採用しました。
Face++ 顔検出
まず、データベース用の自撮り写真 1 枚を用意し、multipart/form-data で POST して 顔検出 API を呼び出し、facetoken を取得します。facetoken は画像内の各顔に対して一意で、後続の比較で使います。
face_token を取得したら、faceset に登録しないと 72 時間後に無効になるため、次は長期利用できるよう顔ライブラリを作成します。
Face++ 顔ライブラリ作成
POST で 顔ライブラリ作成 API を叩けば OK です。
faceset_token が得られたら、そこに顔を追加します。
Face++ 顔追加
顔ライブラリへの追加も同様に簡単、手順は上と同じです。
以上で顔認識の事前準備は完了です。Face++ ドキュメントセンター に各 API の詳細があるので、用途に応じて参照してください。
メインプログラム
天気情報は 和風天気の実況天気 API を利用。https://devapi.qweather.com/v7/weather/now?location={都市 ID}&key={key} に GET リクエストを送ります。顔比較は 顔比較 API を呼び出し、ファイルアップロードが必要なので multipart/form-data で POST します。完成版は以下の通り:
毎朝 7 時に定期実行したいときは crontab -e を打ち込み、ファイル内に 0 7 * * * python3 {ファイルパス} と記入して Ctrl + O で保存、Ctrl + X で終了すれば OK です。
最後に
ずっとスマートホーム一式が欲しかったのですが、ちょっと高くて……。なので別の方法で似たような機能を実装してみました。動作確認が取れた瞬間の達成感は、買ってきただけでは味わえない楽しさかもしれません。
補足:もしスマート家電(例:小米スマートコンセント)の ON/OFF も同時に制御したい場合、小米スマートデバイス用 Python ライブラリ があるので、それで実装できるかもしれません。