はじめてのNode-RED
Node-REDのプログラミングモデル
Node-RED User Group Japan 古城 篤
はじめてのNode-RED Ver.1.3.0対応版
自己紹介: 古城 篤(Atsushi Kojo)
➤ Node-RED User Group Japan 発起人(since 2015)
➤ 国連CEFACT日本代表メンバー IoT白書エディター
➤ 株式会社ウフル Chief Research Officer
18年前にCMSのSaaS(当時はASPと呼ぶ)を開発して
提供した時からエンドユーザー・コンピューティングに
興味を持ち、いつしかプログラミングの民主化を夢見て
現在も民主化活動を鋭意継続中!
Node-REDの概要
Node-REDをインストールした環境
(サーバ、PC、ラズパイなど)
Log Sensor
HTTP
MQTT
Other
HTTP
MQTT
Other
Node-REDの画面
パレット
ノード
ワークスペース
フロー
デバッグ
ウィンドウ
デプロイ
ボタン
Node-REDでのプログラミング
➤ データ操作
フローを流れるデータの加工やプロパティ操作を行う→
➤ 条件分岐
フローを流れるデータの条件によって処理を分岐する→
➤ シーケンス処理
フローを流れるデータにシーケンス処理を行う→
➤ モジュール
作ったフローを別のフローから呼び出す→
[要件]
あるCSVファイルから列Aの日付が今日の日付以降のデータだけ抜き取る。
いきなり実践問題
const fs = require('fs');
const csv = require('csv');
const getTime = require('date-fns/getTime');
fs.createReadStream(__dirname + '/test.csv')
.pipe(csv.parse({columns: true}, function(err, data) {
if (err) throw err;
data.forEach(line => {
let a = line.a.split('/');
let today = getTime(new Date());
let lineDate = getTime(new Date(a[0], a[1]-1, a[2]));
if (today <= lineDate) console.log(line);
})
}));
Node-REDでの設計
[設計]
1. 今日の日付を保持する
2. CSVファイルを読み込む
3. 行ごとのデータに分割
4. 行データを別プロパティへ退避する
5. 列Aの日付をタイムスタンプに変換
6. 退避した行データにタイムスタンプの新プロパティを作成
7. 列Aのタイムスタンプと今日のタイムスタンプを比較
8. 条件に該当するデータのみ退避を戻す
9. 条件に該当するデータのみ結合
1. 今日の日付を保持する(フロー作成日 2021/05/26)
Injectノードから流れてきたタイム
スタンプ(今日の日付)をフロー
変数 flow.today へ保持
2. CSVファイルを読み込む
Node-REDフローのデフォルトの
文字コードはutf8、ファイルの文
字コードが異なる場合は読み込む
文字コードを指定する必要がある
文字列として取得した
ファイルのCSVデータ
をcsvノードに渡すと
JSON化される CSVイメージ
3. 行ごとのデータに分割
JSON化されたCSVデータをsplit
ノードに渡すと行ごとのデータ
(配列の要素)に分割できる
デバッグイメージ
4. 行データを別プロパティへ退避する
この後、msg.payload.a の日付を
タイムスタンプに変換する処理を
行うために行データ全体を
msg.line へ一旦退避しつつ
変換処理対象の msg.payload.a
を msg.payload へ代入
5. 列Aの日付をタイムスタンプに変換
日付形式のデータをタイム
スタンプに変換してくれる
node-red-contrib-date を
インストールして配置
デバッグイメージ
6. 退避した行データにタイムスタンプの新プロパティを作成
日付形式のデータをタイム
スタンプに変換した値を
退避した元の行データの
新しいプロパティ line.c
として生成
7. 列Aのタイムスタンプと今日のタイムスタンプを比較
退避した元の行データの
新しいプロパティ line.c
と冒頭 flow.today に保持
していた今日のタイムスタ
ンプを比較
8. 条件に該当するデータのみ退避を戻す
条件に合致した msg だけ
流れてくるので msg.line
に退避していた値を
msg.payload に戻す
(ついでに不要になったプ
ロパティ c を削除)
9. 条件に該当するデータのみ結合

Node-REDのプログラミングモデル