経過時間を求める
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に日時を載せておく必要はありません。