diff --git a/data_svelte/widgets.json b/data_svelte/widgets.json index 76a4712c..9da79005 100644 --- a/data_svelte/widgets.json +++ b/data_svelte/widgets.json @@ -307,7 +307,21 @@ "widget": "anydata", "after": "ltr", "icon": "speedometer" - }, + }, + { + "name": "anydataSpeed", + "label": "мерты в секунду", + "widget": "anydata", + "after": "m/s", + "icon": "speedometer" + }, + { + "name": "anydataСorner", + "label": "угол градусов", + "widget": "anydata", + "after": "°", + "icon": "speedometer" + }, { "name": "nil", "label": "Без виджета" diff --git a/include/Const.h b/include/Const.h index 09cc7d34..e7abc35d 100644 --- a/include/Const.h +++ b/include/Const.h @@ -44,6 +44,14 @@ #define FIRMWARE_NAME "esp32s2_4mb" #endif +#ifdef esp32c3m_4mb +#define FIRMWARE_NAME "esp32c3m_4mb" +#endif + +#ifdef esp32s3_16mb +#define FIRMWARE_NAME "esp32s3_16mb" +#endif + // Размер буфера json #define JSON_BUFFER_SIZE 4096 // держим 2 кб не меняем diff --git a/myProfile.json b/myProfile.json index 7c17d771..74604173 100644 --- a/myProfile.json +++ b/myProfile.json @@ -25,7 +25,7 @@ "projectProp": { "platformio": { "default_envs": "esp8266_4mb", - "comments_default_envs": "choose from: esp8266_4mb or esp32_4mb or esp32cam_4mb or esp32s2_4mb or esp32_4mb3f 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 esp32cam_4mb or esp32s2_4mb or esp32_4mb3f or esp32s3_16mb or esp32c3m_4mb or esp8266_1mb or esp8266_1mb_ota or esp8285_1mb or esp8285_1mb_ota", "envs": [ { "name": "esp8266_4mb", @@ -106,6 +106,22 @@ "firmware": "0x10000", "partitions": "0x8000", "littlefs": "0x290000" + }, + { + "name": "esp32c3m_4mb", + "boot_app0": "0xe000", + "bootloader_qio_80m": "0x1000", + "firmware": "0x10000", + "partitions": "0x8000", + "littlefs": "0x310000" + }, + { + "name": "esp32s3_16mb", + "boot_app0": "0xe000", + "bootloader_qio_80m": "0x1000", + "firmware": "0x10000", + "partitions": "0x8000", + "littlefs": "0x910000" } ] } diff --git a/platformio.ini b/platformio.ini index 10eae1e1..4d65245f 100644 --- a/platformio.ini +++ b/platformio.ini @@ -266,6 +266,52 @@ build_src_filter = + ${env:esp32s2_4mb_fromitems.build_src_filter} +[env:esp32c3m_4mb] +lib_deps = + ${common_env_data.lib_deps_external} + ${env:esp32c3m_4mb_fromitems.lib_deps} +build_flags = + -Desp32c3m_4mb="esp32c3m_4mb" +framework = arduino +board = lolin_c3_mini +platform = espressif32 @6.3.1 +monitor_filters = esp32_exception_decoder +upload_speed = 921600 +monitor_speed = 115200 +debug_tool = esp-prog +board_build.filesystem = littlefs +board_build.partitions = tools/partitions_custom.csv +build_src_filter = + +<*.cpp> + + + + + + + ${env:esp32c3m_4mb_fromitems.build_src_filter} + +[env:esp32s3_16mb] +lib_deps = + ${common_env_data.lib_deps_external} + ${env:esp32s3_16mb_fromitems.lib_deps} +build_flags = + -Desp32s3_16mb="esp32s3_16mb" +framework = arduino +board = esp32-s3-devkitc-1 +board_build.mcu = esp32s3 +platform = espressif32 @6.3.1 +monitor_filters = esp32_exception_decoder +upload_speed = 921600 +monitor_speed = 115200 +debug_tool = esp-prog +board_build.partitions = tools/large_spiffs_16MB.csv +board_upload.flash_size = 16MB +board_build.filesystem = littlefs +build_src_filter = + +<*.cpp> + + + + + + + ${env:esp32s3_16mb_fromitems.build_src_filter} + [env:esp32_16mb] lib_deps = ${common_env_data.lib_deps_external} @@ -485,65 +531,25 @@ build_src_filter = [env:esp8266_4mb_fromitems] lib_deps = - https://github.com/enjoyneering/AHTxx.git - adafruit/Adafruit BME280 Library - adafruit/Adafruit BMP280 Library - beegee-tokyo/DHT sensor library for ESPx https://github.com/milesburton/Arduino-Temperature-Control-Library - https://github.com/tremaru/iarduino_RTC - robtillaart/SHT2x@^0.1.1 - WEMOS SHT3x@1.0.0 - plerup/EspSoftwareSerial - gyverlibs/EncButton @ ^2.0 - adafruit/Adafruit MCP23017 Arduino Library@^2.1.0 - adafruit/Adafruit BusIO @ ^1.13.2 - dfrobot/DFRobotDFPlayerMini @ ^1.0.5 - adafruit/Adafruit BusIO @ ^1.13.2 - https://github.com/robotclass/RobotClass_LiquidCrystal_I2C - marcoschwartz/LiquidCrystal_I2C@^1.1.4 - https://github.com/stblassitude/Adafruit_SSD1306_Wemos_OLED - https://github.com/adafruit/Adafruit-GFX-Library - https://github.com/maxint-rd/TM16xx - adafruit/Adafruit GFX Library @ ^1.11.5 - adafruit/Adafruit BusIO @ ^1.13.2 + https://github.com/GyverLibs/GyverINA + gyverlibs/FastBot build_src_filter = + + + + + + + + + - + - + - + - + - + - + - + + - + - + - + - + - + - + - + - + + + + + + + - + - + - + - + - + - + - + - + + - + - + - + + + [env:esp32_4mb_fromitems] lib_deps = @@ -724,3 +730,27 @@ build_src_filter = + + +[env:esp32c3m_4mb_fromitems] +lib_deps = +build_src_filter = + + + + + + + + + + + + + + + + + +[env:esp32s3_16mb_fromitems] +lib_deps = +build_src_filter = + + + + + + + + + + + + + + + + + diff --git a/src/EspFileSystem.cpp b/src/EspFileSystem.cpp index ef885187..7c8777eb 100644 --- a/src/EspFileSystem.cpp +++ b/src/EspFileSystem.cpp @@ -78,7 +78,8 @@ uint32_t ESP_getChipId(void) } // устарела используем новую функцию ниже -#ifndef esp32s2_4mb +#if !defined(esp32s2_4mb) && !defined(esp32c3m_4mb) && !defined(esp32s3_16mb) +//#ifndef esp32s2_4mb uint32_t ESP_getFlashChipId(void) { #ifdef ESP32 diff --git a/src/Main.cpp b/src/Main.cpp index 0d1e7951..75341d64 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -3,7 +3,7 @@ #include "classes/IoTDB.h" #include "utils/Statistic.h" #include -#ifdef esp32s2_4mb +#if defined(esp32s2_4mb) || defined(esp32s3_16mb) #include #endif @@ -80,7 +80,7 @@ void stopErrorMarker(int id) { } void setup() { -#ifdef esp32s2_4mb +#if defined(esp32s2_4mb) || defined(esp32s3_16mb) USB.begin(); #endif #if defined(esp32_4mb) || defined(esp32_16mb) || defined(esp32cam_4mb) diff --git a/src/PeriodicTasks.cpp b/src/PeriodicTasks.cpp index aca4f182..f9fa9c9d 100644 --- a/src/PeriodicTasks.cpp +++ b/src/PeriodicTasks.cpp @@ -59,7 +59,7 @@ String ESP_getResetReason(void) { return ESP.getResetReason(); } #endif -#ifdef esp32s2_4mb +#if defined(esp32s2_4mb) || defined(esp32s3_16mb) || defined(esp32c3m_4mb) String ESP_getResetReason(void) { return ESP32GetResetReason(0); // CPU 0 } diff --git a/src/modules/virtual/Cron/modinfo.json b/src/modules/virtual/Cron/modinfo.json index 6ba9d543..4356adb6 100644 --- a/src/modules/virtual/Cron/modinfo.json +++ b/src/modules/virtual/Cron/modinfo.json @@ -54,6 +54,8 @@ "esp32cam_4mb": [], "esp32_16mb": [], "esp32s2_4mb": [], + "esp32s3_16mb": [], + "esp32c3m_4mb": [], "esp8266_4mb": [], "esp8266_16mb": [], "esp8266_1mb": [], diff --git a/src/modules/virtual/GoogleSheet/modinfo.json b/src/modules/virtual/GoogleSheet/modinfo.json index afb8f42e..8fa0c5fb 100644 --- a/src/modules/virtual/GoogleSheet/modinfo.json +++ b/src/modules/virtual/GoogleSheet/modinfo.json @@ -62,6 +62,8 @@ "esp32_4mb3f": [], "esp32cam_4mb": [], "esp32s2_4mb": [], + "esp32s3_16mb": [], + "esp32c3m_4mb": [], "esp8266_4mb": [] } } \ No newline at end of file diff --git a/src/modules/virtual/Loging/modinfo.json b/src/modules/virtual/Loging/modinfo.json index 442637cb..c5bbf6b4 100644 --- a/src/modules/virtual/Loging/modinfo.json +++ b/src/modules/virtual/Loging/modinfo.json @@ -55,6 +55,8 @@ "esp32cam_4mb": [], "esp32_16mb": [], "esp32s2_4mb": [], + "esp32s3_16mb": [], + "esp32c3m_4mb": [], "esp8266_4mb": [], "esp8266_16mb": [], "esp8266_1mb": [], diff --git a/src/modules/virtual/LogingDaily/modinfo.json b/src/modules/virtual/LogingDaily/modinfo.json index f04fd0af..39c82335 100644 --- a/src/modules/virtual/LogingDaily/modinfo.json +++ b/src/modules/virtual/LogingDaily/modinfo.json @@ -48,6 +48,8 @@ "esp32cam_4mb": [], "esp32_16mb": [], "esp32s2_4mb": [], + "esp32s3_16mb": [], + "esp32c3m_4mb": [], "esp8266_4mb": [], "esp8266_16mb": [], "esp8266_1mb": [], diff --git a/src/modules/virtual/Timer/modinfo.json b/src/modules/virtual/Timer/modinfo.json index 7882540a..c0b02ea3 100644 --- a/src/modules/virtual/Timer/modinfo.json +++ b/src/modules/virtual/Timer/modinfo.json @@ -78,6 +78,8 @@ "esp32cam_4mb": [], "esp32_16mb": [], "esp32s2_4mb": [], + "esp32s3_16mb": [], + "esp32c3m_4mb": [], "esp8266_4mb": [], "esp8266_16mb": [], "esp8266_1mb": [], diff --git a/src/modules/virtual/VButton/modinfo.json b/src/modules/virtual/VButton/modinfo.json index c38cd289..366e6b51 100644 --- a/src/modules/virtual/VButton/modinfo.json +++ b/src/modules/virtual/VButton/modinfo.json @@ -40,6 +40,8 @@ "esp32cam_4mb": [], "esp32_16mb": [], "esp32s2_4mb": [], + "esp32s3_16mb": [], + "esp32c3m_4mb": [], "esp8266_4mb": [], "esp8266_16mb": [], "esp8266_1mb": [], diff --git a/src/modules/virtual/Variable/modinfo.json b/src/modules/virtual/Variable/modinfo.json index b155b0f9..49bff50c 100644 --- a/src/modules/virtual/Variable/modinfo.json +++ b/src/modules/virtual/Variable/modinfo.json @@ -100,6 +100,8 @@ "esp32cam_4mb": [], "esp32_16mb": [], "esp32s2_4mb": [], + "esp32s3_16mb": [], + "esp32c3m_4mb": [], "esp8266_4mb": [], "esp8266_16mb": [], "esp8266_1mb": [], diff --git a/src/modules/virtual/VariableColor/modinfo.json b/src/modules/virtual/VariableColor/modinfo.json index d3aa7769..c6703166 100644 --- a/src/modules/virtual/VariableColor/modinfo.json +++ b/src/modules/virtual/VariableColor/modinfo.json @@ -39,6 +39,8 @@ "esp32cam_4mb": [], "esp32_16mb": [], "esp32s2_4mb": [], + "esp32s3_16mb": [], + "esp32c3m_4mb": [], "esp8266_4mb": [], "esp8266_16mb": [], "esp8266_1mb": [], diff --git a/src/modules/virtual/Weather/modinfo.json b/src/modules/virtual/Weather/modinfo.json index e40f1127..928bc442 100644 --- a/src/modules/virtual/Weather/modinfo.json +++ b/src/modules/virtual/Weather/modinfo.json @@ -44,6 +44,8 @@ "esp32cam_4mb": [], "esp32_16mb": [], "esp32s2_4mb": [], + "esp32s3_16mb": [], + "esp32c3m_4mb": [], "esp8266_4mb": [], "esp8266_16mb": [], "esp8266_1mb": [], diff --git a/src/modules/virtual/owmWeather/modinfo.json b/src/modules/virtual/owmWeather/modinfo.json index 520e0761..43d3708a 100644 --- a/src/modules/virtual/owmWeather/modinfo.json +++ b/src/modules/virtual/owmWeather/modinfo.json @@ -1,5 +1,6 @@ { "menuSection": "virtual_elments", + "configItem": [ { "global": 0, @@ -13,7 +14,7 @@ "descr": "Температура на улице", "int": 30, "API_key": "", - "сity": "Moscow", + "city": "Moscow", "lon": "37.54", "lat": "57.74", "lang": "ru", @@ -23,13 +24,14 @@ "debug": 0 } ], + "about": { "authorName": "Serghei Crasnicov, v2.0 Mikhail Bubnov", - "authorContact": "https://t.me/Serghei63", + "authorContact": "https://t.me/Serghei63 https://t.me/Mit4bmw", "authorGit": "https://github.com/Serghei63", "specialThanks": "AVAKS", "moduleName": "owmWeather", - "moduleVersion": "2.0", + "moduleVersion": "2.1", "usedRam": { "esp32_4mb": 15, "esp8266_4mb": 15 @@ -58,14 +60,43 @@ "lon": "Долгота, при использовании координат, будет автоматически выбран ближайший город", "lat": "Широта, при использовании координат, будет автоматически выбран ближайший город", "lang": "Язык используемый в ответах OpenWetaherMap", - "debug": "1 - выводить дополнительный лог в сериал" - } + "debug":"1 - выводить дополнительный лог в сериал" + }, + "funcInfo": [ + { + "name": "sunrise", + "descr": "Функция астрологического таймера, можно задать время до/после рассвета, вернётся количество минут до сработки или после (-). После заката будет возвращать +999 (Значение <=0 будет от сработки и до заката), когда 0 - значит время подошло", + "params": ["количество минут до(-)/после(+) рассвета"] + }, + { + "name": "sunset", + "descr": "Функция астрологического таймера, можно задать время до/после заката, вернётся количество минут до сработки или после (-), когда 0 - значит время подошло", + "params": ["количество минут до(-)/после(+) заката"] + }, + { + "name": "night", + "descr": "Вернет 1 если ночь (уже закат) и 0 если день (рассвет)", + "params": [] + } + ] }, - "defActive": false, + + "defActive": true, + "usedLibs": { "esp32_4mb": [], "esp32_4mb3f": [], "esp32s2_4mb": [], - "esp32_16mb": [] + "esp32_16mb": [], + "esp32s3_16mb": [], + "esp32c3m_4mb": [], + "esp8266_4mb": [], + "esp8266_16mb": [], + "esp8266_1mb": [], + "esp8266_1mb_ota": [], + "esp8285_1mb": [], + "esp8285_1mb_ota": [], + "esp8266_2mb": [], + "esp8266_2mb_ota": [] } -} \ No newline at end of file +} diff --git a/src/modules/virtual/owmWeather/owmWeather.cpp b/src/modules/virtual/owmWeather/owmWeather.cpp index 90699baf..6204db5c 100644 --- a/src/modules/virtual/owmWeather/owmWeather.cpp +++ b/src/modules/virtual/owmWeather/owmWeather.cpp @@ -22,9 +22,12 @@ private: String _lang = ""; bool _debug = false; DynamicJsonDocument Weatherdoc1; + unsigned long _sunsetTime = 0; + unsigned long _sunriseTime = 0; + uint32_t _tzone = 0; public: - owmWeather(String parameters) : Weatherdoc1(1024), IoTItem(parameters) + owmWeather(String parameters) : Weatherdoc1(1024), IoTItem(parameters) { _API_key = jsonReadStr(parameters, "API_key"); // _ID_sity = jsonReadStr(parameters, "ID_sity"); @@ -82,7 +85,8 @@ public: deserializeJson(Weatherdoc1, payload); // ret += payload; - SerialPrint("i", "Weatherdoc1", "memoryUsage: " + String(Weatherdoc1.memoryUsage())); + if (_debug) + SerialPrint("i", "Weatherdoc1", "memoryUsage: " + String(Weatherdoc1.memoryUsage())); } } else @@ -104,6 +108,11 @@ public: getWeather(); if (jsonReadStr(Weatherdoc1["main"], "temp", true) != "null") { + _tzone = Weatherdoc1["timezone"].as(); + _sunriseTime = std::atoll(jsonReadStr(Weatherdoc1["sys"], "sunrise", true).c_str()); + _sunriseTime = _sunriseTime + _tzone; + _sunsetTime = std::atoll(jsonReadStr(Weatherdoc1["sys"], "sunset", true).c_str()); + _sunsetTime = _sunsetTime + _tzone; publishNew("main", "temp"); publishNew("main", "pressure"); @@ -121,66 +130,152 @@ public: if (_param == "temp") { value.valS = jsonReadStr(Weatherdoc1["main"], "temp", true); + regEvent(value.valS, "owmWeather"); } else if (_param == "pressure") { - value.valS = jsonReadStr(Weatherdoc1["main"], "pressure", true); + // value.valS = jsonReadStr(Weatherdoc1["main"], "pressure", true); + int tval; + jsonRead(Weatherdoc1["main"], "pressure", tval, true); + regEvent(tval / 1.333, "owmWeather"); } else if (_param == "humidity") { value.valS = jsonReadStr(Weatherdoc1["main"], "humidity", true); + regEvent(value.valS, "owmWeather"); } else if (_param == "speed") { value.valS = jsonReadStr(Weatherdoc1["wind"], "speed", true); + regEvent(value.valS, "owmWeather"); } else if (_param == "deg") { value.valS = jsonReadStr(Weatherdoc1["wind"], "deg", true); + regEvent(value.valS, "owmWeather"); } else if (_param == "all") { value.valS = jsonReadStr(Weatherdoc1["clouds"], "all", true); + regEvent(value.valS, "owmWeather"); } else if (_param == "main") { value.valS = jsonReadStr(Weatherdoc1["weather"][0], "main", true); + regEvent(value.valS, "owmWeather"); } else if (_param == "description") { value.valS = jsonReadStr(Weatherdoc1["weather"][0], "description", true); + regEvent(value.valS, "owmWeather"); } else if (_param == "icon") { value.valS = jsonReadStr(Weatherdoc1["weather"][0], "icon", true); + regEvent(value.valS, "owmWeather"); } else if (_param == "sunrise") { - value.valS = getTimeDotFormatedFromUnix(std::atoll(jsonReadStr(Weatherdoc1["sys"], "sunrise", true).c_str())); + value.valS = getTimeDotFormatedFromUnix(_sunriseTime); + regEvent(value.valS, "owmWeather"); } else if (_param == "sunset") { - value.valS = getTimeDotFormatedFromUnix(std::atoll(jsonReadStr(Weatherdoc1["sys"], "sunset", true).c_str())); + value.valS = getTimeDotFormatedFromUnix(_sunsetTime); + regEvent(value.valS, "owmWeather"); } - else if (_param == "sunset") + else if (_param == "name") { value.valS = Weatherdoc1["name"].as(); + regEvent(value.valS, "owmWeather"); } // value.isDecimal = false; - regEvent(value.valS, "owmWeather"); + // regEvent(value.valS, "owmWeather"); } } IoTValue execute(String command, std::vector ¶m) { + IoTValue value = {}; if (command == "get") { // getWeather(); doByInterval(); } + else if (command == "night") + { + if (_sunsetTime == 0 || !isTimeSynch) + { + SerialPrint("i", ("AstroTimer"), "Not TimeSynch or Weather data server"); + value.valD = 0; + return value; + } + long dt_cur = getSystemTime() + _tzone; + // Если светло + if (dt_cur >= _sunriseTime && dt_cur < _sunsetTime) + value.valD = 0; + else // если темно + value.valD = 1; + if (_debug) + { + SerialPrint("i", ("AstroTimer"), "night: " + String(value.valD)); + } + } - return {}; + else if (command == "sunset") + { + if (_sunsetTime == 0 || !isTimeSynch) + { + SerialPrint("i", ("AstroTimer"), "Not TimeSynch or Weather data server"); + value.valD = 999; + return value; + } + long dt_cur = getSystemTime() + _tzone; + if (param.size()) + { + if (param[0].isDecimal) + { + long dt_set = (_sunsetTime + (int)(param[0].valD * 60)); + long dt = dt_set - dt_cur; + value.valD = dt / 60; + if (_debug) + { + SerialPrint("i", ("AstroTimer"), "set: " + getTimeDotFormatedFromUnix(dt_set) + " time: " + getTimeDotFormatedFromUnix(dt_cur) + " sunset: " + getTimeDotFormatedFromUnix(_sunsetTime) + " Dt: " + String(param[0].valD) + " diff: " + String(value.valD)); + } + } + } + } + else if (command == "sunrise") + { + if (_sunriseTime == 0 || !isTimeSynch) + { + SerialPrint("i", ("AstroTimer"), "Not TimeSynch or Weather data server"); + value.valD = 999; + return value; + } + long dt_cur = getSystemTime() + _tzone; + if (dt_cur >= _sunsetTime) + { + SerialPrint("i", ("AstroTimer"), "УЖЕ Закат, таймер не считаем time: " + getTimeDotFormatedFromUnix(dt_cur) + " diff: " + String(value.valD)); + value.valD = 999; + return value; + } + if (param.size()) + { + if (param[0].isDecimal) + { + long dt_set = (_sunriseTime + (int)(param[0].valD * 60)); + long dt = dt_set - dt_cur; + value.valD = dt / 60; + if (_debug) + { + SerialPrint("i", ("AstroTimer"), "set: " + getTimeDotFormatedFromUnix(dt_set) + " time: " + getTimeDotFormatedFromUnix(dt_cur) + " sunrise: " + getTimeDotFormatedFromUnix(_sunriseTime) + " Dt: " + String(param[0].valD) + " diff: " + String(value.valD)); + } + } + } + } + return value; } // проверяем если пришедшее значение отличается от предыдущего регистрируем событие @@ -230,14 +325,33 @@ public: { if (Weatherdoc1[root][param].as() != tmp->value.valS) { - tmp->setValue(getTimeDotFormatedFromUnix(std::atoll(jsonReadStr(Weatherdoc1[root], param, true).c_str())), true); + if (param == "sunrise") + { + tmp->setValue(getTimeDotFormatedFromUnix(_sunriseTime), true); + } + else if (param == "sunset") + { + tmp->setValue(getTimeDotFormatedFromUnix(_sunsetTime), true); + } + else + { + tmp->setValue(Weatherdoc1[root][param].as(), true); + } } } else { if (Weatherdoc1[root][param].as() != tmp->value.valS) { - tmp->setValue(Weatherdoc1[root][param].as(), true); + if (param == "pressure") + { + int tval = Weatherdoc1[root][param].as(); + tmp->setValue(String(tval / 1.333), true); + } + else + { + tmp->setValue(Weatherdoc1[root][param].as(), true); + } } } }