Raspberry Pi + Node-RED + センサー + ラズパイ カメラ で室内の様子を通知する
“Raspberry Pi + Node-RED + センサー + メール で室内のコンディションを通知する“の続きです。
先日のTALKで、今回のTALKでは、“Node-RED”をインストールした“Raspberry Pi”に接続したDHT11 温度センサー モジュールとPIRセンサーモジュールを使って、部屋に人がいない時だけ、室内の温度温度をメールで伝える仕組みを作りました。
今回のTALKは、送信するメール本文にラズパイが撮影した写真 (静止画)を添付できるよう改良を加えてみます。
なお、先日のTALKと内容が重複する部分は割愛しますので、その辺りをご了解下さい。
< ラズパイ用のカメラをセットアップする >
ラズパイ用のカメラと言えば、解像度が8メガピクセルの”Raspberry Pi カメラモジュール【Raspberry Pi Camera V2】“が定番ですが、今回のような開発用途だと、正直言って予算オーバーですよね。今回は、スペックは解像度が5メガピクセルと劣りますが安価で、かつ設置用の簡易スタンドが付いている”LABISTS Raspberry Piカメラモジュール 1080P 5M OV5647センサー ケース付き Raspberry Pi Model 2B、3B、3B+、4Bに適用“を試してみることにしました。
この製品はRaspberry Pi 2〜4をサポートしているため普通サイズのコネクタのケーブルが2本付属しています。もし、Raspberry Pi Zeroモデルで使いたい場合は、”For raspberry pi カメラモジュール 5MP Raspberry Pi 4 model b /3 b+ / Pi Zero Camera とケース500W画素 感光チップOV5647センサー“をチョイスする選択肢もあるようです。
カメラのセットアップ方法は、ラズパイ公式カメラと同じです。詳しい内容は、”Raspberry Pi 4 4GBモデルでこれまで構築したラズパイ環境を統合化してみる (3) “ラズパイ標準カメラでビデオ監視”“をご覧下さい。
付属のカメラスタンドはこんな感じです。組立図は同封されていないので、アマゾンの商品ページに掲載されている写真を参考に自力で組み立てました。それでも10分ぐらいで完成したので難しいことはないと思います。ちなみに、本当は透明なアクリル?製ですが、保護している紙が剥がしにくかったので、そのままにしてあります。
正面から見るとこんな感じ。ラズパイのカメラ・レンズは置き場所に困るので、簡易スタンドとは言えあると便利かも。
カメラを利用する前に、ラズパイの”Raspberry Pi の設定” -> “インターフェイス”画面でカメラを有効にすることを忘れないで下さいね。
カメラのセットアップが終わったら、写真を試し撮りしてみましょう。
raspistill -o image.jpg
< Node-REDで写真撮影ができるノードをセットアップする >
今回は、”node-red-contrib-camerapi“という写真撮影用のノードを利用します。
“node-red-contrib-camerapi”ノードのプロパティ画面では、写真データの保存方法、写真の解像度といった基本項目の他、画像の角度、エフェクト、ISO設定、露出・ホワイトバランスなど多彩な設定が可能です。
まず始めに、撮影した写真データを一旦ファイルに保存し、ファイルからデータを読み込んだうえでメール送信するフローを考えてみます。
“node-red-contrib-camerapi”ノードのプロパティ画面は上図の通りです。ポイントは、”File Mode”欄は”Custom File Name”に設定、”File Name”に分かりやすいファイル名、”File default path”欄は”No”、”File Path”欄は分かりやすい写真ファイルの保存先パスとすることで、写真ファイルの場所を特定することです。”File Mode”欄をデフォルトの”Auto File Name”のままにしておくと、ノードが割り当てる独自のファイル名になってしまうので、後々の処理が面倒になります。
完成したフローです。”node-red-contrib-camerapi”ノードに続く”delay”ノードで15秒のタイムタグを設けているのは、写真データがファイルに保存されるまで、少々の時間を要するからです。写真の解像度によっても、保存にかかる所要時間が異なります。
“delay”ノードに続く”file in”ノードでは、指定したパスで写真データを読み込んだ後、バイナリバッファ形式で後方の”function”ノードに送ります。
前方の”file in”ノードから送られてきた”msg.payload”に格納されたバイナリバッファ形式の写真データは、そのまま後方の”node-red-node-email“ノードに繋げます。
“node-red-node-email”ノードは、”msg.payload”にバイナリ形式の写真データが格納されている場合、メール本文に写真データを静止画として添付してくれます。
今度は、”node-red-contrib-camerapi”ノードのプロパティ画面の”File Mode”欄は”Buffered Mode”に設定してみましょう。
メモリ内の写真データで後方のノードに渡すことができるので、フロー全体がとてもシンプルになりました。
こちらも問題なくメール送信ができました。
< ダッシュボードに撮影した写真を表示してみる >
余談ですが、Node-REDのダッシュボード (“node-red-dashboard“)に、ラズパイのカメラで撮影した写真を掲載してみましょう。
ダッシュボードに動画や静止画を表示する”node-red-contrib-ui-media“ノードを利用します。
“node-red-contrib-ui-media”のプロパティ画面では、写真や動画が保存されるパスを指定するのですが、最初どういう意味か分かりませんでした。例は良くないですが、下図の場合は、
“./.node-red/lib/ui-media/lib/写真/stillcamera.jpg”というパスにメディアを保存するという設定になります。ですので、ダッシュボード上で、動的に表示するコンテンツを変化させたいのであれば、このパスに最新の写真などを保存し直すといったアプローチになります。
また、”node-red-contrib-camerapi”ノードのプロパティ画面の”File Mode”欄は”Custom File Name”に設定し、写真ファイルなどの名前を固定にする必要があります。
こんな感じで、ダッシュボードに表示されます。この仕組みは、何か別の用途で活用できそうですね。
※ “node-red-contrib-ui-media”でダッシュボードにコンテンツを表示するためには、一度だけラズパイまたは”Node-RED”をリブートする必要があるようです。
< 人感センサーと温度センサーを絡めたメール送信 >
最後に、人感センサーと温度センサーを絡め、室内に人がいない時にだけ、メール本文に室内の温湿度を記入し、室内の様子を撮った写真を添付したメールを送信するフローを完成させます。
こちらが完成したフローです。
先頭の”inject”ノードでは、1時間毎にフローを実行する設定にしました。
人感センサーのフロー部分は、前日のTALK (“Raspberry Pi + Node-RED + センサー + メール で室内のコンディションを通知する“)のまま流用しました。
温度センサーのフロー部分も基本同じですが、後方のフローに温湿度のデータを伝えたので、”change”ノードで温度がセットされている”msg.payload”の値を、新たに設けた”msg.temp”に代入しました。湿度は、もともと”msg.humidity”に格納されているので、そのまま後方に繋げます。
参考までに、今回のフローで用意したメールの素材はこんな具合です。
“change”ノードに続く”function”ノードで、人感センサーの検出結果をもとに判定し、室内に人がいない場合、室内の写真を撮るフローに繋げます。
“node-red-contrib-camerapi”ノードに続く”function”ノードでメールを作成します。
“node-red-contrib-camerapi”ノードでは、”msg.payload”に写真データが格納されている場合、メール本文は”msg.description”に記述するルールになっています。
msg.topic = '現在の写真'
msg.description = '現在の温度は' + msg.temp + '℃、湿度は' + msg.humidity +'%です';
msg.payload = msg.payload;
return msg;
デプロイ後、外出していると、こんな感じでメールが届きます。
|
|
|
ホームページ “THE POOH FILES”にも是非お立ち寄り下さい。
“Adobe Stock“でベストショットな写真素材を販売中です。是非ご覧下さい。