Это старая версия документа!
Достаточно сложный и запутанный, но удобный поток для мониторинга произвольных устройств в локальной сети или Интернете.
В этой цепочке используются следующие узлы, которых нет в стандартной поставке:
Эти подпотоки входят в состав кода ниже и загружать отдельно их не надо!
Поток запускается раз в минуту, получает из базы все устройства и пингует их. Потом записывает ответы в базу и через 30 секунд повторно пингует только те, которые не ответили до этого, и опять записывает ответы в базу. Далее идет задержка в 10 секунд, чтобы все устройства успели провериться и все данные записаться. Потом из базы извлекаются отдельно не отвечающие устройства, работающие устройства и устройства, которые не работали до этого. В зависимости от состава данных на почту отправляются обобщенные письма с разным содержимым.
Для работы этого потока, необходимо вручную создать таблицу, выполнив SQL-запрос:
CREATE TABLE nw_status (_id INTEGER PRIMARY KEY, name TEXT, host TEXT, timeout INTEGER, response INTEGER, sent INTEGER)
Пример цепочки:
[ { "id": "28be5e5d.cb7442", "type": "inject", "z": "66d1b95c.cf90f8", "name": "Подготовка запроса", "props": [ { "p": "topic", "vt": "str" }, { "p": "payload" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "CREATE TABLE nw_status (_id INTEGER PRIMARY KEY, name TEXT, host TEXT, timeout INTEGER, response INTEGER, sent INTEGER)", "payload": "", "payloadType": "date", "x": 350, "y": 240, "wires": [ [ "d089a31b.a5805" ] ] }, { "id": "758cd73a.9cf318", "type": "debug", "z": "66d1b95c.cf90f8", "name": "Вывод команды", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 350, "y": 360, "wires": [] }, { "id": "d089a31b.a5805", "type": "sqlite", "z": "66d1b95c.cf90f8", "mydb": "2bc4c6d.cf1f03a", "sqlquery": "msg.topic", "sql": "", "name": "Создание таблицы", "x": 350, "y": 300, "wires": [ [ "758cd73a.9cf318" ] ] }, { "id": "2bc4c6d.cf1f03a", "type": "sqlitedb", "db": "c:\\noderedDB\\nw_status.db", "mode": "RWC" } ]
Все эти запросы можно вставлять в msg.topic узла «inject» из примера цепочки в предыдущем пункте.
INSERT INTO nw_status (name, host, sent) VALUES ("Устройство 1", "192.168.0.5", FALSE)
Последний параметр должен быть всегда false
!
INSERT INTO nw_status (name, host, sent) VALUES ("Устройство 1", "192.168.0.5", FALSE), ("Устройство 2", "192.168.0.6", FALSE), ("Устройство 3", "192.168.0.7", FALSE)
Последний параметр должен быть всегда false
!
SELECT * FROM nw_status
DELETE FROM nw_status WHERE _id = 1
[ { "id": "38c9a069.18cd6", "type": "subflow", "name": "sendmail", "info": "Отправляет почту по настроенным реквизитам.", "category": "", "in": [ { "x": 60, "y": 60, "wires": [ { "id": "be1032f6.e2b02" } ] } ], "out": [], "env": [], "color": "#C7E9C0", "icon": "node-red/envelope.svg" }, { "id": "be1032f6.e2b02", "type": "e-mail", "z": "38c9a069.18cd6", "server": "smtp.mail.com", "port": "465", "secure": true, "tls": true, "name": "nikolay@soloshin.su", "dname": "Отправка сообщения", "x": 240, "y": 60, "wires": [] }, { "id": "bf63e9a3.a5b928", "type": "tab", "label": "Мониторинг сети", "disabled": false, "info": "" }, { "id": "cfe7df0c.f1ba8", "type": "ping", "z": "bf63e9a3.a5b928", "protocol": "Automatic", "mode": "triggered", "name": "Проверка связи", "host": "", "timer": "60", "inputs": 1, "x": 720, "y": 40, "wires": [ [ "6432f525.3fcdec", "f294d89c.2ea288" ] ] }, { "id": "fc20d804.5ada18", "type": "inject", "z": "bf63e9a3.a5b928", "name": "Запуск раз в мин.", "props": [], "repeat": "60", "crontab": "", "once": true, "onceDelay": "1", "topic": "", "x": 150, "y": 40, "wires": [ [ "8c18105b.84c43" ] ] }, { "id": "8c18105b.84c43", "type": "sqlite", "z": "bf63e9a3.a5b928", "mydb": "2bc4c6d.cf1f03a", "sqlquery": "fixed", "sql": "SELECT _id, host, response, sent FROM nw_status", "name": "Выборка всех устройств из базы", "x": 440, "y": 40, "wires": [ [ "cfe7df0c.f1ba8" ] ] }, { "id": "ac764a5f.30d158", "type": "sqlite", "z": "bf63e9a3.a5b928", "mydb": "2bc4c6d.cf1f03a", "sqlquery": "msg.topic", "sql": "UPDATE nw_status SET response = $response WHERE _id = $id", "name": "Запись ответов в базу", "x": 690, "y": 220, "wires": [ [] ] }, { "id": "6432f525.3fcdec", "type": "change", "z": "bf63e9a3.a5b928", "name": "Подготовка параметров запроса", "rules": [ { "t": "set", "p": "topic", "pt": "msg", "to": "\"UPDATE nw_status SET response = \" & payload & \" WHERE _id = \" & ping._id", "tot": "jsonata" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 660, "y": 160, "wires": [ [ "ac764a5f.30d158" ] ] }, { "id": "54551fc7.c449", "type": "ping", "z": "bf63e9a3.a5b928", "protocol": "Automatic", "mode": "triggered", "name": "Повторная проверка связи", "host": "", "timer": "20", "inputs": 1, "x": 180, "y": 280, "wires": [ [ "6432f525.3fcdec", "20b57937.b480b6" ] ] }, { "id": "20b57937.b480b6", "type": "switch", "z": "bf63e9a3.a5b928", "name": "Отсечка работающих устройств", "property": "payload", "propertyType": "msg", "rules": [ { "t": "false" }, { "t": "else" } ], "checkall": "false", "repair": false, "outputs": 2, "x": 200, "y": 340, "wires": [ [ "251fd244.6bc71e" ], [ "cdb27b4e.0e8408" ] ] }, { "id": "f294d89c.2ea288", "type": "switch", "z": "bf63e9a3.a5b928", "name": "Отсечка работающих устройств", "property": "payload", "propertyType": "msg", "rules": [ { "t": "false" }, { "t": "else" } ], "checkall": "false", "repair": false, "outputs": 2, "x": 200, "y": 100, "wires": [ [ "92c6d976.4c9eb8" ], [ "cdb27b4e.0e8408" ] ] }, { "id": "92c6d976.4c9eb8", "type": "delay", "z": "bf63e9a3.a5b928", "name": "Задержка 30 сек", "pauseType": "delay", "timeout": "30", "timeoutUnits": "seconds", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": true, "x": 150, "y": 160, "wires": [ [ "fe66d152.90cc4" ] ] }, { "id": "fe66d152.90cc4", "type": "template", "z": "bf63e9a3.a5b928", "name": "Восстановление структуры", "field": "payload", "fieldType": "msg", "format": "handlebars", "syntax": "mustache", "template": "[{\n\"_id\": {{{ping._id}}},\n\"host\": \"{{{ping.host}}}\",\n\"timeout\": {{{ping.timeout}}}\n}]", "output": "json", "x": 180, "y": 220, "wires": [ [ "54551fc7.c449" ] ] }, { "id": "f22d9840.db3838", "type": "sqlite", "z": "bf63e9a3.a5b928", "mydb": "2bc4c6d.cf1f03a", "sqlquery": "fixed", "sql": "SELECT _id, name FROM nw_status WHERE response = false AND sent = false", "name": "Выборка новых уведомлений", "x": 190, "y": 460, "wires": [ [ "8eab3c0.f34e6c8" ] ] }, { "id": "59302cbf.45d0b4", "type": "change", "z": "bf63e9a3.a5b928", "name": "Установка темы и времени", "rules": [ { "t": "set", "p": "topic", "pt": "msg", "to": "\"Уведомление системы мониторинга от \" & $now('[H01]:[m01]:[s01] [D01].[M01].[Y0001]', '+1000') & \"!\"", "tot": "jsonata" }, { "t": "delete", "p": "ping", "pt": "msg" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 440, "y": 760, "wires": [ [ "cdca79a3.67f758" ] ] }, { "id": "a91d85a7.c844f8", "type": "template", "z": "bf63e9a3.a5b928", "name": "Шаблон тела письма", "field": "payload", "fieldType": "msg", "format": "handlebars", "syntax": "mustache", "template": "{{{setsendstatus}}}:\n\n{{{fails}}}\nДиагностические данные:\n\n{{{payload}}}", "output": "str", "x": 160, "y": 760, "wires": [ [ "59302cbf.45d0b4" ] ] }, { "id": "2224cda9.8a42a2", "type": "csv", "z": "bf63e9a3.a5b928", "name": "Преобразование 1-й секции письма", "sep": ",", "hdrin": "", "hdrout": "none", "multi": "one", "ret": "\\r\\n", "temp": "name", "skip": "0", "strings": true, "include_empty_strings": "", "include_null_values": "", "x": 550, "y": 580, "wires": [ [ "5a58b9c4.d46f88" ] ] }, { "id": "cdca79a3.67f758", "type": "subflow:38c9a069.18cd6", "z": "bf63e9a3.a5b928", "name": "Отправка писем", "env": [], "x": 150, "y": 820, "wires": [] }, { "id": "d5126915.e6c4f8", "type": "sqlite", "z": "bf63e9a3.a5b928", "mydb": "2bc4c6d.cf1f03a", "sqlquery": "msg.topic", "sql": "UPDATE nw_status SET sent = true WHERE response = false", "name": "Установка флага отправки", "x": 680, "y": 1000, "wires": [ [] ] }, { "id": "5a58b9c4.d46f88", "type": "change", "z": "bf63e9a3.a5b928", "name": "Перемещение данных", "rules": [ { "t": "move", "p": "payload", "pt": "msg", "to": "fails", "tot": "msg" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 170, "y": 640, "wires": [ [ "c5361c7e.7aa9b" ] ] }, { "id": "c5361c7e.7aa9b", "type": "sqlite", "z": "bf63e9a3.a5b928", "mydb": "2bc4c6d.cf1f03a", "sqlquery": "fixed", "sql": "SELECT name, response FROM nw_status WHERE response > 0 ORDER BY response DESC", "name": "Выборка: устройство отвечает", "x": 530, "y": 640, "wires": [ [ "e85a41df.97796" ] ] }, { "id": "e85a41df.97796", "type": "csv", "z": "bf63e9a3.a5b928", "name": "Преобразование 2-й секции", "sep": "\\t", "hdrin": "", "hdrout": "none", "multi": "one", "ret": "\\r\\n", "temp": "name,response", "skip": "0", "strings": true, "include_empty_strings": "", "include_null_values": "", "x": 180, "y": 700, "wires": [ [ "f78e87bf.8fa918" ] ] }, { "id": "bd70494f.de36c8", "type": "change", "z": "bf63e9a3.a5b928", "name": "Подготовка параметров запроса", "rules": [ { "t": "set", "p": "topic", "pt": "msg", "to": "\"UPDATE nw_status SET sent = \" & setsendstatus & \" WHERE _id = \" & payload._id", "tot": "jsonata" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 660, "y": 940, "wires": [ [ "d5126915.e6c4f8" ] ] }, { "id": "a37420b1.59473", "type": "sqlite", "z": "bf63e9a3.a5b928", "mydb": "2bc4c6d.cf1f03a", "sqlquery": "fixed", "sql": "SELECT _id, name FROM nw_status WHERE sent = true AND response > 0", "name": "Выборка: у-ва с предупреждениями", "x": 650, "y": 340, "wires": [ [ "9dc64396.a2ca2" ] ] }, { "id": "666b7178.3bf08", "type": "split", "z": "bf63e9a3.a5b928", "name": "Разделение массива", "splt": "\\n", "spltType": "str", "arraySplt": 1, "arraySpltType": "len", "stream": false, "addname": "", "x": 700, "y": 880, "wires": [ [ "bd70494f.de36c8" ] ] }, { "id": "14e6ce78.52a912", "type": "sqlite", "z": "bf63e9a3.a5b928", "mydb": "2bc4c6d.cf1f03a", "sqlquery": "fixed", "sql": "SELECT _id, name FROM nw_status WHERE response = false", "name": "Выборка: у-во не отвечает", "x": 180, "y": 580, "wires": [ [ "2224cda9.8a42a2" ] ] }, { "id": "d70537c9.e5d708", "type": "switch", "z": "bf63e9a3.a5b928", "name": "Отсечка пустых сообщений", "property": "payload", "propertyType": "msg", "rules": [ { "t": "nempty" } ], "checkall": "false", "repair": false, "outputs": 1, "x": 680, "y": 460, "wires": [ [ "666b7178.3bf08", "a5ae845b.949b08" ] ] }, { "id": "8eab3c0.f34e6c8", "type": "change", "z": "bf63e9a3.a5b928", "name": "Метка: установить статус отправки", "rules": [ { "t": "set", "p": "setsendstatus", "pt": "msg", "to": "true", "tot": "bool" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 210, "y": 520, "wires": [ [ "d70537c9.e5d708" ] ] }, { "id": "9dc64396.a2ca2", "type": "change", "z": "bf63e9a3.a5b928", "name": "Метка: снять статус отправки", "rules": [ { "t": "set", "p": "setsendstatus", "pt": "msg", "to": "false", "tot": "bool" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 670, "y": 400, "wires": [ [ "d70537c9.e5d708" ] ] }, { "id": "cdb27b4e.0e8408", "type": "trigger", "z": "bf63e9a3.a5b928", "name": "Отбрасывание лишних сообщений", "op1": "", "op2": "", "op1type": "nul", "op2type": "date", "duration": "10", "extend": false, "overrideDelay": false, "units": "s", "reset": "", "bytopic": "all", "topic": "topic", "outputs": 1, "x": 650, "y": 280, "wires": [ [ "a37420b1.59473" ] ] }, { "id": "251fd244.6bc71e", "type": "trigger", "z": "bf63e9a3.a5b928", "name": "Отбрасывание лишних сообщений", "op1": "", "op2": "", "op1type": "nul", "op2type": "date", "duration": "10", "extend": false, "overrideDelay": false, "units": "s", "reset": "", "bytopic": "all", "topic": "topic", "outputs": 1, "x": 210, "y": 400, "wires": [ [ "f22d9840.db3838" ] ] }, { "id": "a5ae845b.949b08", "type": "switch", "z": "bf63e9a3.a5b928", "name": "Выбор пути", "property": "setsendstatus", "propertyType": "msg", "rules": [ { "t": "true" }, { "t": "false" } ], "checkall": "false", "repair": false, "outputs": 2, "x": 670, "y": 520, "wires": [ [ "14e6ce78.52a912" ], [ "2224cda9.8a42a2" ] ] }, { "id": "f78e87bf.8fa918", "type": "change", "z": "bf63e9a3.a5b928", "name": "Установка первой строки тела", "rules": [ { "t": "change", "p": "setsendstatus", "pt": "msg", "from": "true", "fromt": "bool", "to": "Устройства перестали отвечать", "tot": "str" }, { "t": "change", "p": "setsendstatus", "pt": "msg", "from": "false", "fromt": "bool", "to": "Устройства начали отвечать", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 490, "y": 700, "wires": [ [ "a91d85a7.c844f8" ] ] }, { "id": "2bc4c6d.cf1f03a", "type": "sqlitedb", "db": "c:\\noderedDB\\nw_status.db", "mode": "RWC" } ]
Обсуждение