diff --git a/compilerProfile.json b/compilerProfile.json
index 0e4c8536..7c17d771 100644
--- a/compilerProfile.json
+++ b/compilerProfile.json
@@ -52,7 +52,7 @@
"firmware": "0x10000",
"partitions": "0x8000",
"littlefs": "0x310000"
- },
+ },
{
"name": "esp32cam_4mb",
"boot_app0": "0xe000",
@@ -154,6 +154,10 @@
}
],
"sensors": [
+ {
+ "path": "src/modules/exec/Pcf8591",
+ "active": false
+ },
{
"path": "src/modules/sensors/A02Distance",
"active": true
diff --git a/data_full/build/bundle.css.gz b/data_full/build/bundle.css.gz
index d7558d9b..29ab1fa8 100644
Binary files a/data_full/build/bundle.css.gz and b/data_full/build/bundle.css.gz differ
diff --git a/data_full/build/bundle.js.gz b/data_full/build/bundle.js.gz
index 63218540..24f6ab8b 100644
Binary files a/data_full/build/bundle.js.gz and b/data_full/build/bundle.js.gz differ
diff --git a/data_full/index.html b/data_full/index.html
index 4dc7d628..bbcd166f 100644
--- a/data_full/index.html
+++ b/data_full/index.html
@@ -4,12 +4,12 @@
-
IoT Manager 4.5.4
+ IoT Manager 4.5.5
-
+
-
+
diff --git a/data_svelte/build/bundle.css.gz b/data_svelte/build/bundle.css.gz
index d7558d9b..29ab1fa8 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 63218540..24f6ab8b 100644
Binary files a/data_svelte/build/bundle.js.gz and b/data_svelte/build/bundle.js.gz differ
diff --git a/data_svelte/flashProfile.json b/data_svelte/flashProfile.json
index bc38fdf5..825be6e6 100644
--- a/data_svelte/flashProfile.json
+++ b/data_svelte/flashProfile.json
@@ -48,6 +48,10 @@
}
],
"sensors": [
+ {
+ "path": "src/modules/exec/Pcf8591",
+ "active": false
+ },
{
"path": "src/modules/sensors/A02Distance",
"active": true
diff --git a/data_svelte/index.html b/data_svelte/index.html
index 4dc7d628..bbcd166f 100644
--- a/data_svelte/index.html
+++ b/data_svelte/index.html
@@ -4,12 +4,12 @@
- IoT Manager 4.5.4
+ IoT Manager 4.5.5
-
+
-
+
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 2865cd60..e7abc35d 100644
--- a/include/Const.h
+++ b/include/Const.h
@@ -2,7 +2,7 @@
#include "BuildTime.h"
// Версия прошивки
-#define FIRMWARE_VERSION 454
+#define FIRMWARE_VERSION 455
#ifdef esp8266_1mb_ota
#define FIRMWARE_NAME "esp8266_1mb_ota"
@@ -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 0e4c8536..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",
@@ -52,7 +52,7 @@
"firmware": "0x10000",
"partitions": "0x8000",
"littlefs": "0x310000"
- },
+ },
{
"name": "esp32cam_4mb",
"boot_app0": "0xe000",
@@ -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"
}
]
}
@@ -154,6 +170,10 @@
}
],
"sensors": [
+ {
+ "path": "src/modules/exec/Pcf8591",
+ "active": false
+ },
{
"path": "src/modules/sensors/A02Distance",
"active": true
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/exec/Pcf8591/Pcf8591.cpp b/src/modules/exec/Pcf8591/Pcf8591.cpp
new file mode 100644
index 00000000..ff7d45bc
--- /dev/null
+++ b/src/modules/exec/Pcf8591/Pcf8591.cpp
@@ -0,0 +1,71 @@
+#include "Global.h"
+#include "classes/IoTItem.h"
+
+#include "Wire.h"
+#include
+
+// Make sure that this is set to the value in volts of VCC
+#define ADC_REFERENCE_VOLTAGE 3.3
+
+class Pcf8591 : public IoTItem {
+ int _pin;
+ bool _isRaw;
+ bool _isInited = false;
+ Adafruit_PCF8591 pcf = Adafruit_PCF8591();
+
+ public:
+ Pcf8591(String parameters) : IoTItem(parameters) {
+ String tmp;
+ jsonRead(parameters, "pin", tmp);
+ _pin = tmp.toInt();
+
+ jsonRead(parameters, "mode", tmp);
+ _isRaw = tmp == "raw";
+
+ if (!pcf.begin()) {
+ Serial.println("# Adafruit PCF8591 not found!");
+ _isInited = false;
+ } else
+
+ _isInited = true;
+
+ Serial.println("# Adafruit PCF8591 found");
+
+ pcf.enableDAC(true);
+
+ Serial.println("AIN0, AIN1, AIN2, AIN3");
+
+ }
+
+ uint8_t dac_counter = 0;
+
+ void doByInterval() {
+
+ // Make a triangle wave on the DAC output
+ pcf.analogWrite(dac_counter++);
+
+ if (_isInited) {
+ if (_isRaw)
+ value.valD = pcf.analogRead(_pin); // Чтение АЦП нулевого канала (Вольты)
+ else
+ value.valD = (int_to_volts(pcf.analogRead(_pin), 8, ADC_REFERENCE_VOLTAGE));
+ regEvent(value.valD, "PCF8591");
+ }
+
+}
+
+ float int_to_volts(uint16_t dac_value, uint8_t bits, float logic_level) {
+ return (((float)dac_value / ((1 << bits) - 1)) * logic_level);
+
+ }
+
+ ~Pcf8591(){};
+};
+
+void *getAPI_Pcf8591(String subtype, String param) {
+ if (subtype == F("Pcf8591")) {
+ return new Pcf8591(param);
+ } else {
+ return nullptr;
+ }
+}
diff --git a/src/modules/exec/Pcf8591/modinfo.json b/src/modules/exec/Pcf8591/modinfo.json
new file mode 100644
index 00000000..c3bef508
--- /dev/null
+++ b/src/modules/exec/Pcf8591/modinfo.json
@@ -0,0 +1,75 @@
+{
+ "menuSection": "sensors",
+ "configItem": [
+ {
+ "global": 0,
+ "name": "Расширитель портов PCF8591",
+ "type": "Reading",
+ "subtype": "Pcf8591",
+ "id": "Pcf85",
+ "widget": "anydataVlt",
+ "page": "PCF8591",
+ "descr": "PCF_0",
+ "pin": "0",
+ "mode": "volt",
+ "map": "1,255,1,100",
+ "plus": 0,
+ "multiply": 1,
+ "round": 2,
+ "int": 7
+ }
+ ],
+ "about": {
+ "authorName": "Serghei Crasnicov",
+ "authorContact": "https://t.me/Serghei63",
+ "authorGit": "https://github.com/Serghei63",
+ "specialThanks": "",
+ "moduleName": "Pcf8591",
+ "moduleVersion": "1.0",
+ "usedRam": {
+ "esp32_4mb": 15,
+ "esp8266_4mb": 15
+ },
+ "title": "Расширитель 4-х аналоговых портов PCF8591",
+ "moduleDesc": "Позволяет получить относительную величину напряжения на понижающем трансформаторе.",
+ "propInfo": {
+ "pin": "Номер AN, к которому подключен датчик. Допускается 0, 1, 2, 3",
+ "mode": "Режим работы. volt - вывод в вольтах , raw - значения от 0 до 255",
+ "int": "Количество секунд между опросами датчика."
+ }
+ },
+ "defActive": false,
+ "usedLibs": {
+
+ "esp32_4mb": [
+ "https://github.com/adafruit/Adafruit_PCF8591"
+ ],
+ "esp32_16mb": [
+ "https://github.com/adafruit/Adafruit_PCF8591"
+ ],
+ "esp8266_4mb": [
+ "https://github.com/adafruit/Adafruit_PCF8591"
+ ],
+ "esp8266_16mb": [
+ "https://github.com/adafruit/Adafruit_PCF8591"
+ ],
+ "esp8266_1mb": [
+ "https://github.com/adafruit/Adafruit_PCF8591"
+ ],
+ "esp8266_1mb_ota": [
+ "https://github.com/adafruit/Adafruit_PCF8591"
+ ],
+ "esp8285_1mb": [
+ "https://github.com/adafruit/Adafruit_PCF8591"
+ ],
+ "esp8285_1mb_ota": [
+ "https://github.com/adafruit/Adafruit_PCF8591"
+ ],
+ "esp8266_2mb": [
+ "https://github.com/adafruit/Adafruit_PCF8591"
+ ],
+ "esp8266_2mb_ota": [
+ "https://github.com/adafruit/Adafruit_PCF8591"
+ ]
+ }
+}
\ No newline at end of file
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/VariableColor.cpp b/src/modules/virtual/VariableColor/VariableColor.cpp
deleted file mode 100644
index 12e0ff34..00000000
--- a/src/modules/virtual/VariableColor/VariableColor.cpp
+++ /dev/null
@@ -1,46 +0,0 @@
-#include "Global.h"
-#include "classes/IoTItem.h"
-
-// дочь - родитель
-class VariableColor : public IoTItem
-{
-private:
-public:
- VariableColor(String parameters) : IoTItem(parameters)
- {
- }
-
- void doByInterval()
- {
- }
-
- // событие когда пользователь подключается приложением или веб интерфейсом к усройству
- void onMqttWsAppConnectEvent()
- {
- SerialPrint("i", "Connecting", "Dashbord open ");
- regEvent(value.valS, "VariableColor", false, true);
- }
-
- IoTValue execute(String command, std::vector ¶m)
- {
- if (command == "widget" && param.size() == 2)
- {
- String json = "{}";
- jsonWriteStr(json, param[0].valS, param[1].valS);
- sendSubWidgetsValues(_id, json);
- }
- return {};
- }
-};
-
-void *getAPI_VariableColor(String subtype, String param)
-{
- if (subtype == F("VariableColor"))
- {
- return new VariableColor(param);
- }
- else
- {
- return nullptr;
- }
-}
diff --git a/src/modules/virtual/VariableColor/modinfo.json b/src/modules/virtual/VariableColor/modinfo.json
deleted file mode 100644
index d3aa7769..00000000
--- a/src/modules/virtual/VariableColor/modinfo.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{
- "menuSection": "virtual_elments",
- "configItem": [
- {
- "global": 0,
- "name": "Цветной текст",
- "type": "Reading",
- "subtype": "VariableColor",
- "id": "color",
- "needSave": 0,
- "widget": "anydataDef",
- "page": "Вывод",
- "descr": "Цветной текст",
- "val": "...",
- "round": 0
- }
- ],
- "about": {
- "authorName": "AVAKS",
- "authorContact": "https://t.me/@avaks_dev",
- "authorGit": "https://github.com/avaksru",
- "specialThanks": "",
- "moduleName": "VariableColor",
- "moduleVersion": "1",
- "usedRam": {
- "esp32_4mb": 15,
- "esp8266_4mb": 15
- },
- "title": "Цветной текст",
- "moduleDesc": "Текст с возможностью динамического изменения цвета",
- "propInfo": {
- "val": "Значение при старте"
- }
- },
- "defActive": true,
- "usedLibs": {
- "esp32_4mb": [],
- "esp32_4mb3f": [],
- "esp32cam_4mb": [],
- "esp32_16mb": [],
- "esp32s2_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/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);
+ }
}
}
}