ようやく色々なセンサからデータを取ってくることができるようになったので、そのデータを結合することを覚えたいと思います。
あとは、データ取得日時もしっかりと記録したい。
そんなわけで、本日は下記2点を行いました。
- データ取得日時の記録
- 日時データと複数のセンサの値を結合
まずはデータ取得日時から。
Node-REDのタイムスタンプがあるので、何も問題無くいけるかと思ったらそうでもなかった。
色々と調べてみると、「node-red-contrib-moment」というものを使うと良いらしいことが分かりました。
まずはノードの追加ですね。
似たようなのがたくさん出てきますが、上記に書いた「node-red-contrib-moment」というのが最近まで更新されていることがわかります。
他のは数年前で更新が止まっていました。
うまく追加できると、ノードが2つ追加されます。
今回使ったのは、「Date/Time Formatter」というノードです。
まずはシンプルに下記のようなフローを作成。
ノードの中身は下記のようにしました。
Date/Time Formatter
Output Formatは、初めは空白でしたが、上記のように入れました。
こうすることで、出力される日時の形式が設定できます。
こんな感じ。
例えば、「/」を「-」や「.(ドット)」に変えても良いですし、その辺はお好みで。
次に、複数のデータを結合するのですが、それは「Join」ノードを使いました。
これは初めから入っているノードなので、追加は無し。
参考にした記事はこちら。
今回結合したいデータは6個。
- データ取得日時 :1個
- BME280 の 温度・湿度・気圧データ :3個
- MH-Z19C の CO2濃度・温度データ :2個
各センサからのデータ取得は以前に確認済みですので、これらを繋げるだけ。
以前の記事は下記を参照ください。
今回のハードはこんな感じになりました。
RaspberryPi + BME280 + MH-Z19C
以前使ったのをそのまま足しただけ。
配線などは以前の記事を参照してください。
フローは、下記のようにしました。
一見複雑そうですが、赤色の枠で囲った部分が今回新たに追加したノードです。
Joinノードは色々と触っていって、ようやくうまくいく方法を見つけた感じです。
内容は、センサノードからの出力と日時データはそのまま結合できないので、センサの出力は数字のみを取り出してから結合、というフローになっています。
Join
初期設定から3か所変更しています。
- 動作 :「手動」 (初期設定は「自動」)
- 出力 :「配列」 (初期設定は「文字列」)
- 指定数のメッセージパーツを受信後 :6 (初期設定は空白)
今回はCSVファイルに出力することにしましたので、出力は配列が都合が良かったです。
カンマ区切りなので、CSVと相性が良いですね。
「6」は結合するデータ数になるので、ここは場合によって変えないといけないです。
出力形式は色々ありますが、オブジェクト同士なら「結合オブジェクト」も使えるのかもしれない。
まだやってないので何とも言えませんが。
これらがうまく動くと、下記のような出力が得られました。
Joinノード後で青い色になっているのは、MH-Z19Cの出力ですね。
赤色が文字列、青色が数字、になっているような気がする。
そして、最終的には下記のようなCSVファイルが出力されました。
空白が入っているのが気になるーーーー。
無駄な改行を消せば直りそうだけど、今日は気力切れ。
手動でサクッと消してグラフ化してみました。
よし!
こういうのをやりたかった!!
今回はかなり有益なことができた気がします。
「コード書いたほうが早くね?」というツッコミもあるかもしれませんが、コードが書けない人でもここまで出来るNode-REDは本当に凄い。
この記事が誰かの助けになれば幸いです。