NodeRED:修改 flows.json 后配置丢失
NodeRED: Configuration lost after modifying flows.json
我有一个使用 MQTT 发布者和订阅节点以及一个代理配置的工作流程。一切正常。
在启动 NodeRED 之前,我必须使用环境变量 MQTT_BROKER_IP
和 MQTT_BROKER_PORT
.
更改 MQTT 代理 ip 和端口
为此我使用
sed -i -e "s/^\([[:blank:]]*\"broker\":[[:blank:]]*\)\"[^\"]*\",/\"$MQTT_BROKER_IP\",/g" /data/flows.json
sed -i -e "s/^\([[:blank:]]*\"port\":[[:blank:]]*\)\"[^\"]*\",/\"$MQTT_BROKER_PORT\",/g" /data/flows.json
替换有效。
现在的问题是,当 NodeRED 启动时,日志文件中出现错误:
[info] Starting flows
[error] [mqtt out:2b1fba1a.efa24e] missing broker configuration
[error] [mqtt in:58c7bd6b.0e8664] missing broker configuration
当我转到 NodeRED 编辑器时,打开 MQTT 节点,保存它们而不修改任何内容并部署流程,一切正常,MQTT 节点亮起绿色 "connected"。
为什么会这样?我必须如何正确修改 NodeRED 外部的 flows.json?
问题是 json 字段 broker
被流程中的多个条目用于不同的事情。例如
您正在尝试编辑的 mqtt-broker
配置节点:
{
"id": "c2ba2a60.80ae38",
"type": "mqtt-broker",
"z": "",
"name": "",
"broker": "192.168.1.116",
"port": "1883",
"clientid": "",
"usetls": false,
"compatmode": false,
"keepalive": "60",
"cleansession": true,
"birthTopic": "",
"birthQos": "0",
"birthPayload": "",
"closeTopic": "",
"closeQos": "0",
"closePayload": "",
"willTopic": "",
"willQos": "0",
"willPayload": ""
}
和 mqtt-in
节点:
{
"id": "98d0e95b.c28c2",
"type": "mqtt in",
"z": "a4de5120.cd3f58",
"name": "",
"topic": "#",
"qos": "0",
"datatype": "auto",
"broker": "c2ba2a60.80ae38",
"x": 190,
"y": 80,
"wires": [
[]
]
}
如您所见,当您 运行 您的 sed 脚本时,它也会更改 broker
mqtt-in
节点中指向 mqtt-broker
的条目。
open/save 可能有效,因为您只定义了一个 mqtt-broker
,因此它将默认在列表中被选中,因此在您部署时修复该条目。
如果你想做这种事情,你需要更复杂的东西,它知道它正在更新的每个 JSON 条目中的 type
条目。
我有一个使用 MQTT 发布者和订阅节点以及一个代理配置的工作流程。一切正常。
在启动 NodeRED 之前,我必须使用环境变量 MQTT_BROKER_IP
和 MQTT_BROKER_PORT
.
为此我使用
sed -i -e "s/^\([[:blank:]]*\"broker\":[[:blank:]]*\)\"[^\"]*\",/\"$MQTT_BROKER_IP\",/g" /data/flows.json
sed -i -e "s/^\([[:blank:]]*\"port\":[[:blank:]]*\)\"[^\"]*\",/\"$MQTT_BROKER_PORT\",/g" /data/flows.json
替换有效。
现在的问题是,当 NodeRED 启动时,日志文件中出现错误:
[info] Starting flows
[error] [mqtt out:2b1fba1a.efa24e] missing broker configuration
[error] [mqtt in:58c7bd6b.0e8664] missing broker configuration
当我转到 NodeRED 编辑器时,打开 MQTT 节点,保存它们而不修改任何内容并部署流程,一切正常,MQTT 节点亮起绿色 "connected"。
为什么会这样?我必须如何正确修改 NodeRED 外部的 flows.json?
问题是 json 字段 broker
被流程中的多个条目用于不同的事情。例如
您正在尝试编辑的 mqtt-broker
配置节点:
{
"id": "c2ba2a60.80ae38",
"type": "mqtt-broker",
"z": "",
"name": "",
"broker": "192.168.1.116",
"port": "1883",
"clientid": "",
"usetls": false,
"compatmode": false,
"keepalive": "60",
"cleansession": true,
"birthTopic": "",
"birthQos": "0",
"birthPayload": "",
"closeTopic": "",
"closeQos": "0",
"closePayload": "",
"willTopic": "",
"willQos": "0",
"willPayload": ""
}
和 mqtt-in
节点:
{
"id": "98d0e95b.c28c2",
"type": "mqtt in",
"z": "a4de5120.cd3f58",
"name": "",
"topic": "#",
"qos": "0",
"datatype": "auto",
"broker": "c2ba2a60.80ae38",
"x": 190,
"y": 80,
"wires": [
[]
]
}
如您所见,当您 运行 您的 sed 脚本时,它也会更改 broker
mqtt-in
节点中指向 mqtt-broker
的条目。
open/save 可能有效,因为您只定义了一个 mqtt-broker
,因此它将默认在列表中被选中,因此在您部署时修复该条目。
如果你想做这种事情,你需要更复杂的东西,它知道它正在更新的每个 JSON 条目中的 type
条目。