Это старая версия документа!
Небольшой поток для мониторинга произвольных устройств в локальной сети или Интернете.
В этой цепочке используются следующие узлы, которых нет в стандартной поставке:
Эти подпотоки входят в состав кода ниже и загружать отдельно их не надо!
Поток запускается раз в минуту, получает из базы все устройства и пингует их. Потом записывает ответы в базу и через 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, timeout, sent) VALUES ("Устройство 1", "192.168.0.5", 10000, FALSE)
Если таймаут необходимо установить по умолчанию, вместо цифр указать NULL
1). Последний параметр должен быть всегда FALSE
!
INSERT INTO nw_status (name, host, timeout, sent) VALUES ("Устройство 1", "192.168.0.5", NULL, FALSE), ("Устройство 2", "192.168.0.6", 7000, FALSE), ("Устройство 3", "192.168.0.7", 2000, FALSE)
Если таймаут необходимо установить по умолчанию, вместо цифр указать NULL
2). Последний параметр должен быть всегда 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.beget.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": 620, "y": 40, "wires": [ [ "f294d89c.2ea288", "c405ff.17624a" ] ] }, { "id": "fc20d804.5ada18", "type": "inject", "z": "bf63e9a3.a5b928", "name": "Запуск раз в мин.", "props": [], "repeat": "60", "crontab": "", "once": true, "onceDelay": "1", "topic": "", "payloadType": "str", "x": 150, "y": 40, "wires": [ [ "8c18105b.84c43" ] ] }, { "id": "8c18105b.84c43", "type": "sqlite", "z": "bf63e9a3.a5b928", "mydb": "2bc4c6d.cf1f03a", "sqlquery": "fixed", "sql": "SELECT _id, host, timeout, response, sent FROM nw_status", "name": "Выборка всех устройств", "x": 390, "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": 700, "y": 820, "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": 690, "y": 760, "wires": [ [ "ac764a5f.30d158" ] ] }, { "id": "54551fc7.c449", "type": "ping", "z": "bf63e9a3.a5b928", "protocol": "Automatic", "mode": "triggered", "name": "Повторная проверка связи", "host": "", "timer": "20", "inputs": 1, "x": 580, "y": 160, "wires": [ [ "917c54d9.b70438" ] ] }, { "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": 220, "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": "Задержка", "pauseType": "delay", "timeout": "30", "timeoutUnits": "seconds", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": true, "x": 460, "y": 100, "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": 680, "y": 100, "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": 340, "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": 700, "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": 700, "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": 650, "y": 460, "wires": [ [ "5a58b9c4.d46f88" ] ] }, { "id": "cdca79a3.67f758", "type": "subflow:38c9a069.18cd6", "z": "bf63e9a3.a5b928", "name": "Отправка писем", "env": [], "x": 710, "y": 700, "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": 520, "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": 670, "y": 520, "wires": [ [ "e8ff64c5.1ca438" ] ] }, { "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": 640, "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": 240, "y": 760, "wires": [ [ "ac764a5f.30d158" ] ] }, { "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": 220, "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": 400, "wires": [ [ "57aa603d.94b88" ] ] }, { "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": 460, "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": 540, "y": 340, "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": 180, "y": 400, "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": 690, "y": 280, "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": 210, "y": 160, "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": 310, "y": 280, "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": 470, "y": 400, "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": 670, "y": 640, "wires": [ [ "a91d85a7.c844f8" ] ] }, { "id": "e8ff64c5.1ca438", "type": "switch", "z": "bf63e9a3.a5b928", "name": "Фильтрация пустой нагрузки", "property": "payload", "propertyType": "msg", "rules": [ { "t": "empty" }, { "t": "else" } ], "checkall": "false", "repair": false, "outputs": 2, "x": 190, "y": 580, "wires": [ [ "ba2d5855.7ea038" ], [ "e85a41df.97796" ] ] }, { "id": "ba2d5855.7ea038", "type": "change", "z": "bf63e9a3.a5b928", "name": "Сообщение о пустой нагрузке", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "Ни одно устройство не отвечает!", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 670, "y": 580, "wires": [ [ "f78e87bf.8fa918" ] ] }, { "id": "917c54d9.b70438", "type": "link out", "z": "bf63e9a3.a5b928", "name": "", "links": [ "6eb43df6.380bd4", "4918704f.87e68" ], "x": 775, "y": 160, "wires": [] }, { "id": "6eb43df6.380bd4", "type": "link in", "z": "bf63e9a3.a5b928", "name": "", "links": [ "917c54d9.b70438", "c405ff.17624a" ], "x": 495, "y": 760, "wires": [ [ "6432f525.3fcdec" ] ] }, { "id": "c405ff.17624a", "type": "link out", "z": "bf63e9a3.a5b928", "name": "", "links": [ "6eb43df6.380bd4" ], "x": 775, "y": 40, "wires": [] }, { "id": "4918704f.87e68", "type": "link in", "z": "bf63e9a3.a5b928", "name": "", "links": [ "917c54d9.b70438" ], "x": 75, "y": 280, "wires": [ [ "20b57937.b480b6" ] ] }, { "id": "57aa603d.94b88", "type": "link out", "z": "bf63e9a3.a5b928", "name": "", "links": [ "5faa1282.d0715c" ], "x": 775, "y": 340, "wires": [] }, { "id": "5faa1282.d0715c", "type": "link in", "z": "bf63e9a3.a5b928", "name": "", "links": [ "57aa603d.94b88" ], "x": 75, "y": 760, "wires": [ [ "bd70494f.de36c8" ] ] }, { "id": "2bc4c6d.cf1f03a", "type": "sqlitedb", "db": "c:\\noderedDB\\nw_status.db", "mode": "RWC" } ]
Обсуждение