Tibbo-Piを使って環境モニターを作ろう

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を書きます。

ノードの名前は「不快指数」とします。

 

実行

デプロイをクリックしてフローを実行しましょう。

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とします。

この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とします。

 

実行

デプロイをクリックしてフローを実行しましょう。

不快指数が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送信とします。

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がセットされます。

 

email送信functionのコードを変更して、フローコンテキストemailerrがtrueなら常にメールを送信するようにします。

 

実行

メール送信エラーが発生するように、emailの設定をクリアしてからデプロイして実行しましょう。

メール送信のたびに例外が発生して、デバッグウインドウにエラーメッセージが表示されます。

動作を確認したら、emailを再度設定しておきます。