NodeRED: Конфигурация потеряна после изменения потоков. json - PullRequest
1 голос
/ 31 января 2020

У меня есть рабочий процесс с использованием MQTT-издателя и узлов подписки и одной конфигурации посредника. Все работает.

Перед запуском NodeRED мне нужно изменить ip и порт брокера MQTT с переменными окружения MQTT_BROKER_IP и MQTT_BROKER_PORT.

. Для этого я использую

sed -i -e "s/^\([[:blank:]]*\"broker\":[[:blank:]]*\)\"[^\"]*\",/\1\"$MQTT_BROKER_IP\",/g" /data/flows.json
sed -i -e "s/^\([[:blank:]]*\"port\":[[:blank:]]*\)\"[^\"]*\",/\1\"$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

Когда я go в Редактор NodeRED, открывайте узлы MQTT, сохраняйте их, ничего не изменяя, и развертывайте поток, все работает, и узлы MQTT получают зеленый «подключенный» свет.

Почему это происходит? Как мне правильно изменить потоки. json за пределами NodeRED?

1 Ответ

1 голос
/ 01 февраля 2020

Проблема в том, что поле 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.

Открытие / сохранение, вероятно, работает, потому что у вас определен только один mqtt-broker поэтому он будет выбран по умолчанию в списке, поэтому исправляет эту запись при развертывании.

Если вы хотите делать подобные вещи, вам потребуется нечто более сложное, которое знает о записи type в каждом JSON запись обновляется.

...