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

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


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, timeout, sent) VALUES ("Устройство 1", "192.168.0.5", 10000, FALSE)

Если таймаут необходимо установить по умолчанию, вместо цифр указать NULL1). Последний параметр должен быть всегда 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)

Если таймаут необходимо установить по умолчанию, вместо цифр указать NULL2). Последний параметр должен быть всегда 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.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"
    }
]
1) , 2)
По умолчанию 5000/(5 сек.), диапазон 1000-30000.

Обсуждение

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