diff --git a/data_svelte/build/bundle.css.gz b/data_svelte/build/bundle.css.gz index ebccf588..8c7bb6f3 100644 Binary files a/data_svelte/build/bundle.css.gz and b/data_svelte/build/bundle.css.gz differ diff --git a/data_svelte/build/bundle.js.gz b/data_svelte/build/bundle.js.gz index db575529..0db852d1 100644 Binary files a/data_svelte/build/bundle.js.gz and b/data_svelte/build/bundle.js.gz differ diff --git a/data_svelte/index.html b/data_svelte/index.html index 9d22217b..ffbfd6f5 100644 --- a/data_svelte/index.html +++ b/data_svelte/index.html @@ -4,12 +4,12 @@ - IoT Manager 4.4.4 + IoT Manager 4.4.5 - + - + diff --git a/data_svelte/items.json b/data_svelte/items.json index f8cc2674..72366d57 100644 --- a/data_svelte/items.json +++ b/data_svelte/items.json @@ -192,19 +192,7 @@ "header": "Сенсоры" }, { - "name": "13. A02 Дальность", - "type": "Reading", - "subtype": "A02Distance", - "id": "dist", - "widget": "anydataCm", - "page": "Сенсоры", - "descr": "Дальность", - "int": 5, - "round": 1, - "num": 13 - }, - { - "name": "14. Acs712 Ток", + "name": "13. Acs712 Ток", "type": "Reading", "subtype": "Acs712", "id": "amp", @@ -219,11 +207,11 @@ "sens": 100, "adczero": 512, "btn-setZero": "nil", - "num": 14 + "num": 13 }, { "global": 0, - "name": "15. AHTXX Температура", + "name": "14. AHTXX Температура", "type": "Reading", "subtype": "AhtXXt", "id": "Temp20", @@ -234,11 +222,11 @@ "addr": "0x38", "shtType": 1, "round": 1, - "num": 15 + "num": 14 }, { "global": 0, - "name": "16. AHTXX Влажность", + "name": "15. AHTXX Влажность", "type": "Reading", "subtype": "AhtXXh", "id": "Hum20", @@ -249,11 +237,11 @@ "addr": "0x38", "shtType": 1, "round": 1, - "num": 16 + "num": 15 }, { "global": 0, - "name": "17. Аналоговый сенсор", + "name": "16. Аналоговый сенсор", "type": "Reading", "subtype": "AnalogAdc", "id": "t", @@ -267,11 +255,11 @@ "pin": 0, "int": 15, "avgSteps": 1, - "num": 17 + "num": 16 }, { "global": 0, - "name": "18. BME280 Температура", + "name": "17. BME280 Температура", "type": "Reading", "subtype": "Bme280t", "id": "Tmp3", @@ -281,11 +269,11 @@ "int": 15, "addr": "0x77", "round": 1, - "num": 18 + "num": 17 }, { "global": 0, - "name": "19. BME280 Давление", + "name": "18. BME280 Давление", "type": "Reading", "subtype": "Bme280p", "id": "Press3", @@ -295,11 +283,11 @@ "int": 15, "addr": "0x77", "round": 1, - "num": 19 + "num": 18 }, { "global": 0, - "name": "20. BME280 Влажность", + "name": "19. BME280 Влажность", "type": "Reading", "subtype": "Bme280h", "id": "Hum3", @@ -309,11 +297,11 @@ "int": 15, "addr": "0x77", "round": 1, - "num": 20 + "num": 19 }, { "global": 0, - "name": "21. BME280 Tочка росы", + "name": "20. BME280 Tочка росы", "type": "Reading", "subtype": "Bme280dp", "id": "Dew3", @@ -323,11 +311,11 @@ "int": 15, "addr": "0x77", "round": 1, - "num": 21 + "num": 20 }, { "global": 0, - "name": "22. BMP280 Температура", + "name": "21. BMP280 Температура", "type": "Reading", "subtype": "Bmp280t", "id": "tmp3", @@ -337,11 +325,11 @@ "int": 15, "addr": "0x77", "round": 1, - "num": 22 + "num": 21 }, { "global": 0, - "name": "23. BMP280 Давление", + "name": "22. BMP280 Давление", "type": "Reading", "subtype": "Bmp280p", "id": "Press3", @@ -351,11 +339,11 @@ "int": 15, "addr": "0x77", "round": 1, - "num": 23 + "num": 22 }, { "global": 0, - "name": "24. DHT11 Температура", + "name": "23. DHT11 Температура", "type": "Reading", "subtype": "Dht1122t", "id": "tmp3", @@ -365,11 +353,11 @@ "int": 15, "pin": 0, "senstype": "dht11", - "num": 24 + "num": 23 }, { "global": 0, - "name": "25. DHT11 Влажность", + "name": "24. DHT11 Влажность", "type": "Reading", "subtype": "Dht1122h", "id": "Hum3", @@ -379,11 +367,11 @@ "int": 15, "pin": 0, "senstype": "dht11", - "num": 25 + "num": 24 }, { "global": 0, - "name": "26. DS18B20 Температура", + "name": "25. DS18B20 Температура", "type": "Reading", "subtype": "Ds18b20", "id": "dstmp", @@ -395,11 +383,11 @@ "index": 0, "addr": "", "round": 1, - "num": 26 + "num": 25 }, { "global": 0, - "name": "27. Аналоговый счетчик импульсов", + "name": "26. Аналоговый счетчик импульсов", "type": "Writing", "subtype": "Impulse", "id": "impulse", @@ -412,11 +400,11 @@ "pinMode": "INPUT", "debounceDelay": 3, "multiply": 1, - "num": 27 + "num": 26 }, { "global": 0, - "name": "28. PZEM 004t Напряжение", + "name": "27. PZEM 004t Напряжение", "type": "Reading", "subtype": "Pzem004v", "id": "v", @@ -426,11 +414,11 @@ "int": 15, "addr": "0xF8", "round": 1, - "num": 28 + "num": 27 }, { "global": 0, - "name": "29. PZEM 004t Сила тока", + "name": "28. PZEM 004t Сила тока", "type": "Reading", "subtype": "Pzem004a", "id": "a", @@ -440,11 +428,11 @@ "int": 15, "addr": "0xF8", "round": 1, - "num": 29 + "num": 28 }, { "global": 0, - "name": "30. PZEM 004t Мощность", + "name": "29. PZEM 004t Мощность", "type": "Reading", "subtype": "Pzem004w", "id": "w", @@ -454,11 +442,11 @@ "int": 15, "addr": "0xF8", "round": 1, - "num": 30 + "num": 29 }, { "global": 0, - "name": "31. PZEM 004t Энергия", + "name": "30. PZEM 004t Энергия", "type": "Reading", "subtype": "Pzem004wh", "id": "wh", @@ -468,11 +456,11 @@ "int": 15, "addr": "0xF8", "round": 1, - "num": 31 + "num": 30 }, { "global": 0, - "name": "32. PZEM 004t Частота", + "name": "31. PZEM 004t Частота", "type": "Reading", "subtype": "Pzem004hz", "id": "hz", @@ -482,11 +470,11 @@ "int": 15, "addr": "0xF8", "round": 1, - "num": 32 + "num": 31 }, { "global": 0, - "name": "33. PZEM 004t Косинус", + "name": "32. PZEM 004t Косинус", "type": "Reading", "subtype": "Pzem004pf", "id": "pf", @@ -496,11 +484,11 @@ "int": 15, "addr": "0xF8", "round": 1, - "num": 33 + "num": 32 }, { "global": 0, - "name": "34. PZEM настройка", + "name": "33. PZEM настройка", "type": "Reading", "subtype": "Pzem004cmd", "id": "set", @@ -512,11 +500,11 @@ "changeaddr": 0, "setaddr": "0x01", "reset": 0, - "num": 34 + "num": 33 }, { "global": 0, - "name": "35. Часы реального времени", + "name": "34. Часы реального времени", "type": "Reading", "subtype": "RTC", "id": "rtc", @@ -532,11 +520,11 @@ "int": 5, "btn-setUTime": "0", "btn-setSysTime": "nil", - "num": 35 + "num": 34 }, { - "name": "36. (S8) Cенсор качества воздуха", - "num": 36, + "name": "35. (S8) Cенсор качества воздуха", + "num": 35, "type": "Reading", "subtype": "S8co", "id": "s8co", @@ -550,7 +538,7 @@ }, { "global": 0, - "name": "37. Sht20 Температура", + "name": "36. Sht20 Температура", "type": "Reading", "subtype": "Sht20t", "id": "tmp2", @@ -559,11 +547,11 @@ "descr": "Температура", "int": 15, "round": 1, - "num": 37 + "num": 36 }, { "global": 0, - "name": "38. Sht20 Влажность", + "name": "37. Sht20 Влажность", "type": "Reading", "subtype": "Sht20h", "id": "Hum2", @@ -572,11 +560,11 @@ "descr": "Влажность", "int": 15, "round": 1, - "num": 38 + "num": 37 }, { "global": 0, - "name": "39. Sht30 Температура", + "name": "38. Sht30 Температура", "type": "Reading", "subtype": "Sht30t", "id": "tmp30", @@ -585,11 +573,11 @@ "descr": "SHT30 Температура", "int": 15, "round": 1, - "num": 39 + "num": 38 }, { "global": 0, - "name": "40. Sht30 Влажность", + "name": "39. Sht30 Влажность", "type": "Reading", "subtype": "Sht30h", "id": "Hum30", @@ -598,12 +586,12 @@ "descr": "SHT30 Влажность", "int": 15, "round": 1, - "num": 40 + "num": 39 }, { "global": 0, - "name": "41. HC-SR04 Ультразвуковой дальномер", - "num": 41, + "name": "40. HC-SR04 Ультразвуковой дальномер", + "num": 40, "type": "Reading", "subtype": "Sonar", "id": "sonar", @@ -615,7 +603,7 @@ "int": 5 }, { - "name": "42. UART", + "name": "41. UART", "type": "Reading", "subtype": "UART", "page": "", @@ -627,14 +615,14 @@ "line": 2, "speed": 9600, "eventFormat": 0, - "num": 42 + "num": 41 }, { "header": "Исполнительные устройства" }, { "global": 0, - "name": "43. Кнопка подключенная к пину", + "name": "42. Кнопка подключенная к пину", "type": "Writing", "subtype": "ButtonIn", "id": "btn", @@ -649,11 +637,11 @@ "debounceDelay": 50, "fixState": 0, "inv": 0, - "num": 43 + "num": 42 }, { "global": 0, - "name": "44. Управление пином", + "name": "43. Управление пином", "type": "Writing", "subtype": "ButtonOut", "needSave": 0, @@ -664,11 +652,11 @@ "int": 0, "inv": 0, "pin": 2, - "num": 44 + "num": 43 }, { "global": 0, - "name": "45. Пассивный звуковой извещатель", + "name": "44. Пассивный звуковой извещатель", "type": "Writing", "subtype": "Buzzer", "id": "buzzer", @@ -687,11 +675,11 @@ "cycle": 0, "indication": 1, "val": 0, - "num": 45 + "num": 44 }, { "global": 0, - "name": "46. Энкодер", + "name": "45. Энкодер", "type": "Writing", "subtype": "Encoder", "id": "enc", @@ -704,11 +692,11 @@ "step": 1, "stepOnPress": 5, "pins": "4,5,2", - "num": 46 + "num": 45 }, { "global": 0, - "name": "47. Сервопривод", + "name": "46. Сервопривод", "type": "Writing", "subtype": "IoTServo", "id": "servo", @@ -719,11 +707,11 @@ "pin": 12, "apin": -1, "amap": "0, 4096, 0, 180", - "num": 47 + "num": 46 }, { "global": 0, - "name": "48. Расширитель портов Mcp23017", + "name": "47. Расширитель портов Mcp23017", "type": "Reading", "subtype": "Mcp23017", "id": "Mcp", @@ -733,11 +721,11 @@ "int": "0", "addr": "0x20", "index": 1, - "num": 48 + "num": 47 }, { "global": 0, - "name": "49. MP3 плеер", + "name": "48. MP3 плеер", "type": "Reading", "subtype": "Mp3", "id": "mp3", @@ -747,11 +735,11 @@ "int": 1, "pins": "14,12", "volume": 20, - "num": 49 + "num": 48 }, { "global": 0, - "name": "50. Сенсорная кнопка", + "name": "49. Сенсорная кнопка", "type": "Writing", "subtype": "Multitouch", "id": "impulse", @@ -765,11 +753,11 @@ "pinMode": "INPUT", "debounceDelay": 50, "PWMDelay": 500, - "num": 50 + "num": 49 }, { "global": 0, - "name": "51. Расширитель портов Pcf8574", + "name": "50. Расширитель портов Pcf8574", "type": "Reading", "subtype": "Pcf8574", "id": "Pcf", @@ -779,27 +767,29 @@ "int": "0", "addr": "0x20", "index": 1, - "num": 51 + "num": 50 }, { "global": 0, - "name": "52. PWM ESP8266", + "name": "51. PWM ESP32", "type": "Writing", - "subtype": "Pwm8266", + "subtype": "Pwm32", "id": "pwm", "widget": "range", "page": "Кнопки", "descr": "PWM", "int": 0, - "pin": 15, + "pin": 2, "freq": 5000, + "ledChannel": 2, + "PWM_resolution": 10, "val": 0, "apin": -1, - "num": 52 + "num": 51 }, { "global": 0, - "name": "53. Телеграм-Лайт", + "name": "52. Телеграм-Лайт", "type": "Writing", "subtype": "TelegramLT", "id": "tg", @@ -808,14 +798,14 @@ "descr": "", "token": "", "chatID": "", - "num": 53 + "num": 52 }, { "header": "Экраны" }, { "global": 0, - "name": "54. LCD экран 2004", + "name": "53. LCD экран 2004", "type": "Reading", "subtype": "Lcd2004", "id": "Lcd", @@ -827,10 +817,10 @@ "size": "20,4", "coord": "0,0", "id2show": "id датчика", - "num": 54 + "num": 53 }, { - "name": "55. LCD экран 1602", + "name": "54. LCD экран 1602", "type": "Reading", "subtype": "Lcd2004", "id": "Lcd", @@ -842,6 +832,6 @@ "size": "16,2", "coord": "0,0", "id2show": "id датчика", - "num": 55 + "num": 54 } ] \ No newline at end of file diff --git a/data_svelte/myProfile.json b/data_svelte/myProfile.json index 7432922b..b0ce54f5 100644 --- a/data_svelte/myProfile.json +++ b/data_svelte/myProfile.json @@ -3,7 +3,7 @@ "name": "IoTmanagerVer4", "apssid": "IoTmanager", "appass": "", - "routerssid": "rise", + "routerssid": "iot", "routerpass": "hostel3333", "timezone": 2, "ntp": "pool.ntp.org", @@ -24,7 +24,7 @@ }, "projectProp": { "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" } }, diff --git a/data_svelte/settings.json b/data_svelte/settings.json index 793904a6..297019c9 100644 --- a/data_svelte/settings.json +++ b/data_svelte/settings.json @@ -2,7 +2,7 @@ "name": "IoTmanagerVer4", "apssid": "IoTmanager", "appass": "", - "routerssid": "rise", + "routerssid": "iot", "routerpass": "hostel3333", "timezone": 2, "ntp": "pool.ntp.org", @@ -21,5 +21,6 @@ "pinSDA": 0, "i2cFreq": 100000, "wg": "group1", + "udps": 1, "settings_": "" } \ No newline at end of file diff --git a/data_svelte_lite/settings.json b/data_svelte_lite/settings.json index f6913b49..cf3a7ac8 100644 --- a/data_svelte_lite/settings.json +++ b/data_svelte_lite/settings.json @@ -20,5 +20,6 @@ "pinSDA": 0, "i2cFreq": 100000, "settings_": "", - "wg": "group1" + "wg": "group1", + "udps": 1 } \ No newline at end of file diff --git a/include/Const.h b/include/Const.h index 20cf9a1f..a9e1d9fc 100644 --- a/include/Const.h +++ b/include/Const.h @@ -1,7 +1,7 @@ #pragma once -//Версия прошивки -#define FIRMWARE_VERSION 435 +// Версия прошивки +#define FIRMWARE_VERSION 436 #ifdef esp8266_1mb_ota #define FIRMWARE_NAME "esp8266_1mb_ota" @@ -27,21 +27,21 @@ #define FIRMWARE_NAME "esp32_4mb" #endif -//Размер буфера json -#define JSON_BUFFER_SIZE 2048 //держим 2 кб не меняем +// Размер буфера json +#define JSON_BUFFER_SIZE 2048 // держим 2 кб не меняем #define WEB_SOCKETS_FRAME_SIZE 2048 -//#define LOOP_DEBUG +// #define LOOP_DEBUG -//выбор сервера -//#define ASYNC_WEB_SERVER -//#define ASYNC_WEB_SOCKETS +// выбор сервера +// #define ASYNC_WEB_SERVER +// #define ASYNC_WEB_SOCKETS #define STANDARD_WEB_SERVER #define STANDARD_WEB_SOCKETS #define UDP_ENABLED -//#define REST_FILE_OPERATIONS +// #define REST_FILE_OPERATIONS #define MQTT_RECONNECT_INTERVAL 20000 @@ -54,7 +54,7 @@ #define MIN_DATETIME 1575158400 #define LEAP_YEAR(Y) (((1970 + Y) > 0) && !((1970 + Y) % 4) && (((1970 + Y) % 100) || !((1970 + Y) % 400))) -//задачи таскера +// задачи таскера enum TimerTask_t { WIFI_SCAN, WIFI_MQTT_CONNECTION_CHECK, TIME, @@ -66,14 +66,14 @@ enum TimerTask_t { WIFI_SCAN, ST, END }; -//задачи которые надо протащить через loop +// задачи которые надо протащить через loop enum NotAsyncActions { do_ZERO, do_MQTTPARAMSCHANGED, do_LAST, }; -//состояния обновления +// состояния обновления enum UpdateStates { NOT_STARTED, UPDATE_FS_IN_PROGRESS, UPDATE_FS_COMPLETED, diff --git a/include/DeviceList.h b/include/DeviceList.h index 5f376a29..773492f9 100644 --- a/include/DeviceList.h +++ b/include/DeviceList.h @@ -2,7 +2,7 @@ #include "Global.h" #ifdef ESP8266 -//эта библиотека встроена в ядро +// эта библиотека встроена в ядро #include "ESPAsyncUDP.h" #else #include "AsyncUDP.h" @@ -11,7 +11,8 @@ extern AsyncUDP asyncUdp; extern const String getThisDevice(); extern void addThisDeviceToList(); -extern void asyncUdpInit(); +extern void udpListningInit(); +extern void udpBroadcastInit(); extern String uint8tToString(uint8_t* data, size_t len); extern void udpPacketParse(String& data); extern void jsonMergeArrays(String& existJson, String& incJson); \ No newline at end of file diff --git a/include/EspFileSystem.h b/include/EspFileSystem.h index b77439ba..078f0f8d 100644 --- a/include/EspFileSystem.h +++ b/include/EspFileSystem.h @@ -1,6 +1,7 @@ #pragma once #include "Global.h" #ifdef ESP32 +#include #if USE_LITTLEFS #include #define FileFS LittleFS @@ -35,7 +36,7 @@ extern FS* filesystem; extern bool fileSystemInit(); extern void globalVarsSync(); -//extern String getParamsJson(); +// extern String getParamsJson(); extern void syncSettingsFlashJson(); extern void syncValuesFlashJson(); @@ -47,3 +48,4 @@ extern uint32_t ESP_getChipId(void); extern uint32_t ESP_getFlashChipId(void); extern const String getMacAddress(); extern const String getWebVersion(); +extern uint32_t getFlashChipIdNew(); diff --git a/include/Global.h b/include/Global.h index 91cd2047..285e08ba 100644 --- a/include/Global.h +++ b/include/Global.h @@ -1,8 +1,8 @@ #pragma once -//константы +// константы #include "Const.h" -//внешние глобальные директории +// внешние глобальные директории #include #include #include @@ -43,7 +43,7 @@ #include -//внутренние глобальные директории проекта +// внутренние глобальные директории проекта #include "utils/FileUtils.h" #include "utils/JsonUtils.h" #include "utils/SerialPrint.h" diff --git a/include/WsServer.h b/include/WsServer.h index 0fc6b884..c9de7fe2 100644 --- a/include/WsServer.h +++ b/include/WsServer.h @@ -18,4 +18,6 @@ void publishJsonWs(const String& topic, String& json); void periodicWsSend(); 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); \ No newline at end of file +void sendStringToWs(const String& header, String& payload, int client_id); + +void sendDeviceList(uint8_t num); \ No newline at end of file diff --git a/myProfile.json b/myProfile.json index 7432922b..b0ce54f5 100644 --- a/myProfile.json +++ b/myProfile.json @@ -3,7 +3,7 @@ "name": "IoTmanagerVer4", "apssid": "IoTmanager", "appass": "", - "routerssid": "rise", + "routerssid": "iot", "routerpass": "hostel3333", "timezone": 2, "ntp": "pool.ntp.org", @@ -24,7 +24,7 @@ }, "projectProp": { "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" } }, diff --git a/platformio.ini b/platformio.ini index 7f1d6593..a13d7021 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1,5 +1,5 @@ [platformio] -default_envs = esp8266_4mb +default_envs = esp32_4mb data_dir = data_svelte [common_env_data] @@ -430,6 +430,7 @@ lib_deps = robtillaart/SHT2x@^0.1.1 WEMOS SHT3x@1.0.0 plerup/EspSoftwareSerial + gyverlibs/EncButton @ ^2.0 https://github.com/RoboticsBrno/ServoESP32 adafruit/Adafruit MCP23017 Arduino Library@^2.1.0 adafruit/Adafruit BusIO @ ^1.13.2 @@ -462,6 +463,8 @@ build_src_filter = + + + + + + + + + + diff --git a/src/DeviceList.cpp b/src/DeviceList.cpp index 9a0c42b4..250af529 100644 --- a/src/DeviceList.cpp +++ b/src/DeviceList.cpp @@ -1,9 +1,13 @@ #include "DeviceList.h" +// данная функция не записывает поле status из этого следует что поле равно false и поэтому весь список устройств отдаваемый мк +// уходит со статусом для всех устройств - offline +// приложение svelte хранит свой список и в нем поддерживает корректные статусы, а при получении этого списка +// лишь изменяет в своем те элементы массива которые добавились новые, не трогая остальные const String getThisDevice() { String thisDevice = "{}"; - jsonWriteStr_(thisDevice, F("devicelist_"), ""); //метка для парсинга - jsonWriteStr_(thisDevice, F("wg"), jsonReadStr(settingsFlashJson, F("wg"))); //рабочая группа + // jsonWriteStr_(thisDevice, F("devicelist_"), ""); // метка для парсинга - она не нужна теперь + jsonWriteStr_(thisDevice, F("wg"), jsonReadStr(settingsFlashJson, F("wg"))); // рабочая группа jsonWriteStr_(thisDevice, F("ip"), jsonReadStr(settingsFlashJson, F("ip"))); jsonWriteStr_(thisDevice, F("id"), jsonReadStr(settingsFlashJson, F("id"))); jsonWriteStr_(thisDevice, F("name"), jsonReadStr(settingsFlashJson, F("name"))); @@ -12,54 +16,76 @@ const String getThisDevice() { } void addThisDeviceToList() { - devListHeapJson = getThisDevice(); - SerialPrint("i", "List", "Add this dev to list"); + if (jsonReadInt(settingsFlashJson, F("udps")) != 0) { + // если включен автопоиск то записываем это устройство в оперативную память + 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 AsyncUDP asyncUdp; -void asyncUdpInit() { - if (asyncUdp.listenMulticast(IPAddress(239, 255, 255, 255), 4210)) { - asyncUdp.onPacket([](AsyncUDPPacket packet) { - // Serial.print("UDP Packet Type: "); - // Serial.println(packet.isBroadcast() ? "Broadcast" : packet.isMulticast() ? "Multicast" : "Unicast"); - // Serial.print("From: "); - // Serial.print(packet.remoteIP()); - // Serial.print(":"); - // Serial.println(packet.remotePort()); - // Serial.print("To: "); - // Serial.print(packet.localIP()); - // Serial.print(":"); - // Serial.println(packet.localPort()); - // Serial.print(", Length: "); - // Serial.print(packet.length()); - // Serial.print(", Data: "); - // Serial.write(packet.data(), packet.length()); - - //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()); - }); - } +void udpListningInit() { + // если был включен автоматический поиск устройств + if (jsonReadInt(settingsFlashJson, F("udps")) != 0) { + if (asyncUdp.listenMulticast(IPAddress(239, 255, 255, 255), 4210)) { + asyncUdp.onPacket([](AsyncUDPPacket packet) { + // Serial.print("UDP Packet Type: "); + // Serial.println(packet.isBroadcast() ? "Broadcast" : packet.isMulticast() ? "Multicast" : "Unicast"); + // Serial.print("From: "); + // Serial.print(packet.remoteIP()); + // Serial.print(":"); + // Serial.println(packet.remotePort()); + // Serial.print("To: "); + // Serial.print(packet.localIP()); + // Serial.print(":"); + // Serial.println(packet.localPort()); + // Serial.print(", Length: "); + // Serial.print(packet.length()); + // Serial.print(", Data: "); + // Serial.write(packet.data(), 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( UDP, 60000, [&](void*) { // UDPP if (isNetworkActive()) { @@ -71,11 +97,11 @@ void asyncUdpInit() { }, nullptr, true); - SerialPrint("i", F("UDP"), F("Udp Init")); + SerialPrint("i", F("UDP"), F("Udp broadcast inited")); } void jsonMergeArrays(String& existJson, String& incJson) { - DynamicJsonDocument incJsonDoc(1024); + DynamicJsonDocument incJsonDoc(4096); DeserializationError incJsonError = deserializeJson(incJsonDoc, incJson); // if (incJsonError) { // upd: devlist заведомо верный, зачем проверять еще раз? // 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; // } - DynamicJsonDocument existJsonDoc(1024); + DynamicJsonDocument existJsonDoc(4096); DeserializationError existJsonError = deserializeJson(existJsonDoc, existJson); // if (existJsonError) { // upd: полученный json уже проверен на целостность // SerialPrint("E", F("UDP"), "Invailed json in existing udp dev list " + String(incJsonError.f_str())); diff --git a/src/EspFileSystem.cpp b/src/EspFileSystem.cpp index 21d6f11f..e284d0ed 100644 --- a/src/EspFileSystem.cpp +++ b/src/EspFileSystem.cpp @@ -26,13 +26,13 @@ void globalVarsSync() { // jsonWriteStr_(ssidListHeapJson, "ssids_", ""); //метка для парсинга удалить } -//к удалению. не используется -// String getParamsJson() { -// String json; -// serializeJson(*getLocalItemsAsJSON(), json); -// jsonWriteStr_(json, "params", ""); -// return json; -// } +// к удалению. не используется +// String getParamsJson() { +// String json; +// serializeJson(*getLocalItemsAsJSON(), json); +// jsonWriteStr_(json, "params", ""); +// return json; +// } void syncSettingsFlashJson() { writeFile(F("settings.json"), settingsFlashJson); @@ -43,7 +43,7 @@ void syncValuesFlashJson() { } const String getChipId() { - return String(ESP_getChipId()) + "-" + String(ESP_getFlashChipId()); + return String(ESP_getChipId()) + "-" + String(getFlashChipIdNew()); // + "v" + String(FIRMWARE_VERSION); } void setChipId() { @@ -76,6 +76,7 @@ uint32_t ESP_getChipId(void) { #endif } +// устарела используем новую функцию ниже uint32_t ESP_getFlashChipId(void) { #ifdef ESP32 // Нет аналогичной (без доп.кода) функций в 32 @@ -86,6 +87,31 @@ uint32_t ESP_getFlashChipId(void) { #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() { uint8_t mac[6]; char buf[13] = {0}; diff --git a/src/Main.cpp b/src/Main.cpp index 0e621c25..95216a1f 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -10,8 +10,6 @@ String volStrForSave = ""; unsigned long currentMillis; unsigned long prevMillis; - - void elementsLoop() { // передаем управление каждому элементу конфигурации для выполнения своих функций for (std::list::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) { @@ -29,69 +27,62 @@ void elementsLoop() { 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 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 COUNTER_ERRORMARKER 4 // количество шагов счетчика +#define STEPPER_ERRORMARKER 100000 // размер шага счетчика интервала доверия выполнения блока кода мкс #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 errorMarkerCounter = 0; hw_timer_t *My_timer = NULL; -void IRAM_ATTR onTimer(){ +void IRAM_ATTR onTimer() { if (errorMarkerCounter >= 0) { if (errorMarkerCounter >= COUNTER_ERRORMARKER) { errorMarkerId = initErrorMarkerId; errorMarkerCounter = -1; - } else + } else errorMarkerCounter++; - } + } } #endif void initErrorMarker(int id) { -#ifdef esp32_4mb +#ifdef esp32_4mb initErrorMarkerId = id; errorMarkerCounter = 0; #endif } void stopErrorMarker(int id) { -#ifdef esp32_4mb +#ifdef esp32_4mb errorMarkerCounter = -1; - 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); + 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); errorMarkerId = 0; initErrorMarkerId = 0; #endif } - - void setup() { - -#ifdef esp32_4mb +#ifdef esp32_4mb My_timer = timerBegin(0, 80, true); timerAttachInterrupt(My_timer, &onTimer, true); timerAlarmWrite(My_timer, STEPPER_ERRORMARKER, true); timerAlarmEnable(My_timer); - //timerAlarmDisable(My_timer); + // timerAlarmDisable(My_timer); initErrorMarker(SETUPBASE_ERRORMARKER); #endif @@ -141,23 +132,19 @@ void setup() { // настраиваем микроконтроллер configure("/config.json"); - + stopErrorMarker(SETUPCONF_ERRORMARKER); - - initErrorMarker(SETUPSCEN_ERRORMARKER); - + // подготавливаем сценарии iotScen.loadScenario("/scenario.txt"); // создаем событие завершения инициализации основных моментов для возможности выполнения блока кода при загрузке createItemFromNet("onInit", "1", 1); elementsLoop(); - - stopErrorMarker(SETUPSCEN_ERRORMARKER); - - + stopErrorMarker(SETUPSCEN_ERRORMARKER); + initErrorMarker(SETUPINET_ERRORMARKER); // подключаемся к роутеру @@ -181,8 +168,6 @@ void setup() { stopErrorMarker(SETUPINET_ERRORMARKER); - - initErrorMarker(SETUPLAST_ERRORMARKER); // NTP @@ -191,11 +176,10 @@ void setup() { // инициализация задач переодического выполнения periodicTasksInit(); - // синхронизация списка устройств - addThisDeviceToList(); - // запуск работы udp - asyncUdpInit(); + addThisDeviceToList(); + udpListningInit(); + udpBroadcastInit(); // создаем событие завершения конфигурирования для возможности выполнения блока кода при загрузке createItemFromNet("onStart", "1", 1); @@ -227,8 +211,6 @@ void setup() { stopErrorMarker(SETUPLAST_ERRORMARKER); } - - void loop() { #ifdef LOOP_DEBUG unsigned long st = millis(); @@ -253,7 +235,7 @@ void loop() { initErrorMarker(MQTT_ERRORMARKER); mqttLoop(); stopErrorMarker(MQTT_ERRORMARKER); - + initErrorMarker(MODULES_ERRORMARKER); elementsLoop(); stopErrorMarker(MODULES_ERRORMARKER); diff --git a/src/MqttClient.cpp b/src/MqttClient.cpp index c2480941..4324e7c1 100644 --- a/src/MqttClient.cpp +++ b/src/MqttClient.cpp @@ -6,7 +6,7 @@ void mqttInit() { WIFI_MQTT_CONNECTION_CHECK, MQTT_RECONNECT_INTERVAL, [&](void*) { if (WiFi.status() == WL_CONNECTED) { - SerialPrint("i", F("WIFI"), "OK: " + jsonReadStr(settingsFlashJson, F("ip"))); + SerialPrint("i", F("WIFI"), "http://" + jsonReadStr(settingsFlashJson, F("ip"))); wifiUptimeCalc(); if (mqtt.connected()) { SerialPrint("i", F("MQTT"), "OK"); @@ -133,10 +133,10 @@ void mqttCallback(char* topic, uint8_t* payload, size_t length) { if (payloadStr.startsWith("HELLO")) { SerialPrint("i", F("MQTT"), F("Full update")); - //публикация всех виджетов + // публикация всех виджетов publishWidgets(); - //публикация всех статус сообщений при подключении приложения и генерация события подключения приложения в модулях + // публикация всех статус сообщений при подключении приложения и генерация события подключения приложения в модулях for (std::list::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) { if ((*it)->iAmLocal) { publishStatusMqtt((*it)->getID(), (*it)->getValue()); @@ -144,7 +144,7 @@ void mqttCallback(char* topic, uint8_t* payload, size_t length) { } } - //отправка данных графиков - данный код будет оптимизирован после завершения написания приложения с новыми графиками + // отправка данных графиков - данный код будет оптимизирован после завершения написания приложения с новыми графиками for (std::list::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) { if ((*it)->getSubtype() == "Loging" || "LogingDaily") { (*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) { String key = selectFromMarkerToMarker(topicStr, "/", 3); - - String valueIfJson = ""; // проверяем формат, если json то берем статус, иначе - как есть + + String valueIfJson = ""; // проверяем формат, если json то берем статус, иначе - как есть if (!jsonRead(payloadStr, F("status"), valueIfJson, false)) generateOrder(key, payloadStr); - else generateOrder(key, valueIfJson); + else + generateOrder(key, valueIfJson); SerialPrint("i", F("=>MQTT"), "Msg from iotmanager app: " + key + " " + payloadStr); } - //здесь мы получаем события с других устройств, которые потом проверяются в сценариях этого устройства + // здесь мы получаем события с других устройств, которые потом проверяются в сценариях этого устройства else if (topicStr.indexOf("event") != -1) { if (!jsonReadBool(settingsFlashJson, "mqttin")) { return; @@ -251,7 +252,7 @@ void publishWidgets() { DeserializationError error = deserializeJson(doc, file); if (error) { 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(); for (JsonVariant value : arr) { @@ -292,43 +293,43 @@ void handleMqttStatus(bool send, int state) { const String getStateStr(int e) { switch (e) { - case -4: //Нет ответа от сервера + case -4: // Нет ответа от сервера return F("e1"); break; - case -3: //Соединение было разорвано + case -3: // Соединение было разорвано return F("e2"); break; - case -2: //Ошибка соединения. Обычно возникает когда неверно указано название сервера MQTT + case -2: // Ошибка соединения. Обычно возникает когда неверно указано название сервера MQTT return F("e3"); break; - case -1: //Клиент был отключен + case -1: // Клиент был отключен return F("e4"); break; - case 0: //подключено + case 0: // подключено return F("e5"); break; - case 1: //Ошибка версии + case 1: // Ошибка версии return F("e6"); break; - case 2: //Отклонен идентификатор + case 2: // Отклонен идентификатор return F("e7"); break; - case 3: //Не могу установить соединение + case 3: // Не могу установить соединение return F("e8"); break; - case 4: //Неправильное имя пользователя/пароль + case 4: // Неправильное имя пользователя/пароль return F("e9"); break; - case 5: //Не авторизован для подключения + case 5: // Не авторизован для подключения return F("e10"); break; - case 6: //Название сервера пустое + case 6: // Название сервера пустое return F("e11"); break; - case 7: //Имя пользователя или пароль пустые + case 7: // Имя пользователя или пароль пустые return F("e12"); break; - case 8: //Подключение в процессе + case 8: // Подключение в процессе return F("e13"); break; default: diff --git a/src/WsServer.cpp b/src/WsServer.cpp index 6eec69aa..aa7cd24f 100644 --- a/src/WsServer.cpp +++ b/src/WsServer.cpp @@ -135,11 +135,12 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length) // RouterFind(jsonReadStr(settingsFlashJson, F("routerssid"))); } - // обработка кнопки сохранить настройки wifi + // обработка кнопки сохранить settings.json if (headerStr == "/sgnittes|") { writeUint8tToString(payload, length, headerLenth, settingsFlashJson); writeFileUint8tByFrames("settings.json", payload, length, headerLenth, 256); sendStringToWs("errors", errorsHeapJson, num); + // если не было создано приема данных по udp - то создадим его addThisDeviceToList(); } @@ -164,7 +165,14 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length) // отвечаем данными на запрос страницы 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() { sendStringToWs("ssidli", ssidListHeapJson, -1); sendStringToWs("errors", errorsHeapJson, -1); - sendStringToWs("devlis", devListHeapJson, -1); + // отправляем переодичестки только в авто режиме + if (jsonReadInt(settingsFlashJson, F("udps")) != 0) { + sendStringToWs("devlis", devListHeapJson, -1); + } } #ifdef ESP32 @@ -413,3 +424,14 @@ void sendStringToWs(const String& header, String& payload, int client_id) { 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); + } +} diff --git a/src/modules/API.cpp b/src/modules/API.cpp index e4f040c1..71529d10 100644 --- a/src/modules/API.cpp +++ b/src/modules/API.cpp @@ -7,7 +7,6 @@ void* getAPI_Timer(String subtype, String params); void* getAPI_Variable(String subtype, String params); void* getAPI_VariableColor(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_AhtXX(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_Multitouch(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_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_VariableColor(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_AhtXX(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_Multitouch(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_Lcd2004(subtype, params)) != nullptr) return tmpAPI; return nullptr; diff --git a/src/utils/TimeUtils.cpp b/src/utils/TimeUtils.cpp index ef850250..aa8588f5 100644 --- a/src/utils/TimeUtils.cpp +++ b/src/utils/TimeUtils.cpp @@ -2,7 +2,7 @@ #include "Global.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"; const String prettySeconds(unsigned long time_s) {