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

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


iot:software:node-red:flows:leak_detection

Оповещение о протечках через Node-RED

Этот поток создан для уведомления о протечках на электронную почту, если используется нестандартный метод подключения датчика или в вашей экосистеме Apple HomeKit нет «домашнего центра управления». В этих случаях о сработке датчика вы узнаете только находясь дома,.. что не достаточно хорошо. LOL

Причем оба этих кейса, как раз мой случай.

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

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

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

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

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

При получении сообщения, проверяется, есть ли такое устройство в базе данных. Если это новый датчик, то создается запись в таблице и на почту отправляется приветственное письмо с инструкцией по назначению датчику корректного названия. Если датчик присутствует в таблице, определяется, какие данные он передает. Если он передает протечку, то информация заносится в таблицу и отправляется предупреждение на почту. Помимо этого датчик попадает в цепочку повторных предупреждений, которые отправляются с заданной периодичностью, где он крутится до тех пор, пока протечка не будет устранена. Если протечка была, но устранена, то отправляется письмо о восстановлении датчика и в таблицу заносятся соответствующие данные. Если протечки и не было, то ничего не происходит.

Также к потоку подключен подпоток сторожевого таймера, который при отсутствии периодических диагностических данных от датчика, уведомит об этом на почту.

Создание таблицы

:!: Для работы этого потока, необходимо вручную создать таблицу, выполнив SQL-запрос:

CREATE TABLE wl_state (_id TEXT PRIMARY KEY, name TEXT UNIQUE, INTEGER DEFAULT 0, TIMESTAMP INTEGER)

Пример цепочки:

[
    {
        "id": "28be5e5d.cb7442",
        "type": "inject",
        "z": "67ff7e91.76e24",
        "name": "Подготовка запроса",
        "props": [
            {
                "p": "topic",
                "vt": "str"
            },
            {
                "p": "payload"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "CREATE TABLE wl_state (_id TEXT PRIMARY KEY, name TEXT UNIQUE, INTEGER DEFAULT 0, timestamp INTEGER)",
        "payload": "",
        "payloadType": "date",
        "x": 370,
        "y": 160,
        "wires": [
            [
                "d089a31b.a5805"
            ]
        ]
    },
    {
        "id": "758cd73a.9cf318",
        "type": "debug",
        "z": "67ff7e91.76e24",
        "name": "Вывод команды",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 370,
        "y": 280,
        "wires": []
    },
    {
        "id": "d089a31b.a5805",
        "type": "sqlite",
        "z": "67ff7e91.76e24",
        "mydb": "4ab28460.21e8cc",
        "sqlquery": "msg.topic",
        "sql": "",
        "name": "Создание таблицы",
        "x": 370,
        "y": 220,
        "wires": [
            [
                "758cd73a.9cf318"
            ]
        ]
    },
    {
        "id": "4ab28460.21e8cc",
        "type": "sqlitedb",
        "db": "c:\\noderedDB\\water_leak.db",
        "mode": "RWC"
    }
]

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

leak-detection.json
[
    {
        "id": "98ba2d02.5ee68",
        "type": "subflow",
        "name": "watchdog",
        "info": "Ожидает поступление сообщений в установленный интервал, если сообщения нет, генерирует письмо с предупреждением.\n\nПринимает **msg.topic** в качестве ID датчика и **msg.payload** в качестве названия, которые будут указаны в теле письма.",
        "category": "",
        "in": [
            {
                "x": 80,
                "y": 40,
                "wires": [
                    {
                        "id": "fee5d855.a15048"
                    }
                ]
            }
        ],
        "out": [],
        "env": [
            {
                "name": "msgnote35634",
                "type": "str",
                "value": "",
                "ui": {
                    "label": {
                        "en-US": "Укажите задержку срабатывания таймера в миллисекундах."
                    },
                    "type": "none"
                }
            },
            {
                "name": "msgdelay",
                "type": "num",
                "value": "3600000",
                "ui": {
                    "icon": "font-awesome/fa-clock-o",
                    "label": {
                        "en-US": "Задержка (мс)"
                    },
                    "type": "input",
                    "opts": {
                        "types": [
                            "num"
                        ]
                    }
                }
            }
        ],
        "color": "#FFAAAA",
        "icon": "font-awesome/fa-clock-o"
    },
    {
        "id": "7cada431.44b94c",
        "type": "trigger",
        "z": "98ba2d02.5ee68",
        "name": "Таймер",
        "op1": "",
        "op2": "",
        "op1type": "pay",
        "op2type": "date",
        "duration": "10",
        "extend": true,
        "overrideDelay": true,
        "units": "s",
        "reset": "",
        "bytopic": "topic",
        "topic": "topic",
        "outputs": 2,
        "x": 540,
        "y": 40,
        "wires": [
            [
                "536fe262.24fb2c"
            ],
            [
                "27141a53.5a2246"
            ]
        ],
        "outputLabels": [
            "Первое",
            "Ошибка"
        ]
    },
    {
        "id": "3cfc87ed.72e3d8",
        "type": "subflow:38c9a069.18cd6",
        "z": "98ba2d02.5ee68",
        "name": "Отправка почты",
        "env": [],
        "x": 710,
        "y": 580,
        "wires": []
    },
    {
        "id": "ca1cc7d1.c86308",
        "type": "change",
        "z": "98ba2d02.5ee68",
        "name": "Установка текстовых полей письма",
        "rules": [
            {
                "t": "move",
                "p": "firstline",
                "pt": "msg",
                "to": "payload",
                "tot": "msg"
            },
            {
                "t": "set",
                "p": "topic",
                "pt": "msg",
                "to": "\"Изменился статус датчика (\" & $now('[H01]:[m01]:[s01] [D01].[M01].[Y0001]', '+1000') & \")\"",
                "tot": "jsonata"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 210,
        "y": 580,
        "wires": [
            [
                "3cfc87ed.72e3d8"
            ]
        ]
    },
    {
        "id": "fee5d855.a15048",
        "type": "change",
        "z": "98ba2d02.5ee68",
        "name": "Установка задержки таймера",
        "rules": [
            {
                "t": "set",
                "p": "delay",
                "pt": "msg",
                "to": "msgdelay",
                "tot": "env"
            },
            {
                "t": "set",
                "p": "savedtopic",
                "pt": "msg",
                "to": "topic",
                "tot": "msg"
            },
            {
                "t": "set",
                "p": "savedpayload",
                "pt": "msg",
                "to": "payload",
                "tot": "msg"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 290,
        "y": 40,
        "wires": [
            [
                "7cada431.44b94c"
            ]
        ]
    },
    {
        "id": "536fe262.24fb2c",
        "type": "change",
        "z": "98ba2d02.5ee68",
        "name": "Подготовка запроса",
        "rules": [
            {
                "t": "set",
                "p": "topic",
                "pt": "msg",
                "to": "\"SELECT * FROM watchdog WHERE topic = \\\"\" & savedtopic & \"\\\"\"",
                "tot": "jsonata"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 160,
        "y": 100,
        "wires": [
            [
                "25c0b13d.61990e"
            ]
        ]
    },
    {
        "id": "25c0b13d.61990e",
        "type": "sqlite",
        "z": "98ba2d02.5ee68",
        "mydb": "abf4792e.cd5078",
        "sqlquery": "msg.topic",
        "sql": "",
        "name": "Запрос на наличие записи в БД",
        "x": 200,
        "y": 160,
        "wires": [
            [
                "43ffca62.b3b554"
            ]
        ]
    },
    {
        "id": "43ffca62.b3b554",
        "type": "switch",
        "z": "98ba2d02.5ee68",
        "name": "Маршрутизация",
        "property": "payload",
        "propertyType": "msg",
        "rules": [
            {
                "t": "nempty"
            },
            {
                "t": "else"
            }
        ],
        "checkall": "false",
        "repair": false,
        "outputs": 2,
        "x": 650,
        "y": 160,
        "wires": [
            [
                "2557a088.c4251"
            ],
            [
                "90a4953e.e690a8"
            ]
        ]
    },
    {
        "id": "90a4953e.e690a8",
        "type": "change",
        "z": "98ba2d02.5ee68",
        "name": "Подготовка запроса",
        "rules": [
            {
                "t": "set",
                "p": "topic",
                "pt": "msg",
                "to": "\"INSERT INTO watchdog (topic, name) VALUES (\\\"\" & savedtopic & \"\\\", \\\"\" & savedpayload & \"\\\")\"",
                "tot": "jsonata"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 160,
        "y": 220,
        "wires": [
            [
                "235c7484.7cd52c"
            ]
        ]
    },
    {
        "id": "235c7484.7cd52c",
        "type": "sqlite",
        "z": "98ba2d02.5ee68",
        "mydb": "abf4792e.cd5078",
        "sqlquery": "msg.topic",
        "sql": "",
        "name": "Добавление отсутствующей записи",
        "x": 210,
        "y": 280,
        "wires": [
            [
                "2557a088.c4251"
            ]
        ]
    },
    {
        "id": "2557a088.c4251",
        "type": "change",
        "z": "98ba2d02.5ee68",
        "name": "Подготовка запроса",
        "rules": [
            {
                "t": "set",
                "p": "topic",
                "pt": "msg",
                "to": "\"SELECT * FROM watchdog WHERE topic = \\\"\" & savedtopic & \"\\\" AND sent = false\"",
                "tot": "jsonata"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 540,
        "y": 280,
        "wires": [
            [
                "b903c102.384fe"
            ]
        ]
    },
    {
        "id": "b903c102.384fe",
        "type": "sqlite",
        "z": "98ba2d02.5ee68",
        "mydb": "abf4792e.cd5078",
        "sqlquery": "msg.topic",
        "sql": "",
        "name": "Выборка записей, которые не отправлялись",
        "x": 240,
        "y": 340,
        "wires": [
            [
                "2d7a7c9c.c9c0a4"
            ]
        ]
    },
    {
        "id": "2d7a7c9c.c9c0a4",
        "type": "switch",
        "z": "98ba2d02.5ee68",
        "name": "Отсечка пустых сообщений",
        "property": "payload",
        "propertyType": "msg",
        "rules": [
            {
                "t": "nempty"
            }
        ],
        "checkall": "false",
        "repair": false,
        "outputs": 1,
        "x": 180,
        "y": 400,
        "wires": [
            [
                "29c18b99.2c4044"
            ]
        ]
    },
    {
        "id": "27141a53.5a2246",
        "type": "change",
        "z": "98ba2d02.5ee68",
        "name": "Настройка текста письма (false)",
        "rules": [
            {
                "t": "set",
                "p": "topic",
                "pt": "msg",
                "to": "false",
                "tot": "bool"
            },
            {
                "t": "set",
                "p": "firstline",
                "pt": "msg",
                "to": "\"Датчик \\\"\" & savedpayload & \"\\\" не передает показания уже \" & $ceil(delay/1000/60) & \" мин!\\n\\nИдентификатор устройства \\\"\" & savedtopic & \"\\\".\"",
                "tot": "jsonata"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 660,
        "y": 100,
        "wires": [
            [
                "b13655cc.bdf9d8"
            ]
        ]
    },
    {
        "id": "b13655cc.bdf9d8",
        "type": "change",
        "z": "98ba2d02.5ee68",
        "name": "Подготовка запроса",
        "rules": [
            {
                "t": "set",
                "p": "topic",
                "pt": "msg",
                "to": "\"UPDATE watchdog SET sent = \" & topic & \" WHERE topic = \\\"\" & savedtopic & \"\\\"\"",
                "tot": "jsonata"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 700,
        "y": 460,
        "wires": [
            [
                "b4d28c09.f2007"
            ]
        ]
    },
    {
        "id": "b4d28c09.f2007",
        "type": "sqlite",
        "z": "98ba2d02.5ee68",
        "mydb": "abf4792e.cd5078",
        "sqlquery": "msg.topic",
        "sql": "",
        "name": "Установка флага отправки",
        "x": 180,
        "y": 520,
        "wires": [
            [
                "ca1cc7d1.c86308"
            ]
        ]
    },
    {
        "id": "29c18b99.2c4044",
        "type": "change",
        "z": "98ba2d02.5ee68",
        "name": "Настройка текста письма (true)",
        "rules": [
            {
                "t": "set",
                "p": "topic",
                "pt": "msg",
                "to": "true",
                "tot": "bool"
            },
            {
                "t": "set",
                "p": "firstline",
                "pt": "msg",
                "to": "\"Датчик \\\"\" & savedpayload & \"\\\" передал показания! Интервал проверки \" & $ceil(delay/1000/60) & \" мин.\\n\\nИдентификатор устройства \\\"\" & savedtopic & \"\\\".\"",
                "tot": "jsonata"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 190,
        "y": 460,
        "wires": [
            [
                "b13655cc.bdf9d8"
            ]
        ]
    },
    {
        "id": "abf4792e.cd5078",
        "type": "sqlitedb",
        "z": "98ba2d02.5ee68",
        "db": "c:\\noderedDB\\watchdog.db",
        "mode": "RWC"
    },
    {
        "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": "5cda2c4a.a099b4",
        "type": "tab",
        "label": "Детекция протечек",
        "disabled": false,
        "info": ""
    },
    {
        "id": "c032c9e5.848ad8",
        "type": "change",
        "z": "5cda2c4a.a099b4",
        "name": "Сохранение данных и формирование запроса",
        "rules": [
            {
                "t": "set",
                "p": "originaltopic",
                "pt": "msg",
                "to": "topic",
                "tot": "msg"
            },
            {
                "t": "set",
                "p": "originalpayload",
                "pt": "msg",
                "to": "payload",
                "tot": "msg"
            },
            {
                "t": "set",
                "p": "topic",
                "pt": "msg",
                "to": "\"SELECT name, sent FROM wl_state WHERE _id = \\\"\" & originaltopic & \"\\\"\"",
                "tot": "jsonata"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 620,
        "y": 100,
        "wires": [
            [
                "d0cef548.c51a88"
            ]
        ]
    },
    {
        "id": "7e624390.fd809c",
        "type": "switch",
        "z": "5cda2c4a.a099b4",
        "name": "Наличие протечки",
        "property": "originalpayload.water_leak",
        "propertyType": "msg",
        "rules": [
            {
                "t": "true"
            },
            {
                "t": "else"
            }
        ],
        "checkall": "false",
        "repair": false,
        "outputs": 2,
        "x": 150,
        "y": 280,
        "wires": [
            [
                "639b2ac5.5c2d04"
            ],
            [
                "14d51aec.cc7875"
            ]
        ],
        "outputLabels": [
            "Есть",
            "Нет"
        ]
    },
    {
        "id": "d0cef548.c51a88",
        "type": "sqlite",
        "z": "5cda2c4a.a099b4",
        "mydb": "4ab28460.21e8cc",
        "sqlquery": "msg.topic",
        "sql": "",
        "name": "Запрос данных у-ва",
        "x": 160,
        "y": 160,
        "wires": [
            [
                "a4fced1f.9219"
            ]
        ]
    },
    {
        "id": "a4fced1f.9219",
        "type": "switch",
        "z": "5cda2c4a.a099b4",
        "name": "Наличие у-ва в базе",
        "property": "payload",
        "propertyType": "msg",
        "rules": [
            {
                "t": "nempty"
            },
            {
                "t": "else"
            }
        ],
        "checkall": "false",
        "repair": false,
        "outputs": 2,
        "x": 160,
        "y": 220,
        "wires": [
            [
                "7e624390.fd809c",
                "26b59bd5.85cca4"
            ],
            [
                "7920981a.ac5458"
            ]
        ],
        "outputLabels": [
            "Есть",
            "Нет"
        ]
    },
    {
        "id": "7920981a.ac5458",
        "type": "change",
        "z": "5cda2c4a.a099b4",
        "name": "Формирование запроса",
        "rules": [
            {
                "t": "set",
                "p": "newname",
                "pt": "msg",
                "to": "\"Новый датчик \" & $ceil($random()*1000)",
                "tot": "jsonata"
            },
            {
                "t": "set",
                "p": "topic",
                "pt": "msg",
                "to": "\"INSERT INTO wl_state (_id, name) VALUES (\\\"\" & originaltopic & \"\\\", \\\"\" & newname & \"\\\")\"",
                "tot": "jsonata"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 550,
        "y": 160,
        "wires": [
            [
                "4e9b4527.40225c"
            ]
        ]
    },
    {
        "id": "4e9b4527.40225c",
        "type": "sqlite",
        "z": "5cda2c4a.a099b4",
        "mydb": "4ab28460.21e8cc",
        "sqlquery": "msg.topic",
        "sql": "",
        "name": "Добавление нового устройства",
        "x": 570,
        "y": 220,
        "wires": [
            [
                "91922c30.07bbe"
            ]
        ]
    },
    {
        "id": "91922c30.07bbe",
        "type": "change",
        "z": "5cda2c4a.a099b4",
        "name": "Формирование приветственного письма",
        "rules": [
            {
                "t": "set",
                "p": "topic",
                "pt": "msg",
                "to": "\"В систему добавлен новый датчик (\" & $now('[H01]:[m01]:[s01] [D01].[M01].[Y0001]', '+1000') & \")\"",
                "tot": "jsonata"
            },
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "\"Пожалуйста, измените название датчика на корректное. Сейчас он называется \\\"\" & newname & \"\\\".\\n\\nИнструкция:\\n1) Откройте нужный поток в web-интерфейсе Node-RED;\\n2) Откройте свойства узла \\\"Переименование датчика\\\";\\n3) В поле \\\"deviceid\\\" вставьте значение \\\"\" & originaltopic & \"\\\";\\n4) В поле \\\"devicenewname\\\" впишите новое название;\\n5) Нажмите \\\"Готово\\\", \\\"Развернуть\\\" и запустите узел.\"",
                "tot": "jsonata"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 600,
        "y": 280,
        "wires": [
            [
                "7278784c.781738"
            ]
        ]
    },
    {
        "id": "a0d0bc06.69b2f",
        "type": "subflow:38c9a069.18cd6",
        "z": "5cda2c4a.a099b4",
        "name": "Отправка почты",
        "env": [],
        "x": 630,
        "y": 940,
        "wires": []
    },
    {
        "id": "cf569c2.ff8e06",
        "type": "sqlite",
        "z": "5cda2c4a.a099b4",
        "mydb": "4ab28460.21e8cc",
        "sqlquery": "msg.topic",
        "sql": "",
        "name": "Запись статуса отправки",
        "x": 550,
        "y": 580,
        "wires": [
            [
                "b124d397.59a69"
            ]
        ]
    },
    {
        "id": "14d51aec.cc7875",
        "type": "switch",
        "z": "5cda2c4a.a099b4",
        "name": "Блокировка диагностики",
        "property": "payload[0].sent",
        "propertyType": "msg",
        "rules": [
            {
                "t": "eq",
                "v": "1",
                "vt": "num"
            }
        ],
        "checkall": "false",
        "repair": false,
        "outputs": 1,
        "x": 170,
        "y": 340,
        "wires": [
            [
                "8ee6a8f8.289bf8",
                "26c1c49e.f46bac"
            ]
        ]
    },
    {
        "id": "1fb86d20.8d0583",
        "type": "change",
        "z": "5cda2c4a.a099b4",
        "name": "Подготовка письма о протечке",
        "rules": [
            {
                "t": "set",
                "p": "topic",
                "pt": "msg",
                "to": "\"Обнаружена протечка в \" & $now('[H01]:[m01]:[s01] [D01].[M01].[Y0001]', '+1000') & \"!\"",
                "tot": "jsonata"
            },
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "\"Сработал датчик \\\"\" & payload[0].name & \"\\\".\"",
                "tot": "jsonata"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 570,
        "y": 400,
        "wires": [
            [
                "7278784c.781738"
            ]
        ]
    },
    {
        "id": "639b2ac5.5c2d04",
        "type": "switch",
        "z": "5cda2c4a.a099b4",
        "name": "Блокировка повторной отправки",
        "property": "payload[0].sent",
        "propertyType": "msg",
        "rules": [
            {
                "t": "eq",
                "v": "0",
                "vt": "num"
            }
        ],
        "checkall": "false",
        "repair": false,
        "outputs": 1,
        "x": 580,
        "y": 460,
        "wires": [
            [
                "1fb86d20.8d0583",
                "42cc2306.8a7eac"
            ]
        ]
    },
    {
        "id": "42cc2306.8a7eac",
        "type": "change",
        "z": "5cda2c4a.a099b4",
        "name": "Установка метки и даты",
        "rules": [
            {
                "t": "set",
                "p": "topic",
                "pt": "msg",
                "to": "\"UPDATE wl_state SET sent = \" & originalpayload.water_leak & \", timestamp = \\\"\" & $now('[H01]:[m01]:[s01] [D01].[M01].[Y0001]', '+1000') & \"\\\" WHERE _id = \\\"\" & originaltopic & \"\\\"\"",
                "tot": "jsonata"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 550,
        "y": 520,
        "wires": [
            [
                "cf569c2.ff8e06"
            ]
        ]
    },
    {
        "id": "8ee6a8f8.289bf8",
        "type": "change",
        "z": "5cda2c4a.a099b4",
        "name": "Подготовка письма об устранении",
        "rules": [
            {
                "t": "set",
                "p": "topic",
                "pt": "msg",
                "to": "\"Протечка устранена в \" & $now('[H01]:[m01]:[s01] [D01].[M01].[Y0001]', '+1000') & \"!\"",
                "tot": "jsonata"
            },
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "\"Датчик \\\"\" & payload[0].name & \"\\\" восстановился.\"",
                "tot": "jsonata"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 580,
        "y": 340,
        "wires": [
            [
                "7278784c.781738"
            ]
        ]
    },
    {
        "id": "bd959e70.f6fdf",
        "type": "sqlite",
        "z": "5cda2c4a.a099b4",
        "mydb": "4ab28460.21e8cc",
        "sqlquery": "fixed",
        "sql": "SELECT name, timestamp FROM wl_state WHERE sent = true",
        "name": "Выборка сработавших датчиков",
        "x": 580,
        "y": 640,
        "wires": [
            [
                "620a57e3.dd4ef8"
            ]
        ]
    },
    {
        "id": "a62b273f.4c1278",
        "type": "trigger",
        "z": "5cda2c4a.a099b4",
        "name": "Задержка первого письма",
        "op1": "msgreset",
        "op2": "",
        "op1type": "str",
        "op2type": "payl",
        "duration": "20",
        "extend": false,
        "overrideDelay": true,
        "units": "hr",
        "reset": "",
        "bytopic": "all",
        "topic": "topic",
        "outputs": 1,
        "x": 560,
        "y": 700,
        "wires": [
            [
                "a6ea953f.b81088"
            ]
        ]
    },
    {
        "id": "9be28274.36ede",
        "type": "change",
        "z": "5cda2c4a.a099b4",
        "name": "Подготовка темы и тела письма",
        "rules": [
            {
                "t": "set",
                "p": "topic",
                "pt": "msg",
                "to": "\"Внимание! Протечка не устранена (\" & $now() & \")!\"",
                "tot": "jsonata"
            },
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "\"Нижеуказанные датчики перешли в состояние протечки:\\n\\n\" & payload",
                "tot": "jsonata"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 580,
        "y": 880,
        "wires": [
            [
                "a0d0bc06.69b2f"
            ]
        ]
    },
    {
        "id": "a2aad8d1.b35d48",
        "type": "inject",
        "z": "5cda2c4a.a099b4",
        "name": "Переименование датчика",
        "props": [
            {
                "p": "deviceid",
                "v": "zigbee2mqtt/0x00158d0006334159",
                "vt": "str"
            },
            {
                "p": "devicenewname",
                "v": "Кухня",
                "vt": "str"
            },
            {
                "p": "topic",
                "v": "\"UPDATE wl_state SET name = \\\"\" & devicenewname & \"\\\" WHERE _id = \\\"\" & deviceid & \"\\\"\"",
                "vt": "jsonata"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payloadType": "str",
        "x": 170,
        "y": 460,
        "wires": [
            [
                "cf569c2.ff8e06"
            ]
        ]
    },
    {
        "id": "26c1c49e.f46bac",
        "type": "change",
        "z": "5cda2c4a.a099b4",
        "name": "Снятие метки и даты",
        "rules": [
            {
                "t": "set",
                "p": "topic",
                "pt": "msg",
                "to": "\"UPDATE wl_state SET sent = \" & originalpayload.water_leak & \", timestamp = \\\"\\\" WHERE _id = \\\"\" & originaltopic & \"\\\"\"",
                "tot": "jsonata"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 160,
        "y": 400,
        "wires": [
            [
                "cf569c2.ff8e06"
            ]
        ]
    },
    {
        "id": "d9ca0742.4f9818",
        "type": "split",
        "z": "5cda2c4a.a099b4",
        "name": "Разделение сообщения",
        "splt": "\\n",
        "spltType": "str",
        "arraySplt": 1,
        "arraySpltType": "len",
        "stream": false,
        "addname": "",
        "x": 170,
        "y": 820,
        "wires": [
            [
                "4ef98a44.ada364"
            ]
        ]
    },
    {
        "id": "4ef98a44.ada364",
        "type": "template",
        "z": "5cda2c4a.a099b4",
        "name": "Модификация сообщения",
        "field": "payload",
        "fieldType": "msg",
        "format": "handlebars",
        "syntax": "mustache",
        "template": "{{{payload.name}}} с {{{payload.timestamp}}}",
        "output": "str",
        "x": 560,
        "y": 820,
        "wires": [
            [
                "16b29d21.f6f2e3"
            ]
        ]
    },
    {
        "id": "16b29d21.f6f2e3",
        "type": "join",
        "z": "5cda2c4a.a099b4",
        "name": "Сборка сообщения",
        "mode": "custom",
        "build": "string",
        "property": "payload",
        "propertyType": "msg",
        "key": "payload.out",
        "joiner": "\\n",
        "joinerType": "str",
        "accumulate": false,
        "timeout": "",
        "count": "",
        "reduceRight": false,
        "reduceExp": "",
        "reduceInit": "",
        "reduceInitType": "",
        "reduceFixup": "",
        "x": 160,
        "y": 880,
        "wires": [
            [
                "9be28274.36ede"
            ]
        ]
    },
    {
        "id": "620a57e3.dd4ef8",
        "type": "switch",
        "z": "5cda2c4a.a099b4",
        "name": "Отсечка пустых сообщений",
        "property": "payload",
        "propertyType": "msg",
        "rules": [
            {
                "t": "empty"
            },
            {
                "t": "else"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 180,
        "y": 700,
        "wires": [
            [
                "1b7b1f3b.3a7871"
            ],
            [
                "a62b273f.4c1278"
            ]
        ]
    },
    {
        "id": "a6ea953f.b81088",
        "type": "trigger",
        "z": "5cda2c4a.a099b4",
        "name": "Циклическая отправка письма",
        "op1": "",
        "op2": "0",
        "op1type": "pay",
        "op2type": "str",
        "duration": "-20",
        "extend": false,
        "overrideDelay": true,
        "units": "hr",
        "reset": "msgreset",
        "bytopic": "all",
        "topic": "topic",
        "outputs": 1,
        "x": 570,
        "y": 760,
        "wires": [
            [
                "d9ca0742.4f9818"
            ]
        ]
    },
    {
        "id": "1b7b1f3b.3a7871",
        "type": "change",
        "z": "5cda2c4a.a099b4",
        "name": "Сброс триггера",
        "rules": [
            {
                "t": "set",
                "p": "reset",
                "pt": "msg",
                "to": "true",
                "tot": "bool"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 140,
        "y": 760,
        "wires": [
            [
                "a6ea953f.b81088",
                "a62b273f.4c1278"
            ]
        ]
    },
    {
        "id": "7278784c.781738",
        "type": "link out",
        "z": "5cda2c4a.a099b4",
        "name": "Передача почты",
        "links": [
            "de0d6638.631658"
        ],
        "x": 795,
        "y": 400,
        "wires": []
    },
    {
        "id": "de0d6638.631658",
        "type": "link in",
        "z": "5cda2c4a.a099b4",
        "name": "Прием почты",
        "links": [
            "7278784c.781738"
        ],
        "x": 455,
        "y": 940,
        "wires": [
            [
                "a0d0bc06.69b2f"
            ]
        ]
    },
    {
        "id": "b124d397.59a69",
        "type": "change",
        "z": "5cda2c4a.a099b4",
        "name": "Установка таймера задержки",
        "rules": [
            {
                "t": "set",
                "p": "delay",
                "pt": "msg",
                "to": "600000",
                "tot": "num"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 190,
        "y": 640,
        "wires": [
            [
                "bd959e70.f6fdf"
            ]
        ]
    },
    {
        "id": "2fdc97c3.e7f3e8",
        "type": "subflow:98ba2d02.5ee68",
        "z": "5cda2c4a.a099b4",
        "name": "Сторожевой таймер",
        "env": [],
        "x": 160,
        "y": 580,
        "wires": []
    },
    {
        "id": "cb0bb7c4.654b78",
        "type": "change",
        "z": "5cda2c4a.a099b4",
        "name": "Подготовка данных",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "payload[0].name",
                "tot": "msg"
            },
            {
                "t": "set",
                "p": "topic",
                "pt": "msg",
                "to": "originaltopic",
                "tot": "msg"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 220,
        "y": 520,
        "wires": [
            [
                "2fdc97c3.e7f3e8"
            ]
        ]
    },
    {
        "id": "26b59bd5.85cca4",
        "type": "link out",
        "z": "5cda2c4a.a099b4",
        "name": "На таймер",
        "links": [
            "1e10bbb8.876304"
        ],
        "x": 355,
        "y": 280,
        "wires": []
    },
    {
        "id": "1e10bbb8.876304",
        "type": "link in",
        "z": "5cda2c4a.a099b4",
        "name": "С таймера",
        "links": [
            "26b59bd5.85cca4"
        ],
        "x": 75,
        "y": 520,
        "wires": [
            [
                "cb0bb7c4.654b78"
            ]
        ]
    },
    {
        "id": "3fe60e7b.6b3472",
        "type": "mqtt in",
        "z": "5cda2c4a.a099b4",
        "name": "Датчик на кухне",
        "topic": "zigbee2mqtt/0x00158d0006334159",
        "qos": "2",
        "datatype": "json",
        "broker": "8745b931.133868",
        "x": 140,
        "y": 40,
        "wires": [
            [
                "c032c9e5.848ad8"
            ]
        ]
    },
    {
        "id": "4ab28460.21e8cc",
        "type": "sqlitedb",
        "db": "c:\\noderedDB\\water_leak.db",
        "mode": "RWC"
    },
    {
        "id": "8745b931.133868",
        "type": "mqtt-broker",
        "name": "localhost",
        "broker": "localhost",
        "port": "1883",
        "clientid": "",
        "usetls": false,
        "compatmode": false,
        "keepalive": "60",
        "cleansession": true,
        "birthTopic": "",
        "birthQos": "0",
        "birthPayload": "",
        "closeTopic": "",
        "closeQos": "0",
        "closePayload": "",
        "willTopic": "",
        "willQos": "0",
        "willPayload": ""
    }
]

Дисклеймер

  • Использование материалов данной базы знаний разрешено на условиях лицензии, указанной внизу каждой страницы! При использовании материалов активная гиперссылка на соответствующую страницу данной базы знаний обязательна!
  • Автор не несет и не может нести какую либо ответственность за последствия использования материалов, размещенных в данной базе знаний. Все материалы предоставляются по принципу «как есть». Используйте их исключительно на свой страх и риск.
  • Все высказывания, мысли или идеи автора, размещенные в материалах данной базе знаний, являются исключительно его личным субъективным мнением и могут не совпадать с мнением читателей!
  • При размещении ссылок в данной базе знаний на интернет-страницы третьих лиц автор не несет ответственности за их техническую функциональность (особенно отсутствие вирусов) и содержание! При обнаружении таких ссылок, можно и желательно сообщить о них в комментариях к соответствующей статье.

Обсуждение

Ваш комментарий:
X U L E C N O Q​ G᠎ W Y X W H H M
 
Последнее изменение: 2022/02/16 21:20 — Николай Солошин