Это нативный для Node-RED вариант передачи данных в проект «Народный мониторинг», т.к. для его реализации не требуются дополнительные узлы. Однако, с виду он немного более туманный, ибо в официальной инструкции написано что-то не до конца понятное… Но это только так кажется… если разобраться, что к чему.
Пример использования специального узла «node-red-narodmon» опубликован тут.
В этой цепочке используются следующие узлы, которых нет в стандартной поставке:
Это вторая версия цепочки, полностью переосмысленная и переработанная. Первая доступна в архиве.
В отличие от первой версии:
Цепочка запускается по таймеру раз в 5 минут1), считывает конфигурацию, о которой ниже, и делает нужное количество запросов к базе данных. Далее, если есть новые данные, они компонуются и отправляются в «Народный мониторинг», если нет, то, как говорится, и суда нет – ничего не происходит.
Состав отправляемой JSON-строки зависит от наличия новых данных, которые автоматически определяются по колонке «_id» соответствующей таблицы, и может быть полным или частичным.
Настройка работы цепочки производится в узле «Ввод параметров», который имеет следующую структуру:
[ { "table": "device_1", "columns": "temperature_c AS temperature, humidity" }, { "table": "device_2", "columns": "pressure" } ]
Необходимые для отправки колонки указываются через запятую. При желании можно переименовать колонки в выводе, использовав конструкцию «AS alias», как в примере выше.
Для отправки данных используется родной узел «mqtt out» со следующими настройками:
Путь до параметра | Значение | ||
---|---|---|---|
Сервер → | Соединение → | Сервер: | narodmon.ru |
ID клиента: | XX:XX:XX:XX:XX:XX2) | ||
Безопасность → | Имя пользователя: | <логин в проекте> | |
Пароль: | <личный код>3) | ||
Тема: | <логин в проекте>/<название устройства>/json4) |
Никаких других обязательных данных указывать или менять не нужно! Не знаю, почему такое расхождение с инструкцией на сайте проекта…
Если до этого использовали какой-либо другой вариант передачи данных на сервер, то после внесения изменений в поток, необходимо на сайте в свойствах устройства изменить протокол на MQTT, иначе данные будут игнорироваться!
[ { "id": "87cf2c5.9c165d", "type": "comment", "z": "551f568e.e62c18", "name": "Отправка данных на narodmon", "info": "", "x": 190, "y": 580, "wires": [] }, { "id": "8332b0ad.531ea", "type": "mqtt out", "z": "551f568e.e62c18", "name": "Передача данных", "topic": "nikolays/VND 22/json", "qos": "", "retain": "", "broker": "72c3b2f6.2ae94c", "x": 710, "y": 760, "wires": [] }, { "id": "d88ac30a.42feb", "type": "inject", "z": "551f568e.e62c18", "name": "Периодический запуск", "props": [], "repeat": "305", "crontab": "", "once": true, "onceDelay": "1", "topic": "", "x": 170, "y": 640, "wires": [ [ "5d6eea0c.4d6d24" ] ] }, { "id": "dd2a836b.d64a4", "type": "sqlite", "z": "551f568e.e62c18", "mydb": "dbb6e10a.23844", "sqlquery": "msg.topic", "sql": "", "name": "Запрос к базе данных", "x": 440, "y": 700, "wires": [ [ "7f4584c6.2f61cc" ] ] }, { "id": "c6b04d86.596db", "type": "change", "z": "551f568e.e62c18", "name": "Подготовка запроса", "rules": [ { "t": "set", "p": "topic", "pt": "msg", "to": "\"SELECT _id, \" & datasets[0].columns & \" FROM \" & datasets[0].table & \" ORDER BY _id DESC LIMIT 1\"", "tot": "jsonata" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 160, "y": 700, "wires": [ [ "dd2a836b.d64a4" ] ] }, { "id": "5d6eea0c.4d6d24", "type": "change", "z": "551f568e.e62c18", "name": "Ввод параметров", "rules": [ { "t": "set", "p": "datasets", "pt": "msg", "to": "[{\"table\":\"snzb-02\",\"columns\":\"temperature AS Te, humidity AS Hy\"},{\"table\":\"bme680\",\"columns\":\"pressureSt AS Pst, pressureSl AS Psl, pressureBt AS Pbl\"}]", "tot": "json" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 430, "y": 640, "wires": [ [ "c6b04d86.596db" ] ] }, { "id": "7f4584c6.2f61cc", "type": "change", "z": "551f568e.e62c18", "name": "Обработка данных", "rules": [ { "t": "move", "p": "payload[0]._id", "pt": "msg", "to": "current_id", "tot": "msg" }, { "t": "set", "p": "telemetry", "pt": "msg", "to": "current_id > ( $type( $lookup( $flowContext( \"last_id\" ), datasets[0].table ) ) = \"number\" ? $lookup( $flowContext( \"last_id\" ), datasets[0].table ) : current_id ) = true ? $merge( $append( telemetry, payload ) ) : $merge( telemetry )", "tot": "jsonata" }, { "t": "set", "p": "last_id", "pt": "flow", "to": "$merge( [ $flowContext( \"last_id\" ), { $.datasets[0].table: current_id } ] )", "tot": "jsonata" }, { "t": "delete", "p": "datasets[0]", "pt": "msg" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 710, "y": 700, "wires": [ [ "b887ba10.f4dd28" ] ] }, { "id": "b887ba10.f4dd28", "type": "switch", "z": "551f568e.e62c18", "name": "Маршрутизация", "property": "payload", "propertyType": "msg", "rules": [ { "t": "jsonata_exp", "v": "$exists( datasets[0] )", "vt": "jsonata" }, { "t": "jsonata_exp", "v": "$exists( telemetry )", "vt": "jsonata" } ], "checkall": "false", "repair": false, "outputs": 2, "x": 150, "y": 760, "wires": [ [ "c6b04d86.596db" ], [ "7812260c.cbdb68" ] ], "outputLabels": [ "Нужен еще цикл", "Есть данные для публикации" ], "info": "Если массив \"datasets\" не пустой, значит не все таблицы были обработаны, уходим на следующий круг.\n\nЕсли сообщение \"telemetry\" отсутствует, значит нет данных для публикации, завершаем." }, { "id": "7812260c.cbdb68", "type": "change", "z": "551f568e.e62c18", "name": "Перемещение нагрузки", "rules": [ { "t": "move", "p": "telemetry", "pt": "msg", "to": "payload", "tot": "msg" }, { "t": "delete", "p": "datasets", "pt": "msg" }, { "t": "delete", "p": "current_id", "pt": "msg" }, { "t": "set", "p": "topic", "pt": "msg", "to": "Bye-Bye!", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 430, "y": 760, "wires": [ [ "8332b0ad.531ea" ] ] }, { "id": "72c3b2f6.2ae94c", "type": "mqtt-broker", "name": "narodmon", "broker": "narodmon.ru", "port": "1883", "clientid": "E0:3F:49:13:58:61", "usetls": false, "compatmode": false, "keepalive": "60", "cleansession": true, "birthTopic": "", "birthQos": "0", "birthPayload": "", "closeTopic": "", "closeQos": "0", "closePayload": "", "willTopic": "", "willQos": "0", "willPayload": "" }, { "id": "dbb6e10a.23844", "type": "sqlitedb", "db": "c:\\noderedDB\\telemetry.db", "mode": "RWC" } ]
Обсуждение