diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index 0876e574b..74dd90159 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -22,6 +22,11 @@ - mixer MM100 telegram 0x2CC [#1554](https://github.com/emsesp/EMS-ESP32/issues/1554) - boiler hpSetDiffPressure [#1563](https://github.com/emsesp/EMS-ESP32/issues/1563) - custom variables [#1423](https://github.com/emsesp/EMS-ESP32/issues/1423) +- thermostat second dhw circuit [#1634](https://github.com/emsesp/EMS-ESP32/issues/1634) +- heatpump dhw energy meter [#1609](https://github.com/emsesp/EMS-ESP32/issues/1609) +- remote thermostat emulation for RC100H, RC200 and FB10 [#1287](https://github.com/emsesp/EMS-ESP32/discussions/1287), [#1602](https://github.com/emsesp/EMS-ESP32/discussions/1602), [#1551](https://github.com/emsesp/EMS-ESP32/discussions/1551) +- env and partitions for DevKitC-1-N32R8 [#1635](https://github.com/emsesp/EMS-ESP32/discussions/1635) +- heatpump dhw stop temperatures [#1624](https://github.com/emsesp/EMS-ESP32/issues/1624) ## Fixed @@ -35,6 +40,8 @@ - Wifi Tx Power not adjusted [#1614](https://github.com/emsesp/EMS-ESP32/issues/1614) - MQTT discovery of custom entity doesn't consider type of data [#1587](https://github.com/emsesp/EMS-ESP32/issues/1587) - WiFi TxPower wasn't correctly used. Added an 'Auto' setting, which is the default. +- MQTT heap check [#622](https://github.com/emsesp/EMS-ESP32/issues/1622) +- Slovak language fix [#1636](https://github.com/emsesp/EMS-ESP32/discussions/1636) ## Changed @@ -45,3 +52,4 @@ - Length of mqtt Broker adress [#1619](https://github.com/emsesp/EMS-ESP32/issues/1619) - C++ optimizations - see - Send MQTT heartbeat immediately after connection [#1628](https://github.com/emsesp/EMS-ESP32/issues/1628) +- 16MB partitions with second nvs, larger FS, Coredump diff --git a/esp32_partition_16M.csv b/esp32_partition_16M.csv index 413266921..4068ffaf1 100644 --- a/esp32_partition_16M.csv +++ b/esp32_partition_16M.csv @@ -1,6 +1,8 @@ # Name, Type, SubType, Offset, Size, Flags -nvs, data, nvs, 0x9000, 0x035000, +nvs, data, nvs, 0x9000, 0x005000, otadata, data, ota, , 0x002000, -app0, app, ota_0, , 0x6E0000, -app1, app, ota_1, , 0x6E0000, -spiffs, data, spiffs, , 0x200000, \ No newline at end of file +app0, app, ota_0, , 0x5D0000, +app1, app, ota_1, , 0x5D0000, +nvs1, data, nvs, , 0x040000, +spiffs, data, spiffs, , 0x400000, +coredump, data, coredump,, 0x010000, \ No newline at end of file diff --git a/esp32_partition_32M.csv b/esp32_partition_32M.csv new file mode 100644 index 000000000..25411fc99 --- /dev/null +++ b/esp32_partition_32M.csv @@ -0,0 +1,8 @@ +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 0x005000, +otadata, data, ota, , 0x002000, +app0, app, ota_0, , 0xDD0000, +app1, app, ota_1, , 0xDD0000, +nvs1, data, nvs, , 0x040000, +spiffs, data, spiffs, , 0x400000, +coredump, data, coredump,, 0x010000, \ No newline at end of file diff --git a/interface/package.json b/interface/package.json index 5f8471407..f3942614e 100644 --- a/interface/package.json +++ b/interface/package.json @@ -26,13 +26,13 @@ "@babel/core": "^7.23.9", "@emotion/react": "^11.11.3", "@emotion/styled": "^11.11.0", - "@mui/icons-material": "^5.15.10", - "@mui/material": "^5.15.10", + "@mui/icons-material": "^5.15.11", + "@mui/material": "^5.15.11", "@table-library/react-table-library": "4.1.7", "@types/imagemin": "^8.0.5", "@types/lodash-es": "^4.17.12", "@types/node": "^20.11.20", - "@types/react": "^18.2.57", + "@types/react": "^18.2.58", "@types/react-dom": "^18.2.19", "@types/react-router-dom": "^5.3.3", "alova": "^2.17.0", @@ -57,7 +57,7 @@ "@typescript-eslint/eslint-plugin": "^7.0.2", "@typescript-eslint/parser": "^7.0.2", "concurrently": "^8.2.2", - "eslint": "^8.56.0", + "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-import-resolver-typescript": "^3.6.1", "eslint-plugin-autofix": "^1.1.0", @@ -69,7 +69,7 @@ "preact": "^10.19.6", "prettier": "^3.2.5", "rollup-plugin-visualizer": "^5.12.0", - "terser": "^5.27.2", + "terser": "^5.28.1", "vite": "^5.1.4", "vite-plugin-imagemin": "^0.6.1", "vite-tsconfig-paths": "^4.3.1" diff --git a/interface/src/i18n/sk/index.ts b/interface/src/i18n/sk/index.ts index e6c405d59..10f62d995 100644 --- a/interface/src/i18n/sk/index.ts +++ b/interface/src/i18n/sk/index.ts @@ -95,13 +95,13 @@ const sk: Translation = { 'API volania', 'Syslog správy' ], - NUM_DEVICES: '{num} Zariadenia{{s}}', - NUM_TEMP_SENSORS: '{num} Teplotné snímače{{s}}', - NUM_ANALOG_SENSORS: '{num} Analógové snímače{{s}}', - NUM_DAYS: '{num} dní{{s}}', - NUM_SECONDS: '{num} sekúnd{{s}}', - NUM_HOURS: '{num} hodín{{s}}', - NUM_MINUTES: '{num} minút{{s}}', + NUM_DEVICES: '{num} Zariaden{{í|ie|ia|ia|í}}', + NUM_TEMP_SENSORS: '{num} Teplotn{{ých|ý|é|é|ých}} snímač{{ov||e|e|ov}}', + NUM_ANALOG_SENSORS: '{num} Analogov{ých|ý|é|é|ých}} snímač{{ov||e|e|ov}}', + NUM_DAYS: '{num} d{{ní|eň|ní|ní|ní}}', + NUM_SECONDS: '{num} sek{{únd|unda|undy|undy|únd}}', + NUM_HOURS: '{num} hod{{ín|ina|iny|iny|ín}}', + NUM_MINUTES: '{num} minú{{t|ta|ty|ty|t}}', APPLICATION_SETTINGS: 'Nastavenia aplikácie', CUSTOMIZATIONS: 'Prispôsobenia', APPLICATION_RESTARTING: 'EMS-ESP sa reštartuje', diff --git a/interface/yarn.lock b/interface/yarn.lock index 4a57a829b..22cc7bfc1 100644 --- a/interface/yarn.lock +++ b/interface/yarn.lock @@ -856,10 +856,10 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:8.56.0": - version: 8.56.0 - resolution: "@eslint/js@npm:8.56.0" - checksum: 10/97a4b5ccf7e24f4d205a1fb0f21cdcd610348ecf685f6798a48dd41ba443f2c1eedd3050ff5a0b8f30b8cf6501ab512aa9b76e531db15e59c9ebaa41f3162e37 +"@eslint/js@npm:8.57.0": + version: 8.57.0 + resolution: "@eslint/js@npm:8.57.0" + checksum: 10/3c501ce8a997cf6cbbaf4ed358af5492875e3550c19b9621413b82caa9ae5382c584b0efa79835639e6e0ddaa568caf3499318e5bdab68643ef4199dce5eb0a0 languageName: node linkType: hard @@ -901,14 +901,14 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.11.13": - version: 0.11.13 - resolution: "@humanwhocodes/config-array@npm:0.11.13" +"@humanwhocodes/config-array@npm:^0.11.14": + version: 0.11.14 + resolution: "@humanwhocodes/config-array@npm:0.11.14" dependencies: - "@humanwhocodes/object-schema": "npm:^2.0.1" - debug: "npm:^4.1.1" + "@humanwhocodes/object-schema": "npm:^2.0.2" + debug: "npm:^4.3.1" minimatch: "npm:^3.0.5" - checksum: 10/9f655e1df7efa5a86822cd149ca5cef57240bb8ffd728f0c07cc682cc0a15c6bdce68425fbfd58f9b3e8b16f79b3fd8cb1e96b10c434c9a76f20b2a89f213272 + checksum: 10/3ffb24ecdfab64014a230e127118d50a1a04d11080cbb748bc21629393d100850496456bbcb4e8c438957fe0934430d731042f1264d6a167b62d32fc2863580a languageName: node linkType: hard @@ -919,10 +919,10 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/object-schema@npm:^2.0.1": - version: 2.0.1 - resolution: "@humanwhocodes/object-schema@npm:2.0.1" - checksum: 10/dbddfd0465aecf92ed845ec30d06dba3f7bb2496d544b33b53dac7abc40370c0e46b8787b268d24a366730d5eeb5336ac88967232072a183905ee4abf7df4dab +"@humanwhocodes/object-schema@npm:^2.0.2": + version: 2.0.2 + resolution: "@humanwhocodes/object-schema@npm:2.0.2" + checksum: 10/ef915e3e2f34652f3d383b28a9a99cfea476fa991482370889ab14aac8ecd2b38d47cc21932526c6d949da0daf4a4a6bf629d30f41b0caca25e146819cbfa70e languageName: node linkType: hard @@ -992,14 +992,14 @@ __metadata: languageName: node linkType: hard -"@mui/base@npm:5.0.0-beta.36": - version: 5.0.0-beta.36 - resolution: "@mui/base@npm:5.0.0-beta.36" +"@mui/base@npm:5.0.0-beta.37": + version: 5.0.0-beta.37 + resolution: "@mui/base@npm:5.0.0-beta.37" dependencies: "@babel/runtime": "npm:^7.23.9" "@floating-ui/react-dom": "npm:^2.0.8" "@mui/types": "npm:^7.2.13" - "@mui/utils": "npm:^5.15.9" + "@mui/utils": "npm:^5.15.11" "@popperjs/core": "npm:^2.11.8" clsx: "npm:^2.1.0" prop-types: "npm:^15.8.1" @@ -1010,20 +1010,20 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10/32be203df3ffa2e36095d37295adae7870489fb2ed82a156c10f9ea4a51c3d06b0c3415e8503b110aa2ee98d3d86d6c1c50e190e85130aa1c1db694afa56ab7a + checksum: 10/28ac58e46ecf7d43fec77f501604e16687df499c82ace9cb32228623cf2549ebf2b74815aacae2920ccb2feed5402c68ad8c599b1bdc717fa5c4caaa408e9c0a languageName: node linkType: hard -"@mui/core-downloads-tracker@npm:^5.15.10": - version: 5.15.10 - resolution: "@mui/core-downloads-tracker@npm:5.15.10" - checksum: 10/aeb16b31f60c08cc03585fedadceadd54aa48dda394fb945ab885f884c1b1692efb72309465641b6ca2367bd53d5fdce15f189d4691f42b59206622ffb2d6f0f +"@mui/core-downloads-tracker@npm:^5.15.11": + version: 5.15.11 + resolution: "@mui/core-downloads-tracker@npm:5.15.11" + checksum: 10/7b6b9dc9fbe63e80cd0de85db73eb397031c8e60fbfc4fcd9d6c396f9222c1467bfb2bbe817973e6090576a0016fb0189b4a8ccee3e42210ace99efb5ace52d3 languageName: node linkType: hard -"@mui/icons-material@npm:^5.15.10": - version: 5.15.10 - resolution: "@mui/icons-material@npm:5.15.10" +"@mui/icons-material@npm:^5.15.11": + version: 5.15.11 + resolution: "@mui/icons-material@npm:5.15.11" dependencies: "@babel/runtime": "npm:^7.23.9" peerDependencies: @@ -1033,20 +1033,20 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10/ce22c02dc7ed960a21f8d5ea7c4d4fc03d9f71e8a26ced02f75da1ffd6c768e6fa0682a308a03be53bffc2325a5aaf68be69f9e192b0a57c6752f7548e5b9045 + checksum: 10/2b337aa7c39e8e75cffd92742aaf7e1a8196597b9e3285322cd3aa3dc7c7f0142ac00d768affaf3a8c7eeab7fd3535de70419a6a8b599fdfa00d65323b6982f8 languageName: node linkType: hard -"@mui/material@npm:^5.15.10": - version: 5.15.10 - resolution: "@mui/material@npm:5.15.10" +"@mui/material@npm:^5.15.11": + version: 5.15.11 + resolution: "@mui/material@npm:5.15.11" dependencies: "@babel/runtime": "npm:^7.23.9" - "@mui/base": "npm:5.0.0-beta.36" - "@mui/core-downloads-tracker": "npm:^5.15.10" - "@mui/system": "npm:^5.15.9" + "@mui/base": "npm:5.0.0-beta.37" + "@mui/core-downloads-tracker": "npm:^5.15.11" + "@mui/system": "npm:^5.15.11" "@mui/types": "npm:^7.2.13" - "@mui/utils": "npm:^5.15.9" + "@mui/utils": "npm:^5.15.11" "@types/react-transition-group": "npm:^4.4.10" clsx: "npm:^2.1.0" csstype: "npm:^3.1.3" @@ -1066,16 +1066,16 @@ __metadata: optional: true "@types/react": optional: true - checksum: 10/a88ad1287a905549ed516742544c8ba32f0cd7e1b184564efc8ceba5f43060d37b5cd113db605f1bb5be6c74cbdad7321d3fd7df410ba33d55548cf7c5bbf8d0 + checksum: 10/1f95143a9704829179c504404449994cd4c5bcdb6ea536bd15a85113a92874c6ecdbd2cf18df46a2982d98c6855e2d1a9198ea53a059abb02a7411eaa1c630ec languageName: node linkType: hard -"@mui/private-theming@npm:^5.15.9": - version: 5.15.9 - resolution: "@mui/private-theming@npm:5.15.9" +"@mui/private-theming@npm:^5.15.11": + version: 5.15.11 + resolution: "@mui/private-theming@npm:5.15.11" dependencies: "@babel/runtime": "npm:^7.23.9" - "@mui/utils": "npm:^5.15.9" + "@mui/utils": "npm:^5.15.11" prop-types: "npm:^15.8.1" peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 @@ -1083,13 +1083,13 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10/ca6d0643289eb14e127d46a516311807a7935994dcbb14a108e756ba9fe39bf08e2fe2f2bd75cec5a71817f3b2fe74de2f3322b67931539ced5e2f13aa9e2326 + checksum: 10/ec185f586586bb1460cf93ebe82cf7bc0b62822d70e5836d95fa50e1525ce84c32b937ce005a32226bc9bab45c3763cb2865c503eac7c96bb98a58498b2d64f5 languageName: node linkType: hard -"@mui/styled-engine@npm:^5.15.9": - version: 5.15.9 - resolution: "@mui/styled-engine@npm:5.15.9" +"@mui/styled-engine@npm:^5.15.11": + version: 5.15.11 + resolution: "@mui/styled-engine@npm:5.15.11" dependencies: "@babel/runtime": "npm:^7.23.9" "@emotion/cache": "npm:^11.11.0" @@ -1104,19 +1104,19 @@ __metadata: optional: true "@emotion/styled": optional: true - checksum: 10/ddf0bda85507419829c8fe3735b5b05d9544fea0f954de574a9841d46d14dd750050834aae5b1f0b676a1dc5fe1278c22fb16415df7d6202d6aa49fea12d59de + checksum: 10/fedbb9891abd633e5072d30aae7405cec9e5e22ac63c9e117c49ddb66e86ec7baaed58f934efc7847ea86cc856a8c9a9ec5a08cd0072a7850184321a968704ad languageName: node linkType: hard -"@mui/system@npm:^5.15.9": - version: 5.15.9 - resolution: "@mui/system@npm:5.15.9" +"@mui/system@npm:^5.15.11": + version: 5.15.11 + resolution: "@mui/system@npm:5.15.11" dependencies: "@babel/runtime": "npm:^7.23.9" - "@mui/private-theming": "npm:^5.15.9" - "@mui/styled-engine": "npm:^5.15.9" + "@mui/private-theming": "npm:^5.15.11" + "@mui/styled-engine": "npm:^5.15.11" "@mui/types": "npm:^7.2.13" - "@mui/utils": "npm:^5.15.9" + "@mui/utils": "npm:^5.15.11" clsx: "npm:^2.1.0" csstype: "npm:^3.1.3" prop-types: "npm:^15.8.1" @@ -1132,7 +1132,7 @@ __metadata: optional: true "@types/react": optional: true - checksum: 10/85c2d18f3846cc1554db48071606a52f22186cf4ac1b0be748b275a8e200c12528c477acb794b8eb545e4603e5b8566186ea022eb09b5b1a3668554dd0ea9c7d + checksum: 10/004e64a558e6d75ab0036f65555459f0769b9ab8b50aecd583a9a41a0db5358168c3bd9f4146848dec4ececfedd6f5af11f519ba3f7bd2e28224f5487a1eef81 languageName: node linkType: hard @@ -1148,9 +1148,9 @@ __metadata: languageName: node linkType: hard -"@mui/utils@npm:^5.15.9": - version: 5.15.9 - resolution: "@mui/utils@npm:5.15.9" +"@mui/utils@npm:^5.15.11": + version: 5.15.11 + resolution: "@mui/utils@npm:5.15.11" dependencies: "@babel/runtime": "npm:^7.23.9" "@types/prop-types": "npm:^15.7.11" @@ -1162,7 +1162,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10/8628e4402856427bbc1ee3628afff596149ae3067ca6d62a1890d7b15217248fbeb65ec9360afc6963b330c08945fe6452deef2849d8ca35d894b42746cdad77 + checksum: 10/a3c3862a93eb646ddd212c19dee44bef4bee9232fc463a0b27ffc79b0e41a6c4b09b152953156c7ca458b1856dddd0cc4febc078e2151574e3df62868504fb59 languageName: node linkType: hard @@ -1670,14 +1670,14 @@ __metadata: languageName: node linkType: hard -"@types/react@npm:^18.2.57": - version: 18.2.57 - resolution: "@types/react@npm:18.2.57" +"@types/react@npm:^18.2.58": + version: 18.2.58 + resolution: "@types/react@npm:18.2.58" dependencies: "@types/prop-types": "npm:*" "@types/scheduler": "npm:*" csstype: "npm:^3.0.2" - checksum: 10/beee45a8ee48862fb5101f6ebdd89ccc20c5a6df29dcd2315560bc3b57ea3af8d09a8e9bb1c58063a70f9010e0d2c7bd300819438e2ca62810285c3d7275ab5a + checksum: 10/ec5e1a7d8acc55551efec7a3d63441d24c7e94b66bf8039944541a8408048668e51b7b4b0b6e8303cdea271b7c6da242cdc7bb8ca501eedf822956edbdbfc67e languageName: node linkType: hard @@ -1851,15 +1851,15 @@ __metadata: "@babel/core": "npm:^7.23.9" "@emotion/react": "npm:^11.11.3" "@emotion/styled": "npm:^11.11.0" - "@mui/icons-material": "npm:^5.15.10" - "@mui/material": "npm:^5.15.10" + "@mui/icons-material": "npm:^5.15.11" + "@mui/material": "npm:^5.15.11" "@preact/compat": "npm:^17.1.2" "@preact/preset-vite": "npm:^2.8.1" "@table-library/react-table-library": "npm:4.1.7" "@types/imagemin": "npm:^8.0.5" "@types/lodash-es": "npm:^4.17.12" "@types/node": "npm:^20.11.20" - "@types/react": "npm:^18.2.57" + "@types/react": "npm:^18.2.58" "@types/react-dom": "npm:^18.2.19" "@types/react-router-dom": "npm:^5.3.3" "@typescript-eslint/eslint-plugin": "npm:^7.0.2" @@ -1867,7 +1867,7 @@ __metadata: alova: "npm:^2.17.0" async-validator: "npm:^4.2.5" concurrently: "npm:^8.2.2" - eslint: "npm:^8.56.0" + eslint: "npm:^8.57.0" eslint-config-prettier: "npm:^9.1.0" eslint-import-resolver-typescript: "npm:^3.6.1" eslint-plugin-autofix: "npm:^1.1.0" @@ -1890,7 +1890,7 @@ __metadata: react-toastify: "npm:^10.0.4" rollup-plugin-visualizer: "npm:^5.12.0" sockette: "npm:^2.0.6" - terser: "npm:^5.27.2" + terser: "npm:^5.28.1" typesafe-i18n: "npm:^5.26.2" typescript: "npm:^5.3.3" vite: "npm:^5.1.4" @@ -3979,15 +3979,15 @@ __metadata: languageName: node linkType: hard -"eslint@npm:^8.56.0": - version: 8.56.0 - resolution: "eslint@npm:8.56.0" +"eslint@npm:^8.57.0": + version: 8.57.0 + resolution: "eslint@npm:8.57.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" "@eslint-community/regexpp": "npm:^4.6.1" "@eslint/eslintrc": "npm:^2.1.4" - "@eslint/js": "npm:8.56.0" - "@humanwhocodes/config-array": "npm:^0.11.13" + "@eslint/js": "npm:8.57.0" + "@humanwhocodes/config-array": "npm:^0.11.14" "@humanwhocodes/module-importer": "npm:^1.0.1" "@nodelib/fs.walk": "npm:^1.2.8" "@ungap/structured-clone": "npm:^1.2.0" @@ -4023,7 +4023,7 @@ __metadata: text-table: "npm:^0.2.0" bin: eslint: bin/eslint.js - checksum: 10/ef6193c6e4cef20774b985a5cc2fd4bf6d3c4decd423117cbc4a0196617861745db291217ad3c537bc3a160650cca965bc818f55e1f3e446af1fcb293f9940a5 + checksum: 10/00496e218b23747a7a9817bf58b522276d0dc1f2e546dceb4eea49f9871574088f72f1f069a6b560ef537efa3a75261b8ef70e51ef19033da1cc4c86a755ef15 languageName: node linkType: hard @@ -8312,9 +8312,9 @@ __metadata: languageName: node linkType: hard -"terser@npm:^5.27.2": - version: 5.27.2 - resolution: "terser@npm:5.27.2" +"terser@npm:^5.28.1": + version: 5.28.1 + resolution: "terser@npm:5.28.1" dependencies: "@jridgewell/source-map": "npm:^0.3.3" acorn: "npm:^8.8.2" @@ -8322,7 +8322,7 @@ __metadata: source-map-support: "npm:~0.5.20" bin: terser: bin/terser - checksum: 10/589f1112d6cd7653f6e2d4a38970e97a160de01cddb214dc924aa330c22b8c3635067a47db1233e060e613e380b979ca336c3211b17507ea13b0adff10ecbd40 + checksum: 10/922159f036a89a7d01b8b67e0eacb4425c20cf19067d2e82c1523153ed3bf66c36b945fd16c610b7ea41fedb867b189d2a350415fb566f4668a1701ab768728e languageName: node linkType: hard diff --git a/lib/AsyncTCP/src/AsyncTCP.cpp b/lib/AsyncTCP/src/AsyncTCP.cpp index f3b06870b..75b3ca5c7 100644 --- a/lib/AsyncTCP/src/AsyncTCP.cpp +++ b/lib/AsyncTCP/src/AsyncTCP.cpp @@ -248,7 +248,13 @@ static bool _start_async_task() { return false; } if (!_async_service_task_handle) { - customTaskCreateUniversal(_async_service_task, "async_tcp", CONFIG_ASYNC_TCP_STACK_SIZE, NULL, CONFIG_ASYNC_TCP_TASK_PRIORITY, &_async_service_task_handle, CONFIG_ASYNC_TCP_RUNNING_CORE); + customTaskCreateUniversal(_async_service_task, + "async_tcp", + CONFIG_ASYNC_TCP_STACK_SIZE, + NULL, + CONFIG_ASYNC_TCP_TASK_PRIORITY, + &_async_service_task_handle, + CONFIG_ASYNC_TCP_RUNNING_CORE); if (!_async_service_task_handle) { return false; } diff --git a/lib/AsyncTCP/src/AsyncTCP.h b/lib/AsyncTCP/src/AsyncTCP.h index e361a520c..ec21f6fd2 100644 --- a/lib/AsyncTCP/src/AsyncTCP.h +++ b/lib/AsyncTCP/src/AsyncTCP.h @@ -53,13 +53,15 @@ extern "C" { #define CONFIG_ASYNC_TCP_TASK_PRIORITY 5 #endif +// stack usage measured: ESP32: ~2.3K, ESP32S3: ~3.5k #ifndef CONFIG_ASYNC_TCP_STACK_SIZE #define CONFIG_ASYNC_TCP_STACK_SIZE 5120 #endif +// maybe enlarge queue to 64 or 128 see https://github.com/emsesp/EMS-ESP32/issues/177 #ifndef CONFIG_ASYNC_TCP_QUEUE -#define CONFIG_ASYNC_TCP_QUEUE 128 +#define CONFIG_ASYNC_TCP_QUEUE 32 #endif class AsyncClient; diff --git a/platformio.ini b/platformio.ini index 55c236899..b8b634186 100644 --- a/platformio.ini +++ b/platformio.ini @@ -33,7 +33,7 @@ build_flags = -D ARDUINOTRACE_ENABLE=0 -D CONFIG_ETH_ENABLED -D CONFIG_UART_ISR_IN_IRAM - -D CONFIG_ASYNC_TCP_STACK_SIZE=8192 + -D CONFIG_ASYNC_TCP_STACK_SIZE=5120 unbuild_flags = ${common.core_unbuild_flags} @@ -97,6 +97,20 @@ build_flags = ${espressi32_base.build_flags} '-DEMSESP_DEFAULT_BOARD_PROFILE="S32S3"' +[env:ci_s3_32M] +extends = espressi32_base +extra_scripts = scripts/rename_fw.py +board = lolin_s3 +board_build.f_cpu = 240000000L +board_upload.flash_size = 32MB +board_build.partitions = esp32_partition_32M.csv +board_build.flash_mode = opi +board_build.arduino.memory_type: opi_opi +build_unflags = ${common.unbuild_flags} +build_flags = + ${espressi32_base.build_flags} + '-DEMSESP_DEFAULT_BOARD_PROFILE="S32S3"' + [env:esp32_4M] extends = espressi32_base_tasmota board = esp32dev diff --git a/src/analogsensor.cpp b/src/analogsensor.cpp index 5c38da043..d5a81a37f 100644 --- a/src/analogsensor.cpp +++ b/src/analogsensor.cpp @@ -660,10 +660,9 @@ bool AnalogSensor::get_value_info(JsonObject output, const char * cmd, const int // this is for a specific sensor // make a copy of the string command for parsing, and lowercase it - char sensor_name[30] = {'\0'}; + char sensor_name[COMMAND_MAX_LENGTH] = {'\0'}; char * attribute_s = nullptr; - strlcpy(sensor_name, cmd, sizeof(sensor_name)); - auto sensor_lowercase = Helpers::toLower(sensor_name); + strlcpy(sensor_name, Helpers::toLower(cmd).c_str(), sizeof(sensor_name)); // check specific attribute to fetch instead of the complete record char * breakp = strchr(sensor_name, '/'); @@ -673,7 +672,7 @@ bool AnalogSensor::get_value_info(JsonObject output, const char * cmd, const int } for (const auto & sensor : sensors_) { - if (sensor_lowercase == Helpers::toLower(sensor.name().c_str()) || Helpers::atoint(sensor_name) == sensor.gpio()) { + if (sensor_name == Helpers::toLower(sensor.name()) || Helpers::atoint(sensor_name) == sensor.gpio()) { // add the details addSensorJson(output, sensor); diff --git a/src/command.cpp b/src/command.cpp index 9b5037060..9ee5d5031 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -88,12 +88,12 @@ uint8_t Command::process(const char * path, const bool is_admin, const JsonObjec command_p = p.paths()[1].c_str(); } else if (num_paths == 3) { // concatenate the path into one string as it could be in the format 'hc/XXX' - char command[50]; + char command[COMMAND_MAX_LENGTH]; snprintf(command, sizeof(command), "%s/%s", p.paths()[1].c_str(), p.paths()[2].c_str()); command_p = command; } else if (num_paths > 3) { // concatenate the path into one string as it could be in the format 'hc/XXX/attribute' - char command[50]; + char command[COMMAND_MAX_LENGTH]; snprintf(command, sizeof(command), "%s/%s/%s", p.paths()[1].c_str(), p.paths()[2].c_str(), p.paths()[3].c_str()); command_p = command; } else { @@ -151,7 +151,7 @@ uint8_t Command::process(const char * path, const bool is_admin, const JsonObjec if (strlen(d)) { char * device_end = (char *)strchr(d, '/'); if (device_end != nullptr) { - char device_s[15] = {'\0'}; + char device_s[20] = {'\0'}; const char * device_p = device_s; const char * data_p = nullptr; strlcpy(device_s, d, device_end - d + 1); @@ -161,7 +161,7 @@ uint8_t Command::process(const char * path, const bool is_admin, const JsonObjec if (data_p == nullptr) { return CommandRet::INVALID; } - char data_s[40]; + char data_s[COMMAND_MAX_LENGTH]; strlcpy(data_s, Helpers::toLower(data_p).c_str(), 30); if (strstr(data_s, "/value") == nullptr) { strcat(data_s, "/value"); diff --git a/src/command.h b/src/command.h index 79539ec29..f12ff15f4 100644 --- a/src/command.h +++ b/src/command.h @@ -27,6 +27,8 @@ using uuid::console::Shell; namespace emsesp { +#define COMMAND_MAX_LENGTH 50 + // mqtt flags for command subscriptions enum CommandFlag : uint8_t { MQTT_SUB_FLAG_DEFAULT = 0, // 0 no flags set, always subscribe to MQTT diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index 54c7fa571..2d9d54519 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -836,6 +836,24 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const MAKE_CF_CB(set_wwEcoPlusDiffTemp), 6, 12); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, + &wwComfStopTemp_, + DeviceValueType::UINT, + FL_(wwComfStopTemp), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_wwComfStopTemp)); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, + &wwEcoStopTemp_, + DeviceValueType::UINT, + FL_(wwEcoStopTemp), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_wwEcoStopTemp)); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, + &wwEcoPlusStopTemp_, + DeviceValueType::UINT, + FL_(wwEcoPlusStopTemp), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_wwEcoPlusStopTemp)); register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &hpCircPumpWw_, DeviceValueType::BOOL, @@ -1940,6 +1958,10 @@ void Boiler::process_HpDhwSettings(std::shared_ptr telegram) { has_update(telegram, wwComfDiffTemp_, 12); has_update(telegram, wwEcoDiffTemp_, 13); has_update(telegram, wwEcoPlusDiffTemp_, 14); + //https://github.com/emsesp/EMS-ESP32/issues/1624 + has_update(telegram, wwComfStopTemp_, 8); + has_update(telegram, wwEcoStopTemp_, 9); + has_update(telegram, wwEcoPlusStopTemp_, 10); } // 0x49C: @@ -2952,6 +2974,7 @@ bool Boiler::set_tempDiff(const char * value, const int8_t id) { return false; } +// also used for stopTemp with different index bool Boiler::set_wwOffTemp(const char * value, const int8_t id) { int v; if (Helpers::value2temperature(value, v)) { diff --git a/src/devices/boiler.h b/src/devices/boiler.h index 854b10fe2..c047f1231 100644 --- a/src/devices/boiler.h +++ b/src/devices/boiler.h @@ -269,6 +269,9 @@ class Boiler : public EMSdevice { uint8_t wwComfDiffTemp_; uint8_t wwEcoDiffTemp_; uint8_t wwEcoPlusDiffTemp_; + uint8_t wwComfStopTemp_; + uint8_t wwEcoStopTemp_; + uint8_t wwEcoPlusStopTemp_; uint8_t vp_cooling_; uint8_t heatCable_; @@ -489,6 +492,15 @@ class Boiler : public EMSdevice { inline bool set_wwEcoPlusDiffTemp(const char * value, const int8_t id) { return set_wwDiffTemp(value, 14); } + inline bool set_wwComfStopTemp(const char * value, const int8_t id) { + return set_wwOffTemp(value, 8); + } + inline bool set_wwEcoStopTemp(const char * value, const int8_t id) { + return set_wwOffTemp(value, 9); + } + inline bool set_wwEcoPlusStopTemp(const char * value, const int8_t id) { + return set_wwOffTemp(value, 10); + } bool set_vp_cooling(const char * value, const int8_t id); bool set_heatCable(const char * value, const int8_t id); bool set_VC0valve(const char * value, const int8_t id); diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index a6f174db8..aa6c52eca 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -164,6 +164,7 @@ Thermostat::Thermostat(uint8_t device_type, uint8_t device_id, uint8_t product_i register_telegram_type(hpmode_typeids[i], "HPMode", true, MAKE_PF_CB(process_HPMode)); } register_telegram_type(0x2F5, "RC300WWmode", true, MAKE_PF_CB(process_RC300WWmode)); + register_telegram_type(0x2F6, "RC300WW2mode", true, MAKE_PF_CB(process_RC300WW2mode)); register_telegram_type(0x31B, "RC300WWtemp", true, MAKE_PF_CB(process_RC300WWtemp)); register_telegram_type(0x31D, "RC300WWmode2", false, MAKE_PF_CB(process_RC300WWmode2)); register_telegram_type(0x31E, "RC300WWmode2", false, MAKE_PF_CB(process_RC300WWmode2)); @@ -1198,6 +1199,30 @@ void Thermostat::process_RC300WWmode(std::shared_ptr telegram) { has_update(telegram, wwDailyHeatTime_, 9); // value in steps of 15 min } +// type 02F6 +// RC300WWmode(0x2F6), data: 02 FF 04 00 00 00 08 05 00 08 04 00 00 00 00 00 00 00 00 00 01 +void Thermostat::process_RC300WW2mode(std::shared_ptr telegram) { + has_update(telegram, wwCircPump2_, 1); // FF=off, 0=on ? + + if (model() == EMSdevice::EMS_DEVICE_FLAG_BC400) { + const uint8_t modes[] = {0, 5, 1, 2, 4}; // off, eco+, eco, comfort, auto + uint8_t wwmode = wwMode_ < sizeof(modes) ? modes[wwMode2_] : EMS_VALUE_UINT_NOTSET; + telegram->read_value(wwmode, 2); + const uint8_t modes1[] = {0, 2, 3, 0, 4, 1}; + has_update(wwMode2_, wwmode < sizeof(modes1) ? modes1[wwmode] : EMS_VALUE_UINT_NOTSET); + } else { + has_update(telegram, wwMode2_, 2); // 0=off, 1=low, 2=high, 3=auto, 4=own prog + } + has_update(telegram, wwCircMode2_, 3); // 0=off, 1=on, 2=auto, 4=own? + has_update(telegram, wwChargeDuration2_, 10); // value in steps of 15 min + has_update(telegram, wwCharge2_, 11); // bool 0xFF on + has_update(telegram, wwDisinfecting2_, 5); // 0-off, 0xFF on + has_update(telegram, wwDisinfectHour2_, 6); // value in steps of 15 min + has_update(telegram, wwDisinfectDay2_, 7); // 0-6 Day of week, 7 every day + has_update(telegram, wwDailyHeating2_, 8); // 0-off, 0xFF on + has_update(telegram, wwDailyHeatTime2_, 9); // value in steps of 15 min +} + // types 0x31D and 0x31E // RC300WWmode2(0x31D), data: 00 00 09 07 void Thermostat::process_RC300WWmode2(std::shared_ptr telegram) { @@ -1991,6 +2016,7 @@ bool Thermostat::set_roomsensor(const char * value, const int8_t id) { // sets the thermostat ww working mode, where mode is a string, ems and ems+ bool Thermostat::set_wwmode(const char * value, const int8_t id) { + uint8_t wwc = (id == DeviceValueTAG::TAG_WWC2 - DeviceValueTAG::TAG_HC1 + 1) ? 1 : 0; uint8_t set; if (model() == EMSdevice::EMS_DEVICE_FLAG_RC10) { @@ -2003,12 +2029,12 @@ bool Thermostat::set_wwmode(const char * value, const int8_t id) { return false; } const uint8_t modes[] = {0, 5, 1, 2, 4}; - write_command(0x02F5, 2, modes[set], 0x02F5); + write_command(0x02F5 + wwc, 2, modes[set], 0x02F5 + wwc); } else if ((model() == EMSdevice::EMS_DEVICE_FLAG_RC300) || (model() == EMSdevice::EMS_DEVICE_FLAG_RC100)) { if (!Helpers::value2enum(value, set, FL_(enum_wwMode))) { return false; } - write_command(0x02F5, 2, set, 0x02F5); + write_command(0x02F5 + wwc, 2, set, 0x02F5 + wwc); } else if (model() == EMSdevice::EMS_DEVICE_FLAG_RC30) { if (!Helpers::value2enum(value, set, FL_(enum_wwMode3))) { return false; @@ -2062,7 +2088,8 @@ bool Thermostat::set_wwtemplow(const char * value, const int8_t id) { // Set ww charge RC300, ems+ bool Thermostat::set_wwcharge(const char * value, const int8_t id) { - bool b; + uint8_t wwc = (id == DeviceValueTAG::TAG_WWC2 - DeviceValueTAG::TAG_HC1 + 1) ? 1 : 0; + bool b; if (!Helpers::value2bool(value, b)) { return false; } @@ -2070,7 +2097,7 @@ bool Thermostat::set_wwcharge(const char * value, const int8_t id) { if ((model() == EMSdevice::EMS_DEVICE_FLAG_JUNKERS)) { write_command(0x0115, 0, b ? 0xFF : 0x00, 0x01D3); } else { - write_command(0x02F5, 11, b ? 0xFF : 0x00, 0x02F5); + write_command(0x02F5 + wwc, 11, b ? 0xFF : 0x00, 0x02F5 + wwc); } return true; @@ -2078,13 +2105,14 @@ bool Thermostat::set_wwcharge(const char * value, const int8_t id) { // Set ww charge duration in steps of 15 min, ems+ bool Thermostat::set_wwchargeduration(const char * value, const int8_t id) { - int t; + uint8_t wwc = (id == DeviceValueTAG::TAG_WWC2 - DeviceValueTAG::TAG_HC1 + 1) ? 1 : 0; + int t; if (!Helpers::value2number(value, t)) { return false; } t = (t + 8) / 15; - write_command(0x2F5, 10, t, 0x02F5); + write_command(0x2F5 + wwc, 10, t, 0x02F5 + wwc); return true; } @@ -2126,13 +2154,14 @@ bool Thermostat::set_cooling(const char * value, const int8_t id) { // sets the thermostat ww circulation working mode, where mode is a string bool Thermostat::set_wwcircmode(const char * value, const int8_t id) { + uint8_t wwc = (id == DeviceValueTAG::TAG_WWC2 - DeviceValueTAG::TAG_HC1 + 1) ? 1 : 0; uint8_t set; if ((model() == EMSdevice::EMS_DEVICE_FLAG_BC400) || (model() == EMSdevice::EMS_DEVICE_FLAG_RC300) || (model() == EMSdevice::EMS_DEVICE_FLAG_RC100)) { if (!Helpers::value2enum(value, set, FL_(enum_wwCircMode))) { return false; } - write_command(0x02F5, 3, set, 0x02F5); + write_command(0x02F5 + wwc, 3, set, 0x02F5 + wwc); return true; } if (!Helpers::value2enum(value, set, FL_(enum_wwMode2))) { @@ -2145,17 +2174,19 @@ bool Thermostat::set_wwcircmode(const char * value, const int8_t id) { } bool Thermostat::set_wwDailyHeating(const char * value, const int8_t id) { - bool b; + uint8_t wwc = (id == DeviceValueTAG::TAG_WWC2 - DeviceValueTAG::TAG_HC1 + 1) ? 1 : 0; + bool b; if (!Helpers::value2bool(value, b)) { return false; } - write_command(0x2F5, 8, b ? 0xFF : 0x00, 0x2F5); + write_command(0x2F5 + wwc, 8, b ? 0xFF : 0x00, 0x2F5 + wwc); return true; } bool Thermostat::set_wwDailyHeatTime(const char * value, const int8_t id) { - int set; + uint8_t wwc = (id == DeviceValueTAG::TAG_WWC2 - DeviceValueTAG::TAG_HC1 + 1) ? 1 : 0; + int set; if (!Helpers::value2number(value, set)) { return false; } @@ -2166,19 +2197,20 @@ bool Thermostat::set_wwDailyHeatTime(const char * value, const int8_t id) { return false; } - write_command(0x2F5, 9, t, 0x2F5); + write_command(0x2F5 + wwc, 9, t, 0x2F5 + wwc); } return true; } bool Thermostat::set_wwDisinfect(const char * value, const int8_t id) { - bool b; + uint8_t wwc = (id == DeviceValueTAG::TAG_WWC2 - DeviceValueTAG::TAG_HC1 + 1) ? 1 : 0; + bool b; if (!Helpers::value2bool(value, b)) { return false; } if ((model() == EMSdevice::EMS_DEVICE_FLAG_BC400) || (model() == EMSdevice::EMS_DEVICE_FLAG_RC300) || (model() == EMSdevice::EMS_DEVICE_FLAG_RC100)) { - write_command(0x2F5, 5, b ? 0xFF : 0x00, 0x2F5); + write_command(0x2F5 + wwc, 5, b ? 0xFF : 0x00, 0x2F5 + wwc); } else if (model() == EMSdevice::EMS_DEVICE_FLAG_RC30) { write_command(EMS_TYPE_RC30wwSettings, 2, b ? 0xFF : 0x00, EMS_TYPE_RC30wwSettings); } else { @@ -2189,13 +2221,14 @@ bool Thermostat::set_wwDisinfect(const char * value, const int8_t id) { } bool Thermostat::set_wwDisinfectDay(const char * value, const int8_t id) { + uint8_t wwc = (id == DeviceValueTAG::TAG_WWC2 - DeviceValueTAG::TAG_HC1 + 1) ? 1 : 0; uint8_t set; if (!Helpers::value2enum(value, set, FL_(enum_dayOfWeek))) { return false; } if ((model() == EMSdevice::EMS_DEVICE_FLAG_BC400) || (model() == EMSdevice::EMS_DEVICE_FLAG_RC300) || (model() == EMSdevice::EMS_DEVICE_FLAG_RC100)) { - write_command(0x2F5, 7, set, 0x2F5); + write_command(0x2F5 + wwc, 7, set, 0x2F5 + wwc); } else if (model() == EMSdevice::EMS_DEVICE_FLAG_RC30) { write_command(EMS_TYPE_RC30wwSettings, 3, set, EMS_TYPE_RC30wwSettings); } else { @@ -2206,12 +2239,13 @@ bool Thermostat::set_wwDisinfectDay(const char * value, const int8_t id) { } bool Thermostat::set_wwDisinfectHour(const char * value, const int8_t id) { - int set; + uint8_t wwc = (id == DeviceValueTAG::TAG_WWC2 - DeviceValueTAG::TAG_HC1 + 1) ? 1 : 0; + int set; if ((model() == EMSdevice::EMS_DEVICE_FLAG_BC400) || (model() == EMSdevice::EMS_DEVICE_FLAG_RC300) || (model() == EMSdevice::EMS_DEVICE_FLAG_RC100)) { if (!Helpers::value2number(value, set, 0, 1431)) { return false; } - write_command(0x2F5, 6, (set + 8) / 15, 0x2F5); + write_command(0x2F5 + wwc, 6, (set + 8) / 15, 0x2F5 + wwc); } else if (model() == EMSdevice::EMS_DEVICE_FLAG_RC30) { if (!Helpers::value2number(value, set, 0, 23)) { return false; @@ -3816,6 +3850,8 @@ void Thermostat::register_device_values() { FL_(wwMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwmode)); + register_device_value( + DeviceValueTAG::TAG_WWC2, &wwMode2_, DeviceValueType::ENUM, FL_(enum_wwMode4), FL_(wwMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwmode)); } else { register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, @@ -3825,6 +3861,8 @@ void Thermostat::register_device_values() { FL_(wwMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwmode)); + register_device_value( + DeviceValueTAG::TAG_WWC2, &wwMode2_, DeviceValueType::ENUM, FL_(enum_wwMode), FL_(wwMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwmode)); } register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwSetTempLow_, @@ -3848,7 +3886,6 @@ void Thermostat::register_device_values() { MAKE_CF_CB(set_wwchargeduration)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwCharge_, DeviceValueType::BOOL, FL_(wwCharge), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwcharge)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwExtra1_, DeviceValueType::UINT, FL_(wwExtra1), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwExtra2_, DeviceValueType::UINT, FL_(wwExtra2), DeviceValueUOM::DEGREES); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwDisinfecting_, DeviceValueType::BOOL, @@ -3871,6 +3908,74 @@ void Thermostat::register_device_values() { MAKE_CF_CB(set_wwDisinfectHour), 0, 1431); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwDailyHeating_, + DeviceValueType::BOOL, + FL_(wwDailyHeating), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_wwDailyHeating)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwDailyHeatTime_, + DeviceValueType::UINT, + DeviceValueNumOp::DV_NUMOP_MUL15, + FL_(wwDailyHeatTime), + DeviceValueUOM::MINUTES, + MAKE_CF_CB(set_wwDailyHeatTime), + 0, + 1431); + register_device_value(DeviceValueTAG::TAG_WWC2, + &wwCircMode2_, + DeviceValueType::ENUM, + FL_(enum_wwCircMode), + FL_(wwCircMode), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_wwcircmode)); + register_device_value(DeviceValueTAG::TAG_WWC2, + &wwChargeDuration2_, + DeviceValueType::UINT, + DeviceValueNumOp::DV_NUMOP_MUL15, + FL_(wwChargeDuration), + DeviceValueUOM::MINUTES, + MAKE_CF_CB(set_wwchargeduration)); + register_device_value(DeviceValueTAG::TAG_WWC2, &wwCharge2_, DeviceValueType::BOOL, FL_(wwCharge), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwcharge)); + register_device_value(DeviceValueTAG::TAG_WWC2, &wwExtra2_, DeviceValueType::UINT, FL_(wwExtra2), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_WWC2, + &wwDisinfecting2_, + DeviceValueType::BOOL, + FL_(wwDisinfecting), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_wwDisinfect)); + register_device_value(DeviceValueTAG::TAG_WWC2, + &wwDisinfectDay2_, + DeviceValueType::ENUM, + FL_(enum_dayOfWeek), + FL_(wwDisinfectDay), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_wwDisinfectDay)); + register_device_value(DeviceValueTAG::TAG_WWC2, + &wwDisinfectHour2_, + DeviceValueType::UINT, + DeviceValueNumOp::DV_NUMOP_MUL15, + FL_(wwDisinfectTime), + DeviceValueUOM::MINUTES, + MAKE_CF_CB(set_wwDisinfectHour), + 0, + 1431); + register_device_value(DeviceValueTAG::TAG_WWC2, + &wwDailyHeating2_, + DeviceValueType::BOOL, + FL_(wwDailyHeating), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_wwDailyHeating)); + register_device_value(DeviceValueTAG::TAG_WWC2, + &wwDailyHeatTime2_, + DeviceValueType::UINT, + DeviceValueNumOp::DV_NUMOP_MUL15, + FL_(wwDailyHeatTime), + DeviceValueUOM::MINUTES, + MAKE_CF_CB(set_wwDailyHeatTime), + 0, + 1431); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hybridStrategy_, DeviceValueType::ENUM, diff --git a/src/devices/thermostat.h b/src/devices/thermostat.h index 0fad61c6c..419954140 100644 --- a/src/devices/thermostat.h +++ b/src/devices/thermostat.h @@ -223,15 +223,23 @@ class Thermostat : public EMSdevice { uint8_t wwExtra1_; // wwExtra active for wwSystem 1 uint8_t wwExtra2_; uint8_t wwMode_; + uint8_t wwMode2_; uint8_t wwCircPump_; + uint8_t wwCircPump2_; uint8_t wwCircMode_; + uint8_t wwCircMode2_; uint8_t wwSetTemp_; uint8_t wwSetTempLow_; uint8_t wwCharge_; + uint8_t wwCharge2_; uint8_t wwChargeDuration_; + uint8_t wwChargeDuration2_; uint8_t wwDisinfecting_; + uint8_t wwDisinfecting2_; uint8_t wwDisinfectDay_; uint8_t wwDisinfectHour_; + uint8_t wwDisinfectDay2_; + uint8_t wwDisinfectHour2_; uint8_t wwMaxTemp_; uint8_t wwOneTimeKey_; uint8_t wwProgMode_; @@ -240,6 +248,8 @@ class Thermostat : public EMSdevice { char wwCircSwitchTime_[16]; uint8_t wwDailyHeating_; uint8_t wwDailyHeatTime_; + uint8_t wwDailyHeating2_; + uint8_t wwDailyHeatTime2_; uint8_t wwWhenModeOff_; char wwHoliday_[26]; char wwVacation_[26]; @@ -393,6 +403,7 @@ class Thermostat : public EMSdevice { void process_RC300Summer(std::shared_ptr telegram); void process_RC300Summer2(std::shared_ptr telegram); void process_RC300WWmode(std::shared_ptr telegram); + void process_RC300WW2mode(std::shared_ptr telegram); void process_RC300WWmode2(std::shared_ptr telegram); void process_RC300WWtemp(std::shared_ptr telegram); void process_RC300OutdoorTemp(std::shared_ptr telegram); diff --git a/src/emsesp.cpp b/src/emsesp.cpp index ff0727a80..cd4645a89 100644 --- a/src/emsesp.cpp +++ b/src/emsesp.cpp @@ -1496,7 +1496,9 @@ void EMSESP::start() { esp8266React.begin(); // loads core system services settings (network, mqtt, ap, ntp etc) - nvs_.begin("ems-esp", false, "nvs"); + if (!nvs_.begin("ems-esp", false, "nvs1")) { // try new partition on 16M flash first + nvs_.begin("ems-esp", false, "nvs"); // fallback to first nvs + } LOG_INFO("Starting EMS-ESP version %s", EMSESP_APP_VERSION); // welcome message LOG_DEBUG("System is running in Debug mode"); diff --git a/src/locale_translations.h b/src/locale_translations.h index 1aa219ef6..366f076d3 100644 --- a/src/locale_translations.h +++ b/src/locale_translations.h @@ -444,6 +444,9 @@ MAKE_TRANSLATION(wwEcoPlusOffTemp, "wwecoplusoff", "eco+ switch off", "ECO+ Auss MAKE_TRANSLATION(wwComfDiffTemp, "wwcomfdiff", "comfort diff", "Komfort Differenztemp", "", "", "", "", "", "", "", "") // TODO translate MAKE_TRANSLATION(wwEcoDiffTemp, "wwecodiff", "eco diff", "ECO Differenztemp", "", "", "", "", "", "", "", "") // TODO translate MAKE_TRANSLATION(wwEcoPlusDiffTemp, "wwecoplusdiff", "eco+ diff", "ECO+ Differenztemp", "", "", "", "", "", "", "", "") // TODO translate +MAKE_TRANSLATION(wwComfStopTemp, "wwcomfstop", "comfort stop temp", "Komfort Stopptemp", "", "", "", "", "", "", "", "") // TODO translate +MAKE_TRANSLATION(wwEcoStopTemp, "wwecostop", "eco stop temp", "ECO Stopptemp", "", "", "", "", "", "", "", "") // TODO translate +MAKE_TRANSLATION(wwEcoPlusStopTemp, "wwecoplusstop", "eco+ stop temp", "ECO+ Stopptemp", "", "", "", "", "", "", "", "") // TODO translate MAKE_TRANSLATION(auxHeatMode, "auxheatrmode", "aux heater mode", "Modus Zusatzheizer", "Modus bijverwarmer", "", "tryb pracy dogrzewacza po blokadzie z Zakładu Energetycznego", "tilleggsvarmer modus", "", "ilave ısıtıcı modu", "modalità riscaldatore addizionale", "režim pomocného ohrievača") // TODO translate MAKE_TRANSLATION(auxMaxLimit, "auxmaxlimit", "aux heater max limit", "Zusatzheizer max. Grenze", "Bijverwarmer grensinstelling maximaal", "", "dogrzewacz, maksymalny limit", "tillegsvarme maksgrense", "", "ilave ısıtıcı maks limit", "limite massimo riscaldatore addizionale", "maximálny limit pomocného ohrievača") // TODO translate diff --git a/src/mqtt.cpp b/src/mqtt.cpp index 157f5109e..fba8c5104 100644 --- a/src/mqtt.cpp +++ b/src/mqtt.cpp @@ -607,7 +607,8 @@ bool Mqtt::queue_message(const uint8_t operation, const std::string & topic, con } // check free mem #ifndef EMSESP_STANDALONE - if (ESP.getFreeHeap() < 60 * 1024 || ESP.getMaxAllocHeap() < 40 * 1024) { + // if (ESP.getFreeHeap() < 60 * 1024 || ESP.getMaxAllocHeap() < 40 * 1024) { + if (heap_caps_get_free_size(MALLOC_CAP_8BIT) < 60 * 1024) { // checks free Heap+PSRAM if (operation == Operation::PUBLISH) { mqtt_message_id_++; mqtt_publish_fails_++; @@ -1327,13 +1328,13 @@ void Mqtt::add_ha_sections_to_doc(const char * name, const char * tpl_draft = "{{'online' if %s else 'offline'}}"; - // EMS-ESP status check char tpl[150]; - snprintf(tpl, sizeof(tpl), "%s/status", Mqtt::base().c_str()); - avty_json["t"] = tpl; - snprintf(tpl, sizeof(tpl), tpl_draft, "value == 'online'"); - avty_json["val_tpl"] = tpl; - avty.add(avty_json); // returns 0 if no mem + // EMS-ESP status check + // snprintf(tpl, sizeof(tpl), "%s/status", Mqtt::base().c_str()); + // avty_json["t"] = tpl; + // snprintf(tpl, sizeof(tpl), tpl_draft, "value == 'online'"); + // avty_json["val_tpl"] = tpl; + // avty.add(avty_json); // returns 0 if no mem // skip conditional Jinja2 templates if not home assistant if (discovery_type() == discoveryType::HOMEASSISTANT) { diff --git a/src/system.cpp b/src/system.cpp index 36c1b0db7..8040b6c85 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -1204,10 +1204,12 @@ bool System::command_info(const char * value, const int8_t id, JsonObject output node["uptime"] = uuid::log::format_timestamp_ms(uuid::get_uptime_ms(), 3); node["uptime (seconds)"] = uuid::get_uptime_sec(); #ifndef EMSESP_STANDALONE - node["platform"] = ARDUINO_VERSION; + node["platform"] = EMSESP_PLATFORM; + node["arduino"] = ARDUINO_VERSION; node["sdk"] = ESP.getSdkVersion(); node["free mem"] = getHeapMem(); node["max alloc"] = getMaxAllocMem(); + node["free caps"] = heap_caps_get_free_size(MALLOC_CAP_8BIT) / 1024; // includes heap and psram node["used app"] = EMSESP::system_.appUsed(); // kilobytes node["free app"] = EMSESP::system_.appFree(); // kilobytes node["partition"] = esp_ota_get_running_partition()->label; diff --git a/src/temperaturesensor.cpp b/src/temperaturesensor.cpp index d07a478a5..125cc42c3 100644 --- a/src/temperaturesensor.cpp +++ b/src/temperaturesensor.cpp @@ -377,10 +377,9 @@ bool TemperatureSensor::get_value_info(JsonObject output, const char * cmd, cons // this is for a specific sensor // make a copy of the string command for parsing, and lowercase it - char sensor_name[30] = {'\0'}; + char sensor_name[COMMAND_MAX_LENGTH] = {'\0'}; char * attribute_s = nullptr; - strlcpy(sensor_name, cmd, sizeof(sensor_name)); - auto sensor_lowercase = Helpers::toLower(sensor_name); + strlcpy(sensor_name, Helpers::toLower(cmd).c_str(), sizeof(sensor_name)); // check for a specific attribute to fetch instead of the complete record char * breakp = strchr(sensor_name, '/'); @@ -391,7 +390,7 @@ bool TemperatureSensor::get_value_info(JsonObject output, const char * cmd, cons for (const auto & sensor : sensors_) { // match custom name or sensor ID - if (sensor_lowercase == Helpers::toLower(sensor.name().c_str()) || sensor_lowercase == Helpers::toLower(sensor.id().c_str())) { + if (sensor_name == Helpers::toLower(sensor.name()) || sensor_name == Helpers::toLower(sensor.id())) { // add values addSensorJson(output, sensor); // if we're filtering on an attribute, go find it diff --git a/src/uart/emsuart_esp32.cpp b/src/uart/emsuart_esp32.cpp index ad8c9da7c..e1284d2c3 100644 --- a/src/uart/emsuart_esp32.cpp +++ b/src/uart/emsuart_esp32.cpp @@ -47,20 +47,18 @@ void EMSuart::uart_event_task(void * pvParameters) { while (1) { //Waiting for UART event. if (xQueueReceive(uart_queue, (void *)&event, portMAX_DELAY)) { - if (event.type == UART_DATA) { - length += event.size; - } else if (event.type == UART_BREAK) { + if (event.type == UART_BREAK) { + length += event.size ? event.size - 1 : 0; if (length == 2 || (length >= 6 && length <= EMS_MAXBUFFERSIZE)) { uart_read_bytes(EMSUART_NUM, telegram, length, portMAX_DELAY); - // if (telegram[0] && !telegram[length - 1]) { EMSESP::incoming_telegram(telegram, (uint8_t)(length - 1)); - // } - } else { - // flush buffer up to break + } else { // flush buffer up to break uint8_t buf[length]; uart_read_bytes(EMSUART_NUM, buf, length, portMAX_DELAY); } length = 0; + } else if (event.type == UART_DATA) { + length += event.size; } else if (event.type == UART_BUFFER_FULL) { uart_flush_input(EMSUART_NUM); length = 0; diff --git a/src/version.h b/src/version.h index 81aae191e..e53a32b99 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.6.5-test.15" +#define EMSESP_APP_VERSION "3.6.5-test.16" diff --git a/src/web/WebCustomEntityService.cpp b/src/web/WebCustomEntityService.cpp index 7cbc1b7a0..c9ed66281 100644 --- a/src/web/WebCustomEntityService.cpp +++ b/src/web/WebCustomEntityService.cpp @@ -278,8 +278,8 @@ bool WebCustomEntityService::get_value_info(JsonObject output, const char * cmd) return true; } - char command_s[30]; - strlcpy(command_s, cmd, sizeof(command_s)); + char command_s[COMMAND_MAX_LENGTH]; + strlcpy(command_s, Helpers::toLower(cmd).c_str(), sizeof(command_s)); char * attribute_s = nullptr; // check specific attribute to fetch instead of the complete record char * breakp = strchr(command_s, '/'); @@ -289,7 +289,7 @@ bool WebCustomEntityService::get_value_info(JsonObject output, const char * cmd) } for (const auto & entity : *customEntityItems) { - if (Helpers::toLower(entity.name) == Helpers::toLower(command_s)) { + if (Helpers::toLower(entity.name) == command_s) { output["name"] = entity.name; output["ram"] = entity.ram; output["type"] = entity.value_type == DeviceValueType::BOOL ? "boolean" : entity.value_type == DeviceValueType::STRING ? "string" : F_(number); diff --git a/src/web/WebSchedulerService.cpp b/src/web/WebSchedulerService.cpp index 52665811a..1dd23adc6 100644 --- a/src/web/WebSchedulerService.cpp +++ b/src/web/WebSchedulerService.cpp @@ -168,8 +168,8 @@ bool WebSchedulerService::get_value_info(JsonObject output, const char * cmd) { return (output.size() > 0); } - char command_s[30]; - strlcpy(command_s, cmd, sizeof(command_s)); + char command_s[COMMAND_MAX_LENGTH]; + strlcpy(command_s, Helpers::toLower(cmd).c_str(), sizeof(command_s)); char * attribute_s = nullptr; // check specific attribute to fetch instead of the complete record @@ -180,7 +180,7 @@ bool WebSchedulerService::get_value_info(JsonObject output, const char * cmd) { } for (const ScheduleItem & scheduleItem : *scheduleItems_) { - if (Helpers::toLower(scheduleItem.name) == Helpers::toLower(command_s)) { + if (Helpers::toLower(scheduleItem.name) == command_s) { output["name"] = scheduleItem.name; output["type"] = "boolean"; if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) { diff --git a/src/web/WebSettingsService.cpp b/src/web/WebSettingsService.cpp index 7a1b81bf2..56170ae1a 100644 --- a/src/web/WebSettingsService.cpp +++ b/src/web/WebSettingsService.cpp @@ -93,24 +93,25 @@ StateUpdateResult WebSettings::update(JsonObject root, WebSettings & settings) { bool psram = ESP.getPsramSize() > 0; // System::PSram() is initializd later if (System::load_board_profile(data, settings.board_profile.c_str())) { if (settings.board_profile == "CUSTOM") { //read pins, fallback to S32 - data[0] = root["led_gpio"] | 2; - data[1] = root["dallas_gpio"] | 18; - data[2] = root["rx_gpio"] | 23; - data[3] = root["tx_gpio"] | 5; - data[4] = root["pbutton_gpio"] | 0; - data[5] = root["phy_type"] | PHY_type::PHY_TYPE_NONE; - data[6] = root["eth_power"] | 0; - data[7] = root["eth_phy_addr"] | 0; - data[8] = root["eth_clock_mode"] | 0; + data = {(int8_t)(root["led_gpio"] | 2), + (int8_t)(root["dallas_gpio"] | 18), + (int8_t)(root["rx_gpio"] | 23), + (int8_t)(root["tx_gpio"] | 5), + (int8_t)(root["pbutton_gpio"] | 0), + (int8_t)(root["phy_type"] | PHY_type::PHY_TYPE_NONE), + (int8_t)(root["eth_power"] | 0), + (int8_t)(root["eth_phy_addr"] | 0), + (int8_t)(root["eth_clock_mode"] | 0)}; } // check valid pins in this board profile if (!System::is_valid_gpio(data[0], psram) || !System::is_valid_gpio(data[1], psram) || !System::is_valid_gpio(data[2], psram) || !System::is_valid_gpio(data[3], psram) || !System::is_valid_gpio(data[4], psram) || !System::is_valid_gpio(data[6], psram)) { settings.board_profile = ""; // reset to factory default } + } else { + settings.board_profile = ""; // reset to factory default } - // load the profile - if (!System::load_board_profile(data, settings.board_profile.c_str())) { + if (settings.board_profile == "") { // unknown, check for NVS or scan for ethernet, use default E32/E32V2/S32 settings.board_profile = EMSESP::nvs_.getString("boot"); if (!System::load_board_profile(data, settings.board_profile.c_str())) {