初めてのNode-RED ノード作成編 ~その1 シンプルなノード~


公式のドキュメント(http://nodered.org/docs/creating-nodes/first-node) に従ってノードを自分で作ってみます。
シンプルなノードとして、入力された文字列を全て小文字に変換するノードを作成して実行するまでやってみましょう。


# ノードの作成
## ノードの構成要素
ノードは`js`と`html`ファイルから構成されています。
ざっくり言うとロジックとUIをそれぞれ担っています。
詳細は別の記事で書きますので今はそれだけわかればいいです。

## ノードの配置場所
ノードのコードの配置場所は2つのいずれかになります。

1. `~/.node-red/nodes`配下 ← デフォルトはこっち
1. 指定のディレクトリ

指定のディレクトリの場合はを使う場合は`setting.js`内に`nodesDir: '/foo/bar/nodes'`のように定義しておくことで指定のディレクトリを読みに行きます。
`setting.js`もデフォルトのファイルと指定のファイルを指定する事が出来ますが、
そのあたりはまた別の記事で詳しく書こうと思います。

## js
下記コードを適当なディレクトリを作成して`lower-case.js`として保存してください。

```lower-case.js
module.exports = function(RED) {
    function LowerCaseNode(config) {
        RED.nodes.createNode(this,config);
        var node = this;
        this.on('input', function(msg) {
            msg.payload = msg.payload.toLowerCase();
            node.send(msg);
        });
    }
    RED.nodes.registerType("lower-case",LowerCaseNode);
}
```

## HTML
下記コードを上記の`lower-case.js`と同じディレクトリに`lower-case.html`として保存してください。


```lower-case.html
<script type="text/javascript">
    RED.nodes.registerType('lower-case',{
        category: 'function',
        color: '#a6bbcf',
        defaults: {
            name: {value:""}
        },
        inputs:1,
        outputs:1,
        icon: "file.png",
        label: function() {
            return this.name||"lower-case";
        }
    });
</script>

<script type="text/x-red" data-template-name="lower-case">
    <div class="form-row">
        <label for="node-input-name"><i class="icon-tag"></i> Name</label>
        <input type="text" id="node-input-name" placeholder="Name">
    </div>
</script>

<script type="text/x-red" data-help-name="lower-case">
    <p>A simple node that converts the message payloads into all lower-case characters</p>
</script>
```


# Node-RED起動
ここで動かして確認みましょう。
カレントディレクトリが以下の様なディレクトリ構成であることを想定して話を進めます。

```
.
├── nodes
│   ├── lower-case.html
│   └── lower-case.js
└── settings.js
```
`settings.js`はデフォルトの`~/.node-red/setting.js`をコピーして前述した指定のノードディレクトリを設定されたものとします。
`node-red -u . `で実行します。`-u`オプションについても後ほど別記事で説明します。

起動したNode-REDの画面で今追加した`lower case`ノードが確認できるはずです。
![Pasted_Image_4_17_16__20_23.png](https://qiita-image-store.s3.amazonaws.com/0/11776/672cb6a5-a1a1-c666-bdc2-e04b893c6631.png "Pasted_Image_4_17_16__20_23.png")


# flowに追加して動作確認してみよう。
確認用にこんな感じのflowを作成してみました。
![Kobito.xtH7oB.png](https://qiita-image-store.s3.amazonaws.com/0/11776/4a13c4ca-98a6-b80f-fd24-c1abee1a63ee.png "Kobito.xtH7oB.png")

`inject`ノードの設定は以下のとおり
![Kobito.3S3ZCa.png](https://qiita-image-store.s3.amazonaws.com/0/11776/2b11c3a9-0cdd-ed6a-067e-9c7f2152b583.png "Kobito.3S3ZCa.png")

Deployして実行した結果が以下になります。
![Kobito.7IqSoP.png](https://qiita-image-store.s3.amazonaws.com/0/11776/86a5763f-fb2b-c9af-576f-20cd33dfb6fa.png "Kobito.7IqSoP.png")

うまくいってますね。

## 作成したノードを見る
では改めて作成したファイルの内容について見ていきましょう。まずはjsから
### js

```lower-case.js
module.exports = function(RED) {
    function LowerCaseNode(config) {
        RED.nodes.createNode(this,config); //ノード生成 ... ①
        var node = this;
        this.on('input', function(msg) { //ノードの入力に処理 ... ②
            msg.payload = msg.payload.toLowerCase(); //小文字変換... ③ 
            node.send(msg); //ノードの出力定義 ... ④
        });
    }
    RED.nodes.registerType("lower-case",LowerCaseNode); //ノード登録 ... ⑤
}
```

① `RED.nodes.createNode()`でノード生成
② `this.on('input', function)`でノードへの入力をトリガとした処理を行います。
![Kobito.xLPbTt.png](https://qiita-image-store.s3.amazonaws.com/0/11776/1cf71c99-bdb0-ceb9-a834-4dca3321efc3.png "Kobito.xLPbTt.png")

③ `toLowerCase()`で入力で渡された`msg.payload`の値に対して小文字変換します。
④ `node-send(msg)`で変換後の出力を返します。
![Kobito.ksYKri.png](https://qiita-image-store.s3.amazonaws.com/0/11776/8d3c3198-5f10-1829-6ef2-ec7ba910110f.png "Kobito.ksYKri.png")
⑤ 最後にこのノードタイプを定義し、Node-REDへ登録します。

### HTML
ちょっと長いので分割します。

```lower-case.html
//プロパティ定義
<script type="text/javascript">
    RED.nodes.registerType('lower-case',{ //ノードタイプ ...①
        category: 'function', //ノードカテゴリ ... ②
        color: '#a6bbcf', // ノード色 ... ③
        defaults: {
            name: {value:""} // 編集可能プロパティ ... ④
        },
        inputs:1, //ノード入力(0 or 1) ... ⑤
        outputs:1,//ノード出力(0 or more) ... ⑥
        icon: "file.png", // ノードアイコン ... ⑦
        label: function() {
            return this.name||"lower-case"; // ノードラベル ... ⑧
        }
    });
</script>
```
① ノードタイプ名です。前述のjsで`RED.nodes.registerType`で指定したノードタイプ名と合わせてください。
② ノードカテゴリです。デフォルトのNode-REDの画面だとinputやoutput、function、socialなどのカテゴリで分類してノードが表示されています。そのカテゴリを指定しています。
![Kobito.T4fVxH.png](https://qiita-image-store.s3.amazonaws.com/0/11776/50642507-e93c-a020-50f7-741612ef921b.png "Kobito.T4fVxH.png")

③ 画面に表示されているノードの色を指定します。
④ 編集可能プロパティを定義します。この例では`defaults`の`name`のみを定義してますが、自由に増やせます。編集可能プロパティでそのノードに自由に設定できる値を持たせることができます。
⑤ ノードの入力です。1を設定するとノードの左側に入力用のポートが表示されます。1か0で設定します。カテゴリ「input」のノードなどは基本的に自身が起点となるため、この値が0で、functionやoutputなどは1が設定されるのが想像できるかと思います。
⑥ ノードの出力です。0またはそれ以上の数値が設定できます。
⑦ アイコン画像名です。この例だとfile.pngはlower-case.jsと同じディレクトリに配置される事を想定します。
⑧ ノードのラベルです。この例のように編集可能プロパティに設定してない場合はノードタイプ名を設定するなどの定義が可能です。

```
//編集可能プロパティの編集画面定義 ... ①
<script type="text/x-red" data-template-name="lower-case">
    <div class="form-row">
        <label for="node-input-name"><i class="icon-tag"></i> Name</label>
        <input type="text" id="node-input-name" placeholder="Name">
    </div>
</script>

//ノードのヘルプテキスト ... ②
<script type="text/x-red" data-help-name="lower-case">
    <p>A simple node that converts the message payloads into all lower-case characters</p>
</script>
```
① 編集可能プロパティの編集画面定義です。この例のような定義をしておくと、ノードをダブルクリックした際に編集可能プロパティの編集画面が表示されます。
![Kobito.WdfGDU.png](https://qiita-image-store.s3.amazonaws.com/0/11776/b2146d94-3ab5-0ebc-517a-7923fa039ec6.png "Kobito.WdfGDU.png")

② ノードのヘルプテキストです。画面左のノードパレットでノードの上にマウスが重なった際にヘルプテキストが表示されるようになります。
![Kobito.E5lcsT.png](https://qiita-image-store.s3.amazonaws.com/0/11776/bb87d999-0073-155f-51ca-99d974fe40fa.png "Kobito.E5lcsT.png")

以上！