目的
Node-REDはビジュアル言語なので、他の言語のようなユーティリティは作りにくそうに思えます。しかし、プログラムはflows.jsonというJSONファイルに保存されますので、基本的な構造さえわかれば色々なツールを作ることができます。今回は、flows.jsonのフォーマットのうち、解析に役立ちそうな内容を説明します。
flows.json
Node-REDのプログラムをデプロイするとユーザディレクトリ(デフォルトは~/.node-red)に出力されるのがflows.jsonです。このjsonファイルはプログラムそのもので、タブとタブ内のノード(モジュール)などのオブジェクトの各プロパティ(設定値)が保存されています。
flows.jsonは書き出しメニューから、全体、タブ単位、選択部分をクリップボードやファイルに書き出すこともでき、整形出力も可能です。
すべては一つの配列に
複数の種類のオブジェクトが、すべて一つの配列に並んでいて、種類(type)で区別されます。種類ごとに配列を分けた方がわかりやすいかなとも思いますが、
- 階層が深くならない
- すべてのオブジェクトを同じように扱える
- 拡張性が高い
といった利点があると思います。
配列の並び順
配列の並び順は、タブ、グループ、オブジェクトの順で、同じ種類の中は基本的に作成した順に並んでいます。ただし、タブは表示位置を変えると表示順に並べ変えられます。
オブジェクトはidで識別
タブ、グループ、ノードなどオブジェクトはidで識別されます。ノード間の接続はオブジェクトではないのでidはなく、接続先のノードのidが示されるだけです。
ノード間の接続とタブは一方向、グループとリンクは双方向
ノード間の接続は接続元のwiresで、タブはノードのzで一方向に示されます。グループはグループのnodesとノードのg
で、リンクはlink in、link out、link callのlinksで双方向に示されます。エディタの操作の都合浄双方向にしないと不便なのでしょう。
なお、link outはmodeによってlinkとreturnが示されます。
タブの名前はlabel、それ以外はname、説明はinfo
flows.jsonを解析すると名前を使いたくなると思います。タブの名前はlabel、それ以外はnameで示されます。なお、、説明はすべてinfoです。
今は昔
かつてのNode-REDはflows.jsonのバックアップファイルがなく、起動時の処理で無限ループになると整形されていないflowsjsonを編集して直すなどしていました。今はそんな必要はなくなりましたが、整形されたJSONはわかりやすいので、ぜひ一度覗いてみてください。Node-REDの処理の都合や様々なツールへの応用が思い浮かぶでしょう。
サンプルフロー
[#Node-RED]flows.jsonからノード一覧を作成する
[#Node-RED]flows.jsonからリンクノード一覧を作成する