mirror of
https://github.com/IoTManagerProject/IoTManager.git
synced 2026-03-26 22:22:16 +03:00
добавлено сохранение списка устройств, новый веб интерфейс
This commit is contained in:
Binary file not shown.
Binary file not shown.
@@ -4,12 +4,12 @@
|
|||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
||||||
|
|
||||||
<title>IoT Manager 4.4.4</title>
|
<title>IoT Manager 4.4.5</title>
|
||||||
|
|
||||||
<link rel="icon" type="image/png" href="/favicon.ico" />
|
<link rel="icon" type="image/png" href="/favicon.ico" />
|
||||||
<link rel="stylesheet" href="/build/bundle.css?444" />
|
<link rel="stylesheet" href="/build/bundle.css?445" />
|
||||||
|
|
||||||
<script defer src="/build/bundle.js?444"></script>
|
<script defer src="/build/bundle.js?445"></script>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body></body>
|
<body></body>
|
||||||
|
|||||||
@@ -192,19 +192,7 @@
|
|||||||
"header": "Сенсоры"
|
"header": "Сенсоры"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "13. A02 Дальность",
|
"name": "13. Acs712 Ток",
|
||||||
"type": "Reading",
|
|
||||||
"subtype": "A02Distance",
|
|
||||||
"id": "dist",
|
|
||||||
"widget": "anydataCm",
|
|
||||||
"page": "Сенсоры",
|
|
||||||
"descr": "Дальность",
|
|
||||||
"int": 5,
|
|
||||||
"round": 1,
|
|
||||||
"num": 13
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "14. Acs712 Ток",
|
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Acs712",
|
"subtype": "Acs712",
|
||||||
"id": "amp",
|
"id": "amp",
|
||||||
@@ -219,11 +207,11 @@
|
|||||||
"sens": 100,
|
"sens": 100,
|
||||||
"adczero": 512,
|
"adczero": 512,
|
||||||
"btn-setZero": "nil",
|
"btn-setZero": "nil",
|
||||||
"num": 14
|
"num": 13
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "15. AHTXX Температура",
|
"name": "14. AHTXX Температура",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "AhtXXt",
|
"subtype": "AhtXXt",
|
||||||
"id": "Temp20",
|
"id": "Temp20",
|
||||||
@@ -234,11 +222,11 @@
|
|||||||
"addr": "0x38",
|
"addr": "0x38",
|
||||||
"shtType": 1,
|
"shtType": 1,
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 15
|
"num": 14
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "16. AHTXX Влажность",
|
"name": "15. AHTXX Влажность",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "AhtXXh",
|
"subtype": "AhtXXh",
|
||||||
"id": "Hum20",
|
"id": "Hum20",
|
||||||
@@ -249,11 +237,11 @@
|
|||||||
"addr": "0x38",
|
"addr": "0x38",
|
||||||
"shtType": 1,
|
"shtType": 1,
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 16
|
"num": 15
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "17. Аналоговый сенсор",
|
"name": "16. Аналоговый сенсор",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "AnalogAdc",
|
"subtype": "AnalogAdc",
|
||||||
"id": "t",
|
"id": "t",
|
||||||
@@ -267,11 +255,11 @@
|
|||||||
"pin": 0,
|
"pin": 0,
|
||||||
"int": 15,
|
"int": 15,
|
||||||
"avgSteps": 1,
|
"avgSteps": 1,
|
||||||
"num": 17
|
"num": 16
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "18. BME280 Температура",
|
"name": "17. BME280 Температура",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Bme280t",
|
"subtype": "Bme280t",
|
||||||
"id": "Tmp3",
|
"id": "Tmp3",
|
||||||
@@ -281,11 +269,11 @@
|
|||||||
"int": 15,
|
"int": 15,
|
||||||
"addr": "0x77",
|
"addr": "0x77",
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 18
|
"num": 17
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "19. BME280 Давление",
|
"name": "18. BME280 Давление",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Bme280p",
|
"subtype": "Bme280p",
|
||||||
"id": "Press3",
|
"id": "Press3",
|
||||||
@@ -295,11 +283,11 @@
|
|||||||
"int": 15,
|
"int": 15,
|
||||||
"addr": "0x77",
|
"addr": "0x77",
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 19
|
"num": 18
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "20. BME280 Влажность",
|
"name": "19. BME280 Влажность",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Bme280h",
|
"subtype": "Bme280h",
|
||||||
"id": "Hum3",
|
"id": "Hum3",
|
||||||
@@ -309,11 +297,11 @@
|
|||||||
"int": 15,
|
"int": 15,
|
||||||
"addr": "0x77",
|
"addr": "0x77",
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 20
|
"num": 19
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "21. BME280 Tочка росы",
|
"name": "20. BME280 Tочка росы",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Bme280dp",
|
"subtype": "Bme280dp",
|
||||||
"id": "Dew3",
|
"id": "Dew3",
|
||||||
@@ -323,11 +311,11 @@
|
|||||||
"int": 15,
|
"int": 15,
|
||||||
"addr": "0x77",
|
"addr": "0x77",
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 21
|
"num": 20
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "22. BMP280 Температура",
|
"name": "21. BMP280 Температура",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Bmp280t",
|
"subtype": "Bmp280t",
|
||||||
"id": "tmp3",
|
"id": "tmp3",
|
||||||
@@ -337,11 +325,11 @@
|
|||||||
"int": 15,
|
"int": 15,
|
||||||
"addr": "0x77",
|
"addr": "0x77",
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 22
|
"num": 21
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "23. BMP280 Давление",
|
"name": "22. BMP280 Давление",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Bmp280p",
|
"subtype": "Bmp280p",
|
||||||
"id": "Press3",
|
"id": "Press3",
|
||||||
@@ -351,11 +339,11 @@
|
|||||||
"int": 15,
|
"int": 15,
|
||||||
"addr": "0x77",
|
"addr": "0x77",
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 23
|
"num": 22
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "24. DHT11 Температура",
|
"name": "23. DHT11 Температура",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Dht1122t",
|
"subtype": "Dht1122t",
|
||||||
"id": "tmp3",
|
"id": "tmp3",
|
||||||
@@ -365,11 +353,11 @@
|
|||||||
"int": 15,
|
"int": 15,
|
||||||
"pin": 0,
|
"pin": 0,
|
||||||
"senstype": "dht11",
|
"senstype": "dht11",
|
||||||
"num": 24
|
"num": 23
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "25. DHT11 Влажность",
|
"name": "24. DHT11 Влажность",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Dht1122h",
|
"subtype": "Dht1122h",
|
||||||
"id": "Hum3",
|
"id": "Hum3",
|
||||||
@@ -379,11 +367,11 @@
|
|||||||
"int": 15,
|
"int": 15,
|
||||||
"pin": 0,
|
"pin": 0,
|
||||||
"senstype": "dht11",
|
"senstype": "dht11",
|
||||||
"num": 25
|
"num": 24
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "26. DS18B20 Температура",
|
"name": "25. DS18B20 Температура",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Ds18b20",
|
"subtype": "Ds18b20",
|
||||||
"id": "dstmp",
|
"id": "dstmp",
|
||||||
@@ -395,11 +383,11 @@
|
|||||||
"index": 0,
|
"index": 0,
|
||||||
"addr": "",
|
"addr": "",
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 26
|
"num": 25
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "27. Аналоговый счетчик импульсов",
|
"name": "26. Аналоговый счетчик импульсов",
|
||||||
"type": "Writing",
|
"type": "Writing",
|
||||||
"subtype": "Impulse",
|
"subtype": "Impulse",
|
||||||
"id": "impulse",
|
"id": "impulse",
|
||||||
@@ -412,11 +400,11 @@
|
|||||||
"pinMode": "INPUT",
|
"pinMode": "INPUT",
|
||||||
"debounceDelay": 3,
|
"debounceDelay": 3,
|
||||||
"multiply": 1,
|
"multiply": 1,
|
||||||
"num": 27
|
"num": 26
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "28. PZEM 004t Напряжение",
|
"name": "27. PZEM 004t Напряжение",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Pzem004v",
|
"subtype": "Pzem004v",
|
||||||
"id": "v",
|
"id": "v",
|
||||||
@@ -426,11 +414,11 @@
|
|||||||
"int": 15,
|
"int": 15,
|
||||||
"addr": "0xF8",
|
"addr": "0xF8",
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 28
|
"num": 27
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "29. PZEM 004t Сила тока",
|
"name": "28. PZEM 004t Сила тока",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Pzem004a",
|
"subtype": "Pzem004a",
|
||||||
"id": "a",
|
"id": "a",
|
||||||
@@ -440,11 +428,11 @@
|
|||||||
"int": 15,
|
"int": 15,
|
||||||
"addr": "0xF8",
|
"addr": "0xF8",
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 29
|
"num": 28
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "30. PZEM 004t Мощность",
|
"name": "29. PZEM 004t Мощность",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Pzem004w",
|
"subtype": "Pzem004w",
|
||||||
"id": "w",
|
"id": "w",
|
||||||
@@ -454,11 +442,11 @@
|
|||||||
"int": 15,
|
"int": 15,
|
||||||
"addr": "0xF8",
|
"addr": "0xF8",
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 30
|
"num": 29
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "31. PZEM 004t Энергия",
|
"name": "30. PZEM 004t Энергия",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Pzem004wh",
|
"subtype": "Pzem004wh",
|
||||||
"id": "wh",
|
"id": "wh",
|
||||||
@@ -468,11 +456,11 @@
|
|||||||
"int": 15,
|
"int": 15,
|
||||||
"addr": "0xF8",
|
"addr": "0xF8",
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 31
|
"num": 30
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "32. PZEM 004t Частота",
|
"name": "31. PZEM 004t Частота",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Pzem004hz",
|
"subtype": "Pzem004hz",
|
||||||
"id": "hz",
|
"id": "hz",
|
||||||
@@ -482,11 +470,11 @@
|
|||||||
"int": 15,
|
"int": 15,
|
||||||
"addr": "0xF8",
|
"addr": "0xF8",
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 32
|
"num": 31
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "33. PZEM 004t Косинус",
|
"name": "32. PZEM 004t Косинус",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Pzem004pf",
|
"subtype": "Pzem004pf",
|
||||||
"id": "pf",
|
"id": "pf",
|
||||||
@@ -496,11 +484,11 @@
|
|||||||
"int": 15,
|
"int": 15,
|
||||||
"addr": "0xF8",
|
"addr": "0xF8",
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 33
|
"num": 32
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "34. PZEM настройка",
|
"name": "33. PZEM настройка",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Pzem004cmd",
|
"subtype": "Pzem004cmd",
|
||||||
"id": "set",
|
"id": "set",
|
||||||
@@ -512,11 +500,11 @@
|
|||||||
"changeaddr": 0,
|
"changeaddr": 0,
|
||||||
"setaddr": "0x01",
|
"setaddr": "0x01",
|
||||||
"reset": 0,
|
"reset": 0,
|
||||||
"num": 34
|
"num": 33
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "35. Часы реального времени",
|
"name": "34. Часы реального времени",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "RTC",
|
"subtype": "RTC",
|
||||||
"id": "rtc",
|
"id": "rtc",
|
||||||
@@ -532,11 +520,11 @@
|
|||||||
"int": 5,
|
"int": 5,
|
||||||
"btn-setUTime": "0",
|
"btn-setUTime": "0",
|
||||||
"btn-setSysTime": "nil",
|
"btn-setSysTime": "nil",
|
||||||
"num": 35
|
"num": 34
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "36. (S8) Cенсор качества воздуха",
|
"name": "35. (S8) Cенсор качества воздуха",
|
||||||
"num": 36,
|
"num": 35,
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "S8co",
|
"subtype": "S8co",
|
||||||
"id": "s8co",
|
"id": "s8co",
|
||||||
@@ -550,7 +538,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "37. Sht20 Температура",
|
"name": "36. Sht20 Температура",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Sht20t",
|
"subtype": "Sht20t",
|
||||||
"id": "tmp2",
|
"id": "tmp2",
|
||||||
@@ -559,11 +547,11 @@
|
|||||||
"descr": "Температура",
|
"descr": "Температура",
|
||||||
"int": 15,
|
"int": 15,
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 37
|
"num": 36
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "38. Sht20 Влажность",
|
"name": "37. Sht20 Влажность",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Sht20h",
|
"subtype": "Sht20h",
|
||||||
"id": "Hum2",
|
"id": "Hum2",
|
||||||
@@ -572,11 +560,11 @@
|
|||||||
"descr": "Влажность",
|
"descr": "Влажность",
|
||||||
"int": 15,
|
"int": 15,
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 38
|
"num": 37
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "39. Sht30 Температура",
|
"name": "38. Sht30 Температура",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Sht30t",
|
"subtype": "Sht30t",
|
||||||
"id": "tmp30",
|
"id": "tmp30",
|
||||||
@@ -585,11 +573,11 @@
|
|||||||
"descr": "SHT30 Температура",
|
"descr": "SHT30 Температура",
|
||||||
"int": 15,
|
"int": 15,
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 39
|
"num": 38
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "40. Sht30 Влажность",
|
"name": "39. Sht30 Влажность",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Sht30h",
|
"subtype": "Sht30h",
|
||||||
"id": "Hum30",
|
"id": "Hum30",
|
||||||
@@ -598,12 +586,12 @@
|
|||||||
"descr": "SHT30 Влажность",
|
"descr": "SHT30 Влажность",
|
||||||
"int": 15,
|
"int": 15,
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 40
|
"num": 39
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "41. HC-SR04 Ультразвуковой дальномер",
|
"name": "40. HC-SR04 Ультразвуковой дальномер",
|
||||||
"num": 41,
|
"num": 40,
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Sonar",
|
"subtype": "Sonar",
|
||||||
"id": "sonar",
|
"id": "sonar",
|
||||||
@@ -615,7 +603,7 @@
|
|||||||
"int": 5
|
"int": 5
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "42. UART",
|
"name": "41. UART",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "UART",
|
"subtype": "UART",
|
||||||
"page": "",
|
"page": "",
|
||||||
@@ -627,14 +615,14 @@
|
|||||||
"line": 2,
|
"line": 2,
|
||||||
"speed": 9600,
|
"speed": 9600,
|
||||||
"eventFormat": 0,
|
"eventFormat": 0,
|
||||||
"num": 42
|
"num": 41
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"header": "Исполнительные устройства"
|
"header": "Исполнительные устройства"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "43. Кнопка подключенная к пину",
|
"name": "42. Кнопка подключенная к пину",
|
||||||
"type": "Writing",
|
"type": "Writing",
|
||||||
"subtype": "ButtonIn",
|
"subtype": "ButtonIn",
|
||||||
"id": "btn",
|
"id": "btn",
|
||||||
@@ -649,11 +637,11 @@
|
|||||||
"debounceDelay": 50,
|
"debounceDelay": 50,
|
||||||
"fixState": 0,
|
"fixState": 0,
|
||||||
"inv": 0,
|
"inv": 0,
|
||||||
"num": 43
|
"num": 42
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "44. Управление пином",
|
"name": "43. Управление пином",
|
||||||
"type": "Writing",
|
"type": "Writing",
|
||||||
"subtype": "ButtonOut",
|
"subtype": "ButtonOut",
|
||||||
"needSave": 0,
|
"needSave": 0,
|
||||||
@@ -664,11 +652,11 @@
|
|||||||
"int": 0,
|
"int": 0,
|
||||||
"inv": 0,
|
"inv": 0,
|
||||||
"pin": 2,
|
"pin": 2,
|
||||||
"num": 44
|
"num": 43
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "45. Пассивный звуковой извещатель",
|
"name": "44. Пассивный звуковой извещатель",
|
||||||
"type": "Writing",
|
"type": "Writing",
|
||||||
"subtype": "Buzzer",
|
"subtype": "Buzzer",
|
||||||
"id": "buzzer",
|
"id": "buzzer",
|
||||||
@@ -687,11 +675,11 @@
|
|||||||
"cycle": 0,
|
"cycle": 0,
|
||||||
"indication": 1,
|
"indication": 1,
|
||||||
"val": 0,
|
"val": 0,
|
||||||
"num": 45
|
"num": 44
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "46. Энкодер",
|
"name": "45. Энкодер",
|
||||||
"type": "Writing",
|
"type": "Writing",
|
||||||
"subtype": "Encoder",
|
"subtype": "Encoder",
|
||||||
"id": "enc",
|
"id": "enc",
|
||||||
@@ -704,11 +692,11 @@
|
|||||||
"step": 1,
|
"step": 1,
|
||||||
"stepOnPress": 5,
|
"stepOnPress": 5,
|
||||||
"pins": "4,5,2",
|
"pins": "4,5,2",
|
||||||
"num": 46
|
"num": 45
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "47. Сервопривод",
|
"name": "46. Сервопривод",
|
||||||
"type": "Writing",
|
"type": "Writing",
|
||||||
"subtype": "IoTServo",
|
"subtype": "IoTServo",
|
||||||
"id": "servo",
|
"id": "servo",
|
||||||
@@ -719,11 +707,11 @@
|
|||||||
"pin": 12,
|
"pin": 12,
|
||||||
"apin": -1,
|
"apin": -1,
|
||||||
"amap": "0, 4096, 0, 180",
|
"amap": "0, 4096, 0, 180",
|
||||||
"num": 47
|
"num": 46
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "48. Расширитель портов Mcp23017",
|
"name": "47. Расширитель портов Mcp23017",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Mcp23017",
|
"subtype": "Mcp23017",
|
||||||
"id": "Mcp",
|
"id": "Mcp",
|
||||||
@@ -733,11 +721,11 @@
|
|||||||
"int": "0",
|
"int": "0",
|
||||||
"addr": "0x20",
|
"addr": "0x20",
|
||||||
"index": 1,
|
"index": 1,
|
||||||
"num": 48
|
"num": 47
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "49. MP3 плеер",
|
"name": "48. MP3 плеер",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Mp3",
|
"subtype": "Mp3",
|
||||||
"id": "mp3",
|
"id": "mp3",
|
||||||
@@ -747,11 +735,11 @@
|
|||||||
"int": 1,
|
"int": 1,
|
||||||
"pins": "14,12",
|
"pins": "14,12",
|
||||||
"volume": 20,
|
"volume": 20,
|
||||||
"num": 49
|
"num": 48
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "50. Сенсорная кнопка",
|
"name": "49. Сенсорная кнопка",
|
||||||
"type": "Writing",
|
"type": "Writing",
|
||||||
"subtype": "Multitouch",
|
"subtype": "Multitouch",
|
||||||
"id": "impulse",
|
"id": "impulse",
|
||||||
@@ -765,11 +753,11 @@
|
|||||||
"pinMode": "INPUT",
|
"pinMode": "INPUT",
|
||||||
"debounceDelay": 50,
|
"debounceDelay": 50,
|
||||||
"PWMDelay": 500,
|
"PWMDelay": 500,
|
||||||
"num": 50
|
"num": 49
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "51. Расширитель портов Pcf8574",
|
"name": "50. Расширитель портов Pcf8574",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Pcf8574",
|
"subtype": "Pcf8574",
|
||||||
"id": "Pcf",
|
"id": "Pcf",
|
||||||
@@ -779,27 +767,29 @@
|
|||||||
"int": "0",
|
"int": "0",
|
||||||
"addr": "0x20",
|
"addr": "0x20",
|
||||||
"index": 1,
|
"index": 1,
|
||||||
"num": 51
|
"num": 50
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "52. PWM ESP8266",
|
"name": "51. PWM ESP32",
|
||||||
"type": "Writing",
|
"type": "Writing",
|
||||||
"subtype": "Pwm8266",
|
"subtype": "Pwm32",
|
||||||
"id": "pwm",
|
"id": "pwm",
|
||||||
"widget": "range",
|
"widget": "range",
|
||||||
"page": "Кнопки",
|
"page": "Кнопки",
|
||||||
"descr": "PWM",
|
"descr": "PWM",
|
||||||
"int": 0,
|
"int": 0,
|
||||||
"pin": 15,
|
"pin": 2,
|
||||||
"freq": 5000,
|
"freq": 5000,
|
||||||
|
"ledChannel": 2,
|
||||||
|
"PWM_resolution": 10,
|
||||||
"val": 0,
|
"val": 0,
|
||||||
"apin": -1,
|
"apin": -1,
|
||||||
"num": 52
|
"num": 51
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "53. Телеграм-Лайт",
|
"name": "52. Телеграм-Лайт",
|
||||||
"type": "Writing",
|
"type": "Writing",
|
||||||
"subtype": "TelegramLT",
|
"subtype": "TelegramLT",
|
||||||
"id": "tg",
|
"id": "tg",
|
||||||
@@ -808,14 +798,14 @@
|
|||||||
"descr": "",
|
"descr": "",
|
||||||
"token": "",
|
"token": "",
|
||||||
"chatID": "",
|
"chatID": "",
|
||||||
"num": 53
|
"num": 52
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"header": "Экраны"
|
"header": "Экраны"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "54. LCD экран 2004",
|
"name": "53. LCD экран 2004",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Lcd2004",
|
"subtype": "Lcd2004",
|
||||||
"id": "Lcd",
|
"id": "Lcd",
|
||||||
@@ -827,10 +817,10 @@
|
|||||||
"size": "20,4",
|
"size": "20,4",
|
||||||
"coord": "0,0",
|
"coord": "0,0",
|
||||||
"id2show": "id датчика",
|
"id2show": "id датчика",
|
||||||
"num": 54
|
"num": 53
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "55. LCD экран 1602",
|
"name": "54. LCD экран 1602",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Lcd2004",
|
"subtype": "Lcd2004",
|
||||||
"id": "Lcd",
|
"id": "Lcd",
|
||||||
@@ -842,6 +832,6 @@
|
|||||||
"size": "16,2",
|
"size": "16,2",
|
||||||
"coord": "0,0",
|
"coord": "0,0",
|
||||||
"id2show": "id датчика",
|
"id2show": "id датчика",
|
||||||
"num": 55
|
"num": 54
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
"name": "IoTmanagerVer4",
|
"name": "IoTmanagerVer4",
|
||||||
"apssid": "IoTmanager",
|
"apssid": "IoTmanager",
|
||||||
"appass": "",
|
"appass": "",
|
||||||
"routerssid": "rise",
|
"routerssid": "iot",
|
||||||
"routerpass": "hostel3333",
|
"routerpass": "hostel3333",
|
||||||
"timezone": 2,
|
"timezone": 2,
|
||||||
"ntp": "pool.ntp.org",
|
"ntp": "pool.ntp.org",
|
||||||
@@ -24,7 +24,7 @@
|
|||||||
},
|
},
|
||||||
"projectProp": {
|
"projectProp": {
|
||||||
"platformio": {
|
"platformio": {
|
||||||
"default_envs": "esp8266_4mb",
|
"default_envs": "esp32_4mb",
|
||||||
"comments_default_envs": "choose from: esp8266_4mb or esp32_4mb or esp8266_1mb or esp8266_1mb_ota or esp8285_1mb or esp8285_1mb_ota"
|
"comments_default_envs": "choose from: esp8266_4mb or esp32_4mb or esp8266_1mb or esp8266_1mb_ota or esp8285_1mb or esp8285_1mb_ota"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
"name": "IoTmanagerVer4",
|
"name": "IoTmanagerVer4",
|
||||||
"apssid": "IoTmanager",
|
"apssid": "IoTmanager",
|
||||||
"appass": "",
|
"appass": "",
|
||||||
"routerssid": "rise",
|
"routerssid": "iot",
|
||||||
"routerpass": "hostel3333",
|
"routerpass": "hostel3333",
|
||||||
"timezone": 2,
|
"timezone": 2,
|
||||||
"ntp": "pool.ntp.org",
|
"ntp": "pool.ntp.org",
|
||||||
@@ -21,5 +21,6 @@
|
|||||||
"pinSDA": 0,
|
"pinSDA": 0,
|
||||||
"i2cFreq": 100000,
|
"i2cFreq": 100000,
|
||||||
"wg": "group1",
|
"wg": "group1",
|
||||||
|
"udps": 1,
|
||||||
"settings_": ""
|
"settings_": ""
|
||||||
}
|
}
|
||||||
@@ -20,5 +20,6 @@
|
|||||||
"pinSDA": 0,
|
"pinSDA": 0,
|
||||||
"i2cFreq": 100000,
|
"i2cFreq": 100000,
|
||||||
"settings_": "",
|
"settings_": "",
|
||||||
"wg": "group1"
|
"wg": "group1",
|
||||||
|
"udps": 1
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
//Версия прошивки
|
// Версия прошивки
|
||||||
#define FIRMWARE_VERSION 435
|
#define FIRMWARE_VERSION 436
|
||||||
|
|
||||||
#ifdef esp8266_1mb_ota
|
#ifdef esp8266_1mb_ota
|
||||||
#define FIRMWARE_NAME "esp8266_1mb_ota"
|
#define FIRMWARE_NAME "esp8266_1mb_ota"
|
||||||
@@ -27,21 +27,21 @@
|
|||||||
#define FIRMWARE_NAME "esp32_4mb"
|
#define FIRMWARE_NAME "esp32_4mb"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//Размер буфера json
|
// Размер буфера json
|
||||||
#define JSON_BUFFER_SIZE 2048 //держим 2 кб не меняем
|
#define JSON_BUFFER_SIZE 2048 // держим 2 кб не меняем
|
||||||
#define WEB_SOCKETS_FRAME_SIZE 2048
|
#define WEB_SOCKETS_FRAME_SIZE 2048
|
||||||
|
|
||||||
//#define LOOP_DEBUG
|
// #define LOOP_DEBUG
|
||||||
|
|
||||||
//выбор сервера
|
// выбор сервера
|
||||||
//#define ASYNC_WEB_SERVER
|
// #define ASYNC_WEB_SERVER
|
||||||
//#define ASYNC_WEB_SOCKETS
|
// #define ASYNC_WEB_SOCKETS
|
||||||
#define STANDARD_WEB_SERVER
|
#define STANDARD_WEB_SERVER
|
||||||
#define STANDARD_WEB_SOCKETS
|
#define STANDARD_WEB_SOCKETS
|
||||||
|
|
||||||
#define UDP_ENABLED
|
#define UDP_ENABLED
|
||||||
|
|
||||||
//#define REST_FILE_OPERATIONS
|
// #define REST_FILE_OPERATIONS
|
||||||
|
|
||||||
#define MQTT_RECONNECT_INTERVAL 20000
|
#define MQTT_RECONNECT_INTERVAL 20000
|
||||||
|
|
||||||
@@ -54,7 +54,7 @@
|
|||||||
#define MIN_DATETIME 1575158400
|
#define MIN_DATETIME 1575158400
|
||||||
#define LEAP_YEAR(Y) (((1970 + Y) > 0) && !((1970 + Y) % 4) && (((1970 + Y) % 100) || !((1970 + Y) % 400)))
|
#define LEAP_YEAR(Y) (((1970 + Y) > 0) && !((1970 + Y) % 4) && (((1970 + Y) % 100) || !((1970 + Y) % 400)))
|
||||||
|
|
||||||
//задачи таскера
|
// задачи таскера
|
||||||
enum TimerTask_t { WIFI_SCAN,
|
enum TimerTask_t { WIFI_SCAN,
|
||||||
WIFI_MQTT_CONNECTION_CHECK,
|
WIFI_MQTT_CONNECTION_CHECK,
|
||||||
TIME,
|
TIME,
|
||||||
@@ -66,14 +66,14 @@ enum TimerTask_t { WIFI_SCAN,
|
|||||||
ST,
|
ST,
|
||||||
END };
|
END };
|
||||||
|
|
||||||
//задачи которые надо протащить через loop
|
// задачи которые надо протащить через loop
|
||||||
enum NotAsyncActions {
|
enum NotAsyncActions {
|
||||||
do_ZERO,
|
do_ZERO,
|
||||||
do_MQTTPARAMSCHANGED,
|
do_MQTTPARAMSCHANGED,
|
||||||
do_LAST,
|
do_LAST,
|
||||||
};
|
};
|
||||||
|
|
||||||
//состояния обновления
|
// состояния обновления
|
||||||
enum UpdateStates { NOT_STARTED,
|
enum UpdateStates { NOT_STARTED,
|
||||||
UPDATE_FS_IN_PROGRESS,
|
UPDATE_FS_IN_PROGRESS,
|
||||||
UPDATE_FS_COMPLETED,
|
UPDATE_FS_COMPLETED,
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#include "Global.h"
|
#include "Global.h"
|
||||||
|
|
||||||
#ifdef ESP8266
|
#ifdef ESP8266
|
||||||
//эта библиотека встроена в ядро
|
// эта библиотека встроена в ядро
|
||||||
#include "ESPAsyncUDP.h"
|
#include "ESPAsyncUDP.h"
|
||||||
#else
|
#else
|
||||||
#include "AsyncUDP.h"
|
#include "AsyncUDP.h"
|
||||||
@@ -11,7 +11,8 @@ extern AsyncUDP asyncUdp;
|
|||||||
|
|
||||||
extern const String getThisDevice();
|
extern const String getThisDevice();
|
||||||
extern void addThisDeviceToList();
|
extern void addThisDeviceToList();
|
||||||
extern void asyncUdpInit();
|
extern void udpListningInit();
|
||||||
|
extern void udpBroadcastInit();
|
||||||
extern String uint8tToString(uint8_t* data, size_t len);
|
extern String uint8tToString(uint8_t* data, size_t len);
|
||||||
extern void udpPacketParse(String& data);
|
extern void udpPacketParse(String& data);
|
||||||
extern void jsonMergeArrays(String& existJson, String& incJson);
|
extern void jsonMergeArrays(String& existJson, String& incJson);
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "Global.h"
|
#include "Global.h"
|
||||||
#ifdef ESP32
|
#ifdef ESP32
|
||||||
|
#include <rom/spi_flash.h>
|
||||||
#if USE_LITTLEFS
|
#if USE_LITTLEFS
|
||||||
#include <LittleFS.h>
|
#include <LittleFS.h>
|
||||||
#define FileFS LittleFS
|
#define FileFS LittleFS
|
||||||
@@ -35,7 +36,7 @@ extern FS* filesystem;
|
|||||||
extern bool fileSystemInit();
|
extern bool fileSystemInit();
|
||||||
extern void globalVarsSync();
|
extern void globalVarsSync();
|
||||||
|
|
||||||
//extern String getParamsJson();
|
// extern String getParamsJson();
|
||||||
|
|
||||||
extern void syncSettingsFlashJson();
|
extern void syncSettingsFlashJson();
|
||||||
extern void syncValuesFlashJson();
|
extern void syncValuesFlashJson();
|
||||||
@@ -47,3 +48,4 @@ extern uint32_t ESP_getChipId(void);
|
|||||||
extern uint32_t ESP_getFlashChipId(void);
|
extern uint32_t ESP_getFlashChipId(void);
|
||||||
extern const String getMacAddress();
|
extern const String getMacAddress();
|
||||||
extern const String getWebVersion();
|
extern const String getWebVersion();
|
||||||
|
extern uint32_t getFlashChipIdNew();
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
//константы
|
// константы
|
||||||
#include "Const.h"
|
#include "Const.h"
|
||||||
|
|
||||||
//внешние глобальные директории
|
// внешние глобальные директории
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <ArduinoJson.h>
|
#include <ArduinoJson.h>
|
||||||
#include <TickerScheduler.h>
|
#include <TickerScheduler.h>
|
||||||
@@ -43,7 +43,7 @@
|
|||||||
|
|
||||||
#include <FS.h>
|
#include <FS.h>
|
||||||
|
|
||||||
//внутренние глобальные директории проекта
|
// внутренние глобальные директории проекта
|
||||||
#include "utils/FileUtils.h"
|
#include "utils/FileUtils.h"
|
||||||
#include "utils/JsonUtils.h"
|
#include "utils/JsonUtils.h"
|
||||||
#include "utils/SerialPrint.h"
|
#include "utils/SerialPrint.h"
|
||||||
|
|||||||
@@ -18,4 +18,6 @@ void publishJsonWs(const String& topic, String& json);
|
|||||||
void periodicWsSend();
|
void periodicWsSend();
|
||||||
|
|
||||||
void sendFileToWsByFrames(const String& filename, const String& header, const String& json, int client_id, size_t frameSize);
|
void sendFileToWsByFrames(const String& filename, const String& header, const String& json, int client_id, size_t frameSize);
|
||||||
void sendStringToWs(const String& header, String& payload, int client_id);
|
void sendStringToWs(const String& header, String& payload, int client_id);
|
||||||
|
|
||||||
|
void sendDeviceList(uint8_t num);
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
"name": "IoTmanagerVer4",
|
"name": "IoTmanagerVer4",
|
||||||
"apssid": "IoTmanager",
|
"apssid": "IoTmanager",
|
||||||
"appass": "",
|
"appass": "",
|
||||||
"routerssid": "rise",
|
"routerssid": "iot",
|
||||||
"routerpass": "hostel3333",
|
"routerpass": "hostel3333",
|
||||||
"timezone": 2,
|
"timezone": 2,
|
||||||
"ntp": "pool.ntp.org",
|
"ntp": "pool.ntp.org",
|
||||||
@@ -24,7 +24,7 @@
|
|||||||
},
|
},
|
||||||
"projectProp": {
|
"projectProp": {
|
||||||
"platformio": {
|
"platformio": {
|
||||||
"default_envs": "esp8266_4mb",
|
"default_envs": "esp32_4mb",
|
||||||
"comments_default_envs": "choose from: esp8266_4mb or esp32_4mb or esp8266_1mb or esp8266_1mb_ota or esp8285_1mb or esp8285_1mb_ota"
|
"comments_default_envs": "choose from: esp8266_4mb or esp32_4mb or esp8266_1mb or esp8266_1mb_ota or esp8285_1mb or esp8285_1mb_ota"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
[platformio]
|
[platformio]
|
||||||
default_envs = esp8266_4mb
|
default_envs = esp32_4mb
|
||||||
data_dir = data_svelte
|
data_dir = data_svelte
|
||||||
|
|
||||||
[common_env_data]
|
[common_env_data]
|
||||||
@@ -430,6 +430,7 @@ lib_deps =
|
|||||||
robtillaart/SHT2x@^0.1.1
|
robtillaart/SHT2x@^0.1.1
|
||||||
WEMOS SHT3x@1.0.0
|
WEMOS SHT3x@1.0.0
|
||||||
plerup/EspSoftwareSerial
|
plerup/EspSoftwareSerial
|
||||||
|
gyverlibs/EncButton @ ^2.0
|
||||||
https://github.com/RoboticsBrno/ServoESP32
|
https://github.com/RoboticsBrno/ServoESP32
|
||||||
adafruit/Adafruit MCP23017 Arduino Library@^2.1.0
|
adafruit/Adafruit MCP23017 Arduino Library@^2.1.0
|
||||||
adafruit/Adafruit BusIO @ ^1.13.2
|
adafruit/Adafruit BusIO @ ^1.13.2
|
||||||
@@ -462,6 +463,8 @@ build_src_filter =
|
|||||||
+<modules/sensors/UART>
|
+<modules/sensors/UART>
|
||||||
+<modules/exec/ButtonIn>
|
+<modules/exec/ButtonIn>
|
||||||
+<modules/exec/ButtonOut>
|
+<modules/exec/ButtonOut>
|
||||||
|
+<modules/exec/Buzzer>
|
||||||
|
+<modules/exec/Enconder>
|
||||||
+<modules/exec/IoTServo>
|
+<modules/exec/IoTServo>
|
||||||
+<modules/exec/Mcp23017>
|
+<modules/exec/Mcp23017>
|
||||||
+<modules/exec/Mp3>
|
+<modules/exec/Mp3>
|
||||||
|
|||||||
@@ -1,9 +1,13 @@
|
|||||||
#include "DeviceList.h"
|
#include "DeviceList.h"
|
||||||
|
|
||||||
|
// данная функция не записывает поле status из этого следует что поле равно false и поэтому весь список устройств отдаваемый мк
|
||||||
|
// уходит со статусом для всех устройств - offline
|
||||||
|
// приложение svelte хранит свой список и в нем поддерживает корректные статусы, а при получении этого списка
|
||||||
|
// лишь изменяет в своем те элементы массива которые добавились новые, не трогая остальные
|
||||||
const String getThisDevice() {
|
const String getThisDevice() {
|
||||||
String thisDevice = "{}";
|
String thisDevice = "{}";
|
||||||
jsonWriteStr_(thisDevice, F("devicelist_"), ""); //метка для парсинга
|
// jsonWriteStr_(thisDevice, F("devicelist_"), ""); // метка для парсинга - она не нужна теперь
|
||||||
jsonWriteStr_(thisDevice, F("wg"), jsonReadStr(settingsFlashJson, F("wg"))); //рабочая группа
|
jsonWriteStr_(thisDevice, F("wg"), jsonReadStr(settingsFlashJson, F("wg"))); // рабочая группа
|
||||||
jsonWriteStr_(thisDevice, F("ip"), jsonReadStr(settingsFlashJson, F("ip")));
|
jsonWriteStr_(thisDevice, F("ip"), jsonReadStr(settingsFlashJson, F("ip")));
|
||||||
jsonWriteStr_(thisDevice, F("id"), jsonReadStr(settingsFlashJson, F("id")));
|
jsonWriteStr_(thisDevice, F("id"), jsonReadStr(settingsFlashJson, F("id")));
|
||||||
jsonWriteStr_(thisDevice, F("name"), jsonReadStr(settingsFlashJson, F("name")));
|
jsonWriteStr_(thisDevice, F("name"), jsonReadStr(settingsFlashJson, F("name")));
|
||||||
@@ -12,54 +16,76 @@ const String getThisDevice() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void addThisDeviceToList() {
|
void addThisDeviceToList() {
|
||||||
devListHeapJson = getThisDevice();
|
if (jsonReadInt(settingsFlashJson, F("udps")) != 0) {
|
||||||
SerialPrint("i", "List", "Add this dev to list");
|
// если включен автопоиск то записываем это устройство в оперативную память
|
||||||
|
devListHeapJson = getThisDevice();
|
||||||
|
} else {
|
||||||
|
// если выключен автопоиск то записываем это устройство в флешь память
|
||||||
|
// если файла не было никогда
|
||||||
|
String list = readFile("/devlist.json", 2048);
|
||||||
|
if (list == "failed") {
|
||||||
|
writeFile("/devlist.json", getThisDevice());
|
||||||
|
} else {
|
||||||
|
// если файл был то перепишем в нем первое устройство - to do
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SerialPrint("i", F("List"), F("This dev added to list"));
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef UDP_ENABLED
|
#ifdef UDP_ENABLED
|
||||||
AsyncUDP asyncUdp;
|
AsyncUDP asyncUdp;
|
||||||
|
|
||||||
void asyncUdpInit() {
|
void udpListningInit() {
|
||||||
if (asyncUdp.listenMulticast(IPAddress(239, 255, 255, 255), 4210)) {
|
// если был включен автоматический поиск устройств
|
||||||
asyncUdp.onPacket([](AsyncUDPPacket packet) {
|
if (jsonReadInt(settingsFlashJson, F("udps")) != 0) {
|
||||||
// Serial.print("UDP Packet Type: ");
|
if (asyncUdp.listenMulticast(IPAddress(239, 255, 255, 255), 4210)) {
|
||||||
// Serial.println(packet.isBroadcast() ? "Broadcast" : packet.isMulticast() ? "Multicast" : "Unicast");
|
asyncUdp.onPacket([](AsyncUDPPacket packet) {
|
||||||
// Serial.print("From: ");
|
// Serial.print("UDP Packet Type: ");
|
||||||
// Serial.print(packet.remoteIP());
|
// Serial.println(packet.isBroadcast() ? "Broadcast" : packet.isMulticast() ? "Multicast" : "Unicast");
|
||||||
// Serial.print(":");
|
// Serial.print("From: ");
|
||||||
// Serial.println(packet.remotePort());
|
// Serial.print(packet.remoteIP());
|
||||||
// Serial.print("To: ");
|
// Serial.print(":");
|
||||||
// Serial.print(packet.localIP());
|
// Serial.println(packet.remotePort());
|
||||||
// Serial.print(":");
|
// Serial.print("To: ");
|
||||||
// Serial.println(packet.localPort());
|
// Serial.print(packet.localIP());
|
||||||
// Serial.print(", Length: ");
|
// Serial.print(":");
|
||||||
// Serial.print(packet.length());
|
// Serial.println(packet.localPort());
|
||||||
// Serial.print(", Data: ");
|
// Serial.print(", Length: ");
|
||||||
// Serial.write(packet.data(), packet.length());
|
// Serial.print(packet.length());
|
||||||
|
// Serial.print(", Data: ");
|
||||||
//String data = {packet.data(), packet.length()}; // для ESP32 подходит как замена uint8tToString, но 8266 не переваривает
|
// Serial.write(packet.data(), packet.length());
|
||||||
String data = uint8tToString(packet.data(), packet.length());
|
|
||||||
String remoteWorkgroup = "";
|
|
||||||
data.replace("[", "");
|
|
||||||
data.replace("]", "");
|
|
||||||
if (jsonRead(data, F("wg"), remoteWorkgroup)) { // проверяем чтоб полученный формат был Json и заодно вытягиваем имя группы
|
|
||||||
String loacalWorkgroup = "";
|
|
||||||
jsonRead(settingsFlashJson, F("wg"), loacalWorkgroup);
|
|
||||||
if (remoteWorkgroup == loacalWorkgroup) {
|
|
||||||
SerialPrint("i", F("UDP"), "IP: " + packet.remoteIP().toString() + ":" + String(packet.remotePort()));
|
|
||||||
jsonMergeArrays(devListHeapJson, data);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
SerialPrint("E", F("UDP"), F("Udp packet invalid"));
|
|
||||||
}
|
|
||||||
// reply to the client
|
|
||||||
// String ip = WiFi.localIP().toString();
|
|
||||||
// asyncUdp.broadcastTo(ip.c_str(), packet.remotePort());
|
|
||||||
// packet.printf(ip.c_str(), packet.length());
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
//будем отправлять каждые 60 секунд презентацию данного устройства
|
// String data = {packet.data(), packet.length()}; // для ESP32 подходит как замена uint8tToString, но 8266 не переваривает
|
||||||
|
String data = uint8tToString(packet.data(), packet.length());
|
||||||
|
String remoteWorkgroup = "";
|
||||||
|
data.replace("[", "");
|
||||||
|
data.replace("]", "");
|
||||||
|
if (jsonRead(data, F("wg"), remoteWorkgroup)) { // проверяем чтоб полученный формат был Json и заодно вытягиваем имя группы
|
||||||
|
String loacalWorkgroup = "";
|
||||||
|
jsonRead(settingsFlashJson, F("wg"), loacalWorkgroup);
|
||||||
|
if (remoteWorkgroup == loacalWorkgroup) {
|
||||||
|
SerialPrint("i", F("UDP"), "IP: " + packet.remoteIP().toString() + ":" + String(packet.remotePort()));
|
||||||
|
jsonMergeArrays(devListHeapJson, data);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
SerialPrint("E", F("UDP"), F("Udp packet invalid"));
|
||||||
|
}
|
||||||
|
// reply to the client
|
||||||
|
// String ip = WiFi.localIP().toString();
|
||||||
|
// asyncUdp.broadcastTo(ip.c_str(), packet.remotePort());
|
||||||
|
// packet.printf(ip.c_str(), packet.length());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
SerialPrint("i", F("UDP"), F("Udp listning inited"));
|
||||||
|
} else {
|
||||||
|
devListHeapJson = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void udpBroadcastInit() {
|
||||||
|
// будем отправлять каждые 60 секунд презентацию данного устройства
|
||||||
ts.add(
|
ts.add(
|
||||||
UDP, 60000, [&](void*) { // UDPP
|
UDP, 60000, [&](void*) { // UDPP
|
||||||
if (isNetworkActive()) {
|
if (isNetworkActive()) {
|
||||||
@@ -71,11 +97,11 @@ void asyncUdpInit() {
|
|||||||
},
|
},
|
||||||
nullptr, true);
|
nullptr, true);
|
||||||
|
|
||||||
SerialPrint("i", F("UDP"), F("Udp Init"));
|
SerialPrint("i", F("UDP"), F("Udp broadcast inited"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void jsonMergeArrays(String& existJson, String& incJson) {
|
void jsonMergeArrays(String& existJson, String& incJson) {
|
||||||
DynamicJsonDocument incJsonDoc(1024);
|
DynamicJsonDocument incJsonDoc(4096);
|
||||||
DeserializationError incJsonError = deserializeJson(incJsonDoc, incJson);
|
DeserializationError incJsonError = deserializeJson(incJsonDoc, incJson);
|
||||||
// if (incJsonError) { // upd: devlist заведомо верный, зачем проверять еще раз?
|
// if (incJsonError) { // upd: devlist заведомо верный, зачем проверять еще раз?
|
||||||
// SerialPrint("E", F("UDP"), "Invailed json in incomming udp packet " + String(incJsonError.f_str()));
|
// SerialPrint("E", F("UDP"), "Invailed json in incomming udp packet " + String(incJsonError.f_str()));
|
||||||
@@ -83,7 +109,7 @@ void jsonMergeArrays(String& existJson, String& incJson) {
|
|||||||
// return;
|
// return;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
DynamicJsonDocument existJsonDoc(1024);
|
DynamicJsonDocument existJsonDoc(4096);
|
||||||
DeserializationError existJsonError = deserializeJson(existJsonDoc, existJson);
|
DeserializationError existJsonError = deserializeJson(existJsonDoc, existJson);
|
||||||
// if (existJsonError) { // upd: полученный json уже проверен на целостность
|
// if (existJsonError) { // upd: полученный json уже проверен на целостность
|
||||||
// SerialPrint("E", F("UDP"), "Invailed json in existing udp dev list " + String(incJsonError.f_str()));
|
// SerialPrint("E", F("UDP"), "Invailed json in existing udp dev list " + String(incJsonError.f_str()));
|
||||||
|
|||||||
@@ -26,13 +26,13 @@ void globalVarsSync() {
|
|||||||
// jsonWriteStr_(ssidListHeapJson, "ssids_", ""); //метка для парсинга удалить
|
// jsonWriteStr_(ssidListHeapJson, "ssids_", ""); //метка для парсинга удалить
|
||||||
}
|
}
|
||||||
|
|
||||||
//к удалению. не используется
|
// к удалению. не используется
|
||||||
// String getParamsJson() {
|
// String getParamsJson() {
|
||||||
// String json;
|
// String json;
|
||||||
// serializeJson(*getLocalItemsAsJSON(), json);
|
// serializeJson(*getLocalItemsAsJSON(), json);
|
||||||
// jsonWriteStr_(json, "params", "");
|
// jsonWriteStr_(json, "params", "");
|
||||||
// return json;
|
// return json;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
void syncSettingsFlashJson() {
|
void syncSettingsFlashJson() {
|
||||||
writeFile(F("settings.json"), settingsFlashJson);
|
writeFile(F("settings.json"), settingsFlashJson);
|
||||||
@@ -43,7 +43,7 @@ void syncValuesFlashJson() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const String getChipId() {
|
const String getChipId() {
|
||||||
return String(ESP_getChipId()) + "-" + String(ESP_getFlashChipId());
|
return String(ESP_getChipId()) + "-" + String(getFlashChipIdNew()); // + "v" + String(FIRMWARE_VERSION);
|
||||||
}
|
}
|
||||||
|
|
||||||
void setChipId() {
|
void setChipId() {
|
||||||
@@ -76,6 +76,7 @@ uint32_t ESP_getChipId(void) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// устарела используем новую функцию ниже
|
||||||
uint32_t ESP_getFlashChipId(void) {
|
uint32_t ESP_getFlashChipId(void) {
|
||||||
#ifdef ESP32
|
#ifdef ESP32
|
||||||
// Нет аналогичной (без доп.кода) функций в 32
|
// Нет аналогичной (без доп.кода) функций в 32
|
||||||
@@ -86,6 +87,31 @@ uint32_t ESP_getFlashChipId(void) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://github.com/espressif/arduino-esp32/issues/6945#issuecomment-1199900892
|
||||||
|
// получение flash ch id из проекта esp easy
|
||||||
|
|
||||||
|
uint32_t getFlashChipIdNew() {
|
||||||
|
// Cache since size does not change
|
||||||
|
static uint32_t flashChipId = 0;
|
||||||
|
|
||||||
|
if (flashChipId == 0) {
|
||||||
|
#ifdef ESP32
|
||||||
|
uint32_t tmp = g_rom_flashchip.device_id;
|
||||||
|
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
flashChipId = flashChipId << 8;
|
||||||
|
flashChipId |= (tmp & 0xFF);
|
||||||
|
tmp = tmp >> 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
// esp_flash_read_id(nullptr, &flashChipId);
|
||||||
|
#elif defined(ESP8266)
|
||||||
|
flashChipId = ESP.getFlashChipId();
|
||||||
|
#endif // ifdef ESP32
|
||||||
|
}
|
||||||
|
return flashChipId;
|
||||||
|
}
|
||||||
|
|
||||||
const String getMacAddress() {
|
const String getMacAddress() {
|
||||||
uint8_t mac[6];
|
uint8_t mac[6];
|
||||||
char buf[13] = {0};
|
char buf[13] = {0};
|
||||||
|
|||||||
78
src/Main.cpp
78
src/Main.cpp
@@ -10,8 +10,6 @@ String volStrForSave = "";
|
|||||||
unsigned long currentMillis;
|
unsigned long currentMillis;
|
||||||
unsigned long prevMillis;
|
unsigned long prevMillis;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void elementsLoop() {
|
void elementsLoop() {
|
||||||
// передаем управление каждому элементу конфигурации для выполнения своих функций
|
// передаем управление каждому элементу конфигурации для выполнения своих функций
|
||||||
for (std::list<IoTItem *>::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) {
|
for (std::list<IoTItem *>::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) {
|
||||||
@@ -29,69 +27,62 @@ void elementsLoop() {
|
|||||||
handleEvent();
|
handleEvent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define SETUPBASE_ERRORMARKER 0
|
||||||
|
#define SETUPCONF_ERRORMARKER 1
|
||||||
|
#define SETUPSCEN_ERRORMARKER 2
|
||||||
|
#define SETUPINET_ERRORMARKER 3
|
||||||
|
#define SETUPLAST_ERRORMARKER 4
|
||||||
|
#define TICKER_ERRORMARKER 5
|
||||||
|
#define HTTP_ERRORMARKER 6
|
||||||
|
#define SOCKETS_ERRORMARKER 7
|
||||||
|
#define MQTT_ERRORMARKER 8
|
||||||
|
#define MODULES_ERRORMARKER 9
|
||||||
|
|
||||||
|
#define COUNTER_ERRORMARKER 4 // количество шагов счетчика
|
||||||
|
#define STEPPER_ERRORMARKER 100000 // размер шага счетчика интервала доверия выполнения блока кода мкс
|
||||||
|
|
||||||
#define SETUPBASE_ERRORMARKER 0
|
|
||||||
#define SETUPCONF_ERRORMARKER 1
|
|
||||||
#define SETUPSCEN_ERRORMARKER 2
|
|
||||||
#define SETUPINET_ERRORMARKER 3
|
|
||||||
#define SETUPLAST_ERRORMARKER 4
|
|
||||||
#define TICKER_ERRORMARKER 5
|
|
||||||
#define HTTP_ERRORMARKER 6
|
|
||||||
#define SOCKETS_ERRORMARKER 7
|
|
||||||
#define MQTT_ERRORMARKER 8
|
|
||||||
#define MODULES_ERRORMARKER 9
|
|
||||||
|
|
||||||
#define COUNTER_ERRORMARKER 4 // количество шагов счетчика
|
|
||||||
#define STEPPER_ERRORMARKER 100000 // размер шага счетчика интервала доверия выполнения блока кода мкс
|
|
||||||
|
|
||||||
#ifdef esp32_4mb
|
#ifdef esp32_4mb
|
||||||
|
|
||||||
static int IRAM_ATTR initErrorMarkerId = 0; // ИД маркера
|
static int IRAM_ATTR initErrorMarkerId = 0; // ИД маркера
|
||||||
static int IRAM_ATTR errorMarkerId = 0;
|
static int IRAM_ATTR errorMarkerId = 0;
|
||||||
static int IRAM_ATTR errorMarkerCounter = 0;
|
static int IRAM_ATTR errorMarkerCounter = 0;
|
||||||
|
|
||||||
hw_timer_t *My_timer = NULL;
|
hw_timer_t *My_timer = NULL;
|
||||||
void IRAM_ATTR onTimer(){
|
void IRAM_ATTR onTimer() {
|
||||||
if (errorMarkerCounter >= 0) {
|
if (errorMarkerCounter >= 0) {
|
||||||
if (errorMarkerCounter >= COUNTER_ERRORMARKER) {
|
if (errorMarkerCounter >= COUNTER_ERRORMARKER) {
|
||||||
errorMarkerId = initErrorMarkerId;
|
errorMarkerId = initErrorMarkerId;
|
||||||
errorMarkerCounter = -1;
|
errorMarkerCounter = -1;
|
||||||
} else
|
} else
|
||||||
errorMarkerCounter++;
|
errorMarkerCounter++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void initErrorMarker(int id) {
|
void initErrorMarker(int id) {
|
||||||
#ifdef esp32_4mb
|
#ifdef esp32_4mb
|
||||||
initErrorMarkerId = id;
|
initErrorMarkerId = id;
|
||||||
errorMarkerCounter = 0;
|
errorMarkerCounter = 0;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void stopErrorMarker(int id) {
|
void stopErrorMarker(int id) {
|
||||||
#ifdef esp32_4mb
|
#ifdef esp32_4mb
|
||||||
errorMarkerCounter = -1;
|
errorMarkerCounter = -1;
|
||||||
if (errorMarkerId)
|
if (errorMarkerId)
|
||||||
SerialPrint("I", "WARNING!", "A lazy (freezing loop more than " + (String)(COUNTER_ERRORMARKER * STEPPER_ERRORMARKER / 1000) + " ms) section has been found! With ID=" + (String)errorMarkerId);
|
SerialPrint("I", "WARNING!", "A lazy (freezing loop more than " + (String)(COUNTER_ERRORMARKER * STEPPER_ERRORMARKER / 1000) + " ms) section has been found! With ID=" + (String)errorMarkerId);
|
||||||
errorMarkerId = 0;
|
errorMarkerId = 0;
|
||||||
initErrorMarkerId = 0;
|
initErrorMarkerId = 0;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
|
#ifdef esp32_4mb
|
||||||
#ifdef esp32_4mb
|
|
||||||
My_timer = timerBegin(0, 80, true);
|
My_timer = timerBegin(0, 80, true);
|
||||||
timerAttachInterrupt(My_timer, &onTimer, true);
|
timerAttachInterrupt(My_timer, &onTimer, true);
|
||||||
timerAlarmWrite(My_timer, STEPPER_ERRORMARKER, true);
|
timerAlarmWrite(My_timer, STEPPER_ERRORMARKER, true);
|
||||||
timerAlarmEnable(My_timer);
|
timerAlarmEnable(My_timer);
|
||||||
//timerAlarmDisable(My_timer);
|
// timerAlarmDisable(My_timer);
|
||||||
|
|
||||||
initErrorMarker(SETUPBASE_ERRORMARKER);
|
initErrorMarker(SETUPBASE_ERRORMARKER);
|
||||||
#endif
|
#endif
|
||||||
@@ -141,23 +132,19 @@ void setup() {
|
|||||||
|
|
||||||
// настраиваем микроконтроллер
|
// настраиваем микроконтроллер
|
||||||
configure("/config.json");
|
configure("/config.json");
|
||||||
|
|
||||||
stopErrorMarker(SETUPCONF_ERRORMARKER);
|
stopErrorMarker(SETUPCONF_ERRORMARKER);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
initErrorMarker(SETUPSCEN_ERRORMARKER);
|
initErrorMarker(SETUPSCEN_ERRORMARKER);
|
||||||
|
|
||||||
// подготавливаем сценарии
|
// подготавливаем сценарии
|
||||||
iotScen.loadScenario("/scenario.txt");
|
iotScen.loadScenario("/scenario.txt");
|
||||||
// создаем событие завершения инициализации основных моментов для возможности выполнения блока кода при загрузке
|
// создаем событие завершения инициализации основных моментов для возможности выполнения блока кода при загрузке
|
||||||
createItemFromNet("onInit", "1", 1);
|
createItemFromNet("onInit", "1", 1);
|
||||||
elementsLoop();
|
elementsLoop();
|
||||||
|
|
||||||
stopErrorMarker(SETUPSCEN_ERRORMARKER);
|
|
||||||
|
|
||||||
|
|
||||||
|
stopErrorMarker(SETUPSCEN_ERRORMARKER);
|
||||||
|
|
||||||
initErrorMarker(SETUPINET_ERRORMARKER);
|
initErrorMarker(SETUPINET_ERRORMARKER);
|
||||||
|
|
||||||
// подключаемся к роутеру
|
// подключаемся к роутеру
|
||||||
@@ -181,8 +168,6 @@ void setup() {
|
|||||||
|
|
||||||
stopErrorMarker(SETUPINET_ERRORMARKER);
|
stopErrorMarker(SETUPINET_ERRORMARKER);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
initErrorMarker(SETUPLAST_ERRORMARKER);
|
initErrorMarker(SETUPLAST_ERRORMARKER);
|
||||||
|
|
||||||
// NTP
|
// NTP
|
||||||
@@ -191,11 +176,10 @@ void setup() {
|
|||||||
// инициализация задач переодического выполнения
|
// инициализация задач переодического выполнения
|
||||||
periodicTasksInit();
|
periodicTasksInit();
|
||||||
|
|
||||||
// синхронизация списка устройств
|
|
||||||
addThisDeviceToList();
|
|
||||||
|
|
||||||
// запуск работы udp
|
// запуск работы udp
|
||||||
asyncUdpInit();
|
addThisDeviceToList();
|
||||||
|
udpListningInit();
|
||||||
|
udpBroadcastInit();
|
||||||
|
|
||||||
// создаем событие завершения конфигурирования для возможности выполнения блока кода при загрузке
|
// создаем событие завершения конфигурирования для возможности выполнения блока кода при загрузке
|
||||||
createItemFromNet("onStart", "1", 1);
|
createItemFromNet("onStart", "1", 1);
|
||||||
@@ -227,8 +211,6 @@ void setup() {
|
|||||||
stopErrorMarker(SETUPLAST_ERRORMARKER);
|
stopErrorMarker(SETUPLAST_ERRORMARKER);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
#ifdef LOOP_DEBUG
|
#ifdef LOOP_DEBUG
|
||||||
unsigned long st = millis();
|
unsigned long st = millis();
|
||||||
@@ -253,7 +235,7 @@ void loop() {
|
|||||||
initErrorMarker(MQTT_ERRORMARKER);
|
initErrorMarker(MQTT_ERRORMARKER);
|
||||||
mqttLoop();
|
mqttLoop();
|
||||||
stopErrorMarker(MQTT_ERRORMARKER);
|
stopErrorMarker(MQTT_ERRORMARKER);
|
||||||
|
|
||||||
initErrorMarker(MODULES_ERRORMARKER);
|
initErrorMarker(MODULES_ERRORMARKER);
|
||||||
elementsLoop();
|
elementsLoop();
|
||||||
stopErrorMarker(MODULES_ERRORMARKER);
|
stopErrorMarker(MODULES_ERRORMARKER);
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ void mqttInit() {
|
|||||||
WIFI_MQTT_CONNECTION_CHECK, MQTT_RECONNECT_INTERVAL,
|
WIFI_MQTT_CONNECTION_CHECK, MQTT_RECONNECT_INTERVAL,
|
||||||
[&](void*) {
|
[&](void*) {
|
||||||
if (WiFi.status() == WL_CONNECTED) {
|
if (WiFi.status() == WL_CONNECTED) {
|
||||||
SerialPrint("i", F("WIFI"), "OK: " + jsonReadStr(settingsFlashJson, F("ip")));
|
SerialPrint("i", F("WIFI"), "http://" + jsonReadStr(settingsFlashJson, F("ip")));
|
||||||
wifiUptimeCalc();
|
wifiUptimeCalc();
|
||||||
if (mqtt.connected()) {
|
if (mqtt.connected()) {
|
||||||
SerialPrint("i", F("MQTT"), "OK");
|
SerialPrint("i", F("MQTT"), "OK");
|
||||||
@@ -133,10 +133,10 @@ void mqttCallback(char* topic, uint8_t* payload, size_t length) {
|
|||||||
if (payloadStr.startsWith("HELLO")) {
|
if (payloadStr.startsWith("HELLO")) {
|
||||||
SerialPrint("i", F("MQTT"), F("Full update"));
|
SerialPrint("i", F("MQTT"), F("Full update"));
|
||||||
|
|
||||||
//публикация всех виджетов
|
// публикация всех виджетов
|
||||||
publishWidgets();
|
publishWidgets();
|
||||||
|
|
||||||
//публикация всех статус сообщений при подключении приложения и генерация события подключения приложения в модулях
|
// публикация всех статус сообщений при подключении приложения и генерация события подключения приложения в модулях
|
||||||
for (std::list<IoTItem*>::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) {
|
for (std::list<IoTItem*>::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) {
|
||||||
if ((*it)->iAmLocal) {
|
if ((*it)->iAmLocal) {
|
||||||
publishStatusMqtt((*it)->getID(), (*it)->getValue());
|
publishStatusMqtt((*it)->getID(), (*it)->getValue());
|
||||||
@@ -144,7 +144,7 @@ void mqttCallback(char* topic, uint8_t* payload, size_t length) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//отправка данных графиков - данный код будет оптимизирован после завершения написания приложения с новыми графиками
|
// отправка данных графиков - данный код будет оптимизирован после завершения написания приложения с новыми графиками
|
||||||
for (std::list<IoTItem*>::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) {
|
for (std::list<IoTItem*>::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) {
|
||||||
if ((*it)->getSubtype() == "Loging" || "LogingDaily") {
|
if ((*it)->getSubtype() == "Loging" || "LogingDaily") {
|
||||||
(*it)->setPublishDestination(TO_MQTT);
|
(*it)->setPublishDestination(TO_MQTT);
|
||||||
@@ -162,16 +162,17 @@ void mqttCallback(char* topic, uint8_t* payload, size_t length) {
|
|||||||
|
|
||||||
else if (topicStr.indexOf(F("control")) != -1) {
|
else if (topicStr.indexOf(F("control")) != -1) {
|
||||||
String key = selectFromMarkerToMarker(topicStr, "/", 3);
|
String key = selectFromMarkerToMarker(topicStr, "/", 3);
|
||||||
|
|
||||||
String valueIfJson = ""; // проверяем формат, если json то берем статус, иначе - как есть
|
String valueIfJson = ""; // проверяем формат, если json то берем статус, иначе - как есть
|
||||||
if (!jsonRead(payloadStr, F("status"), valueIfJson, false))
|
if (!jsonRead(payloadStr, F("status"), valueIfJson, false))
|
||||||
generateOrder(key, payloadStr);
|
generateOrder(key, payloadStr);
|
||||||
else generateOrder(key, valueIfJson);
|
else
|
||||||
|
generateOrder(key, valueIfJson);
|
||||||
|
|
||||||
SerialPrint("i", F("=>MQTT"), "Msg from iotmanager app: " + key + " " + payloadStr);
|
SerialPrint("i", F("=>MQTT"), "Msg from iotmanager app: " + key + " " + payloadStr);
|
||||||
}
|
}
|
||||||
|
|
||||||
//здесь мы получаем события с других устройств, которые потом проверяются в сценариях этого устройства
|
// здесь мы получаем события с других устройств, которые потом проверяются в сценариях этого устройства
|
||||||
else if (topicStr.indexOf("event") != -1) {
|
else if (topicStr.indexOf("event") != -1) {
|
||||||
if (!jsonReadBool(settingsFlashJson, "mqttin")) {
|
if (!jsonReadBool(settingsFlashJson, "mqttin")) {
|
||||||
return;
|
return;
|
||||||
@@ -251,7 +252,7 @@ void publishWidgets() {
|
|||||||
DeserializationError error = deserializeJson(doc, file);
|
DeserializationError error = deserializeJson(doc, file);
|
||||||
if (error) {
|
if (error) {
|
||||||
SerialPrint("E", F("MQTT"), error.f_str());
|
SerialPrint("E", F("MQTT"), error.f_str());
|
||||||
jsonWriteInt(errorsHeapJson, F("jse3"), 1); //Ошибка чтения json файла с виджетами при отправки в mqtt
|
jsonWriteInt(errorsHeapJson, F("jse3"), 1); // Ошибка чтения json файла с виджетами при отправки в mqtt
|
||||||
}
|
}
|
||||||
JsonArray arr = doc.as<JsonArray>();
|
JsonArray arr = doc.as<JsonArray>();
|
||||||
for (JsonVariant value : arr) {
|
for (JsonVariant value : arr) {
|
||||||
@@ -292,43 +293,43 @@ void handleMqttStatus(bool send, int state) {
|
|||||||
|
|
||||||
const String getStateStr(int e) {
|
const String getStateStr(int e) {
|
||||||
switch (e) {
|
switch (e) {
|
||||||
case -4: //Нет ответа от сервера
|
case -4: // Нет ответа от сервера
|
||||||
return F("e1");
|
return F("e1");
|
||||||
break;
|
break;
|
||||||
case -3: //Соединение было разорвано
|
case -3: // Соединение было разорвано
|
||||||
return F("e2");
|
return F("e2");
|
||||||
break;
|
break;
|
||||||
case -2: //Ошибка соединения. Обычно возникает когда неверно указано название сервера MQTT
|
case -2: // Ошибка соединения. Обычно возникает когда неверно указано название сервера MQTT
|
||||||
return F("e3");
|
return F("e3");
|
||||||
break;
|
break;
|
||||||
case -1: //Клиент был отключен
|
case -1: // Клиент был отключен
|
||||||
return F("e4");
|
return F("e4");
|
||||||
break;
|
break;
|
||||||
case 0: //подключено
|
case 0: // подключено
|
||||||
return F("e5");
|
return F("e5");
|
||||||
break;
|
break;
|
||||||
case 1: //Ошибка версии
|
case 1: // Ошибка версии
|
||||||
return F("e6");
|
return F("e6");
|
||||||
break;
|
break;
|
||||||
case 2: //Отклонен идентификатор
|
case 2: // Отклонен идентификатор
|
||||||
return F("e7");
|
return F("e7");
|
||||||
break;
|
break;
|
||||||
case 3: //Не могу установить соединение
|
case 3: // Не могу установить соединение
|
||||||
return F("e8");
|
return F("e8");
|
||||||
break;
|
break;
|
||||||
case 4: //Неправильное имя пользователя/пароль
|
case 4: // Неправильное имя пользователя/пароль
|
||||||
return F("e9");
|
return F("e9");
|
||||||
break;
|
break;
|
||||||
case 5: //Не авторизован для подключения
|
case 5: // Не авторизован для подключения
|
||||||
return F("e10");
|
return F("e10");
|
||||||
break;
|
break;
|
||||||
case 6: //Название сервера пустое
|
case 6: // Название сервера пустое
|
||||||
return F("e11");
|
return F("e11");
|
||||||
break;
|
break;
|
||||||
case 7: //Имя пользователя или пароль пустые
|
case 7: // Имя пользователя или пароль пустые
|
||||||
return F("e12");
|
return F("e12");
|
||||||
break;
|
break;
|
||||||
case 8: //Подключение в процессе
|
case 8: // Подключение в процессе
|
||||||
return F("e13");
|
return F("e13");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -135,11 +135,12 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length)
|
|||||||
// RouterFind(jsonReadStr(settingsFlashJson, F("routerssid")));
|
// RouterFind(jsonReadStr(settingsFlashJson, F("routerssid")));
|
||||||
}
|
}
|
||||||
|
|
||||||
// обработка кнопки сохранить настройки wifi
|
// обработка кнопки сохранить settings.json
|
||||||
if (headerStr == "/sgnittes|") {
|
if (headerStr == "/sgnittes|") {
|
||||||
writeUint8tToString(payload, length, headerLenth, settingsFlashJson);
|
writeUint8tToString(payload, length, headerLenth, settingsFlashJson);
|
||||||
writeFileUint8tByFrames("settings.json", payload, length, headerLenth, 256);
|
writeFileUint8tByFrames("settings.json", payload, length, headerLenth, 256);
|
||||||
sendStringToWs("errors", errorsHeapJson, num);
|
sendStringToWs("errors", errorsHeapJson, num);
|
||||||
|
// если не было создано приема данных по udp - то создадим его
|
||||||
addThisDeviceToList();
|
addThisDeviceToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -164,7 +165,14 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length)
|
|||||||
|
|
||||||
// отвечаем данными на запрос страницы
|
// отвечаем данными на запрос страницы
|
||||||
if (headerStr == "/list|") {
|
if (headerStr == "/list|") {
|
||||||
sendStringToWs("devlis", devListHeapJson, num);
|
sendStringToWs("settin", settingsFlashJson, num);
|
||||||
|
// отправим список устройств в зависимости от того что выбрал user
|
||||||
|
sendDeviceList(num);
|
||||||
|
}
|
||||||
|
|
||||||
|
// сохраняем данные листа
|
||||||
|
if (headerStr == "/tsil|") {
|
||||||
|
writeFileUint8tByFrames("devlist.json", payload, length, headerLenth, 256);
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------//
|
//----------------------------------------------------------------------//
|
||||||
@@ -307,7 +315,10 @@ void publishJsonWs(const String& topic, String& json) {
|
|||||||
void periodicWsSend() {
|
void periodicWsSend() {
|
||||||
sendStringToWs("ssidli", ssidListHeapJson, -1);
|
sendStringToWs("ssidli", ssidListHeapJson, -1);
|
||||||
sendStringToWs("errors", errorsHeapJson, -1);
|
sendStringToWs("errors", errorsHeapJson, -1);
|
||||||
sendStringToWs("devlis", devListHeapJson, -1);
|
// отправляем переодичестки только в авто режиме
|
||||||
|
if (jsonReadInt(settingsFlashJson, F("udps")) != 0) {
|
||||||
|
sendStringToWs("devlis", devListHeapJson, -1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ESP32
|
#ifdef ESP32
|
||||||
@@ -413,3 +424,14 @@ void sendStringToWs(const String& header, String& payload, int client_id) {
|
|||||||
standWebSocket.sendBIN(client_id, (uint8_t*)dataArray, totalSize);
|
standWebSocket.sendBIN(client_id, (uint8_t*)dataArray, totalSize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sendDeviceList(uint8_t num) {
|
||||||
|
if (jsonReadInt(settingsFlashJson, F("udps")) != 0) {
|
||||||
|
// если включен автопоиск то отдаем список из оперативной памяти
|
||||||
|
SerialPrint("E", "FS", devListHeapJson);
|
||||||
|
sendStringToWs("devlis", devListHeapJson, num);
|
||||||
|
} else {
|
||||||
|
// если выключен автопоиск то отдаем список из флешь памяти
|
||||||
|
sendFileToWsByFrames("/devlist.json", "devlis", "", num, WEB_SOCKETS_FRAME_SIZE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ void* getAPI_Timer(String subtype, String params);
|
|||||||
void* getAPI_Variable(String subtype, String params);
|
void* getAPI_Variable(String subtype, String params);
|
||||||
void* getAPI_VariableColor(String subtype, String params);
|
void* getAPI_VariableColor(String subtype, String params);
|
||||||
void* getAPI_VButton(String subtype, String params);
|
void* getAPI_VButton(String subtype, String params);
|
||||||
void* getAPI_A02Distance(String subtype, String params);
|
|
||||||
void* getAPI_Acs712(String subtype, String params);
|
void* getAPI_Acs712(String subtype, String params);
|
||||||
void* getAPI_AhtXX(String subtype, String params);
|
void* getAPI_AhtXX(String subtype, String params);
|
||||||
void* getAPI_AnalogAdc(String subtype, String params);
|
void* getAPI_AnalogAdc(String subtype, String params);
|
||||||
@@ -32,7 +31,7 @@ void* getAPI_Mcp23017(String subtype, String params);
|
|||||||
void* getAPI_Mp3(String subtype, String params);
|
void* getAPI_Mp3(String subtype, String params);
|
||||||
void* getAPI_Multitouch(String subtype, String params);
|
void* getAPI_Multitouch(String subtype, String params);
|
||||||
void* getAPI_Pcf8574(String subtype, String params);
|
void* getAPI_Pcf8574(String subtype, String params);
|
||||||
void* getAPI_Pwm8266(String subtype, String params);
|
void* getAPI_Pwm32(String subtype, String params);
|
||||||
void* getAPI_TelegramLT(String subtype, String params);
|
void* getAPI_TelegramLT(String subtype, String params);
|
||||||
void* getAPI_Lcd2004(String subtype, String params);
|
void* getAPI_Lcd2004(String subtype, String params);
|
||||||
|
|
||||||
@@ -45,7 +44,6 @@ if ((tmpAPI = getAPI_Timer(subtype, params)) != nullptr) return tmpAPI;
|
|||||||
if ((tmpAPI = getAPI_Variable(subtype, params)) != nullptr) return tmpAPI;
|
if ((tmpAPI = getAPI_Variable(subtype, params)) != nullptr) return tmpAPI;
|
||||||
if ((tmpAPI = getAPI_VariableColor(subtype, params)) != nullptr) return tmpAPI;
|
if ((tmpAPI = getAPI_VariableColor(subtype, params)) != nullptr) return tmpAPI;
|
||||||
if ((tmpAPI = getAPI_VButton(subtype, params)) != nullptr) return tmpAPI;
|
if ((tmpAPI = getAPI_VButton(subtype, params)) != nullptr) return tmpAPI;
|
||||||
if ((tmpAPI = getAPI_A02Distance(subtype, params)) != nullptr) return tmpAPI;
|
|
||||||
if ((tmpAPI = getAPI_Acs712(subtype, params)) != nullptr) return tmpAPI;
|
if ((tmpAPI = getAPI_Acs712(subtype, params)) != nullptr) return tmpAPI;
|
||||||
if ((tmpAPI = getAPI_AhtXX(subtype, params)) != nullptr) return tmpAPI;
|
if ((tmpAPI = getAPI_AhtXX(subtype, params)) != nullptr) return tmpAPI;
|
||||||
if ((tmpAPI = getAPI_AnalogAdc(subtype, params)) != nullptr) return tmpAPI;
|
if ((tmpAPI = getAPI_AnalogAdc(subtype, params)) != nullptr) return tmpAPI;
|
||||||
@@ -70,7 +68,7 @@ if ((tmpAPI = getAPI_Mcp23017(subtype, params)) != nullptr) return tmpAPI;
|
|||||||
if ((tmpAPI = getAPI_Mp3(subtype, params)) != nullptr) return tmpAPI;
|
if ((tmpAPI = getAPI_Mp3(subtype, params)) != nullptr) return tmpAPI;
|
||||||
if ((tmpAPI = getAPI_Multitouch(subtype, params)) != nullptr) return tmpAPI;
|
if ((tmpAPI = getAPI_Multitouch(subtype, params)) != nullptr) return tmpAPI;
|
||||||
if ((tmpAPI = getAPI_Pcf8574(subtype, params)) != nullptr) return tmpAPI;
|
if ((tmpAPI = getAPI_Pcf8574(subtype, params)) != nullptr) return tmpAPI;
|
||||||
if ((tmpAPI = getAPI_Pwm8266(subtype, params)) != nullptr) return tmpAPI;
|
if ((tmpAPI = getAPI_Pwm32(subtype, params)) != nullptr) return tmpAPI;
|
||||||
if ((tmpAPI = getAPI_TelegramLT(subtype, params)) != nullptr) return tmpAPI;
|
if ((tmpAPI = getAPI_TelegramLT(subtype, params)) != nullptr) return tmpAPI;
|
||||||
if ((tmpAPI = getAPI_Lcd2004(subtype, params)) != nullptr) return tmpAPI;
|
if ((tmpAPI = getAPI_Lcd2004(subtype, params)) != nullptr) return tmpAPI;
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#include "Global.h"
|
#include "Global.h"
|
||||||
#include "utils/StringUtils.h"
|
#include "utils/StringUtils.h"
|
||||||
|
|
||||||
static const char* TIME_FORMAT PROGMEM = "%02d:%02d:%02d";
|
static const char* TIME_FORMAT PROGMEM = "%02d:%02d"; //:%02d";
|
||||||
static const char* TIME_FORMAT_WITH_DAYS PROGMEM = "%dd %02d:%02d";
|
static const char* TIME_FORMAT_WITH_DAYS PROGMEM = "%dd %02d:%02d";
|
||||||
|
|
||||||
const String prettySeconds(unsigned long time_s) {
|
const String prettySeconds(unsigned long time_s) {
|
||||||
|
|||||||
Reference in New Issue
Block a user