Небольшое дополнение к потоку Сохранение телеметрии в Node-RED, позволяющее сохранять телеметрию с комнатного увлажнителя воздуха в базу данных SQLite.
Для работы цепочки, помимо основного потока, необходимо прошить под Tasmota и соответствующе настроить увлажнитель.
Первый узел подключается к MQTT-брокеру и следит за данными, поступающими с датчика, следующий узел отбирает только сообщения, содержащие в себе полный набор данных. т.к. увлажнитель периодически передает данные частично1). Далее узел проверяет, чтобы данные отличались от предыдущих и пропускает только изменившиеся. Последний узел форматирует данные.
Цепочка подключается к узлу «Перемещение топика и данных». Также нужно добавить название таблицы в узел «Определение названий таблиц».
Если в потоке есть сторожевой таймер, нужно заменить узел «rbe»2) на «delay»3) и установить в нем желаемую периодичность записи показаний4). Это необходимо в виду того, что, с одной стороны, увлажнитель передает телеметрию каждые 30 секунд, а с другой – фактические показания могут не меняться достаточно долгое время из-за чего «rbe» не пропускает сообщения и ложно срабатывает watchdog. При замене на «delay» данные будут поступать стабильно, пока увлажнитель в сети, а watchdog будет срабатывать только при действительной неполадке.
[ { "id": "eaecb7e3.ffea28", "type": "mqtt in", "z": "551f568e.e62c18", "name": "Датчик в увлажнителе", "topic": "humidifier_00896D/tele/SENSOR", "qos": "2", "datatype": "json", "broker": "8745b931.133868", "x": 160, "y": 100, "wires": [ [ "b3347c22.52002" ] ] }, { "id": "b3347c22.52002", "type": "switch", "z": "551f568e.e62c18", "name": "Отбор полных сообщений", "property": "payload.Time", "propertyType": "msg", "rules": [ { "t": "nnull" } ], "checkall": "false", "repair": false, "outputs": 1, "x": 180, "y": 160, "wires": [ [ "a1e4d9f0.d69908" ] ] }, { "id": "a1e4d9f0.d69908", "type": "rbe", "z": "551f568e.e62c18", "name": "Ограничение потока", "func": "rbe", "gap": "", "start": "", "inout": "out", "septopics": true, "property": "payload.TuyaSNS", "x": 160, "y": 220, "wires": [ [ "df98b79a.b09d58" ] ], "info": "Пропускает только, если данные изменились." }, { "id": "df98b79a.b09d58", "type": "template", "z": "551f568e.e62c18", "name": "Форматирование нагрузки", "field": "payload", "fieldType": "msg", "format": "handlebars", "syntax": "mustache", "template": "{\n\"battery\": null,\n\"humidity\": {{{payload.TuyaSNS.Humidity}}},\n\"linkquality\": null,\n\"temperature\": {{{payload.TuyaSNS.Temperature}}},\n\"pressure\": null\n}", "output": "json", "x": 180, "y": 280, "wires": [ [ "d6aeb8ba.178f68" ] ] }, { "id": "8745b931.133868", "type": "mqtt-broker", "name": "localhost", "broker": "localhost", "port": "1883", "clientid": "", "usetls": false, "compatmode": false, "keepalive": "60", "cleansession": true, "birthTopic": "", "birthQos": "0", "birthPayload": "", "closeTopic": "", "closeQos": "0", "closePayload": "", "willTopic": "", "willQos": "0", "willPayload": "" } ]
[ { "id": "8708b0ca.dd485", "type": "delay", "z": "551f568e.e62c18", "name": "Ограничение потока", "pauseType": "rate", "timeout": "5", "timeoutUnits": "seconds", "rate": "1", "nbRateUnits": "15", "rateUnits": "minute", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": true, "x": 160, "y": 220, "wires": [ [ "df98b79a.b09d58" ] ] } ]
Обсуждение