добавлено сохранение списка устройств, новый веб интерфейс

This commit is contained in:
Dmitry Borisenko
2023-06-09 01:11:15 +02:00
parent 589502a273
commit 9e49ece90f
21 changed files with 315 additions and 260 deletions

Binary file not shown.

Binary file not shown.

View File

@@ -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>

View File

@@ -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
} }
] ]

View File

@@ -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"
} }
}, },

View File

@@ -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_": ""
} }

View File

@@ -20,5 +20,6 @@
"pinSDA": 0, "pinSDA": 0,
"i2cFreq": 100000, "i2cFreq": 100000,
"settings_": "", "settings_": "",
"wg": "group1" "wg": "group1",
"udps": 1
} }

View File

@@ -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,

View File

@@ -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);

View File

@@ -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();

View File

@@ -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"

View File

@@ -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);

View File

@@ -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"
} }
}, },

View File

@@ -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>

View File

@@ -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()));

View File

@@ -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};

View File

@@ -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);

View File

@@ -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:

View File

@@ -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);
}
}

View File

@@ -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;

View File

@@ -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) {