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

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


iot:software:node-red:flows:network_monitoring

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
iot:software:node-red:flows:network_monitoring [2021/12/22 18:29]
Николай Солошин Включена функция таймаута.
iot:software:node-red:flows:network_monitoring [2022/02/16 21:20] (текущий)
Николай Солошин ↷ Операцией перемещения обновлены ссылки
Строка 1: Строка 1:
-{{htmlmetatags>metatag-keywords=(network monitoring,node-red,flow)  +{{htmlmetatags>metatag-keywords=(network monitoring,node-red,flow,мониторинг сети,сетевой мониторинг,поток,поток node-red,flows)  
-metatag-description=(Проверяет добавленные в базу узлы и при необходимости отправляет уведомления.)}}+metatag-description=(Проверяет добавленные в базу хосты ипри необходимостиотправляет уведомления.)}}
  
 ====== Мониторинг локальной сети в Node-RED ====== ====== Мониторинг локальной сети в Node-RED ======
  
-Небольшой поток для мониторинга произвольных устройств в локальной сети или Интернете.+Небольшой поток для мониторинга произвольных устройств в локальной сети или Интернете **версия 2.x**, полностью переосмысленная и переписанная -- меньше ложных срабатываний((Для беспроводных устройств оптимальным оказалось 3 дополнительных цикла с задержкой 10 секунд.)), меньше обращений к базе данных, более компактная, линейная и логичная! В общем, конфетка, а не... то, что было((Можно простить, т.к. это практические первое, что я когда-то собрал на Node-RED.)). LOL 
 + 
 +:!: Архивные версии [[iot:software:node-red:flows:network_monitoring?rev=1638922322|1.0]], [[iot:software:node-red:flows:network_monitoring?rev=1640356134|1.1]], [[iot:software:node-red:flows:network_monitoring?rev=1640519728|2.0]].
  
 ===== Нестандартные узлы ===== ===== Нестандартные узлы =====
Строка 16: Строка 18:
 ===== Дополнительные подпотоки ===== ===== Дополнительные подпотоки =====
  
-  * [[iot:node-red:subflows:sendmail|Отправка почты]]+  * [[iot:software:node-red:subflows:sendmail|Отправка почты]]
  
-Эти подпотоки входят в состав кода ниже и загружать отдельно их не надо!+Этот подпоток входит в состав кода ниже и загружать отдельно его не надо!
  
 ===== Описание работы цепочки ===== ===== Описание работы цепочки =====
  
-Поток запускается раз в минуту, получает из базы все устройства и пингует их. Потом записывает ответы в базу и через 30 секунд повторно пингует только те, которые не ответили до этого, и опять записывает ответы в базу. Далее идет задержка в 10 секунд, чтобы все устройства успели провериться и все данные записаться. Потом из базы извлекаются отдельно не отвечающие устройства, работающие устройства и устройства, которые не работали до этого. В зависимости от состава данных на почту отправляются обобщенные письма с разным содержимым.+Цепочка запускается автоматически каждую минуту((Настраивается в узле "Автозапуск".)), при необходимости или каком-то сбое, можно запустить вручную. Далее из базы данных читаются все устройствапроверяются командой ping и записываются результаты в БД. Если есть устройства, которые не ответили, они попадают в цикл с заданным числом витков и временем между попытками((Настраивается в узле "Ввод настроек".)). Прочие устройства ожидают завершения всех циклов, после чего все сообщения собираются в одно, которое и передается дальше
 + 
 +{{iot:software:node-red:flows:nm3.1.png?nolink|}} 
 + 
 +Далее подсчитывается количество тех или иных статусов(("Умерло", "ожило", "мертвое" и "живое" устройство.)) и сообщение вновь разбивается на части для объединения по статусам и сортировки. В конце, если необходимо((Есть устройства со статусами "умерло" или "ожило".)), формируется и отправляется письмо
 + 
 +{{iot:software:node-red:flows:mails_examples.jpg?direct&1000|Примеры писем от мониторинга сети.}} 
 + 
 +=== История изменений ===
  
-{{:iot:node-red:flows:nm1.png?nolink|}}+  * В **версии 2.1** добавлена отправка периодической сводки((По умолчанию раз в 6 часов.)) по недоступным хостам.
  
 ==== Создание таблицы ==== ==== Создание таблицы ====
Строка 30: Строка 40:
 :!: Для работы этого потока, необходимо вручную создать таблицу, выполнив SQL-запрос: :!: Для работы этого потока, необходимо вручную создать таблицу, выполнив SQL-запрос:
  
-<code sql>CREATE TABLE nw_status (_id INTEGER PRIMARY KEY, name TEXT, host TEXT, timeout INTEGER, response INTEGER, sent INTEGER)</code>+<code sql>CREATE TABLE nw_status (_id INTEGER PRIMARY KEY, name TEXT, host TEXT, timeout INTEGER, response INTEGER, sent INTEGER DEFAULT 0, cycles INTEGER)</code>
  
 Пример цепочки: Пример цепочки:
Строка 53: Строка 63:
         "once": false,         "once": false,
         "onceDelay": 0.1,         "onceDelay": 0.1,
-        "topic": "CREATE TABLE nw_status (_id INTEGER PRIMARY KEY, name TEXT, host TEXT, timeout INTEGER, response INTEGER, sent INTEGER)",+        "topic": "CREATE TABLE nw_status (_id INTEGER PRIMARY KEY, name TEXT, host TEXT, timeout INTEGER, response INTEGER, sent INTEGER DEFAULT 0, cycles INTEGER)",
         "payload": "",         "payload": "",
         "payloadType": "date",         "payloadType": "date",
Строка 111: Строка 121:
 === Добавление устройства === === Добавление устройства ===
  
-<code sql>INSERT INTO nw_status (name, host, timeout, sent) VALUES ("Устройство 1", "192.168.0.5", 10000, false)</code>+<code sql>INSERT INTO nw_status (name, host, timeout) VALUES ("Устройство 1", "192.168.0.5", 10000)</code>
  
-Таймаут можно указывать по желанию((По умолчанию 5000, диапазон 1000-30000.)). Последний параметр должен быть всегда ''false''!+Если таймаут необходимо установить по умолчанию, вместо цифр указать ''NULL''((По умолчанию 5000/(5 сек.), диапазон 1000-30000.)) или не использовать его в запросе:
  
-=== Массовое добавление ===+<code sql>INSERT INTO nw_status (name, host) VALUES ("Устройство 1", "192.168.0.5")</code>
  
-<code sql>INSERT INTO nw_status (name, host, timeout, sent) VALUES ("Устройство 1", "192.168.0.5", 1000, false), ("Устройство 2", "192.168.0.6", 7000, false), ("Устройство 3", "192.168.0.7", 2000, false)</code>+=== Массовое добавление ===
  
-Таймаут можно указывать по желанию(о умолчанию 5000диапазон 1000-30000.))Последний параметр должен быть всегда ''false''!+<code sql>INSERT INTO nw_status (name, host, timeout) VALUES ("Устройство 1", "192.168.0.5", NULL), ("Устройство 2""192.168.0.6", 7000), ("Устройство 3", "192.168.0.7", 2000)</code>
  
 === Просмотр всех устройств === === Просмотр всех устройств ===
Строка 125: Строка 135:
 <code sql>SELECT * FROM nw_status</code> <code sql>SELECT * FROM nw_status</code>
  
-=== Удаление устройства с id ===+=== Удаление устройства ===
  
-<code sql>DELETE FROM nw_status WHERE _id = 1</code>+Запрос для удаления устройства с номером 2. 
 + 
 +<code sql>DELETE FROM nw_status WHERE _id = 2</code> 
 + 
 +:!: Во **второй версии** потока есть ограничение -- ряд ''_id'' должен быть цельным, без пропусков((Т.е. "1, 2, 3, 4", а не "1, 2, 4, 5"!)), т.е. нельзя просто так удалить устройство -- его необходимо заменить другим или присвоить его номер последнему устройству в списке! 
 + 
 +=== Обновление последней записи === 
 + 
 +Для замены ''_id'' в последней строке базы данных можно использовать такой запрос: 
 + 
 +<code sql>UPDATE nw_status SET _id = 2 WHERE _rowid_ = ( SELECT MAX( _rowid_ ) FROM nw_status )</code>
  
 ===== Код для загрузки ===== ===== Код для загрузки =====
Строка 176: Строка 196:
     },     },
     {     {
-        "id": "cfe7df0c.f1ba8", +        "id": "817060ef.2b843",
-        "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",         "type": "inject",
         "z": "bf63e9a3.a5b928",         "z": "bf63e9a3.a5b928",
-        "name": "Запуск раз в мин.",+        "name": "Автозапуск",
         "props": [],         "props": [],
         "repeat": "60",         "repeat": "60",
Строка 206: Строка 207:
         "topic": "",         "topic": "",
         "payloadType": "str",         "payloadType": "str",
-        "x": 150+        "x": 130
-        "y": 40,+        "y": 100,
         "wires": [         "wires": [
             [             [
-                "8c18105b.84c43"+                "ad444795.a7b668"
             ]             ]
         ]         ]
     },     },
     {     {
-        "id": "8c18105b.84c43",+        "id": "f27932db.06f1e",
         "type": "sqlite",         "type": "sqlite",
         "z": "bf63e9a3.a5b928",         "z": "bf63e9a3.a5b928",
         "mydb": "2bc4c6d.cf1f03a",         "mydb": "2bc4c6d.cf1f03a",
-        "sqlquery": "fixed", +        "sqlquery": "msg.topic", 
-        "sql": "SELECT _id, host, timeout, response, sent FROM nw_status",+        "sql": "",
         "name": "Выборка всех устройств",         "name": "Выборка всех устройств",
-        "x": 390,+        "x": 690,
         "y": 40,         "y": 40,
         "wires": [         "wires": [
             [             [
-                "cfe7df0c.f1ba8"+                "5ace9ea9.1497d"
             ]             ]
         ]         ]
     },     },
     {     {
-        "id": "ac764a5f.30d158", +        "id": "f41fa10e.39756", 
-        "type": "sqlite",+        "type": "ping",
         "z": "bf63e9a3.a5b928",         "z": "bf63e9a3.a5b928",
-        "mydb": "2bc4c6d.cf1f03a", +        "protocol": "Automatic", 
-        "sqlquery": "msg.topic", +        "mode": "triggered", 
-        "sql": "UPDATE nw_status SET response = $response WHERE _id = $id", +        "name": "Проверка связи", 
-        "name": "Запись в базу данных", +        "host": ""
-        "x": 700+        "timer": "60", 
-        "y": 820,+        "inputs": 1
 +        "x": 460
 +        "y": 160,
         "wires": [         "wires": [
-            []+            [ 
 +                "425962de.576a5c" 
 +            ]
         ]         ]
     },     },
     {     {
-        "id": "6432f525.3fcdec",+        "id": "cbb6faf8.027568",
         "type": "change",         "type": "change",
         "z": "bf63e9a3.a5b928",         "z": "bf63e9a3.a5b928",
-        "name": "Запись ответов в базу",+        "name": "Установка счетчика цикла",
         "rules": [         "rules": [
             {             {
                 "t": "set",                 "t": "set",
-                "p": "topic",+                "p": "ping.count",
                 "pt": "msg",                 "pt": "msg",
-                "to": "\"UPDATE nw_status SET response = \" & payload & \" WHERE _id \" & ping._id",+                "to": "$exists( ping.count ) true ? ( ping.count + 1 ) : 0",
                 "tot": "jsonata"                 "tot": "jsonata"
 +            },
 +            {
 +                "t": "set",
 +                "p": "delay",
 +                "pt": "msg",
 +                "to": "settings.delay",
 +                "tot": "flow"
             }             }
         ],         ],
Строка 263: Строка 275:
         "to": "",         "to": "",
         "reg": false,         "reg": false,
-        "x": 690+        "x": 180
-        "y": 760,+        "y": 220,
         "wires": [         "wires": [
             [             [
-                "ac764a5f.30d158"+                "25c3af02.51d2c"
             ]             ]
         ]         ]
     },     },
     {     {
-        "id": "54551fc7.c449", +        "id": "25c3af02.51d2c",
-        "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",         "type": "switch",
         "z": "bf63e9a3.a5b928",         "z": "bf63e9a3.a5b928",
-        "name": "Отсечка работающих устройств", +        "name": "Проверка счетчика", 
-        "property": "payload",+        "property": "ping.count",
         "propertyType": "msg",         "propertyType": "msg",
         "rules": [         "rules": [
             {             {
-                "t": "false"+                "t": "neq", 
 +                "v": "settings.cycles", 
 +                "vt": "flow"
             },             },
             {             {
-                "t": "else"+                "t": "eq", 
 +                "v": "settings.cycles", 
 +                "vt": "flow"
             }             }
         ],         ],
Строка 307: Строка 305:
         "repair": false,         "repair": false,
         "outputs": 2,         "outputs": 2,
-        "x": 200,+        "x": 460,
         "y": 220,         "y": 220,
         "wires": [         "wires": [
             [             [
-                "251fd244.6bc71e"+                "202cf843.0c54a8"
             ],             ],
             [             [
-                "cdb27b4e.0e8408"+                "73733ff5.013f9"
             ]             ]
 +        ],
 +        "outputLabels": [
 +            "Повторить цикл",
 +            "Завершить цикл"
         ]         ]
     },     },
     {     {
-        "id": "f294d89c.2ea288",+        "id": "425962de.576a5c",
         "type": "switch",         "type": "switch",
         "z": "bf63e9a3.a5b928",         "z": "bf63e9a3.a5b928",
-        "name": "Отсечка работающих устройств",+        "name": "Доступность устройства",
         "property": "payload",         "property": "payload",
         "propertyType": "msg",         "propertyType": "msg",
Строка 336: Строка 338:
         "repair": false,         "repair": false,
         "outputs": 2,         "outputs": 2,
-        "x": 200+        "x": 690
-        "y": 100,+        "y": 160,
         "wires": [         "wires": [
             [             [
-                "92c6d976.4c9eb8"+                "cbb6faf8.027568"
             ],             ],
             [             [
-                "cdb27b4e.0e8408" +                "47244dcf.c20b34"
-            ] +
-        ] +
-    }, +
-    { +
-        "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"+
             ]             ]
 +        ],
 +        "outputLabels": [
 +            "Не отвечает",
 +            "Отвечает"
         ]         ]
     },     },
     {     {
-        "id": "fe66d152.90cc4",+        "id": "202cf843.0c54a8",
         "type": "template",         "type": "template",
         "z": "bf63e9a3.a5b928",         "z": "bf63e9a3.a5b928",
Строка 379: Строка 362:
         "format": "handlebars",         "format": "handlebars",
         "syntax": "mustache",         "syntax": "mustache",
-        "template": "[{\n\"_id\": {{{ping._id}}},\n\"host\": \"{{{ping.host}}}\",\n\"timeout\": {{{ping.timeout}}}\n}]",+        "template": "[{\n\"_id\": {{{ping._id}}},\n\"name\": \"{{{ping.name}}}\",\n\"host\": \"{{{ping.host}}}\",\n\"timeout\": {{{ping.timeout}}},\n\"sent\": {{{ping.sent}}},\n\"count\": {{{ping.count}}}\n}]",
         "output": "json",         "output": "json",
         "x": 680,         "x": 680,
-        "y": 100,+        "y": 280,
         "wires": [         "wires": [
             [             [
-                "54551fc7.c449"+                "d2b39ab6.0c64f8"
             ]             ]
         ]         ]
     },     },
     {     {
-        "id": "f22d9840.db3838", +        "id": "73733ff5.013f9",
-        "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",         "type": "change",
         "z": "bf63e9a3.a5b928",         "z": "bf63e9a3.a5b928",
-        "name": "Установка темы и времени",+        "name": "Установка св-в",
         "rules": [         "rules": [
             {             {
Строка 415: Строка 382:
                 "p": "topic",                 "p": "topic",
                 "pt": "msg",                 "pt": "msg",
-                "to": "\"Уведомление системы мониторинга от \" & $now('[H01]:[m01]:[s01] [D01].[M01].[Y0001]''+1000') & \"!\"",+                "to": "\"UPDATE \\\"\" & $flowContext\"settings.table\" ) & \"\\\" SET response = \" & payload & \"cycles = \" & ( $exists( ping.count ) = false ? 0 : ping.count ) & \" WHERE _id = \" & ping._id",
                 "tot": "jsonata"                 "tot": "jsonata"
             },             },
             {             {
-                "t": "delete", +                "t": "set", 
-                "p": "ping", +                "p": "parts.index", 
-                "pt": "msg"+                "pt": "msg", 
 +                "to": "ping._id - 1", 
 +                "tot": "jsonata" 
 +            }, 
 +            { 
 +                "t": "set", 
 +                "p": "parts.count", 
 +                "pt": "msg", 
 +                "to": "parts.count", 
 +                "tot": "flow" 
 +            }, 
 +            { 
 +                "t": "set", 
 +                "p": "parts.id", 
 +                "pt": "msg", 
 +                "to": "parts.id", 
 +                "tot": "flow" 
 +            }, 
 +            { 
 +                "t": "move", 
 +                "p": "payload", 
 +                "pt": "msg", 
 +                "to": "ping.response", 
 +                "tot": "msg"
             }             }
         ],         ],
Строка 429: Строка 419:
         "to": "",         "to": "",
         "reg": false,         "reg": false,
-        "x": 440+        "x": 220
-        "y": 700,+        "y": 280,
         "wires": [         "wires": [
             [             [
-                "cdca79a3.67f758"+                "5d114f5c.32a04"
             ]             ]
         ]         ]
     },     },
     {     {
-        "id": "a91d85a7.c844f8", +        "id": "5d114f5c.32a04", 
-        "type": "template",+        "type": "sqlite",
         "z": "bf63e9a3.a5b928",         "z": "bf63e9a3.a5b928",
-        "name": "Шаблон тела письма", +        "mydb": "2bc4c6d.cf1f03a", 
-        "field": "payload", +        "sqlquery": "msg.topic", 
-        "fieldType": "msg", +        "sql": "", 
-        "format": "handlebars", +        "name": "Запись ответов", 
-        "syntax": "mustache", +        "x": 420
-        "template": "{{{setsendstatus}}}:\n\n{{{fails}}}\nДиагностические данные:\n\n{{{payload}}}", +        "y": 280,
-        "output": "str", +
-        "x": 160+
-        "y": 700,+
         "wires": [         "wires": [
             [             [
-                "59302cbf.45d0b4"+                "8961f0c.35b121"
             ]             ]
         ]         ]
     },     },
     {     {
-        "id": "2224cda9.8a42a2", +        "id": "5ace9ea9.1497d", 
-        "type": "csv",+        "type": "change",
         "z": "bf63e9a3.a5b928",         "z": "bf63e9a3.a5b928",
-        "name": "Преобразование 1-й секции письма", +        "name": "Сохранение переменных", 
-        "sep": ",", +        "rules": 
-        "hdrin": "", +            { 
-        "hdrout": "none", +                "t": "set", 
-        "multi": "one", +                "p": "parts.count", 
-        "ret": "\\r\\n", +                "pt": "flow", 
-        "temp": "name", +                "to": "$count( payload )\t", 
-        "skip": "0", +                "tot": "jsonata" 
-        "strings": true+            }
-        "include_empty_strings": "", +            { 
-        "include_null_values": "", +                "t": "set", 
-        "x": 650+                "p": "parts.id"
-        "y": 460,+                "pt": "flow", 
 +                "to": "", 
 +                "tot": "date" 
 +            } 
 +        ]
 +        "action": "", 
 +        "property": ""
 +        "from": "", 
 +        "to": ""
 +        "reg": false
 +        "x": 680
 +        "y": 100,
         "wires": [         "wires": [
             [             [
-                "5a58b9c4.d46f88"+                "f41fa10e.39756"
             ]             ]
         ]         ]
     },     },
     {     {
-        "id": "cdca79a3.67f758", +        "id": "93dadf2f.1e905", 
-        "type": "subflow:38c9a069.18cd6",+        "type": "join",
         "z": "bf63e9a3.a5b928",         "z": "bf63e9a3.a5b928",
-        "name":тправка писем", +        "name":бъединение", 
-        "env": []+        "mode": "auto", 
-        "x": 710+        "build": "string", 
-        "y": 700+        "property": "payload", 
-        "wires": []+        "propertyType": "msg", 
 +        "key": "topic", 
 +        "joiner": "\\n", 
 +        "joinerType": "str", 
 +        "accumulate": false, 
 +        "timeout": "", 
 +        "count": "", 
 +        "reduceRight": false, 
 +        "reduceExp": "", 
 +        "reduceInit": "", 
 +        "reduceInitType": "num", 
 +        "reduceFixup": ""
 +        "x": 480
 +        "y": 340
 +        "wires": [ 
 +            [ 
 +                "d763f5eb.4a1378" 
 +            ] 
 +        ], 
 +        "info": "Восстанавливается и объединяется последовательность для того, чтобы достоверно узнать завершение операции тестирования связи."
     },     },
     {     {
-        "id": "5a58b9c4.d46f88",+        "id": "8961f0c.35b121",
         "type": "change",         "type": "change",
         "z": "bf63e9a3.a5b928",         "z": "bf63e9a3.a5b928",
-        "name": "Перемещение данных",+        "name": "Установка статусов",
         "rules": [         "rules": [
             {             {
-                "t": "move",+                "t": "set",
                 "p": "payload",                 "p": "payload",
                 "pt": "msg",                 "pt": "msg",
-                "to": "fails", +                "to": "$type( payload ) = \"array\" ? ping : payload", 
-                "tot": "msg"+                "tot": "jsonata" 
 +            }, 
 +            { 
 +                "t": "set", 
 +                "p": "payload.status", 
 +                "pt": "msg", 
 +                "to": "( payload.sent = 0 and payload.response = false ) ? \"died\" : ( payload.sent = 1 and payload.response = false ) ? \"dead\" : ( payload.sent = 1 and payload.response > 0 ) ? \"revived\" : ( payload.sent = 0 and payload.response > 0 ) ? \"alive\"", 
 +                "tot": "jsonata"
             }             }
         ],         ],
Строка 508: Строка 532:
         "to": "",         "to": "",
         "reg": false,         "reg": false,
-        "x": 170+        "x": 240
-        "y": 520,+        "y": 340,
         "wires": [         "wires": [
             [             [
-                "c5361c7e.7aa9b"+                "93dadf2f.1e905"
             ]             ]
         ]         ]
     },     },
     {     {
-        "id": "c5361c7e.7aa9b", +        "id": "51891d56.192d94", 
-        "type": "sqlite",+        "type": "delay",
         "z": "bf63e9a3.a5b928",         "z": "bf63e9a3.a5b928",
-        "mydb": "2bc4c6d.cf1f03a", +        "name": "Задержка проверки", 
-        "sqlquery": "fixed", +        "pauseType": "delayv", 
-        "sql": "SELECT nameresponse FROM nw_status WHERE response > 0 ORDER BY response DESC", +        "timeout": "1", 
-        "name": "Выборкаустройство отвечает", +        "timeoutUnits": "seconds", 
-        "x": 670+        "rate": "1", 
-        "y": 520,+        "nbRateUnits": "1", 
 +        "rateUnits": "second", 
 +        "randomFirst": "1", 
 +        "randomLast": "5", 
 +        "randomUnits": "seconds", 
 +        "drop": false
 +        "x": 220
 +        "y": 160,
         "wires": [         "wires": [
             [             [
-                "e8ff64c5.1ca438"+                "f41fa10e.39756"
             ]             ]
         ]         ]
     },     },
     {     {
-        "id": "e85a41df.97796", +        "id": "6ccc324d.f380bc",
-        "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",         "type": "change",
         "z": "bf63e9a3.a5b928",         "z": "bf63e9a3.a5b928",
-        "name": "Установка флага отправки",+        "name": "Ввод настроек",
         "rules": [         "rules": [
 +            {
 +                "t": "set",
 +                "p": "settings.cycles",
 +                "pt": "flow",
 +                "to": "3",
 +                "tot": "num"
 +            },
 +            {
 +                "t": "set",
 +                "p": "settings.delay",
 +                "pt": "flow",
 +                "to": "10000",
 +                "tot": "num"
 +            },
 +            {
 +                "t": "set",
 +                "p": "settings.table",
 +                "pt": "flow",
 +                "to": "nw_status_test",
 +                "tot": "str"
 +            },
             {             {
                 "t": "set",                 "t": "set",
                 "p": "topic",                 "p": "topic",
                 "pt": "msg",                 "pt": "msg",
-                "to": "\"UPDATE nw_status SET sent \" & setsendstatus & \" WHERE _id = \" & payload._id",+                "to": "\"SELECT _id, name, host, timeout, sent FROM \\\"\" & $flowContext( \"settings.table\" \"\\\"\"",
                 "tot": "jsonata"                 "tot": "jsonata"
 +            },
 +            {
 +                "t": "set",
 +                "p": "status.run",
 +                "pt": "flow",
 +                "to": "true",
 +                "tot": "bool"
 +            },
 +            {
 +                "t": "set",
 +                "p": "status.sent",
 +                "pt": "flow",
 +                "to": "false",
 +                "tot": "bool"
             }             }
         ],         ],
Строка 574: Строка 617:
         "to": "",         "to": "",
         "reg": false,         "reg": false,
-        "x": 240+        "x": 440
-        "y": 760,+        "y": 40,
         "wires": [         "wires": [
             [             [
-                "ac764a5f.30d158"+                "f27932db.06f1e"
             ]             ]
-        ]+        ]
 +        "info": "**flow.settings.cycles** -- количество дополнительных попыток проверки связи (при установке \"0\" будет проведена 1 попытка; при установке \"1\", соответственно, 2, т.е. одна основная, и одна дополнительная);\n\n**flow.settings.delay** -- задержка между дополнительными попытками проверки;\n\n**flow.settings.table** -- название таблицы в базе данных."
     },     },
     {     {
-        "id": "a37420b1.59473", +        "id": "dbabb4a5.093288", 
-        "type": "sqlite",+        "type": "link in",
         "z": "bf63e9a3.a5b928",         "z": "bf63e9a3.a5b928",
-        "mydb": "2bc4c6d.cf1f03a", +        "name": "", 
-        "sqlquery": "fixed", +        "links": [ 
-        "sql": "SELECT _id, name FROM nw_status WHERE sent = true AND response > 0", +            "d2b39ab6.0c64f8
-        "name": "Выборка: у-ва с предупреждениями"+        ]
-        "x": 650+        "x": 75
-        "y": 220,+        "y": 160,
         "wires": [         "wires": [
             [             [
-                "9dc64396.a2ca2"+                "51891d56.192d94"
             ]             ]
         ]         ]
     },     },
     {     {
-        "id": "666b7178.3bf08", +        "id": "d2b39ab6.0c64f8", 
-        "type": "split",+        "type": "link out",
         "z": "bf63e9a3.a5b928",         "z": "bf63e9a3.a5b928",
-        "name": "Разделение массива", +        "name": "", 
-        "splt": "\\n", +        "links": [ 
-        "spltType": "str", +            "dbabb4a5.093288
-        "arraySplt": 1, +        ]
-        "arraySpltType": "len", +        "x": 675
-        "stream": false, +        "y": 220
-        "addname": ""+        "wires": []
-        "x": 700+
-        "y": 400+
-        "wires": [ +
-            [ +
-                "57aa603d.94b88" +
-            ] +
-        ]+
     },     },
     {     {
-        "id": "14e6ce78.52a912", +        "id": "721310f6.a461a", 
-        "type": "sqlite",+        "type": "link in",
         "z": "bf63e9a3.a5b928",         "z": "bf63e9a3.a5b928",
-        "mydb": "2bc4c6d.cf1f03a", +        "name": "", 
-        "sqlquery": "fixed", +        "links": [ 
-        "sql": "SELECT _id, name FROM nw_status WHERE response = false", +            "47244dcf.c20b34
-        "name": "Выборка: у-во не отвечает"+        ]
-        "x": 180+        "x": 75
-        "y": 460,+        "y": 280,
         "wires": [         "wires": [
             [             [
-                "2224cda9.8a42a2"+                "73733ff5.013f9"
             ]             ]
         ]         ]
     },     },
     {     {
-        "id": "d70537c9.e5d708",+        "id": "47244dcf.c20b34", 
 +        "type": "link out", 
 +        "z": "bf63e9a3.a5b928", 
 +        "name": "", 
 +        "links":
 +            "721310f6.a461a" 
 +        ], 
 +        "x": 775, 
 +        "y": 220, 
 +        "wires": [] 
 +    }, 
 +    { 
 +        "id": "ad444795.a7b668",
         "type": "switch",         "type": "switch",
         "z": "bf63e9a3.a5b928",         "z": "bf63e9a3.a5b928",
-        "name": "Отсечка пустых сообщений", +        "name": "Проверка метки", 
-        "property": "payload", +        "property": "status.run", 
-        "propertyType": "msg",+        "propertyType": "flow",
         "rules": [         "rules": [
             {             {
-                "t": "nempty"+                "t": "jsonata_exp", 
 +                "v": "$exists( $flowContext( \"status.run\" ) ) = false or $flowContext( \"status.run\" ) = false", 
 +                "vt": "jsonata" 
 +            }, 
 +            { 
 +                "t": "jsonata_exp", 
 +                "v": "( $exists( $flowContext( \"status.sent\" ) ) = false or $flowContext( \"status.sent\" ) = false) and $flowContext( \"status.run\" ) = true", 
 +                "vt": "jsonata"
             }             }
         ],         ],
         "checkall": "false",         "checkall": "false",
         "repair": false,         "repair": false,
-        "outputs": 1+        "outputs": 2
-        "x": 540,+        "x": 330, 
 +        "y": 100, 
 +        "wires":
 +            [ 
 +                "6ccc324d.f380bc" 
 +            ], 
 +            [ 
 +                "65cbf7fe.7357d8" 
 +            ] 
 +        ], 
 +        "info": "Фильтр запуска цепочки до завершения предыдущей задачи." 
 +    }, 
 +    { 
 +        "id": "d763f5eb.4a1378", 
 +        "type": "change", 
 +        "z": "bf63e9a3.a5b928", 
 +        "name": "Подсчет статусов", 
 +        "rules":
 +            { 
 +                "t": "set", 
 +                "p": "result.alive", 
 +                "pt": "msg", 
 +                "to": "payload.$sift( function( $v, $k ) { $k = \"status\" and $v = \"alive\" } ) ~> $count()", 
 +                "tot": "jsonata" 
 +            }, 
 +            { 
 +                "t": "set", 
 +                "p": "result.dead", 
 +                "pt": "msg", 
 +                "to": "payload.$sift( function( $v, $k ) { $k = \"status\" and $v = \"dead\" } ) ~> $count()", 
 +                "tot": "jsonata" 
 +            }, 
 +            { 
 +                "t": "set", 
 +                "p": "result.revived", 
 +                "pt": "msg", 
 +                "to": "payload.$sift( function( $v, $k ) { $k = \"status\" and $v = \"revived\" } ) ~> $count()", 
 +                "tot": "jsonata" 
 +            }, 
 +            { 
 +                "t": "set", 
 +                "p": "result.died", 
 +                "pt": "msg", 
 +                "to": "payload.$sift( function( $v, $k ) { $k = \"status\" and $v = \"died\" } ) ~> $count()", 
 +                "tot": "jsonata" 
 +            }, 
 +            { 
 +                "t": "set", 
 +                "p": "status.run", 
 +                "pt": "flow", 
 +                "to": "false", 
 +                "tot": "bool" 
 +            } 
 +        ], 
 +        "action": "", 
 +        "property": "", 
 +        "from": "", 
 +        "to": "", 
 +        "reg": false, 
 +        "x": 710,
         "y": 340,         "y": 340,
         "wires": [         "wires": [
             [             [
-                "666b7178.3bf08", +                "71abee18.7fdf4"
-                "a5ae845b.949b08"+
             ]             ]
         ]         ]
     },     },
     {     {
-        "id": "8eab3c0.f34e6c8",+        "id": "2aa2153.fed7bea", 
 +        "type": "subflow:38c9a069.18cd6", 
 +        "z": "bf63e9a3.a5b928", 
 +        "name": "Отправка писем", 
 +        "env": [], 
 +        "x": 710, 
 +        "y": 640, 
 +        "wires": [] 
 +    }, 
 +    { 
 +        "id": "38565f85.6837e",
         "type": "change",         "type": "change",
         "z": "bf63e9a3.a5b928",         "z": "bf63e9a3.a5b928",
-        "name": "Установка статуса отправки",+        "name": "Наложение проверок",
         "rules": [         "rules": [
             {             {
                 "t": "set",                 "t": "set",
-                "p": "setsendstatus",+                "p": "topic",
                 "pt": "msg",                 "pt": "msg",
 +                "to": "\"Уведомление системы мониторинга от \" & $now( '[H01]:[m01]:[s01] [D01].[M01].[Y0001]', '+1000' ) & \"!\"",
 +                "tot": "jsonata"
 +            },
 +            {
 +                "t": "set",
 +                "p": "payload",
 +                "pt": "msg",
 +                "to": "Запущен новый цикл проверки, тогда как предыдущий еще не завершен! Текущая проверка отменена. Возможно, необходимо увеличить интервал запуска.",
 +                "tot": "str"
 +            },
 +            {
 +                "t": "set",
 +                "p": "status.sent",
 +                "pt": "flow",
                 "to": "true",                 "to": "true",
                 "tot": "bool"                 "tot": "bool"
Строка 676: Строка 814:
         "to": "",         "to": "",
         "reg": false,         "reg": false,
-        "x": 180,+        "x": 700, 
 +        "y": 700, 
 +        "wires":
 +            [ 
 +                "2aa2153.fed7bea" 
 +            ] 
 +        ] 
 +    }, 
 +    { 
 +        "id": "49762568.343b6c", 
 +        "type": "link in", 
 +        "z": "bf63e9a3.a5b928", 
 +        "name": "", 
 +        "links":
 +            "65cbf7fe.7357d8" 
 +        ], 
 +        "x": 555, 
 +        "y": 700, 
 +        "wires":
 +            [ 
 +                "38565f85.6837e" 
 +            ] 
 +        ] 
 +    }, 
 +    { 
 +        "id": "65cbf7fe.7357d8", 
 +        "type": "link out", 
 +        "z": "bf63e9a3.a5b928", 
 +        "name": "", 
 +        "links":
 +            "49762568.343b6c" 
 +        ], 
 +        "x": 495, 
 +        "y": 100, 
 +        "wires": [] 
 +    }, 
 +    { 
 +        "id": "924e62cc.f20bf", 
 +        "type": "csv", 
 +        "z": "bf63e9a3.a5b928", 
 +        "name": "Преобразование в текст", 
 +        "sep": ",", 
 +        "hdrin": "", 
 +        "hdrout": "none", 
 +        "multi": "one", 
 +        "ret": "\\r\\n", 
 +        "temp": "string", 
 +        "skip": "0", 
 +        "strings": true, 
 +        "include_empty_strings": "", 
 +        "include_null_values": "", 
 +        "x": 430, 
 +        "y": 520, 
 +        "wires":
 +            [ 
 +                "6d923a0c.dfcda4" 
 +            ] 
 +        ] 
 +    }, 
 +    { 
 +        "id": "dd59e694.b8b688", 
 +        "type": "split", 
 +        "z": "bf63e9a3.a5b928", 
 +        "name": "Разделение пос-и", 
 +        "splt": "\\n", 
 +        "spltType": "str", 
 +        "arraySplt": 1, 
 +        "arraySpltType": "len", 
 +        "stream": false, 
 +        "addname": "", 
 +        "x": 430,
         "y": 400,         "y": 400,
         "wires": [         "wires": [
             [             [
-                "d70537c9.e5d708"+                "15fa5ef7.8a6351", 
 +                "5a977cdd.89d1a4"
             ]             ]
         ]         ]
     },     },
     {     {
-        "id": "9dc64396.a2ca2",+        "id": "5a977cdd.89d1a4",
         "type": "change",         "type": "change",
         "z": "bf63e9a3.a5b928",         "z": "bf63e9a3.a5b928",
-        "name": "Снятие статуса отправки",+        "name": "Подготовка свойств",
         "rules": [         "rules": [
             {             {
                 "t": "set",                 "t": "set",
-                "p": "setsendstatus",+                "p": "parts.id",
                 "pt": "msg",                 "pt": "msg",
-                "to": "false", +                "to": "payload.status", 
-                "tot": "bool"+                "tot": "msg" 
 +            }, 
 +            { 
 +                "t": "set", 
 +                "p": "parts.count", 
 +                "pt": "msg", 
 +                "to": "parts.id = \"alive\" ? result.alive : parts.id = \"dead\" ? result.dead : parts.id = \"revived\" ? result.revived : parts.id = \"died\" ? result.died", 
 +                "tot": "jsonata" 
 +            }, 
 +            { 
 +                "t": "delete", 
 +                "p": "parts.index", 
 +                "pt": "msg" 
 +            }, 
 +            { 
 +                "t": "set", 
 +                "p": "payload.string", 
 +                "pt": "msg", 
 +                "to": "( payload.response = false ? \"∞\" : payload.response ) & \" мс (\" & ( $exists( payload.count ) = false ? 0 : payload.count ) & \") - \" & payload.name & \" (\" & payload.host & \")\"", 
 +                "tot": "jsonata"
             }             }
         ],         ],
Строка 703: Строка 931:
         "to": "",         "to": "",
         "reg": false,         "reg": false,
-        "x": 690+        "x": 160
-        "y": 280,+        "y": 460,
         "wires": [         "wires": [
             [             [
-                "d70537c9.e5d708"+                "3e710520.472cea"
             ]             ]
         ]         ]
     },     },
     {     {
-        "id": "cdb27b4e.0e8408", +        "id": "3e710520.472cea", 
-        "type": "trigger",+        "type": "join",
         "z": "bf63e9a3.a5b928",         "z": "bf63e9a3.a5b928",
-        "name": "Отбрасывание лишних сообщений", +        "name": "Группировка по статусу", 
-        "op1": "", +        "mode": "auto", 
-        "op2": "", +        "build": "string", 
-        "op1type": "nul", +        "property": "payload", 
-        "op2type": "date", +        "propertyType": "msg", 
-        "duration": "10", +        "key": "topic", 
-        "extend": false+        "joiner": "\\n", 
-        "overrideDelay": false, +        "joinerType": "str"
-        "units": "s", +        "accumulate": false, 
-        "reset": "", +        "timeout": "", 
-        "bytopic": "all", +        "count": "", 
-        "topic": "topic", +        "reduceRight": false, 
-        "outputs": 1+        "reduceExp": "", 
-        "x": 210+        "reduceInit": "", 
-        "y": 160,+        "reduceInitType": "", 
 +        "reduceFixup": ""
 +        "x": 410
 +        "y": 460,
         "wires": [         "wires": [
             [             [
-                "a37420b1.59473"+                "5f8d8b50.4b7204"
             ]             ]
-        ]+        ]
 +        "info": "Создает до двух отдельных сообщений в зависимости от статуса -- отвечает устройство или нет."
     },     },
     {     {
-        "id": "251fd244.6bc71e", +        "id": "5f8d8b50.4b7204", 
-        "type": "trigger",+        "type": "change",
         "z": "bf63e9a3.a5b928",         "z": "bf63e9a3.a5b928",
-        "name": "Отбрасывание лишних сообщений", +        "name": "Подготовка нагрузки", 
-        "op1": "", +        "rules": 
-        "op2": "", +            { 
-        "op1type": "nul", +                "t": "set", 
-        "op2type": "date", +                "p": "payload", 
-        "duration": "10", +                "pt": "msg", 
-        "extend": false+                "to": "$type( payload[0].response ) = \"number\" ? $sort( payload, function( $l, $r ) { $l.response < $r.response } ) : payload", 
-        "overrideDelay": false+                "tot": "jsonata" 
-        "units": "s", +            }
-        "reset": "", +            { 
-        "bytopic": "all", +                "t": "set"
-        "topic": "topic", +                "p": "result.status", 
-        "outputs": 1+                "pt": "msg", 
-        "x": 310+                "to": "payload[0].status", 
-        "y": 280,+                "tot": "msg" 
 +            } 
 +        ]
 +        "action": "", 
 +        "property": "", 
 +        "from": "", 
 +        "to": "", 
 +        "reg": false
 +        "x": 160
 +        "y": 520,
         "wires": [         "wires": [
             [             [
-                "f22d9840.db3838"+                "924e62cc.f20bf"
             ]             ]
         ]         ]
     },     },
     {     {
-        "id": "a5ae845b.949b08",+        "id": "15fa5ef7.8a6351",
         "type": "switch",         "type": "switch",
         "z": "bf63e9a3.a5b928",         "z": "bf63e9a3.a5b928",
-        "name": "Выбор пути", +        "name": "Фильтрация статусов", 
-        "property": "setsendstatus",+        "property": "payload",
         "propertyType": "msg",         "propertyType": "msg",
         "rules": [         "rules": [
             {             {
-                "t": "true" +                "t": "jsonata_exp", 
-            }+                "v": "payload.status = \"died\" or payload.status = \"revived\"", 
-            { +                "vt": "jsonata"
-                "t": "false"+
             }             }
         ],         ],
         "checkall": "false",         "checkall": "false",
         "repair": false,         "repair": false,
-        "outputs": 2+        "outputs": 1
-        "x": 470,+        "x": 700,
         "y": 400,         "y": 400,
         "wires": [         "wires": [
             [             [
-                "14e6ce78.52a912" +                "663cca43.d8dff4"
-            ], +
-            [ +
-                "2224cda9.8a42a2"+
             ]             ]
         ]         ]
     },     },
     {     {
-        "id": "f78e87bf.8fa918",+        "id": "a07661e9.dc5b5", 
 +        "type": "sqlite", 
 +        "z": "bf63e9a3.a5b928", 
 +        "mydb": "2bc4c6d.cf1f03a", 
 +        "sqlquery": "msg.topic", 
 +        "sql": "", 
 +        "name": "Запись статусов", 
 +        "x": 710, 
 +        "y": 520, 
 +        "wires":
 +            [] 
 +        ] 
 +    }, 
 +    { 
 +        "id": "663cca43.d8dff4",
         "type": "change",         "type": "change",
         "z": "bf63e9a3.a5b928",         "z": "bf63e9a3.a5b928",
-        "name": "Установка первой строки тела",+        "name": "Подготовка изменений",
         "rules": [         "rules": [
             {             {
-                "t": "change", +                "t": "set", 
-                "p": "setsendstatus",+                "p": "topic",
                 "pt": "msg",                 "pt": "msg",
-                "from": "true", +                "to": "\"UPDATE \"& $flowContext( \"settings.table\) & \SET sent = \& ( ( payload.status = \"died\and payload.sent = 0 ) ? 1 ( payload.status = \"revived\and payload.sent = 1 ) ? 0 ) & \WHERE _id = \& payload._id", 
-                "fromt": "bool", +                "tot": "jsonata"
-                "to": "Устройства перестали отвечать"+
-                "tot""str" +
-            }, +
-            { +
-                "t": "change", +
-                "p": "setsendstatus"+
-                "pt": "msg", +
-                "from": "false", +
-                "fromt": "bool", +
-                "to": "Устройства начали отвечать", +
-                "tot": "str"+
             }             }
         ],         ],
Строка 820: Строка 1060:
         "to": "",         "to": "",
         "reg": false,         "reg": false,
-        "x": 670+        "x": 690
-        "y": 640,+        "y": 460,
         "wires": [         "wires": [
             [             [
-                "a91d85a7.c844f8"+                "a07661e9.dc5b5"
             ]             ]
         ]         ]
     },     },
     {     {
-        "id": "e8ff64c5.1ca438",+        "id": "71abee18.7fdf4",
         "type": "switch",         "type": "switch",
         "z": "bf63e9a3.a5b928",         "z": "bf63e9a3.a5b928",
-        "name": "Фильтрация пустой нагрузки",+        "name": "Фильтрация изменений",
         "property": "payload",         "property": "payload",
         "propertyType": "msg",         "propertyType": "msg",
         "rules": [         "rules": [
             {             {
-                "t": "empty" +                "t": "jsonata_exp", 
-            }+                "v": "( result.revived > 0 or result.died > 0 ) or ( result.dead > 0 and periodical = true)", 
-            { +                "vt": "jsonata"
-                "t": "else"+
             }             }
         ],         ],
         "checkall": "false",         "checkall": "false",
         "repair": false,         "repair": false,
-        "outputs": 2+        "outputs": 1
-        "x": 190,+        "x": 170, 
 +        "y": 400, 
 +        "wires":
 +            [ 
 +                "dd59e694.b8b688" 
 +            ] 
 +        ] 
 +    }, 
 +    { 
 +        "id": "6d923a0c.dfcda4", 
 +        "type": "change", 
 +        "z": "bf63e9a3.a5b928", 
 +        "name": "Сохранение текста", 
 +        "rules":
 +            { 
 +                "t": "set", 
 +                "p": "status.texts", 
 +                "pt": "flow", 
 +                "to": "$merge( [ $flowContext( \"status.texts\" ), { $.result.status : payload } ] )", 
 +                "tot": "jsonata" 
 +            } 
 +        ], 
 +        "action": "", 
 +        "property": "", 
 +        "from": "", 
 +        "to": "", 
 +        "reg": false, 
 +        "x": 160,
         "y": 580,         "y": 580,
         "wires": [         "wires": [
             [             [
-                "ba2d5855.7ea038+                "2fb8a144.23e9ee
-            ],+            ] 
 +        ] 
 +    }, 
 +    { 
 +        "id": "2fb8a144.23e9ee", 
 +        "type": "trigger", 
 +        "z": "bf63e9a3.a5b928", 
 +        "name": "Ожидание всех частей", 
 +        "op1": "", 
 +        "op2": "true", 
 +        "op1type": "nul", 
 +        "op2type": "bool", 
 +        "duration": "2", 
 +        "extend": true, 
 +        "overrideDelay": false, 
 +        "units": "s", 
 +        "reset": "", 
 +        "bytopic": "all", 
 +        "topic": "topic", 
 +        "outputs": 1, 
 +        "x": 430, 
 +        "y": 580, 
 +        "wires": [
             [             [
-                "e85a41df.97796"+                "13bfd89.8a76c27"
             ]             ]
         ]         ]
     },     },
     {     {
-        "id": "ba2d5855.7ea038",+        "id": "13bfd89.8a76c27",
         "type": "change",         "type": "change",
         "z": "bf63e9a3.a5b928",         "z": "bf63e9a3.a5b928",
-        "name": "Сообщение о пустой нагрузке",+        "name": "Подготовка письма",
         "rules": [         "rules": [
 +            {
 +                "t": "set",
 +                "p": "topic",
 +                "pt": "msg",
 +                "to": "( periodical = true ? \"Сводка системы мониторинга от \" : \"Уведомление системы мониторинга от \" ) & $now( '[H01]:[m01]:[s01] [D01].[M01].[Y0001]', '+1000' ) & \"!\"",
 +                "tot": "jsonata"
 +            },
             {             {
                 "t": "set",                 "t": "set",
                 "p": "payload",                 "p": "payload",
                 "pt": "msg",                 "pt": "msg",
-                "to": "Ни одно устройство не отвечает!", +                "to": "( $exists( $flowContext( \"status.texts.revived\" ) ) = true ? \"Устройства начали отвечать:\\n\" ) & ( $exists( $flowContext( \"status.texts.revived\" ) ) = true ? ( $flowContext( \"status.texts.revived\" ) & \"\\n\" ) ) & ( $exists( $flowContext( \"status.texts.died\" ) ) = true ? \"Устройства перестали отвечать: \\n\" ) & ( $exists( $flowContext( \"status.texts.died\" ) ) = true ? ( $flowContext( \"status.texts.died\" ) & \"\\n\" ) ) & ( $exists( $flowContext( \"status.texts.dead\" ) ) = true ? \"Устройства не отвечают:\\n\" ) & ( $exists( $flowContext( \"status.texts.dead\" ) ) = true ? ( $flowContext( \"status.texts.dead\" ) & \"\\n\" ) ) & ( $exists( $flowContext( \"status.texts.alive\" ) ) = true ? \"Диагностические данные:\\n\" ) & ( $exists( $flowContext( \"status.texts.alive\" ) ) = true ? $flowContext( \"status.texts.alive\" ) )", 
-                "tot": "str"+                "tot": "jsonata" 
 +            }, 
 +            { 
 +                "t": "delete", 
 +                "p": "status.texts", 
 +                "pt": "flow"
             }             }
         ],         ],
Строка 876: Строка 1176:
         "to": "",         "to": "",
         "reg": false,         "reg": false,
-        "x": 670,+        "x": 700,
         "y": 580,         "y": 580,
         "wires": [         "wires": [
             [             [
-                "f78e87bf.8fa918"+                "2aa2153.fed7bea"
             ]             ]
         ]         ]
     },     },
     {     {
-        "id": "917c54d9.b70438", +        "id": "172accf.e425333", 
-        "type": "link out",+        "type": "inject",
         "z": "bf63e9a3.a5b928",         "z": "bf63e9a3.a5b928",
-        "name": "", +        "name": "Запустить и сбросить метку", 
-        "links": [ +        "props": [], 
-            "6eb43df6.380bd4", +        "repeat": "", 
-            "4918704f.87e68"+        "crontab": "", 
 +        "once": false, 
 +        "onceDelay": "1", 
 +        "topic": "", 
 +        "payloadType": "str", 
 +        "x": 180, 
 +        "y": 40, 
 +        "wires": [ 
 +            
 +                "6ccc324d.f380bc" 
 +            ]
         ],         ],
-        "x": 775, +        "info": "Сбросить метку `flow.status.run` и запустить поток. Полезно при сбояхкогда цепочка повисла в режиме ожидания."
-        "y": 160, +
-        "wires": []+
     },     },
     {     {
-        "id": "6eb43df6.380bd4", +        "id": "d45c7cea.9b2c4", 
-        "type": "link in",+        "type": "inject",
         "z": "bf63e9a3.a5b928",         "z": "bf63e9a3.a5b928",
-        "name": "", +        "name": "Периодическая сводка", 
-        "links": [ +        "props": [ 
-            "917c54d9.b70438", +            
-            "c405ff.17624a"+                "p": "topic", 
 +                "v": "\"SELECT _id, name, host, response, sent, cycles FROM \\\"\" & $flowContext( \"settings.table\" ) & \"\\\"\"", 
 +                "vt": "jsonata" 
 +            }, 
 +            { 
 +                "p": "periodical", 
 +                "v": "true", 
 +                "vt": "bool" 
 +            }
         ],         ],
-        "x": 495+        "repeat": "21600", 
-        "y": 760,+        "crontab": "", 
 +        "once": true, 
 +        "onceDelay": "60", 
 +        "topic": "", 
 +        "payloadType": "str", 
 +        "x": 170
 +        "y": 640,
         "wires": [         "wires": [
             [             [
-                "6432f525.3fcdec"+                "994ffc21.74839" 
 +            ] 
 +        ], 
 +        "info": "Отправляется только, если есть \"мертвые\" устройства." 
 +    }, 
 +    { 
 +        "id": "994ffc21.74839", 
 +        "type": "sqlite", 
 +        "z": "bf63e9a3.a5b928", 
 +        "mydb": "2bc4c6d.cf1f03a", 
 +        "sqlquery": "msg.topic", 
 +        "sql": "", 
 +        "name": "Выборка устройств", 
 +        "x": 440, 
 +        "y": 640, 
 +        "wires":
 +            [ 
 +                "f97471ca.36e7d"
             ]             ]
         ]         ]
     },     },
     {     {
-        "id": "c405ff.17624a", +        "id": "f97471ca.36e7d", 
-        "type": "link out",+        "type": "split",
         "z": "bf63e9a3.a5b928",         "z": "bf63e9a3.a5b928",
-        "name": "", +        "name": "Разделение пос-и", 
-        "links": [ +        "splt": "\\n", 
-            "6eb43df6.380bd4+        "spltType": "str", 
-        ]+        "arraySplt": 1, 
-        "x": 775+        "arraySpltType": "len", 
-        "y": 40+        "stream": false, 
-        "wires": []+        "addname": ""
 +        "x": 150
 +        "y": 700
 +        "wires": [ 
 +            [ 
 +                "a11064c5.7b4778" 
 +            ] 
 +        ]
     },     },
     {     {
-        "id": "4918704f.87e68",+        "id": "f9033d4c.c67e1",
         "type": "link in",         "type": "link in",
         "z": "bf63e9a3.a5b928",         "z": "bf63e9a3.a5b928",
         "name": "",         "name": "",
         "links": [         "links": [
-            "917c54d9.b70438"+            "d76d9726.edb0b8"
         ],         ],
         "x": 75,         "x": 75,
-        "y": 280,+        "y": 340,
         "wires": [         "wires": [
             [             [
-                "20b57937.b480b6"+                "8961f0c.35b121"
             ]             ]
         ]         ]
     },     },
     {     {
-        "id": "57aa603d.94b88",+        "id": "d76d9726.edb0b8",
         "type": "link out",         "type": "link out",
         "z": "bf63e9a3.a5b928",         "z": "bf63e9a3.a5b928",
         "name": "",         "name": "",
         "links": [         "links": [
-            "5faa1282.d0715c"+            "f9033d4c.c67e1"
         ],         ],
-        "x": 775+        "x": 495
-        "y": 340,+        "y": 700,
         "wires": []         "wires": []
     },     },
     {     {
-        "id": "5faa1282.d0715c", +        "id": "a11064c5.7b4778", 
-        "type": "link in",+        "type": "change",
         "z": "bf63e9a3.a5b928",         "z": "bf63e9a3.a5b928",
-        "name": "", +        "name": "Подготовка св-в", 
-        "links": [ +        "rules": [ 
-            "57aa603d.94b88"+            
 +                "t": "set", 
 +                "p": "payload.response"
 +                "pt": "msg", 
 +                "to": "payload.response = 0 ? false : payload.response", 
 +                "tot": "jsonata" 
 +            }, 
 +            { 
 +                "t": "move", 
 +                "p": "payload.cycles", 
 +                "pt": "msg", 
 +                "to": "payload.count", 
 +                "tot": "msg" 
 +            }
         ],         ],
-        "x": 75+        "action": "", 
-        "y": 760,+        "property": "", 
 +        "from": "", 
 +        "to": "", 
 +        "reg": false, 
 +        "x": 350
 +        "y": 700,
         "wires": [         "wires": [
             [             [
-                "bd70494f.de36c8"+                "d76d9726.edb0b8"
             ]             ]
         ]         ]
Последнее изменение: 2022/02/12 11:40 (внешнее изменение)