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

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


iot:software:node-red:flows:telemetry_saving

Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
iot:software:node-red:flows:telemetry_saving [2021/04/20 22:10]
Николай Солошин [Нестандартные узлы]
iot:software:node-red:flows:telemetry_saving [2023/11/18 08:25] (текущий)
Николай Солошин
Строка 2: Строка 2:
 metatag-description=(Поток Node-RED для сохранения данных метеодатчиков в базу SQLite.)}} metatag-description=(Поток Node-RED для сохранения данных метеодатчиков в базу SQLite.)}}
  
-====== Сохранение телеметрии ======+====== Сохранение телеметрии в Node-RED ======
  
-Это многофункциональный поток Node-RED, совмещающий в себе функции сохранения данных с датчиков температуры и влажности [[iot:factory_firmware:change|Sonoff SNZB-02]] в базу SQLite, выгрузки данных с уличного датчика в проект "[[https://narodmon.ru/?invite=nikolays|Народный мониторинг]]" и резервного копирования базы на FTP-сервер.+Это многофункциональный поток Node-RED, совмещающий в себе функции сохранения данных с датчиков температуры и влажности [[iot:devices:zigbee:sensors:sonoff:snzb-02|Sonoff SNZB-02]] в базу SQLite, выгрузки данных с уличного датчика в проект "[[https://narodmon.ru/?invite=nikolays|Народный мониторинг]]" и резервного копирования базы на FTP-сервер.
  
-В этой статье описана цепочка узлов, занимающихся сохранением данных, а другие две цепочки рассмотрены в отдельных статьях:+В этой статье описана цепочка узлов, занимающихся сохранением данных, другие зависимые цепочки рассмотрены в отдельных статьях:
  
-  - [[iot:node-red:flows:telemetry_saving:narodmon|Народный мониторинг]], +  - [[iot:software:node-red:flows:telemetry_saving:narodmon|]], 
-  - [[iot:node-red:flows:telemetry_saving:backup|Резервное копирование]].+    * [[iot:software:node-red:flows:telemetry_saving:narodmon:mqtt|]], 
 +  - [[iot:software:node-red:flows:telemetry_saving:backup|]]. 
 + 
 +Также есть дополнения для сохранения телеметрии с [[iot:software:node-red:flows:telemetry_saving:humidifier|умного увлажнителя]] и [[iot:software:node-red:flows:telemetry_saving:barometer|цифрового барометра]].
  
 ===== Нестандартные узлы ===== ===== Нестандартные узлы =====
Строка 20: Строка 23:
 ===== Дополнительные подпотоки ===== ===== Дополнительные подпотоки =====
  
-  * [[iot:node-red:subflows:watchdog|Сторожевой таймер]] +  * [[iot:software:node-red:subflows:watchdog|Сторожевой таймер]] 
-  * [[iot:node-red:subflows:sendmail|Отправка почты]]+  * [[iot:software:node-red:subflows:sendmail|Отправка почты]]
  
 Эти подпотоки входят в состав кода ниже и загружать отдельно их не надо! Однако, если использовать эту цепочку без цепочки резервного копирования, необходимо заменить нижний узел "link out" на подпоток "sendmail". Эти подпотоки входят в состав кода ниже и загружать отдельно их не надо! Однако, если использовать эту цепочку без цепочки резервного копирования, необходимо заменить нижний узел "link out" на подпоток "sendmail".
Строка 31: Строка 34:
 Далее вступает в работу другая ветка цепи, которая отлавливает ошибки SQL и производит одно из двух действий -- если ошибка заключается в отсутствии таблицы, таблица автоматически создается и отправляется уведомление на почту; если происходит любая другая ошибка, просто отправляется уведомление на почту. Далее вступает в работу другая ветка цепи, которая отлавливает ошибки SQL и производит одно из двух действий -- если ошибка заключается в отсутствии таблицы, таблица автоматически создается и отправляется уведомление на почту; если происходит любая другая ошибка, просто отправляется уведомление на почту.
  
-{{:iot:node-red:flows:telemetry_saving:telesaving.png?nolink|}}+{{:iot:software:node-red:flows:telemetry_saving:telemetry_saving_1.1.0.png?nolink|}}
  
 ==== Пример базы данных ==== ==== Пример базы данных ====
  
-[[https://soloshin.su/telemetry-backup/|По ссылке]] пример создаваемой базы данных. Она же, актуальная телеметрия по Владивостоку с Апреля 2021 года. 8-)+[[https://soloshin.su/telemetry/backup/|По ссылке]] пример создаваемой базы данных. <del>Она же, актуальная телеметрия по Владивостоку с Апреля 2021 года.</del> 8-)
  
 Для просмотра, редактирования и постройки экспресс-графиков можно использовать [[https://sqlitebrowser.org/dl/|DB Browser for SQLite]]. Для просмотра, редактирования и постройки экспресс-графиков можно использовать [[https://sqlitebrowser.org/dl/|DB Browser for SQLite]].
  
-{{:iot:node-red:flows:telemetry_saving:sample.png?nolink|}}+{{iot:software:node-red:flows:telemetry_saving:sample.png?nolink|}} 
 + 
 +==== История версий ==== 
 + 
 +  * [[iot:software:node-red:flows:telemetry_saving?rev=1645010443|1.0.0]] -- начальная версия; 
 +  * 1.1.0 -- добавлена поддержка [[iot:software:node-red:flows:telemetry_saving:barometer|барометра]]: 
 +    - изменен состав столбцов таблиц((Из-за чего не совместимая с предыдущей версией...)), 
 +    - добавлена проверка наличия данных, 
 +    - изменен формат записи даты.
  
 ===== Код для загрузки ===== ===== Код для загрузки =====
  
-<file javascript telemetry-saving.json>[+<file javascript telemetry-saving-1.1.0.json>[
     {     {
         "id": "38c9a069.18cd6",         "id": "38c9a069.18cd6",
Строка 148: Строка 159:
         "topic": "topic",         "topic": "topic",
         "outputs": 2,         "outputs": 2,
-        "x": 540,+        "x": 500,
         "y": 40,         "y": 40,
         "wires": [         "wires": [
Строка 155: Строка 166:
             ],             ],
             [             [
-                "27141a53.5a2246"+                "4691ad9.e6cf254"
             ]             ]
         ],         ],
Строка 170: Строка 181:
         "env": [],         "env": [],
         "x": 710,         "x": 710,
-        "y": 580,+        "y": 400,
         "wires": []         "wires": []
     },     },
Строка 199: Строка 210:
         "to": "",         "to": "",
         "reg": false,         "reg": false,
-        "x": 210+        "x": 650
-        "y": 580,+        "y": 340,
         "wires": [         "wires": [
             [             [
Строка 240: Строка 251:
         "to": "",         "to": "",
         "reg": false,         "reg": false,
-        "x": 290,+        "x": 270,
         "y": 40,         "y": 40,
         "wires": [         "wires": [
Строка 267: Строка 278:
         "to": "",         "to": "",
         "reg": false,         "reg": false,
-        "x": 160+        "x": 700
-        "y": 100,+        "y": 40,
         "wires": [         "wires": [
             [             [
Строка 283: Строка 294:
         "sql": "",         "sql": "",
         "name": "Запрос на наличие записи в БД",         "name": "Запрос на наличие записи в БД",
-        "x": 200+        "x": 360
-        "y": 160,+        "y": 100,
         "wires": [         "wires": [
             [             [
Строка 309: Строка 320:
         "repair": false,         "repair": false,
         "outputs": 2,         "outputs": 2,
-        "x": 650+        "x": 710
-        "y": 160,+        "y": 100,
         "wires": [         "wires": [
             [             [
Строка 340: Строка 351:
         "reg": false,         "reg": false,
         "x": 160,         "x": 160,
-        "y": 220,+        "y": 160,
         "wires": [         "wires": [
             [             [
Строка 354: Строка 365:
         "sqlquery": "msg.topic",         "sqlquery": "msg.topic",
         "sql": "",         "sql": "",
-        "name": "Добавление отсутствующей записи", +        "name": "Доботсутствующей записи", 
-        "x": 210+        "x": 420
-        "y": 280,+        "y": 160,
         "wires": [         "wires": [
             [             [
Строка 382: Строка 393:
         "to": "",         "to": "",
         "reg": false,         "reg": false,
-        "x": 540+        "x": 700
-        "y": 280,+        "y": 160,
         "wires": [         "wires": [
             [             [
Строка 399: Строка 410:
         "name": "Выборка записей, которые не отправлялись",         "name": "Выборка записей, которые не отправлялись",
         "x": 240,         "x": 240,
-        "y": 340,+        "y": 220,
         "wires": [         "wires": [
             [             [
Строка 421: Строка 432:
         "repair": false,         "repair": false,
         "outputs": 1,         "outputs": 1,
-        "x": 180+        "x": 680
-        "y": 400,+        "y": 220,
         "wires": [         "wires": [
             [             [
Строка 456: Строка 467:
         "reg": false,         "reg": false,
         "x": 660,         "x": 660,
-        "y": 100,+        "y": 280,
         "wires": [         "wires": [
             [             [
Строка 473: Строка 484:
                 "p": "topic",                 "p": "topic",
                 "pt": "msg",                 "pt": "msg",
-                "to": "\"UPDATE watchdog SET sent = \" & topic & \" WHERE topic = \\\"\" & savedtopic & \"\\\"\"",+                "to": "\"UPDATE watchdog SET sent = \" & topic & \", time = \\\"\" & $now('[Y0001].[M01].[D01] [H01]:[m01]:[s01]', '+1000') & \"\\\" WHERE topic = \\\"\" & savedtopic & \"\\\"\"",
                 "tot": "jsonata"                 "tot": "jsonata"
             }             }
Строка 482: Строка 493:
         "to": "",         "to": "",
         "reg": false,         "reg": false,
-        "x": 700+        "x": 160
-        "y": 460,+        "y": 340,
         "wires": [         "wires": [
             [             [
Строка 497: Строка 508:
         "sqlquery": "msg.topic",         "sqlquery": "msg.topic",
         "sql": "",         "sql": "",
-        "name": "Установка флага отправки", +        "name": "Устфлага отправки", 
-        "x": 180+        "x": 380
-        "y": 520,+        "y": 340,
         "wires": [         "wires": [
             [             [
Строка 533: Строка 544:
         "reg": false,         "reg": false,
         "x": 190,         "x": 190,
-        "y": 460,+        "y": 280,
         "wires": [         "wires": [
             [             [
                 "b13655cc.bdf9d8"                 "b13655cc.bdf9d8"
 +            ]
 +        ]
 +    },
 +    {
 +        "id": "4691ad9.e6cf254",
 +        "type": "link out",
 +        "z": "98ba2d02.5ee68",
 +        "name": "",
 +        "links": [
 +            "ab7f4159.256a4"
 +        ],
 +        "x": 75,
 +        "y": 100,
 +        "wires": []
 +    },
 +    {
 +        "id": "ab7f4159.256a4",
 +        "type": "link in",
 +        "z": "98ba2d02.5ee68",
 +        "name": "",
 +        "links": [
 +            "4691ad9.e6cf254"
 +        ],
 +        "x": 435,
 +        "y": 280,
 +        "wires": [
 +            [
 +                "27141a53.5a2246"
             ]             ]
         ]         ]
Строка 561: Строка 600:
         "env": [],         "env": [],
         "x": 700,         "x": 700,
-        "y": 340,+        "y": 160,
         "wires": []         "wires": []
     },     },
Строка 571: Строка 610:
         "sqlquery": "msg.topic",         "sqlquery": "msg.topic",
         "sql": "",         "sql": "",
-        "name": "Запись данных в базу", +        "name": "Запись в БД", 
-        "x": 440+        "x": 470
-        "y": 280,+        "y": 160,
         "wires": [         "wires": [
             []             []
Строка 588: Строка 627:
                 "p": "topic",                 "p": "topic",
                 "pt": "msg",                 "pt": "msg",
-                "to": "\"INSERT INTO \\\"\" & payload & \"\\\" (timestamp, temperature, humidity, battery, linkquality) VALUES (\\\"\" & $now('[Y0001].[M01].[D01] [H01]:[m01]:[s01]', '+1000') & \"\\\", \" & originalpayload.temperature & \", \" & originalpayload.humidity & \", \" & originalpayload.battery & \", \" & originalpayload.linkquality & \")\"",+                "to": "\"INSERT INTO \\\"\" & payload & \"\\\" (timestamp, temperature, humidity, pressureSt, pressureSl, pressureBt, battery, linkquality) VALUES (\\\"\" & $now('[Y0001]-[M01]-[D01] [H01]:[m01]:[s01]', '+1000') & \"\\\", \" & ( $type( originalpayload.temperature ) = 'number' ? originalpayload.temperature : null ) & \", \" & ( $type( originalpayload.humidity ) = 'number' ? originalpayload.humidity : null ) & \", \" & ( $type( originalpayload.pressure_st ) = 'number' ? originalpayload.pressure_st : null ) & \", \" & ( $type( originalpayload.pressure_sl ) = 'number' ? originalpayload.pressure_sl : null ) & \", \" & ( $type( originalpayload.pressure_bt ) = 'number' ? originalpayload.pressure_bt : null ) & \", \" & ( $type( originalpayload.battery ) = 'number' ? originalpayload.battery : null ) & \", \" & ( $type( originalpayload.linkquality ) = 'number' ? originalpayload.linkquality : null ) & \")\"",
                 "tot": "jsonata"                 "tot": "jsonata"
             }             }
Строка 597: Строка 636:
         "to": "",         "to": "",
         "reg": false,         "reg": false,
-        "x": 440+        "x": 240
-        "y": 220,+        "y": 160,
         "wires": [         "wires": [
             [             [
Строка 609: Строка 648:
         "type": "change",         "type": "change",
         "z": "551f568e.e62c18",         "z": "551f568e.e62c18",
-        "name": "Определение названий таблиц",+        "name": "Именование таблиц",
         "rules": [         "rules": [
             {             {
Строка 624: Строка 663:
                 "p": "payload",                 "p": "payload",
                 "pt": "msg",                 "pt": "msg",
-                "from": "zigbee2mqtt/0x00124b0022670244",+                "from": "barometer_1A2AE9/tele/SENSOR",
                 "fromt": "str",                 "fromt": "str",
                 "to": "balcony",                 "to": "balcony",
 +                "tot": "str"
 +            },
 +            {
 +                "t": "change",
 +                "p": "payload",
 +                "pt": "msg",
 +                "from": "humidifier_00896D/tele/SENSOR",
 +                "fromt": "str",
 +                "to": "humidifier",
                 "tot": "str"                 "tot": "str"
             }             }
Строка 635: Строка 683:
         "to": "",         "to": "",
         "reg": false,         "reg": false,
-        "x": 470+        "x": 700
-        "y": 160,+        "y": 100,
         "wires": [         "wires": [
             [             [
Строка 654: Строка 702:
         "uncaught": false,         "uncaught": false,
         "x": 160,         "x": 160,
-        "y": 280,+        "y": 220,
         "wires": [         "wires": [
             [             [
Строка 665: Строка 713:
         "type": "switch",         "type": "switch",
         "z": "551f568e.e62c18",         "z": "551f568e.e62c18",
-        "name": "Определени ошибки",+        "name": "Определение ошибки",
         "property": "error.message",         "property": "error.message",
         "propertyType": "msg",         "propertyType": "msg",
Строка 682: Строка 730:
         "outputs": 2,         "outputs": 2,
         "x": 160,         "x": 160,
-        "y": 340,+        "y": 280,
         "wires": [         "wires": [
             [             [
Строка 700: Строка 748:
         "type": "change",         "type": "change",
         "z": "551f568e.e62c18",         "z": "551f568e.e62c18",
-        "name": "Перемещение топика и данных",+        "name": "Перемещение данных",
         "rules": [         "rules": [
             {             {
Строка 722: Строка 770:
         "to": "",         "to": "",
         "reg": false,         "reg": false,
-        "x": 480,+        "x": 410,
         "y": 100,         "y": 100,
         "wires": [         "wires": [
Строка 734: Строка 782:
         "type": "change",         "type": "change",
         "z": "551f568e.e62c18",         "z": "551f568e.e62c18",
-        "name":одготовка письма об ошибке",+        "name": "Письмо об ошибке",
         "rules": [         "rules": [
             {             {
Строка 747: Строка 795:
                 "p": "payload",                 "p": "payload",
                 "pt": "msg",                 "pt": "msg",
-                "to": "\"Название модуля:\\n\\n\\\"\" & error.source.name & \"\\\" ( id: \" & error.source.id & \", type: \" & error.source.type & \").\\n\\nТекст ошибки:\\n\\n\\\"\" & error.message & \"\\\"\\n\\nСкорее всего, для нового датчика не добавлено нозваание таблицы!\"",+                "to": "\"Название модуля:\\n\\n\\\"\" & error.source.name & \"\\\" ( id: \" & error.source.id & \", type: \" & error.source.type & \").\\n\\nТекст ошибки:\\n\\n\\\"\" & error.message & \"\\\"\\n\\nСкорее всего, для нового датчика не добавлено название таблицы!\"",
                 "tot": "jsonata"                 "tot": "jsonata"
             }             }
Строка 756: Строка 804:
         "to": "",         "to": "",
         "reg": false,         "reg": false,
-        "x": 190+        "x": 410
-        "y": 400,+        "y": 280,
         "wires": [         "wires": [
             [             [
Строка 774: Строка 822:
                 "p": "topic",                 "p": "topic",
                 "pt": "msg",                 "pt": "msg",
-                "to": "\"CREATE TABLE \\\"\" & payload & \"\\\" (_id INTEGER PRIMARY KEY AUTOINCREMENT, timestamp TEXT, temperature REAL, humidity REAL, battery INTEGER, linkquality INTEGER)\"",+                "to": "\"CREATE TABLE \\\"\" & payload & \"\\\" (_id INTEGER PRIMARY KEY AUTOINCREMENT, timestamp TEXT, temperature REAL, humidity REAL, pressureSt REAL, pressureSl REAL, pressureBt REAL, battery INTEGER, linkquality INTEGER)\"",
                 "tot": "jsonata"                 "tot": "jsonata"
             }             }
Строка 783: Строка 831:
         "to": "",         "to": "",
         "reg": false,         "reg": false,
-        "x": 430+        "x": 410
-        "y": 340,+        "y": 220,
         "wires": [         "wires": [
             [             [
Строка 796: Строка 844:
         "type": "change",         "type": "change",
         "z": "551f568e.e62c18",         "z": "551f568e.e62c18",
-        "name":одготовка письма о созданни таблицы",+        "name": "Письмо о создании таблицы",
         "rules": [         "rules": [
             {             {
Строка 818: Строка 866:
         "to": "",         "to": "",
         "reg": false,         "reg": false,
-        "x": 640+        "x": 670
-        "y": 400,+        "y": 220,
         "wires": [         "wires": [
             [             [
                 "f1dd250e.d302b8"                 "f1dd250e.d302b8"
-            ] 
-        ] 
-    }, 
-    { 
-        "id": "c23c9680.557e48", 
-        "type": "mqtt in", 
-        "z": "551f568e.e62c18", 
-        "name": "Датчик на балконе", 
-        "topic": "zigbee2mqtt/0x00124b0022670244", 
-        "qos": "2", 
-        "datatype": "json", 
-        "broker": "8745b931.133868", 
-        "x": 150, 
-        "y": 40, 
-        "wires": [ 
-            [ 
-                "d6aeb8ba.178f68" 
             ]             ]
         ]         ]
Строка 852: Строка 883:
         "datatype": "json",         "datatype": "json",
         "broker": "8745b931.133868",         "broker": "8745b931.133868",
-        "x": 420+        "x": 140
-        "y": 40,+        "y": 100,
         "wires": [         "wires": [
             [             [
Строка 870: Строка 901:
             "cdbabee6.435e9"             "cdbabee6.435e9"
         ],         ],
-        "x": 575,+        "x": 75, 
 +        "y": 160, 
 +        "wires": [] 
 +    }, 
 +    { 
 +        "id": "257306e4.0dd02a", 
 +        "type": "comment", 
 +        "z": "551f568e.e62c18", 
 +        "name": "Сохранение телеметрии в базу", 
 +        "info": "", 
 +        "x": 190,
         "y": 40,         "y": 40,
         "wires": []         "wires": []
Строка 880: Строка 921:
         "name": "Отправка почты",         "name": "Отправка почты",
         "links": [         "links": [
-            "7c896fde.621af"+            "7c896fde.621af", 
 +            "e24d06b9.f12878"
         ],         ],
-        "x": 395+        "x": 575
-        "y": 400,+        "y": 280,
         "wires": []         "wires": []
 +    },
 +    {
 +        "id": "ec90713c.79299",
 +        "type": "link in",
 +        "z": "551f568e.e62c18",
 +        "name": "",
 +        "links": [
 +            "20b71be1.6e7934"
 +        ],
 +        "x": 775,
 +        "y": 40,
 +        "wires": [
 +            [
 +                "2c1ed738.58c7a8"
 +            ]
 +        ]
     },     },
     {     {
Последнее изменение: 2022/02/12 11:40 (внешнее изменение)