経過時間を求める

1.目的

データ取得開始から現在までの経過時刻を刻むNode-REDのフローを作成しましたので報告します。

デプロイ直後の時刻を“flow変数”として記録し、1秒毎の時刻から引き算して、経過時刻を求めます。Node-REDの時間の最小単位は、1msですので、求めた経過時刻は“ms単位”です。経過時刻を次のようなJSON形式に直して出力します。
日時分秒の計算には、changeノードのJSONata式を使用しています。

出力JSON:{“elapsedTime”:522011305,”day”:6,”hour”:1,”min”:0,”sec”:11}

2. フロー

フローは、2つのブロックに分かれます。(1) 開始時刻記録と (2) 経過時刻出力です。それぞれ、中身を見ていきます。

2.1.開始時刻記録

「計測開始」のinjectionノードは、デプロイ直後に1回だけ、msg.payloadに日時を載せて送り出します。
そのmsg.payloadを「開始時刻」のchangeノードでflow.startTimeに代入します。
このflow.startTimeが開始時刻として使用されます。

2.2.経過時刻出力

① 「1秒タイマ」 injectノード

このノードでは、繰り返し機能を使って、1秒毎に現在の日時をmsg.payloadに載せて出力します。

② 「経過時刻」changeノード

このノードでは、現在の日時をmsg.theTimeに入れます。そして、「開始時刻」flow.startTimeを、msg.startTimeに呼び出して引き算し、経過時間を得ます。

   elapsedTime = msg.theTime – msg.startTime

あとは、日時分秒を計算します。上の引き算含めて、JSONata式を使っています。また、整数に丸めるために、floor関数を使用しています。

  秒:msg.sec = $floor(elapsedTime/1000 % 60)

  分:msg.min = $floor(elapsedTime/(1000 * 60) % 60)

  時:msg.hour = $floor(elapsedTime/(1000 * 60 * 60) % 24)

  日:msg.day = $floor(elapsedTime/(1000 * 60 * 60 * 24))

     $floor(number):number の値を number 以下の最も近い整数値へ切り捨てた値を返します。

 

③「payloadへ」functionノード

②で計算した結果を、JSON形式に直して、msg.payloadに載せます。

msg.payload = { “elapsedTime“: msg.elapsedTime, “day“:msg.day, “hour“:msg.hour, “min“:msg.min, “sec“:msg.sec };

あとは、不要になった情報を消します。

3.ある時点までの経過時間

経過時刻出力のinjectノードの代わりに、経過時間を計算したいタイミングで、「経過時刻」changeノードに信号(msg.payload)を入れればOKです。

「経過時刻」changeノードで、日時がmsg.theTimeに代入されますので、msg.payloadに日時を載せておく必要はありません。