Node-Redで設備の稼働状態をガントチャート風に表示して履歴をCSVデータに保存した

Node-RED

前回のブログでESP32とCDSセンサーを使用してシグナルタワーの状態をAzureに送信しました。
今回はそのデータをNode-Redで表示したときの手法を紹介します。
また、Node-Redでの表示は、再起動などで消えてしまうので、CSVデータに保存も合わせてNode-Redで行いました。

はじめに

今回は以下の記事の続きになりますのでまだご覧いただいていない方はそちらも参考にしてください。

成果

成果としては以下のようになりました。
Node-Redでの表示ではガントチャートで良いものがなかったので、それに似たものを選定しました。

Azureからのデータをグローバル変数に格納する

今回は、シグナルタワーの3色の光り方の組み合わせで状態を分けました。
後でIF文を使用して条件分岐させるときにグローバル変数を使用します。そのためにここでグローバル変数を定義して格納しておきます。
今回使用したNodeは状態を渡してあげて表示するタイプですので必要です。

「msg.payload」はデバッグ用ですので無くてもOK

①Azureの設定

ここに入れる文字列は以下からコピーします。

Azureを開き、IoT Hub内の「共有アクセスポリシー」→iothubowner をクリックします。

上記赤枠内の接続文字列をコピーします。

②switchノード

このchangeノードでAzureに入ってきたデータを振り分けます。
もちろん文字列はESP32に書き込んだスケッチに合わせて変更してください。

③changeノード

changeノードでそれぞれのセンサーの値をフィルターします。
今回は3つセンサーがあるのでchangeノードも3つ必要になります。

④functionノード

ここでグローバル変数に格納できました。変数名は任意です。

global.set("global_sensorValueR",msg.payload);
return msg;

稼働状態表示

node-red-contrib-ui-state-trail のインストール

まず準備として今回使用するノードをインストールしてください。
node-red-contrib-ui-state-trail

①injectノード

一番下の「繰り返し」だけ変更してください。

②funcionノード

グローバル変数を代入する
タイムスタンプを取得する
センサー値の値によって状態を表すように条件分岐させ、状態とタイムスタンプを返します。
※IF文のしきい値は状況に合わせて変更してください。

var status_R = global.get("global_sensorValueR");
var status_G = global.get("global_sensorValueG");
var status_Y = global.get("global_sensorValueY");

var d = new Date();
var localTime = d.getTime();

if (status_R >3200 && status_G > 3200){
    msg.payload = {state:"error",timestamp:localTime};
}else if (status_R >3200 && status_Y > 3200){
    msg.payload = {state:"finish",timestamp:localTime};
}else if (status_R > 3200){
    msg.payload = {state:"alarm",timestamp:localTime};
}else if (status_G > 3200){
    msg.payload = {state:"run",timestamp:localTime};
}else if (status_Y > 3200){
    msg.payload = {state:"stop",timestamp:localTime};
}else {
    msg.payload = {state:"other",timestamp:localTime};
}

return msg;

③State-trail

Groupはお使いのダッシュボードを指定してください。
Periodは表示する期間です。
Time Formatは表示形式です。
Stateは前のfunctionノードで返される文字列になりますので正確に入力してください。
Colorはお好みで。

完成です。うまくできましたでしょうか。
反映されるまで少し時間がかかるようですので、表示されないときは少し待ってみて下さい。
injectノードの繰り返し間隔にもよると思います。

chartグラフ

これはなくても良いですが、センサーの値がどういう風に入力されているかを確認するために作成してみました。

最初のAzureのノードの最後に付けます。

functionノード

3つあるfunctionノードにそれぞれの名前を付けます。

chartノード

グループはお使いのダッシュボードを指定して下さい。
その他の設定は画像を参考に変更してください。

部屋の明かりや、シグナルタワー上下の明かりの影響があるので、消灯しても0にはならない場合が多いです。

CSV保存

Node-Redは再起動するとそれまでのデータが消えてしまいますので、CSVデータにして残しました。

functionノード

グローバル変数を代入し、状態をIF文で返します。


var status_R = global.get("global_sensorValueR");
var status_G = global.get("global_sensorValueG");
var status_Y = global.get("global_sensorValueY");

if (status_R >3200 && status_G > 3200){
    msg.payload = "error";
}else if (status_R >3200 && status_Y > 3200){
    msg.payload = "finish";
}else if (status_R > 3200){
    msg.payload = "alarm";
}else if (status_G > 3200){
    msg.payload = "run";
}else if (status_Y > 3200){
    msg.payload = "stop";
}else {
    msg.payload = "other";
}

return msg;

Date/Time Formatterノード

joinノード

csvノード

fileノード

ファイル名は保存したいパスと最後に「ファイル名.csv」としてください。

さいごに

長くなりましたが、いかがだったでしょうか。
参考になれば幸いです。

コメント

タイトルとURLをコピーしました