Tibbo-Piを使って環境モニターを作ろう
Tibbit #30 湿度/温度センサーを使った環境モニターを作ります。
センサーデータの取得から始めて不快指数の計算、警告ランプ点灯、メール送信と段階的に機能を追加していきます。
使用Tibbitブロック
Tibbitブロック | 使用数 |
#00-3 2chダイレクトI/O+5V+GND | 3 |
#30 湿度/温度センサー | 1 |
#38 ボタン | 1 |
#39 LED | 1 |
Step 1 – センサーデータ取得
#30 湿度/温度センサーからデータを読み込み、Node-REDのデバッグウインドウに表示します。
所要時間:15分
Tibbit配置
SLOT1とSLOT2に#00-3 2chダイレクトI/Oを挿入します。
COM1に#30 湿度/温度センサー、COM2に#38 ボタンを挿入します。
ノード配置
最初にtibbo-piを初期化するtp initializeノードを配置します。
Tibbit #38、switch、Tibbit #30、debugの順にノードを配置、接続します。
ノード設定
Tibbit #38ノードを開き、スロットにS02を設定します。
Tibbit #38ノードはボタンが押されると(押して放したとき)、msg.payloadに1をセットして次のノードに渡します。
Tibbit #30ノードのスロットにS01を設定します。
switchノードを開き、プロパティのドロップダウンで数値を選択、値に1を設定します。
この設定によって、Tibbit #38ノードから受け取ったmsg.payloadの値が1のとき、Tibbit#30ノードが実行されます。
実行
デプロイをクリックしてフローを実行しましょう。
ボタンを押すとデバッグウインドウに温度と湿度が表示されます。
Step 2 – 定期的に実行
一定間隔で自動的にデータを取得します。
所要時間:5分
ノード配置
injectノードを配置し、injectの出力をTibbit #30の入力に接続します。
ノード設定
injectの「Node-RED起動の…」にチェックを入れ、5秒後に設定、繰り返しドロップダウンで「指定した時間間隔」を選択、「時間間隔」を30秒に設定します。
実行
デプロイをクリックしてフローを実行しましょう。
開始5秒後から30秒ごと、またはボタンを押したときにTibbit #30が実行され、温度と湿度が表示されます。
Step 3 – 不快指数を計算する
温度と湿度から不快指数を計算し、湿度/温度に加えて不快指数と体感の目安を表示します。
所要時間:15分
ノード配置
Tibbit #30とdebugの間にfunctionノードを配置します。
Tibbit #30の出力をfunctionの入力、functionの出力をdebugの入力に接続します。
ノード設定
functionのコードに以下のjavascriptを書きます。
ノードの名前は「不快指数」とします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
var t = msg.payload.temp; var h = msg.payload.humd; // 不快指数計算 var di = (0.81 * t) + (0.01 * h * (0.99 * t - 14.3)) + 46.3; msg.payload.di = di.toFixed(2); var di = msg.payload.di; // 体感の目安 var comment = ''; if (di >= 55 && di < 60) { comment = '肌寒い'; } if (di >= 60 && di < 65) { comment = '何も感じない'; } if (di >= 65 && di < 70) { comment = '快い'; } if (di >= 70 && di < 75) { comment = '暑くない'; } if (di >= 75 && di < 80) { comment = 'やや暑い'; } if (di >= 80 && di < 85) { comment = '暑くて汗が出る'; } if (di >= 85) { comment = '暑くてたまらない'; } msg.payload.comment = comment; // タイムスタンプを付加 var now = new Date(); var today = "" + now.getFullYear() + "-" + ('0' + (now.getMonth() + 1)).slice(-2) + "-" + ('0' + now.getDate()).slice(-2) + " " + ('0' + now.getHours()).slice(-2) + ":" + ('0' + now.getMinutes()).slice(-2) + ":" + ('0' + now.getSeconds()).slice(-2); msg.payload.date = today; return msg; |
実行
デプロイをクリックしてフローを実行しましょう。
diが不快指数、commentが体感の目安です。
参照
不快指数と体感の目安
https://ja.wikipedia.org/wiki/%E4%B8%8D%E5%BF%AB%E6%8C%87%E6%95%B0
Step 4 – 警告灯を点灯させる
不快指数が一定の値を超えているとき、LEDを点灯させます。
所要時間:10分
Tibbit配置
SLOT3に#00-3 2chダイレクトI/O、COM3に#39 LEDを挿入します。
ノード配置
switch、function、Tibbit #39の順に配置して接続します。
不快指数functionの出力をswitchの入力に接続します。
ノード設定
Tibbit #39 LEDのスロットにS03を設定します。
switchのプロパティをmsg.payload.di、条件1の値のドロップダウンで数値を選択し、値を75とします。
この設定によって、不快指数が75以上のとき、追加したfunctionが実行されます。
functionのコードに以下のjavascriptを書きます。
ノードの名前はLED ONとします。
1 2 3 |
msg.payload = 1; return msg; |
このfunctionはswitchと連携して、不快指数が75以上のとき、Tibbit #39 LEDを点灯させます。
実行
デプロイをクリックしてフローを実行しましょう。
不快指数がswitchの条件1に設定した値(75)以上になるとLEDが点灯します。
switchの設定値を変更して条件どおりに点灯するのを確認してください。
Step 5 – 警告灯を消す
ここまでのフローでは、一度でも不快指数が指定値以上になると、その後で不快指数が下がってもLEDが点灯したままになってしまいます。
不快指数が指定値未満のときはLEDを消灯する処理を追加しましょう。
所要時間:5分
ノード配置
LED ON functionと並列にfunctionを配置します。
追加したfunctionの出力はTibbit #39 LEDに接続します。
ノード設定
追加したfunctionの入力に接続しているswitchに条件を追加します。
下の追加ボタンで条件を追加、演算子のドロップダウンでその他を選択します。これはmsg.payload.diが条件1以外、つまり75未満であることを意味します。
条件を追加したのでswitchの出力が2つに増えています。上が条件1、下が条件2の出力です。
下の条件2の出力を追加したfunctionの入力に接続します。
functionのコードに以下のjavascriptを書きます。
ノードの名前はLED OFFとします。
1 2 3 |
msg.payload = 0; return msg; |
実行
デプロイをクリックしてフローを実行しましょう。
不快指数がswitchの条件1に設定した値以上になるとLEDが点灯、それ未満になると消灯します。
設定値を変更して条件どおりに点灯/消灯するのを確認してみてください。
(#30 温度/湿度センサーに手を近づけたりすると値が少し変化します)
Step 6 – データをメールで送信
ここまで取得/計算したデータはデバッグウインドウで確認してきました。
データがNode-REDからしか見えないのは不便です。もう少し実用的になるように、このデータをメールで送信してみましょう。
所要時間:20分
ノード配置
emailを配置して、switchの条件1の出力をemailの入力に接続します。
ノード設定
emailのデフォルト設定はgmailのSMTPサーバーになっています。ここではそのままgmailから送信することにします。
宛先に送信先のメールアドレス、ユーザIDとパスワードにそれぞれgmailのアカウント(gmailメールアドレス)とパスワードを設定してください。
ノードの名前はemailとします。
実行
デプロイをクリックしてフローを実行しましょう。
通常、Node-REDからgmailサーバーにログインすると、セキュリティ制限でエラーとなり、送信元のgmailアドレスに「ブロックされたログインについてご確認ください」というメールが来ます。
ブロックを解除するには、このメールの「安全性の低いアプリへのアクセスを許可」をクリックし、「安全性の低いアプリの許可」を有効にします。
ブロックを解除すると、宛先のアドレスに「Message from Node-RED」というタイトルでデータが送信されます。
Step 7 – 体感が変化したときだけメールを送信
先のフローでデータをメールで確認できるようになりましたが、このままでは30秒置きにメールが送信されて未読がどんどん溜まってしまいます。
体感の目安が変化したときだけメールを送信するようにします。
所要時間:20分
ノード配置
不快指数functionとemailの間にfunctionとswitchを配置します。
不快指数functionの出力を追加したfunctionの入力に、switchの出力をemailの入力に接続します。
ノード設定
追加したfunctionのコードに以下のjavascriptを書きます。
名前はemail送信とします。
1 2 3 4 5 6 7 8 |
if (context.get('comment') == msg.payload.comment) { flow.set('sendemail', false); } else { flow.set('sendemail', true); context.set('comment', msg.payload.comment); } return msg; |
context.getとcontext.setはノードのコンテキストにアクセスします。
ノードコンテキストは、そのノードに固有でほかのノードからはアクセスできません。
値はフロー実行中の間保持され、次にノードが実行されたときに前の値がそのまま残っています。
flow.setとflow.getはフローのコンテキストにアクセスします。
フローコンテキストは、フロー内のすべてのノードからアクセスできますが、ほかのフローからはアクセスできません。
このコードでは、前回の体感目安をノードコンテキストで保持し、メール送信要求フラグをフローコンテキストでswitchに渡しています。
switchのプロパティのドロップダウンを開いてflowを選択、sendemailと設定します。
条件はis trueを選択します。
ここではフローコンテキストsendmailがtrueかどうかを判定しています。
この設定によって、フローコンテキストsendmailの値がtrueのとき、emailが実行されます。
実行
デプロイをクリックしてフローを実行しましょう。
最初の1回目は常にメールが送信されます。2回目からは体感が前回と異なるときだけメールが送信されます。
Step 8 – メール送信エラーを処理する
体感が変化しても何らかの原因でメール送信に失敗すると、そのデータは失われてしまいます。
できるだけデータを残すために、メール送信に失敗したら、次のデータは必ず送信するようにします。
所要時間:20分
ノード配置
catch、function、debugの順で配置して接続します。
ノード設定
catchは例外が発生したときに実行されます。エラー取得元ドロップダウンで「選択したノード」を選択し、emailにチェックを入れます。
ノードの名前はemail例外とします。
この設定によって、email送信で例外が発生したとき、catchノードが実行されます。
debugの対象をmsg.error.messageに設定します。
例外の情報はmsg.errorに格納されています。ここではエラーメッセージだけを取り出しています。
functionのコードに以下のjavascriptを書きます。
ノードの名前はemail例外処理とします。
これによって、メール送信時にエラーが発生すると、フローコンテキストemailerrにtrueがセットされます。
1 2 |
flow.set('emailerr', true); return msg; |
email送信functionのコードを変更して、フローコンテキストemailerrがtrueなら常にメールを送信するようにします。
1 2 3 4 5 6 7 8 9 |
if (context.get('comment') == msg.payload.comment && flow.get('emailerr') !== true) { flow.set('sendemail', false); } else { flow.set('sendemail', true); context.set('comment', msg.payload.comment); flow.set('emailerr', false); } return msg; |
実行
メール送信エラーが発生するように、emailの設定をクリアしてからデプロイして実行しましょう。
メール送信のたびに例外が発生して、デバッグウインドウにエラーメッセージが表示されます。
動作を確認したら、emailを再度設定しておきます。