Node-REDのフローをpub/subして複数のゲートウェイをまとめてプログラム更新する

同じNode-REDのソフトウエアを複数のゲートウェイで動かしたい状況になったので、RubyのMQTTを使用してNode-REDのフローを更新するプログラムを作りました。

githubのリポジトリ:
https://github.com/NaotakaSaito/node-red-flow-ctrl

使用するための条件

  1. 管理者権限で実行するときにパスワードが必要だと正しく実行することができません。
  2. node-redのdaemon起動スクリプトが必要です。Raspberry Piの場合は予めスクリプトがインストールされており、以下のコマンドで起動することができます。以下のコマンドを入力してもnode-redの起動ができない場合は、本パッケージに含まれている"nodered.service"を使用してください。 sudo systemctl start nodered

ファイルの説明

ファイル名 用途
main-sub.rb MQTT brokerからNode-REDのフローを受信してNode-REDに反映するメインのプログラムです。
node-red-flow-ctrl.service main-sub.rbを起動するdaemonスクリプトです。
setting.json main-sub.rbのパラメータ用ファイルです
nodered.service node-redのdaemon起動スクリプトです。

setting.jsonのパラメータの確認

setting.jsonの内容を使用する内容に変更してください。
以下のサンプルはAWS-IOTを使用する場合のサンプルになります。
不要であれば、ssl, cert_file, key_file, ca_fileは削除してください。

{
    "backup": false,
    "mqtt" : {
        "topic": "flow/publish",
        "connection": {
            "host": "endpoint.iot.ap-northeast-1.amazonaws.com",
            "port": 8883,
            "ssl": true,
            "cert_file": "cert.pem",
            "key_file": "private.key",
            "ca_file": "root-CA.crt"
        }
    },
    "node-red": {
        "flows" : "/home/pi/.node-red/flows_raspberrypi.json",
        "start" : "sudo systemctl start nodered",
        "stop" : "sudo systemctl stop nodered",
        "interval": 1
    }
}

パラメータ

パラメータ 用途
backup フローのバックアップの有無を指定してください。
mqtt MQTTのパラメータです。
mqtt.topic subscribするMQTTのtopicを指定してください。
mqtt.connection rubyのMQTTに渡すパラメータです。
node.red node-redを制御するためのパラメータです。
node-red.flows node-redのフローファイルを指定してください。
node-red.start node-redを起動するためのスクリプトを指定してください。
node-red.stop node-redを停止するためのスクリプトを指定してください。
node-red.interval node-redを起動する前のインターバルです。

実行方法

初めて実行する場合、rubyのMQTTをインストールしてください。

sudo gem install mqtt

実行方法

ruby main-sub.rb

daemon起動の方法

daemon起動用スクリプトのインストール

copy node-red-flow-ctrl.service /etc/systemd/system/

起動方法や停止方法

sudo systemctl start node-red-flow-ctrl
sudo systemctl stop node-red-flow-ctrl
sudo systemctl status node-red-flow-ctrl

オートスタートの方法

sudo systemctl enable node-red-flow-ctrl

nodered.serviceについて

nodered.serviceの内容を確認してください。
WorkingDirectory, ExecStart, Userなどのパラメータが正しくないと正しく動作しません。

[Service]
Environment="NODE_OPTIONS=--max-old-space-size=128"
Environment="NODE_RED_OPTIONS=-v"
ExecStartPre=/bin/sleep 5
ExecStart=/usr/bin/node-red
WorkingDirectory=/home/pi/.node-red/
User=pi
Group=root
Nice=10
SyslogIdentifier=Node-RED
StandardOutput=syslog
Restart=on-failure
KillSignal=SIGINT

[Install]
WantedBy=multi-user.target

ローカルのフローをpublishする方法

以下のようにシンプルなフローを作成すればMQTT brokerにフローをpublishすることができます。

nodered_flow.png

file inノードはこのように設定を行ってください。
injectionでトリガーが発生すると、ファイルの内容をtextで出力し、それをMQTT brokerにpublishします。

fileinnode.png

スクリプトとフローをpublishする場合

このようにbatchとflowsというkeyのJSON形式でpublishすると、flosのフローをnode-redに適用しつつ、batchを実行してnode-redを再起動します。これでnodeの変更・追加なども行うことができます。

{
    "batch": "cd ~\ncd .node-red\nls\n",
        "flows" : node-redのフロー
}
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.