diff --git a/data_svelte/build/bundle.css.gz b/data_svelte/build/bundle.css.gz index 910785a1..e98b95d1 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 2d726583..2807c59c 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 4a70048b..cc7dd907 100644 --- a/data_svelte/index.html +++ b/data_svelte/index.html @@ -4,12 +4,12 @@ - IoT Manager 4.4.6 + IoT Manager 4.5.0 - + - + diff --git a/data_svelte/widgets.json b/data_svelte/widgets.json index adf8aae5..ba91a71f 100644 --- a/data_svelte/widgets.json +++ b/data_svelte/widgets.json @@ -245,6 +245,17 @@ "max": 100, "debounce": 500 }, + { + "name": "range", + "label": "Ползунок (Servo)", + "widget": "range", + "descrColor": "red", + "after": "%", + "k": 1, + "min": 0, + "max": 180, + "debounce": 500 + }, { "name": "select", "label": "Выпадающий", diff --git a/data_svelte_lite/widgets copy.json b/data_svelte_lite/widgets copy.json new file mode 100644 index 00000000..ba91a71f --- /dev/null +++ b/data_svelte_lite/widgets copy.json @@ -0,0 +1,308 @@ +[ + { + "name": "anydataRed", + "label": "Сообщение1", + "widget": "anydata", + "icon": "body", + "color": "red", + "descrColor": "red" + }, + { + "name": "anydataDgr", + "label": "Сообщение2", + "widget": "anydata", + "after": "", + "color": "red", + "icon": "walk" + }, + { + "name": "anydataDef", + "label": "Текст", + "widget": "anydata", + "after": "", + "icon": "" + }, + { + "name": "anydataVlt", + "label": "Вольты", + "widget": "anydata", + "after": "V", + "icon": "speedometer" + }, + { + "name": "anydataAmp", + "label": "Амперы", + "widget": "anydata", + "after": "A", + "icon": "speedometer" + }, + { + "name": "anydataWt", + "label": "Ватты", + "widget": "anydata", + "after": "Wt", + "icon": "speedometer", + "color": [ + { + "level": 0, + "value": "" + }, + { + "level": 200, + "value": "#009933" + }, + { + "level": 2000, + "value": "#FF9900" + }, + { + "level": 4000, + "value": "red" + } + ] + }, + { + "name": "anydataWth", + "label": "Энергия", + "widget": "anydata", + "after": "kWh", + "icon": "speedometer" + }, + { + "name": "anydataHtz", + "label": "Герцы", + "widget": "anydata", + "after": "Hz", + "icon": "speedometer" + }, + { + "name": "anydataTmp", + "label": "Температура", + "widget": "anydata", + "after": "°С", + "icon": "thermometer", + "font": "OCR A Std", + "color": [ + { + "level": -20, + "value": "#0000CC" + }, + { + "level": -10, + "value": "#0000CC" + }, + { + "level": 0, + "value": "#0000CC" + }, + { + "level": 12, + "value": "#3366FF" + }, + { + "level": 16, + "value": "#33CCFF" + }, + { + "level": 18, + "value": "#009933" + }, + { + "level": 30, + "value": "#FF9900" + }, + { + "level": 40, + "value": "red" + } + ] + }, + { + "name": "anydataMm", + "label": "Давление", + "widget": "anydata", + "after": "mm", + "icon": "speedometer" + }, + { + "name": "anydataHum", + "label": "Влажность", + "widget": "anydata", + "after": "%", + "icon": "water", + "color": "#88AADF" + }, + { + "name": "anydataTm", + "label": "Время", + "widget": "anydata", + "after": "", + "icon": "speedometer" + }, + { + "name": "button", + "label": "Кнопка", + "widget": "btn", + "size": "large", + "color": "green", + "send": "test" + }, + { + "name": "toggle", + "label": "Переключатель", + "widget": "toggle", + "icon": "", + "iconOff": "" + }, + { + "name": "chart1", + "label": "График без точек", + "widget": "chart", + "dateFormat": "HH:mm", + "maxCount": 86400, + "pointRadius": 0 + }, + { + "name": "chart2", + "label": "График с точками", + "widget": "chart", + "maxCount": 86400, + "dateFormat": "HH:mm" + }, + { + "name": "chart3", + "label": "График Дневной", + "widget": "chart", + "dateFormat": "DD.MM.YYYY", + "maxCount": 86400, + "type": "bar" + }, + { + "name": "fillgauge", + "label": "Бочка", + "widget": "fillgauge", + "circleColor": "#00FFFF", + "textColor": "#FFFFFF", + "waveTextColor": "#000000", + "waveColor": "#00FFFF" + }, + { + "name": "inputDate", + "label": "Ввод даты", + "widget": "input", + "size": "small", + "color": "orange", + "type": "date" + }, + { + "name": "inputDgt", + "label": "Ввод числа", + "widget": "input", + "color": "blue", + "type": "number" + }, + { + "name": "inputTxt", + "label": "Ввод текста", + "widget": "input", + "size": "small", + "color": "orange", + "type": "text" + }, + { + "name": "inputTm", + "label": "Ввод времени", + "widget": "input", + "color": "blue", + "type": "time" + }, + { + "name": "progressLine", + "label": "Статус линия", + "widget": "progress-line", + "icon": "sunny", + "max": "100", + "stroke": "10" + }, + { + "name": "progressRound", + "label": "Статус круг", + "widget": "progress-round", + "max": "100", + "stroke": "20", + "color": "#45ccce", + "background": "#777", + "semicircle": "1" + }, + { + "name": "range", + "label": "Ползунок", + "widget": "range", + "descrColor": "red", + "after": "%", + "k": 0.0977, + "min": 0, + "max": 100, + "debounce": 500 + }, + { + "name": "range", + "label": "Ползунок (Servo)", + "widget": "range", + "descrColor": "red", + "after": "%", + "k": 1, + "min": 0, + "max": 180, + "debounce": 500 + }, + { + "name": "select", + "label": "Выпадающий", + "widget": "select", + "options": [ + "Выключен", + "Включен" + ], + "status": 0 + }, + { + "name": "anydataPpm", + "label": "PPM", + "widget": "anydata", + "after": "ppm", + "icon": "speedometer" + }, + { + "name": "anydatamAmp", + "label": "миллиАмперы", + "widget": "anydata", + "after": "mAmp", + "icon": "speedometer" + }, + { + "name": "anydatamVlt", + "label": "миллиВольты", + "widget": "anydata", + "after": "mVlt", + "icon": "speedometer" + }, + { + "name": "anydatamWt", + "label": "миллиВатты", + "widget": "anydata", + "after": "mWt", + "icon": "speedometer" + }, + { + "name": "anydataCm", + "label": "Сантиметры", + "widget": "anydata", + "after": "cm", + "icon": "speedometer" + }, + { + "name": "nil", + "label": "Без виджета" + } +] \ No newline at end of file diff --git a/data_svelte_lite/widgets.json b/data_svelte_lite/widgets.json index cab0dbe2..ba91a71f 100644 --- a/data_svelte_lite/widgets.json +++ b/data_svelte_lite/widgets.json @@ -41,13 +41,31 @@ "label": "Ватты", "widget": "anydata", "after": "Wt", - "icon": "speedometer" + "icon": "speedometer", + "color": [ + { + "level": 0, + "value": "" + }, + { + "level": 200, + "value": "#009933" + }, + { + "level": 2000, + "value": "#FF9900" + }, + { + "level": 4000, + "value": "red" + } + ] }, { "name": "anydataWth", "label": "Энергия", "widget": "anydata", - "after": "kWt/Hr", + "after": "kWh", "icon": "speedometer" }, { @@ -62,7 +80,42 @@ "label": "Температура", "widget": "anydata", "after": "°С", - "icon": "thermometer" + "icon": "thermometer", + "font": "OCR A Std", + "color": [ + { + "level": -20, + "value": "#0000CC" + }, + { + "level": -10, + "value": "#0000CC" + }, + { + "level": 0, + "value": "#0000CC" + }, + { + "level": 12, + "value": "#3366FF" + }, + { + "level": 16, + "value": "#33CCFF" + }, + { + "level": 18, + "value": "#009933" + }, + { + "level": 30, + "value": "#FF9900" + }, + { + "level": 40, + "value": "red" + } + ] }, { "name": "anydataMm", @@ -192,6 +245,17 @@ "max": 100, "debounce": 500 }, + { + "name": "range", + "label": "Ползунок (Servo)", + "widget": "range", + "descrColor": "red", + "after": "%", + "k": 1, + "min": 0, + "max": 180, + "debounce": 500 + }, { "name": "select", "label": "Выпадающий", @@ -209,6 +273,34 @@ "after": "ppm", "icon": "speedometer" }, + { + "name": "anydatamAmp", + "label": "миллиАмперы", + "widget": "anydata", + "after": "mAmp", + "icon": "speedometer" + }, + { + "name": "anydatamVlt", + "label": "миллиВольты", + "widget": "anydata", + "after": "mVlt", + "icon": "speedometer" + }, + { + "name": "anydatamWt", + "label": "миллиВатты", + "widget": "anydata", + "after": "mWt", + "icon": "speedometer" + }, + { + "name": "anydataCm", + "label": "Сантиметры", + "widget": "anydata", + "after": "cm", + "icon": "speedometer" + }, { "name": "nil", "label": "Без виджета" diff --git a/include/BuildTime.h b/include/BuildTime.h new file mode 100644 index 00000000..9049b78f --- /dev/null +++ b/include/BuildTime.h @@ -0,0 +1,80 @@ +/* + Парсинг и получение даты и времени компиляции из __DATE__ и __TIME__ + Документация: + GitHub: https://github.com/GyverLibs/buildTime + Константы времени компиляции: + BUILD_YEAR - год + BUILD_MONTH - месяц + BUILD_DAY - день + BUILD_HOUR - час + BUILD_MIN - минута + BUILD_SEC - секунда + + Исходник http://qaru.site/questions/186859/how-to-use-date-and-time-predefined-macros-in-as-two-integers-then-stringify + AlexGyver, alex@alexgyver.ru + https://alexgyver.ru/ + MIT License + + Версии: + v1.0 - релиз +*/ + +#ifndef buildTime_h +#define buildTime_h +// Example of __DATE__ string: "Jul 27 2012" +// 01234567890 + +#define BUILD_YEAR_CH0 (__DATE__[7] - '0') +#define BUILD_YEAR_CH1 (__DATE__[8] - '0') +#define BUILD_YEAR_CH2 (__DATE__[9] - '0') +#define BUILD_YEAR_CH3 (__DATE__[10] - '0') +#define BUILD_YEAR (BUILD_YEAR_CH0 * 1000 + BUILD_YEAR_CH1 * 100 + BUILD_YEAR_CH2 * 10 + BUILD_YEAR_CH3) + +#define BUILD_MONTH_IS_JAN (__DATE__[0] == 'J' && __DATE__[1] == 'a' && __DATE__[2] == 'n') +#define BUILD_MONTH_IS_FEB (__DATE__[0] == 'F') +#define BUILD_MONTH_IS_MAR (__DATE__[0] == 'M' && __DATE__[1] == 'a' && __DATE__[2] == 'r') +#define BUILD_MONTH_IS_APR (__DATE__[0] == 'A' && __DATE__[1] == 'p') +#define BUILD_MONTH_IS_MAY (__DATE__[0] == 'M' && __DATE__[1] == 'a' && __DATE__[2] == 'y') +#define BUILD_MONTH_IS_JUN (__DATE__[0] == 'J' && __DATE__[1] == 'u' && __DATE__[2] == 'n') +#define BUILD_MONTH_IS_JUL (__DATE__[0] == 'J' && __DATE__[1] == 'u' && __DATE__[2] == 'l') +#define BUILD_MONTH_IS_AUG (__DATE__[0] == 'A' && __DATE__[1] == 'u') +#define BUILD_MONTH_IS_SEP (__DATE__[0] == 'S') +#define BUILD_MONTH_IS_OCT (__DATE__[0] == 'O') +#define BUILD_MONTH_IS_NOV (__DATE__[0] == 'N') +#define BUILD_MONTH_IS_DEC (__DATE__[0] == 'D') + +#define BUILD_MONTH \ + ( \ + (BUILD_MONTH_IS_JAN) ? 1 : (BUILD_MONTH_IS_FEB) ? 2 \ + : (BUILD_MONTH_IS_MAR) ? 3 \ + : (BUILD_MONTH_IS_APR) ? 4 \ + : (BUILD_MONTH_IS_MAY) ? 5 \ + : (BUILD_MONTH_IS_JUN) ? 6 \ + : (BUILD_MONTH_IS_JUL) ? 7 \ + : (BUILD_MONTH_IS_AUG) ? 8 \ + : (BUILD_MONTH_IS_SEP) ? 9 \ + : (BUILD_MONTH_IS_OCT) ? 10 \ + : (BUILD_MONTH_IS_NOV) ? 11 \ + : (BUILD_MONTH_IS_DEC) ? 12 \ + : /* error default */ '?') + +#define BUILD_DAY_CH0 (((__DATE__[4] >= '0') ? (__DATE__[4]) : '0') - '0') +#define BUILD_DAY_CH1 (__DATE__[5] - '0') +#define BUILD_DAY (BUILD_DAY_CH0 * 10 + BUILD_DAY_CH1) + +// Example of __TIME__ string: "21:06:19" +// 01234567 + +#define BUILD_HOUR_CH0 (__TIME__[0] - '0') +#define BUILD_HOUR_CH1 (__TIME__[1] - '0') +#define BUILD_HOUR (BUILD_HOUR_CH0 * 10 + BUILD_HOUR_CH1) + +#define BUILD_MIN_CH0 (__TIME__[3] - '0') +#define BUILD_MIN_CH1 (__TIME__[4] - '0') +#define BUILD_MIN (BUILD_MIN_CH0 * 10 + BUILD_MIN_CH1) + +#define BUILD_SEC_CH0 (__TIME__[6] - '0') +#define BUILD_SEC_CH1 (__TIME__[7] - '0') +#define BUILD_SEC (BUILD_SEC_CH0 * 10 + BUILD_SEC_CH1) + +#endif \ No newline at end of file diff --git a/include/Const.h b/include/Const.h index a9e1d9fc..ed0c83dd 100644 --- a/include/Const.h +++ b/include/Const.h @@ -1,7 +1,8 @@ #pragma once +#include "BuildTime.h" // Версия прошивки -#define FIRMWARE_VERSION 436 +#define FIRMWARE_VERSION 450 #ifdef esp8266_1mb_ota #define FIRMWARE_NAME "esp8266_1mb_ota" @@ -90,4 +91,4 @@ enum distination { TO_MQTT_WS, }; -#define WS_BROADCAST -1 \ No newline at end of file +#define WS_BROADCAST -1 diff --git a/iotm/esp32_4mb/400/firmware.bin b/iotm/esp32_4mb/400/firmware.bin new file mode 100644 index 00000000..83335b7b Binary files /dev/null and b/iotm/esp32_4mb/400/firmware.bin differ diff --git a/iotm/esp32_4mb/400/littlefs.bin b/iotm/esp32_4mb/400/littlefs.bin new file mode 100644 index 00000000..0d4e51e0 Binary files /dev/null and b/iotm/esp32_4mb/400/littlefs.bin differ diff --git a/iotm/esp32_4mb/400/partitions.bin b/iotm/esp32_4mb/400/partitions.bin new file mode 100644 index 00000000..0e52b4c4 Binary files /dev/null and b/iotm/esp32_4mb/400/partitions.bin differ diff --git a/iotm/ver.json b/iotm/ver.json new file mode 100644 index 00000000..128ca01f --- /dev/null +++ b/iotm/ver.json @@ -0,0 +1,5 @@ +{ + "esp32_4mb": { + "0": "400" + } +} \ No newline at end of file diff --git a/src/DeviceList.cpp b/src/DeviceList.cpp index 32620625..96903e16 100644 --- a/src/DeviceList.cpp +++ b/src/DeviceList.cpp @@ -1,9 +1,5 @@ #include "DeviceList.h" -// данная функция не записывает поле status из этого следует что поле равно false и поэтому весь список устройств отдаваемый мк -// уходит со статусом для всех устройств - offline -// приложение svelte хранит свой список и в нем поддерживает корректные статусы, а при получении этого списка -// лишь изменяет в своем те элементы массива которые добавились новые, не трогая остальные const String getThisDevice() { String thisDevice = "{}"; // jsonWriteStr_(thisDevice, F("devicelist_"), ""); // метка для парсинга - она не нужна теперь @@ -11,6 +7,10 @@ const String getThisDevice() { jsonWriteStr_(thisDevice, F("ip"), jsonReadStr(settingsFlashJson, F("ip"))); jsonWriteStr_(thisDevice, F("id"), jsonReadStr(settingsFlashJson, F("id"))); jsonWriteStr_(thisDevice, F("name"), jsonReadStr(settingsFlashJson, F("name"))); + // приложение svelte хранит свой список и в нем поддерживает корректные статусы, а при получении этого списка + // лишь изменяет в своем те элементы массива которые добавились новые, не трогая остальные + jsonWriteBool_(thisDevice, F("status"), false); + jsonWriteInt_(thisDevice, F("fv"), FIRMWARE_VERSION); thisDevice = "[" + thisDevice + "]"; return thisDevice; } diff --git a/src/Main.cpp b/src/Main.cpp index 95216a1f..231053c2 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -93,7 +93,7 @@ void setup() { Serial.println(F("--------------started----------------")); // создание экземпляров классов - // myNotAsyncActions = new NotAsync(do_LAST); + // myNotAsyncActions = new NotAsync(do_LAST); // инициализация файловой системы fileSystemInit(); @@ -101,6 +101,9 @@ void setup() { Serial.println("FIRMWARE NAME " + String(FIRMWARE_NAME)); Serial.println("FIRMWARE VERSION " + String(FIRMWARE_VERSION)); Serial.println("WEB VERSION " + getWebVersion()); + const String buildTime = String(BUILD_DAY) + "/" + String(BUILD_MONTH) + "/" + String(BUILD_YEAR) + " " + String(BUILD_HOUR) + ":" + String(BUILD_MIN) + ":" + String(BUILD_SEC); + Serial.println("BUILD TIME " + buildTime); + jsonWriteStr_(errorsHeapJson, F("bt"), buildTime); Serial.println(F("------------------------")); // получение chip id diff --git a/src/UpgradeFirm.cpp b/src/UpgradeFirm.cpp index 20385771..2229f9d0 100644 --- a/src/UpgradeFirm.cpp +++ b/src/UpgradeFirm.cpp @@ -48,17 +48,19 @@ bool upgradeFS() { #endif #ifdef ESP32 httpUpdate.rebootOnUpdate(false); - //обновляем little fs с помощью метода обновления spiffs + // обновляем little fs с помощью метода обновления spiffs HTTPUpdateResult retFS = httpUpdate.updateSpiffs(wifiClient, getBinPath("littlefs.bin")); #endif - //если FS обновилась успешно + // если FS обновилась успешно if (retFS == HTTP_UPDATE_OK) { SerialPrint("!!!", F("Update"), F("FS upgrade done!")); handleUpdateStatus(true, UPDATE_FS_COMPLETED); ret = true; + } else { + handleUpdateStatus(true, UPDATE_FS_FAILED); } - handleUpdateStatus(true, UPDATE_FS_FAILED); + return ret; } @@ -72,7 +74,7 @@ bool upgradeBuild() { handleUpdateStatus(true, PATH_ERROR); return ret; } -#if defined (esp8266_4mb) || defined (esp8266_1mb) || defined (esp8266_1mb_ota) || defined (esp8266_2mb) || defined (esp8266_2mb_ota) +#if defined(esp8266_4mb) || defined(esp8266_1mb) || defined(esp8266_1mb_ota) || defined(esp8266_2mb) || defined(esp8266_2mb_ota) ESPhttpUpdate.rebootOnUpdate(false); t_httpUpdate_return retBuild = ESPhttpUpdate.update(wifiClient, getBinPath("firmware.bin")); #endif @@ -81,13 +83,14 @@ bool upgradeBuild() { HTTPUpdateResult retBuild = httpUpdate.update(wifiClient, getBinPath("firmware.bin")); #endif - //если BUILD обновился успешно + // если BUILD обновился успешно if (retBuild == HTTP_UPDATE_OK) { SerialPrint("!!!", F("Update"), F("BUILD upgrade done!")); handleUpdateStatus(true, UPDATE_BUILD_COMPLETED); ret = true; + } else { + handleUpdateStatus(true, UPDATE_BUILD_FAILED); } - handleUpdateStatus(true, UPDATE_BUILD_FAILED); return ret; } @@ -132,5 +135,5 @@ void saveUserDataToFlash() { void handleUpdateStatus(bool send, int state) { jsonWriteInt_(errorsHeapJson, F("upd"), state); - if (!send) sendStringToWs("errors", errorsHeapJson, -1); + if (send) sendStringToWs("errors", errorsHeapJson, -1); } \ No newline at end of file diff --git a/src/WsServer.cpp b/src/WsServer.cpp index 822dc881..c8886ab6 100644 --- a/src/WsServer.cpp +++ b/src/WsServer.cpp @@ -163,9 +163,15 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length) // Страница веб интерфейса list //----------------------------------------------------------------------// - // отвечаем данными на запрос страницы + // отвечаем данными на запрос страницы list if (headerStr == "/list|") { sendStringToWs("settin", settingsFlashJson, num); + // отправим список устройств в зависимости от того что выбрал user + // sendDeviceList(num); + } + + // отвечаем на запрос списка устройств (это отдельный запрос который делает приложение при подключении) + if (headerStr == "/devlist|") { // отправим список устройств в зависимости от того что выбрал user sendDeviceList(num); }