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

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


iot:software:node-red:flows:network_monitoring

Это старая версия документа!


Мониторинг локальной сети в Node-RED

Достаточно сложный и запутанный, но удобный поток для мониторинга произвольных устройств в локальной сети или Интернете.

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

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

Дополнительные подпотоки

Эти подпотоки входят в состав кода ниже и загружать отдельно их не надо!

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

Поток запускается раз в минуту, получает из базы все устройства и пингует их. Потом записывает ответы в базу и через 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"
    }
]

Полезные SQL-запросы

Все эти запросы можно вставлять в 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

Удаление устройства с id

DELETE FROM nw_status WHERE _id = 1

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

network-monitoring.json
[
    {
        "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"
    }
]

Обсуждение

SeKam, 2021/12/15 04:33
Если результат запроса "Выборка: устройство отвечает" пустой (ни одно из устройств не пингуется), нода "Преобразование 2-й секции" не отрабатывает. В итоге при отключении устройств дело до письма не доходит.
Николай Солошин, 2021/12/15 12:10
Да, действительно... Ни разу не сталкивался, ибо устройств много. ))) Добавил два узла - "Фильтрация пустой нагрузки" и "Сообщение о пустой нагрузке". Теперь, если все устройства не отвечают, во второй секции пишется "Ни одно устройство не отвечает!". Благодарю! ))
Николай Солошин, 2021/12/26 21:56
Опубликовал вторую версию мониторинга.
Ваш комментарий:
P K S B D V S G I X R U᠎ Z J X D
 
Последнее изменение: 2022/02/12 11:40 (внешнее изменение)