Raspberry Pi + Node-RED + センサー + メール で室内のコンディションを通知する
今回のTALKでは、“Node-RED”をインストールした“Raspberry Pi”に接続した
DHT11 温度センサー モジュール “HiLetgo 3個セット DHT11温度センサー モジュール湿度センサーモジュール デュポンラインと付属 Arduinoと互換”
“aitendo“で買った”PIRセンサーモジュール [HC-SR501]“を使って、
部屋に人がいない時だけ、室内の温度温度をメールで伝える仕組みを作ってみます。自宅に不在時、お留守番中のペットくんたちのために、お部屋のコンディションをチェックする、といったシチュエーションを想定しています。
< Raspberry PiにNode-REDをインストールする >
・先日のTALk (““Raspberry Pi + Node-RED + Google Home で明日の天気を定刻にアナウンス””)をご覧下さい。
< 温度センサー周りをセットアップする >
・温度センサーの取り扱いについては、”ワンコインでお部屋の温度をHomeKitをベースに外出先でもモニターできるようにしてみました“をご覧下さい。
・DHT11 温度センサー モジュールと”Node-RED”の”node-red-contrib-dht-sensor“ノードのセットアップについては、先日のTALk (“Raspberry Pi + Node-RED + ダッシュボード でお部屋の温度と湿度を可視化“)をご覧下さい。
< 人感センサーをセットアップする >
・人感センサーをRaspberry Piに接続する詳しい手順は、“Raspberry Pi 4 4GBモデルでこれまで構築したラズパイ環境を統合化してみる (4) “人感センサーで照明を自動制御””をご覧下さい。
・人感センサーの検出結果は、”Node-RED”の”rpi-gpio-in”ノードで取得します。
“rpi-gpio-in”ノードのプロパティ画面では、人感センサーの”out”端子を接続したGPIOピンヘッドの番号を設定するだけです。検出結果は、人を検知したら”1″、検知していなければ”0″が返ってきます。
フローをデプロイすると、”rpi-gpio-in”ノードは常時動作し、GPIOピンヘッドからの信号が変化する都度、メッセージ (msg.payload)が後方のノードに向けて送信されます。
< Node-REDでメールを扱えるようにする >
“Node-RED”からメールを送受信できる”node-red-node-email“ノードを追加して下さい。
“node-red-node-email”ノードのプロパティ画面では、下図のように、メールサーバ、使用ポート、送信者の認証情報などを設定します。デフォルトはGoogleメール です。iCloudメールを”iCloud メールクライアント向けのメールサーバ設定“をもとに設定してみましたが、なぜかうまく行きませんでした。
メールを送信する時は、msg.topicにメールタイトル、msg.payloadにメール本文をセットしたメッセージをこのノードに送るだけです。
今回は、Googleメールで室内のコンディションを送ることにしました。
とは言え、普通のユーザ認証情報だけではエラーになってしまいます。エラーメッセージでも分かる通り、アプリ パスワードを事前に設定する必要があるようです。
Googleアカウント画面 (“https://myaccount.google.com“)にアクセスし、”セキュリティ”画面の”Google へのアクセス”欄にある”アプリ パスワード”をクリックして下さい。
続く画面下のアプリ パスワード生成欄で、アプリとデバイスを選択し、”生成”ボタンをクリックします。
生成されたアプリ パスワードを、”node-red-node-email”ノードのプロパティ画面のパスワード欄に設定すれば準備完了です。
“Node-RED”のフロー画面は、こんな感じで、”inject”-“function”-“email” (“node-red-node-email”)ノードを配置して接続します。
“function”ノードで、”email”ノード用のメールタイトルと本文を用意します。
“デプロイ”後、フローを実行するとメールが届くはずです。
< 温度センサーの計測値をメール送信する >
それでは、温度センサーで測定した値をメールで送信してみましょう。
前回作成したフローをもとに、”inject”と”function”ノードの間に”rpi dht22″ノード (”node-red-contrib-dht-sensor”)を配置します。
”rpi dht22″ノードのプロパティ画面はこんな感じです。
”rpi dht22″ノードに続く”function”ノードのプロパティ画面は、下図のように編集します。
msg.topic = '自宅のリビングルームの温度と湿度'
msg.payload = '現在の温度は' + msg.payload + '℃、湿度は' + msg.humidity +'%です';
return msg;
“デプロイ”後、フローを実行するとメールが届くはずです。
< 人感センサーの検出結果でメール送信の是非を判断する >
まずは、完成したフローを紹介します。
このフローの特徴は、温度センサーの測定値をメール送信するフローと、人感センサーの検出結果を保存するフローが独立しているところです。
その理由は、人感センサーはいくら調整しても多少の誤検知が避けられないので、フローの先頭に配置しずらいからです。人感センサーは、人が正面にいても全く動かない時間があると不在と検知したり、人がいないのにいると検知することが稀にあります。
とは言え、連続的に誤検知を繰り返すわけではないので、”rpi-gpio-in”ノードに繋いだ”change”ノードで、人感センサーが検出した結果を”Node-RED”の”コンテキスト” (詳しいことが”コンテキストを利用する“を参照。)を使い、タブ内の全フローで共有可能な”flow.xxxx”変数に保存し、いつでも参照できるようにしました。
一方、”rpi dht22″ノードと”function”ノードの間に、メール送信の是非を判定する”function”ノードを配置し、プロパティ画面の”コード”欄では、人感センサーの検出結果である”コンテキスト”変数を取り出し、人がいる時 (=== 1)は後方のノードに”null”を送ることでフローを終了させ、人がいない場合は温度センサーの値をメール本文を作成する”function”ノードに送るようにしました。
最後に、先頭の”inject”ノードのプロパティ画面で、”繰り返し”設定をしておきます。
完成したフローをデプロイしましょう。
今回のサンプル例では、外出時、1時間に一度のペースで、自宅の温度と湿度をメールで確認できるようになりました。
|
|
|
ホームページ “THE POOH FILES”にも是非お立ち寄り下さい。
“Adobe Stock“でベストショットな写真素材を販売中です。是非ご覧下さい。