はじめに
やりたいこと
- Node-REDでどんなことがどこまでできるのかを調べる
- part4(自作ノード編)では、ノードを自作する方法を検証しました
- 今回はchoiceというランダムにくじを引く機能ノードを作成します
- ローカルインストールのみを行い、ライブラリへの公開は行いません
Node-REDのまとめ記事
参考にさせて頂いた記事
動作環境
- OS : CentOS Linux release 7.5.1804 (Core)
- Node-RED : v0.19.5
- docker : 18.09.1
- Node-REDイメージ : nodere/node-red-docker (IMAGE ID/d4f07b39b24d)
- Dockerを使いますが、ホストに立てても大丈夫かと思います。
免責事項
- 検証をして確実と思われる情報を載せておりますが、誤っている可能性もゼロではないので、参考程度にご利用ください
- 本来はコードと実行結果のコンソールログも載せるべきなのですが、数と量が多いので、一旦は画面イメージまでとさせてください。
調査結果
ローカルインストールの流れ
- settings.jsに読み込むノード用フォルダを追記する
- オリジナルノード用にhtmlとjsファイルを作成する
- Node-REDを再起動する
settings.jsの設定
- 以下の設定ファイルの個所にノード用フォルダを追加する
// settings.js
// XXXにノード用フォルダのパスを記載する
// Node-RED scans the `nodes` directory in the install directory to find nodes.
// The following property can be used to specify an additional directory to scan.
nodesDir: 'XXX',
新規ノードの作成
htmlファイル
- 外見や入出力のポートの数、ヘルプのメッセージを決める
<script type="text/javascript">
RED.nodes.registerType('Choice',{
category: 'function', //functionノードとして登録
color: '#a6bbcf', // 色
defaults: {
name: {value:""} // プロパティ
},
inputs:1, // 入力端子数
outputs:1, // 出力端子数
icon: "file.png", // アイコン
label: function() {
return this.name||"Choice"; // ラベル
}
});
</script>
<script type="text/x-red" data-template-name="Choice">
<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="Choice">
<p>くじを引く</p> // ヘルプのメッセージ
</script>
jsファイル
- 処理の実体を記述する
module.exports = function(RED) {
function ChoiceNode(config) { //関数の定義
RED.nodes.createNode(this,config);
var node = this;
this.on('input', function(msg) { // インプットに対応するイベント
// ここからくじ引きのロジックの本体
var result = "???"
var val = Math.floor( Math.random() * 4);
switch (val){
case 0:
result = "はずれ";
break;
case 1:
result = "10点が当たりました"
break;
case 2:
result = "50点が当たりました"
break;
case 3:
result = "100点が当たりました"
break;
default:
result = "はずれ";
break;
}
msg.payload = result;
node.send(msg);
});
}
RED.nodes.registerType("Choice",ChoiceNode); // イベントの登録
}