先日動かしたBME280の値をダッシュボードへ表示させようとしたら意外と苦労したので、その記録を残しておきます。
私と同じような、Javascriptが分からないNode-RED初心者のお役に立てば幸いです。
ダッシュボードは、少し前からチラチラと目にしていたので、私も使ってみようと思いました。
『node-red-dashboard』のノードを追加します。
追加すると、たくさんのノードが追加されます。
今回使用したのは、text、Gauge、chartの3つです。
これらに値を送る場合、基本的には数字のデータを送ることになります。
ただ、センサから複数の測定値が得られる場合、どうやって1つだけ値を抽出するのか色々と考えました。
色々な記事を探していると、どうやらchangeノードを使うようです。
主に参考にさせて頂いた記事はこちら。
(参考)Qiita @takeyan Node-REDにダッシュボードを追加してセンサーデータを可視化する
(参考)YAMANEの世界 BME280センサー
先日作ったフローに、changeノードを付け加えて数値だけ取得できるか実験しました。
前回の記事はこちら。
1つ目の参考記事の通り、センサの直後にchangeノードを繋げました。
changeノードの中身は下記のようにしました。
change
湿度データだけを取得したいので、「msg.payload.humidity」としています。
payloadの後ろの文字列は、センサから出力される結果を元に入れました。
結果
うまく湿度データのみ取得できました!
次に、jsonノード後にchangeノードを入れるパターンです。
実は、このままだとうまく数値が取り出せませんでした。
色々と試したところ、jsonノードの設定を変更すれば数値を1つだけ取得できることが分かりました。
jsonノードの設定は、基本的には3種類。
(下にあるチェックを入れると4種類)
初期値では、『JSON文字列とオブジェクト間の相互互換』という設定になっています。
このままだとうまく数値が取得できませんでした。
これら3種類の結果を残しておきます。
json 『JSON文字列とオブジェクト間の相互互換』の場合
結果はこちら。
上の赤枠がjsonノード直後のデバッグノードの出力で、下の赤枠がchangeノード直後の出力結果です。
changeノード直後の結果が「undefined」になっています。
数値が出力されていないのでNG
json 『常にJSON文字列に変換』の場合
結果
どちらの出力も、『JSON文字列とオブジェクト間の相互互換』の場合と同じ結果でした。
NG
json 『常にJavaScriptオブジェクトに変換』の場合
こちらの場合、チェックボックスの選択が無くなります。
結果
changeノード直後で、数値が1つだけ出力できました!
jsonノード直後の結果も、先ほどと異なっています。
OK
ちなみに、『JSON文字列フォーマット』にチェックを入れるとどうなるのか確認してみました。
json 『JSON文字列フォーマット』にチェックを入れた場合
結果
changeノード後の出力は「undefined」で、jsonノード直後の結果に妙な空白が見られます。
保存されたファイルを確認してみると、分かりやすいことになっていました。
人間が見た場合に分かりやすい形式になって保存される、と理解しても良いのかな?
これはこれで使う場面がありそうなので覚えておこう。
・・・で、ようやくダッシュボードに表示させる準備が整いました!
何気に2日ほど悩んでここまでたどり着いたんですよね。。
ダッシュボードへの表示は、このようにしました。
jsonノード後にchangeノードを入れ、そのあとにtext、gauge、chartの3つのノードを繋げています。
それぞれのノードの設定は、基本的に名称を変更したくらいで、初期設定のまま使いました。
設定画面を残しておきます。
text
Labelを入力した後、Groupの鉛筆マークのボタンをクリックします
ここでも名前を入れます。
これがダッシュボードのタイトルのようなものになります。
一旦設定すると、他のノードにも自動的に反映されていました。
gauge
Labelを入れ、Rangeのmaxを100に変更しました(初期値は10)
今回は湿度の表示をしたかったので0~100にしたけど、ここは測定項目の値によって変更すれば良いと思います。
chart
こちらはLabelを入力しただけ。
あとはデプロイをしてダッシュボードを表示させます。
ダッシュボードのノードを追加すると、デバッグボタンの横にグラフマークのボタンが増えています。
3つのタブの右にあるマークを押すと、ダッシュボードの画面が開きます。
こんな感じで!
色々と設定できるようですが、初期値のままでも結構きれいに表示してくれます。
あとは小数点以下の桁が多すぎるのが気になるので整えます。
ここはfunctionノードを使います。
changeノードの後ろにfunctionノードを入れます。
参考記事のとおり入力しますが、私は小数点第1位までの表示としました。
function
1行目だけを追記しています。
msg.payload = (msg.payload.toFixed(1));
2行目は初めから記入されていましたのでそのまま。
ついでに温度と気圧の情報も取れるようにchangeノードを追加して、下記のようなフローにしました。
あと、ダッシュボードの配置タブで、表示の順番を整えます。
各項目をドラッグ&ドロップで入れ替えられるので簡単。
こんな感じに。
結果
これはいい感じなのでは!??
ダッシュボードでは横軸に時刻が入っていますが、実は元データ(jsonファイル)には時刻が記録されていないんですよね。
なんか不思議な感じ。
せっかくなので、次はjsonファイルやcsvファイルに時刻データを追記してみたいですね。
取得時刻が分からないデータとか利用価値が無いので、やらなくてはいけない…!(使命感)
うまくいったらまとめたいと思います。