どういう時に使う?
MQTTのInputノードのtopicのフィルターはハードコードしなければならず、動的には変更できません。
とある通り、MQTTのTopicは変数などで定義することはできません。
IoT機器を1台しか使わない場合は問題になることはないのですが、複数のIoT機器を同じソースで扱いたい場合に厄介です。
例えば、MQTT Input ノードをトリガーにして raspberry pi
で何らかの操作をする場合、機器ごとにTopicを変えないといけなくなってしまいます。(そうじゃないと全ての機器が一斉に動いてしまします)
となると、Gitなどを使ったソース管理や一括変更ができずに機器が増えれば増えるほど変更のハードルが上がってしまうことになります
では、Node-REDはどうやって設定する?
これを回避する方法のひとつは、$(MY_TOPIC) のような環境変数をtopicにセットすることです。 Node-REDのランタイムが開始したとき、ノードのプロパティがその環境変数に置換されます。 これによりtopicの変更ができますが、 環境変数の変化を反映するにはNode-REDの再起動が必要です。
つまり、下記の様に設定すれば良いわけです。
どうやって環境変数を設定する?
サービスとして実行されている場合は、ユーザーはログインしていないので .bashrc は実行されません。
この様な場合はsystemdスクリプトの/etc/systemd/nodered.service.dで設定できます。ただ、これには Node-REDのアップデートで上書きされてしまうため、より良い方法論としては
sudo systemctl edit nodered
を使うことの様です。
このコマンドを実行することでエディタが起動されます。
あとは
[Service]
Environment="TOPIC=test"
と書き込むことで環境変数として読み込むことができます。
(上記の例の場合はTOPICという環境変数にtest
という値を設定)
きちんと環境変数を読み込むことができたかを確認するためには change
ノードを使うのが便利です。
下記のフローでdebugノードに設定した環境変数が表示されれば成功です。
上記のフロー
[{"id":"bfda43e4.a9b1a","type":"inject","z":"136cfccf.a00ab3","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":150,"y":80,"wires":[["60034503.56516c"]]},{"id":"60034503.56516c","type":"change","z":"136cfccf.a00ab3","name":"環境変数を設定","rules":[{"t":"set","p":"payload","pt":"msg","to":"TOPIC","tot":"env"}],"action":"","property":"","from":"","to":"","reg":false,"x":390,"y":80,"wires":[["ec1ab5ce.8ff598"]]},{"id":"ec1ab5ce.8ff598","type":"debug","z":"136cfccf.a00ab3","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":620,"y":80,"wires":[]}]
参考
公式のドキュメントが参考になります。
日本語版はこちら
ユーザコミュニティでのやりとり(英語)