一定時間継続の閾値超えの検出

1.概要

R-MSMなどのセンサから送られてきたデータの値がある閾値を超えたこと検出し、アラームを上げることはIoTでは必要な動作である。その閾値を超えた状態がノイズなどの一時的なものではなく、一定期間続いていることを検出するフローを作成したので紹介します。

2.動作仕様

データが3秒以上閾値を超えた場合、アラームをONします(LEDを緑から赤に変えます)。アラームのONは、OFFボタンを意図的に押さないと緑になりません。
flow.detectEnableを使うことで、3秒カウンタが複数回実行されることと短い期間の閾値越えで3秒カウント時にアラームがONにならないことを防止します。

表. flow変数一覧

flow変数

機能

初期値

flow.limit

閾値を設定

設定次第

flow.limitOver

データがflow.limitを超えたら、true

flase

flow.detectEnable

3秒カウントの開始許可。3秒カウント中は禁止。アラームON中も禁止

true

3.実験結果

3-1.一定期間閾値越え検出のフロー実装結果

左下のデータ入力のlink-inノードにデータを入力すると閾値が3秒間超えた場合にLEDを赤にする動作を行います。

3-2.鋸波生成のフロー実装結果

1秒ごとにインクリメント/デクリメントし、ピーク値が0~10までの値をとる鋸波を生成します。右端のデータ出力のLink-outノードから出力します。

3-3.実験結果

1秒ごとにインクリメント/デクリメントし、ピーク値が0~10までの値をとる鋸波を生成に対して、閾値7を3秒間超えるとAlartのLEDが赤になります。
一つ目の閾値7に達したピークでは、3秒間維持されていないので、Alartは緑のままです。次の山では、3秒間閾値7を超えているので、Alartが赤に変わります。

4.実装のポイント

4-1.閾値越えのタイマを1回しか発行しない:flow.detectEnableの活用

・switchノード「判定」 ①でデータが閾値を超えた場合、msg.payloadが上側のchangeノード「閾値越え」 ②に送られます。この「閾値越え」 ②の出力をdelayノード⑤に送る構成にしていますと、閾値を超えている間、何回もdelayノード⑤に信号が送られることになり、ずっと「異常継続」⑥の判定が繰り返されることになります。
・やりたいことはそうではなくて、一番初めに「閾値超え」②した後、delayノード⑤で設定した時間(3秒)後に1度だけ「異常継続」⑥判定がなされることです。
・そこで、「閾値越え」②が1発目かどうかを判定するために、変数flow.detectEnableを(初期値:true)設けました。「閾値越え」②が一発目の場合には、flow.detetEnable=“true”なので後段のdelayノード⑤に出力を送ります。同時に、changeノード「2発目禁止」④で、  flow.detectEnable=“false”に設定します。次に、連続してきた「閾値越え」②の出力は、flow.detectEnable=“false”になっていますので、switchノード「一発目」③を通過することができません。

flow.detectEnable=“true”になる条件

1) 初期化(デプロイ)時
2) Alart Offのボタンが押された時
3) 3秒後に判定した時に、閾値越えが解消されていた時
   (一度AlartがOnになると、Alart Offのボタンが押されない限り”false“のまま)

4-2.デプロイ時にLEDの色を緑にリセットする:ダッシュボードのbuttonノードの活用

・ LEDノードは入力されてくるmsg.payload=“true” か、”false”かで色を変えます。Alartが上がり、LEDが赤になった状態で、フローを修正し、デプロイしても赤のままです。
・ LEDの色を緑にするには、ダッシュボードのbuttonノードを押せば、LEDへmsg.payload=”false”になりますので、緑色に変わります。
・ そこで、buttonノードの入力に、injectノードの出力を繋ぎます。injfctノードの“Node-RED起動の0.1秒後、以下を行う”にチェックを入れます。そして、buttonノードの“if msg. arrives on input emulate a button click”にチェックを入れます。
・ これで、デプロイ後、injectノードから信号がbuttonノードに発せられ、Alart Offのボタンが押されたとの同じ動作が実行され、LEDの色が緑色になります。

4-3.鋸波の生成

鋸波の生成は、functionノード①とdelayノード②で行っています。functionノード①から出力されたデータがdelayノード②に出力され、1秒後に、delayノード②からfucntionノード①に入力されることで1秒ごとにデータを生成しています。
動作は、以下の通りです。
(1) 1秒ごとにデータをインクリメント(+1)もしくはデクリメント(-1)して出力します。
(2) データが0になったら、0~11の乱数を生成し、次のピーク値を決めます。
(3) 0からピーク値に向かってインクリメントします。
(4) データがピーク値になったら、0に向かってデクリメントします。