Инструменты пользователя

Инструменты сайта


iot:software:node-red:flows:telemetry_saving:narodmon:mqtt

Передача данных через MQTT

Это нативный для Node-RED вариант передачи данных в проект «Народный мониторинг», т.к. для его реализации не требуются дополнительные узлы. Однако, с виду он немного более туманный, ибо в официальной инструкции написано что-то не до конца понятное… Но это только так кажется… если разобраться, что к чему. :-\

:!: Пример использования специального узла «node-red-narodmon» опубликован тут.

Нестандартные узлы

В этой цепочке используются следующие узлы, которых нет в стандартной поставке:

История версий

Это вторая версия цепочки, полностью переосмысленная и переработанная. Первая доступна в архиве.

В отличие от первой версии:

  • цепочка не зависит от узлов «mqtt in» и для периодического запуска использует узел «inject»;
  • для выборки данных использует уже имеющиеся записи в базе данных SQLite, добавленные потоком «Сохранение телеметрии»;
  • может собирать произвольные данные из разных таблиц одной базы данных в одно сообщение.

Описание работы цепочки

Цепочка запускается по таймеру раз в 5 минут1), считывает конфигурацию, о которой ниже, и делает нужное количество запросов к базе данных. Далее, если есть новые данные, они компонуются и отправляются в «Народный мониторинг», если нет, то, как говорится, и суда нет – ничего не происходит.

Состав отправляемой JSON-строки зависит от наличия новых данных, которые автоматически определяются по колонке «_id» соответствующей таблицы, и может быть полным или частичным.

Конфигурация

Настройка работы цепочки производится в узле «Ввод параметров», который имеет следующую структуру:

[
    {
        "table": "device_1",
        "columns": "temperature_c AS temperature, humidity"
    },
    {
        "table": "device_2",
        "columns": "pressure"
    }
]

Необходимые для отправки колонки указываются через запятую. При желании можно переименовать колонки в выводе, использовав конструкцию «AS alias», как в примере выше.

Настройка MQTT

Для отправки данных используется родной узел «mqtt out» со следующими настройками:

Путь до параметра Значение
Сервер → Соединение → Сервер: narodmon.ru
ID клиента: XX:XX:XX:XX:XX:XX2)
Безопасность → Имя пользователя: <логин в проекте>
Пароль: <личный код>3)
Тема: <логин в проекте>/<название устройства>/json4)

Никаких других обязательных данных указывать или менять не нужно! Не знаю, почему такое расхождение с инструкцией на сайте проекта…

Изменение устройства

Если до этого использовали какой-либо другой вариант передачи данных на сервер, то после внесения изменений в поток, необходимо на сайте в свойствах устройства изменить протокол на MQTT, иначе данные будут игнорироваться!

Код для загрузки

narodmon-mqtt-2.0.0.json
[
    {
        "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"
    }
]

Дисклеймер

  • Использование материалов данной базы знаний разрешено на условиях лицензии, указанной внизу каждой страницы! При использовании материалов активная гиперссылка на соответствующую страницу данной базы знаний обязательна!
  • Автор не несет и не может нести какую либо ответственность за последствия использования материалов, размещенных в данной базе знаний. Все материалы предоставляются по принципу «как есть». Используйте их исключительно на свой страх и риск.
  • Все высказывания, мысли или идеи автора, размещенные в материалах данной базе знаний, являются исключительно его личным субъективным мнением и могут не совпадать с мнением читателей!
  • При размещении ссылок в данной базе знаний на интернет-страницы третьих лиц автор не несет ответственности за их техническую функциональность (особенно отсутствие вирусов) и содержание! При обнаружении таких ссылок, можно и желательно сообщить о них в комментариях к соответствующей статье.
1)
Требование «Народного мониторинга» для бесплатных пользователей.
2)
MAC-адрес устройства.
3)
4 цифры, указанные тут в соответствующем разделе.
4)
К примеру «nikolays/Sonoff SNZB-02/json». Можно с пробелами.

Обсуждение

Ваш комментарий:
S N W A T O X R B​ L W​ R P P Y​ N
 
Последнее изменение: 2022/03/02 23:23 — Николай Солошин