Node-REDのfunctionノードをフローライブラリに登録できるオリジナルノードに変換してみよう


 こんにちは、(株)日立製作所 研究開発グループ サービスコンピューティング研究部の横井一仁です。

 本ドキュメントでは、ノード開発容易化ツール「Node generator」の使い方をご紹介します。前の記事で紹介した画像認識を行うNode-REDのfunctionノードを、共有可能なオリジナルノードに変換してみます。

Node generatorとは

 Node generatorとは、Node-REDのオリジナルノードを自動生成するコマンドラインツールです。

 JavaScriptコードを書いたfunctionノードを共有可能なオリジナルノードに変換したり、Swagger Codegenの様にOpenAPIドキュメント(Swagger)からノードのソースコードを生成したりできます。

 日立が開発し、OSS化した本ツールは、現在OpenJS Foundation (Linux Foundation)管理下のNode-RED公式のサブプロジェクトとなっており、開発コミュニティと協力して機能拡張が行われているOSSになっています。

 本ツールは下記サイトで紹介されている様に、CiscoやIBMなどのNode-RED活用企業でも活用されています。

functionノードからオリジナルノードを生成

 本ドキュメントで用いた動作環境は、Node-REDをインストール済のWindows環境です。Node generatorはmacOSやLinuxにも対応していますので、その場合は適宜ファイルパス等を変更して試してみてください。

(1) functionノードのコードをライブラリに書き出す

 まず、functionノードのJavaScriptコードをファイルとして書き出す操作を行います。

 本操作は、functionノードのノードプロパティ上にある本のマークのボタンをクリックし、「ライブラリへ保存」を選択すればOKです。ライブラリにコードを書き出すと、Node-REDのホームディレクトリの下の「lib¥functions」ディレクトリ(Windowsの場合は「C:¥Users¥<ユーザ名>¥.node-red¥lib¥functions」)にJavaScriptのコードが入ったファイルが書き出されます。

(2) Node generatorをインストール

 管理者モードでコマンドプロンプトを起動し、ビルドツール(Windowsの場合のみ)とNode generatorをインストールします。

npm install -g node-red-nodegen
npm install -g windows-build-tools    (Windowsの場合のみ)

(3) 管理者モードのコマンドプロンプトを閉じる

(4) コマンドプロンプトを開き、ホームディレクトリへ移動

 ユーザモードでコマンドプロンプトを開き直し、cdコマンドを実行してホームディレクトリに移動します。

cd

(4) functionノードのJavaScriptコードからノードを生成

 Node generatorを用いてfunctionノードのJavaScriptコードからノードを生成します。

node-red-nodegen .node-red¥lib¥functions¥image-segmenter.js

 以上でノードの作成ができました。カレントディレクトリ内にnode-red-contrib-image-segmenterディレクトリが生成されているはずです。このディレクトリの中には、以降の手順で編集するpackage.json(モジュールの情報が記載されているファイル)とnode.js(Node-REDランタイムで実行されるノードのソースコードファイル)が含まれています。

 次にこのノードをNode-REDから呼び出せるように設定してみます。

(5) 生成されたディレクトリに移動

cd node-red-contrib-image-segmenter

 今回は、外部モジュールを利用しているため、追加で下記(5-A)(5-B)の手順も行います(functionノードが外部のnpmモジュールを使っていない場合は(5-A)(5-B)の手順はスキップしてください)。

(5-A) package.jsonファイルに依存関係を追加(17行目付近)

  "keywords": [
    "node-red-nodegen"
  ],
  "dependencies": {     <- 依存関係を追加
    "@codait/max-image-segmenter": "0.1.4"  <- 依存関係を追加
  },                    <- 依存関係を追加
  "devDependencies": {
    "node-red": "0.18.7",

(5-B) node.jsファイルに定義を追加(206行目付近)

        }
        sandbox.global.set("imageSegmenter", require('@codait/max-image-segmenter'));  <- vm.createContext()の前に定義を追加
        var context = vm.createContext(sandbox);
        try {
            this.script = vm.createScript(functionText, {

(6) 依存モジュールのインストール、シンボリック作成の準備

npm link

(7) Node-REDのホームディレクトリに移動

cd
cd .node-red

(8) シンボリックリンク作成

npm link node-red-contrib-image-segmenter

(9) Node-REDを起動

 node-redコマンドを用いてNode-REDを起動します。もし起動中の場合はCtrl+cで終了してから再度Node-REDを起動し直してください。

node-red

 Node-REDフローエディタ( http://:<ポート番号> )にアクセスすると、機能カテゴリの中に青色のimage-segmenterノードが登場しているはずです。

 本ノードは、書き出し元のfunctionノードと同様に、前にnode-red-contrib-browser-utilsモジュールのfile injectノード、後ろにdebugノードをつなぐことで、画像認識を行うことができます。

最後に

 Node-REDは、非エンジニアでも開発できるビジュアルプログラミングツールであるため、コーディングの能力が必要となるfunctionノードを多用するとNode-REDの良さが薄れてしまいます。Node generatorを用いて、functionノードを再配布可能なノードに変換し、フローライブラリに登録することで、非エンジニアの方も再利用ができる様になるでしょう。

 Node generatorの使い方については、詳細の日本語ドキュメントも公開していますので、ぜひ見てみてください。