diff --git a/.github/workflows/pre_release.yml b/.github/workflows/pre_release.yml index 0f5e8d914..fbb8c27d1 100644 --- a/.github/workflows/pre_release.yml +++ b/.github/workflows/pre_release.yml @@ -48,6 +48,10 @@ jobs: run: | platformio run -e ci_s3 + - name: Build E32V2 firmware + run: | + platformio run -e ci_16M + - name: Create a GH Release id: 'automatic_releases' uses: 'marvinpinto/action-automatic-releases@latest' diff --git a/interface/package.json b/interface/package.json index f3942614e..efdb1c9b3 100644 --- a/interface/package.json +++ b/interface/package.json @@ -23,16 +23,16 @@ }, "dependencies": { "@alova/adapter-xhr": "^1.0.3", - "@babel/core": "^7.23.9", - "@emotion/react": "^11.11.3", + "@babel/core": "^7.24.0", + "@emotion/react": "^11.11.4", "@emotion/styled": "^11.11.0", "@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.58", + "@types/node": "^20.11.23", + "@types/react": "^18.2.61", "@types/react-dom": "^18.2.19", "@types/react-router-dom": "^5.3.3", "alova": "^2.17.0", @@ -45,7 +45,7 @@ "react-dom": "latest", "react-dropzone": "^14.2.3", "react-icons": "^5.0.1", - "react-router-dom": "^6.22.1", + "react-router-dom": "^6.22.2", "react-toastify": "^10.0.4", "sockette": "^2.0.6", "typesafe-i18n": "^5.26.2", @@ -54,8 +54,8 @@ "devDependencies": { "@preact/compat": "^17.1.2", "@preact/preset-vite": "^2.8.1", - "@typescript-eslint/eslint-plugin": "^7.0.2", - "@typescript-eslint/parser": "^7.0.2", + "@typescript-eslint/eslint-plugin": "^7.1.0", + "@typescript-eslint/parser": "^7.1.0", "concurrently": "^8.2.2", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", diff --git a/interface/src/framework/network/NetworkSettingsForm.tsx b/interface/src/framework/network/NetworkSettingsForm.tsx index 20387fcf6..cf97b3d03 100644 --- a/interface/src/framework/network/NetworkSettingsForm.tsx +++ b/interface/src/framework/network/NetworkSettingsForm.tsx @@ -216,6 +216,8 @@ const WiFiSettingsForm: FC = () => { 11 dBm 8.5 dBm 7 dBm + 5 dBm + 2 dBm } @@ -257,10 +259,12 @@ const WiFiSettingsForm: FC = () => { margin="normal" /> )} - } - label={LL.NETWORK_ENABLE_IPV6()} - /> + {data.enableIPv6 !== undefined && ( + } + label={LL.NETWORK_ENABLE_IPV6()} + /> + )} } label={LL.NETWORK_FIXED_IP()} diff --git a/interface/src/types/network.ts b/interface/src/types/network.ts index 8740eb9b4..c5d8795df 100644 --- a/interface/src/types/network.ts +++ b/interface/src/types/network.ts @@ -42,7 +42,7 @@ export interface NetworkSettings { password: string; hostname: string; static_ip_config: boolean; - enableIPv6: boolean; + enableIPv6?: boolean; bandwidth20: boolean; nosleep: boolean; tx_power: number; diff --git a/interface/yarn.lock b/interface/yarn.lock index 22cc7bfc1..5cdecba3a 100644 --- a/interface/yarn.lock +++ b/interface/yarn.lock @@ -86,26 +86,26 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.23.9": - version: 7.23.9 - resolution: "@babel/core@npm:7.23.9" +"@babel/core@npm:^7.24.0": + version: 7.24.0 + resolution: "@babel/core@npm:7.24.0" dependencies: "@ampproject/remapping": "npm:^2.2.0" "@babel/code-frame": "npm:^7.23.5" "@babel/generator": "npm:^7.23.6" "@babel/helper-compilation-targets": "npm:^7.23.6" "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helpers": "npm:^7.23.9" - "@babel/parser": "npm:^7.23.9" - "@babel/template": "npm:^7.23.9" - "@babel/traverse": "npm:^7.23.9" - "@babel/types": "npm:^7.23.9" + "@babel/helpers": "npm:^7.24.0" + "@babel/parser": "npm:^7.24.0" + "@babel/template": "npm:^7.24.0" + "@babel/traverse": "npm:^7.24.0" + "@babel/types": "npm:^7.24.0" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: 10/268cdbb86bef1b8ea5b1300f2f325e56a1740a5051360cb228ffeaa0f80282b6674f3a2b4d6466adb0691183759b88d4c37b4a4f77232c84a49ed771c84cdc27 + checksum: 10/1e22215cc89e061e0cbfed72f265ad24d363f3e9b24b51e9c4cf3ccb9222260a29a1c1e62edb439cb7e2229a3fce924edd43300500416613236c13fc8d62a947 languageName: node linkType: hard @@ -304,14 +304,14 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.23.9": - version: 7.23.9 - resolution: "@babel/helpers@npm:7.23.9" +"@babel/helpers@npm:^7.24.0": + version: 7.24.0 + resolution: "@babel/helpers@npm:7.24.0" dependencies: - "@babel/template": "npm:^7.23.9" - "@babel/traverse": "npm:^7.23.9" - "@babel/types": "npm:^7.23.9" - checksum: 10/dd56daac8bbd7ed174bb00fd185926fd449e591d9a00edaceb7ac6edbdd7a8db57e2cb365b4fafda382201752789ced2f7ae010f667eab0f198a4571cda4d2c5 + "@babel/template": "npm:^7.24.0" + "@babel/traverse": "npm:^7.24.0" + "@babel/types": "npm:^7.24.0" + checksum: 10/cc82012161b30185c2698da359c7311cf019f0932f8fcb805e985fec9e0053c354f0534dc9961f3170eee579df6724eecd34b0f5ffaa155cdd456af59fbff86e languageName: node linkType: hard @@ -346,12 +346,12 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.23.9": - version: 7.23.9 - resolution: "@babel/parser@npm:7.23.9" +"@babel/parser@npm:^7.24.0": + version: 7.24.0 + resolution: "@babel/parser@npm:7.24.0" bin: parser: ./bin/babel-parser.js - checksum: 10/727a7a807100f6a26df859e2f009c4ddbd0d3363287b45daa50bd082ccd0d431d0c4d0e610a91f806e04a1918726cd0f5a0592c9b902a815337feed12e1cafd9 + checksum: 10/3e5ebb903a6f71629a9d0226743e37fe3d961e79911d2698b243637f66c4df7e3e0a42c07838bc0e7cc9fcd585d9be8f4134a145b9459ee4a459420fb0d1360b languageName: node linkType: hard @@ -421,14 +421,14 @@ __metadata: languageName: node linkType: hard -"@babel/template@npm:^7.23.9": - version: 7.23.9 - resolution: "@babel/template@npm:7.23.9" +"@babel/template@npm:^7.24.0": + version: 7.24.0 + resolution: "@babel/template@npm:7.24.0" dependencies: "@babel/code-frame": "npm:^7.23.5" - "@babel/parser": "npm:^7.23.9" - "@babel/types": "npm:^7.23.9" - checksum: 10/1b011ba9354dc2e646561d54b6862e0df51760e6179faadd79be05825b0b6da04911e4e192df943f1766748da3037fd8493615b38707f7cadb0cf0c96601c170 + "@babel/parser": "npm:^7.24.0" + "@babel/types": "npm:^7.24.0" + checksum: 10/8c538338c7de8fac8ada691a5a812bdcbd60bd4a4eb5adae2cc9ee19773e8fb1a724312a00af9e1ce49056ffd3c3475e7287b5668cf6360bfb3f8ac827a06ffe languageName: node linkType: hard @@ -450,9 +450,9 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.23.9": - version: 7.23.9 - resolution: "@babel/traverse@npm:7.23.9" +"@babel/traverse@npm:^7.24.0": + version: 7.24.0 + resolution: "@babel/traverse@npm:7.24.0" dependencies: "@babel/code-frame": "npm:^7.23.5" "@babel/generator": "npm:^7.23.6" @@ -460,11 +460,11 @@ __metadata: "@babel/helper-function-name": "npm:^7.23.0" "@babel/helper-hoist-variables": "npm:^7.22.5" "@babel/helper-split-export-declaration": "npm:^7.22.6" - "@babel/parser": "npm:^7.23.9" - "@babel/types": "npm:^7.23.9" + "@babel/parser": "npm:^7.24.0" + "@babel/types": "npm:^7.24.0" debug: "npm:^4.3.1" globals: "npm:^11.1.0" - checksum: 10/e2bb845f7f229feb7c338f7e150f5f1abc5395dcd3a6a47f63a25242ec3ec6b165f04a6df7d4849468547faee34eb3cf52487eb0bd867a7d3c42fec2a648266f + checksum: 10/5cc482248ebb79adcbcf021aab4e0e95bafe2a1736ee4b46abe6f88b59848ad73e15e219db8f06c9a33a14c64257e5b47e53876601e998a8c596accb1b7f4996 languageName: node linkType: hard @@ -490,14 +490,14 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.23.9": - version: 7.23.9 - resolution: "@babel/types@npm:7.23.9" +"@babel/types@npm:^7.24.0": + version: 7.24.0 + resolution: "@babel/types@npm:7.24.0" dependencies: "@babel/helper-string-parser": "npm:^7.23.4" "@babel/helper-validator-identifier": "npm:^7.22.20" to-fast-properties: "npm:^2.0.0" - checksum: 10/bed9634e5fd0f9dc63c84cfa83316c4cb617192db9fedfea464fca743affe93736d7bf2ebf418ee8358751a9d388e303af87a0c050cb5d87d5870c1b0154f6cb + checksum: 10/a0b4875ce2e132f9daff0d5b27c7f4c4fcc97f2b084bdc5834e92c9d32592778489029e65d99d00c406da612d87b72d7a236c0afccaa1435c028d0c94c9b6da4 languageName: node linkType: hard @@ -556,9 +556,9 @@ __metadata: languageName: node linkType: hard -"@emotion/react@npm:^11.11.3": - version: 11.11.3 - resolution: "@emotion/react@npm:11.11.3" +"@emotion/react@npm:^11.11.4": + version: 11.11.4 + resolution: "@emotion/react@npm:11.11.4" dependencies: "@babel/runtime": "npm:^7.18.3" "@emotion/babel-plugin": "npm:^11.11.0" @@ -573,7 +573,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10/f7b98557b7d5236296dda48c2fc8a6cde4af7399758496e9f710f85a80c7d66fee1830966caabd7b237601bfdaca4e1add8c681d1ae4cc3d497fe88958d541c4 + checksum: 10/e7da3a1ddc1d72a4179010bdfd17423c13b1a77bf83a8b18271e919fd382d08c62dc2313ed5347acfd1ef85bb1bae8932597647a986e8a1ea1462552716cd495 languageName: node linkType: hard @@ -1299,10 +1299,10 @@ __metadata: languageName: node linkType: hard -"@remix-run/router@npm:1.15.1": - version: 1.15.1 - resolution: "@remix-run/router@npm:1.15.1" - checksum: 10/d262285d155f80779894ee1d9ef07e35421986ba2546378dfe0e3b09397ce71becb6a4677e9efcd4155e2bd3f9f7f7ecbc110cd99bacee6dd7d3e5ce51b7caa8 +"@remix-run/router@npm:1.15.2": + version: 1.15.2 + resolution: "@remix-run/router@npm:1.15.2" + checksum: 10/2a2c9c062228130d0383328de2757301e878fc268a72f813b60b8463bb7ed2c1fa4018072883af8096982a4b2741ec6eb349587cd7f95acfdf09588d93adea67 languageName: node linkType: hard @@ -1590,12 +1590,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^20.11.20": - version: 20.11.20 - resolution: "@types/node@npm:20.11.20" +"@types/node@npm:^20.11.23": + version: 20.11.23 + resolution: "@types/node@npm:20.11.23" dependencies: undici-types: "npm:~5.26.4" - checksum: 10/ff449bdc94810dadb54e0f77dd587c6505ef79ffa5a208c16eb29b223365b188f4c935a3abaf0906a01d05257c3da1f72465594a841d35bcf7b6deac7a6938fb + checksum: 10/fc2a86444461fd74a77c565ff6f854f354e5b637eacc42dc1f35bc859025a11bf495a785ca0439a84e0560157491a89735c0dbff48101113334d30d4b20fb1a3 languageName: node linkType: hard @@ -1670,14 +1670,14 @@ __metadata: languageName: node linkType: hard -"@types/react@npm:^18.2.58": - version: 18.2.58 - resolution: "@types/react@npm:18.2.58" +"@types/react@npm:^18.2.61": + version: 18.2.61 + resolution: "@types/react@npm:18.2.61" dependencies: "@types/prop-types": "npm:*" "@types/scheduler": "npm:*" csstype: "npm:^3.0.2" - checksum: 10/ec5e1a7d8acc55551efec7a3d63441d24c7e94b66bf8039944541a8408048668e51b7b4b0b6e8303cdea271b7c6da242cdc7bb8ca501eedf822956edbdbfc67e + checksum: 10/74c2920ccca83fc51190ed4eda1066fa6a644197839dd37765fcce93cbd50b7a52b75815ce0083bb95195f886c80b57745314dd49ecbf235fa93d753ae2260bc languageName: node linkType: hard @@ -1713,15 +1713,15 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^7.0.2": - version: 7.0.2 - resolution: "@typescript-eslint/eslint-plugin@npm:7.0.2" +"@typescript-eslint/eslint-plugin@npm:^7.1.0": + version: 7.1.0 + resolution: "@typescript-eslint/eslint-plugin@npm:7.1.0" dependencies: "@eslint-community/regexpp": "npm:^4.5.1" - "@typescript-eslint/scope-manager": "npm:7.0.2" - "@typescript-eslint/type-utils": "npm:7.0.2" - "@typescript-eslint/utils": "npm:7.0.2" - "@typescript-eslint/visitor-keys": "npm:7.0.2" + "@typescript-eslint/scope-manager": "npm:7.1.0" + "@typescript-eslint/type-utils": "npm:7.1.0" + "@typescript-eslint/utils": "npm:7.1.0" + "@typescript-eslint/visitor-keys": "npm:7.1.0" debug: "npm:^4.3.4" graphemer: "npm:^1.4.0" ignore: "npm:^5.2.4" @@ -1734,44 +1734,44 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10/430b2f7ca36ee73dc75c1d677088709f3c9d5bbb4fffa3cfbe1b7d63979ee397f7a4a2a1386e05a04991500fa0ab0dd5272e8603a2b20f42e4bf590603500858 + checksum: 10/f0b6b6e6ae2afee1df8dd2fd0c56588f9bb600468be9f255e033709a53371c6434da687e75dcb673503ef4f0416226f4ca3c94c65272828106e39b56aac87334 languageName: node linkType: hard -"@typescript-eslint/parser@npm:^7.0.2": - version: 7.0.2 - resolution: "@typescript-eslint/parser@npm:7.0.2" +"@typescript-eslint/parser@npm:^7.1.0": + version: 7.1.0 + resolution: "@typescript-eslint/parser@npm:7.1.0" dependencies: - "@typescript-eslint/scope-manager": "npm:7.0.2" - "@typescript-eslint/types": "npm:7.0.2" - "@typescript-eslint/typescript-estree": "npm:7.0.2" - "@typescript-eslint/visitor-keys": "npm:7.0.2" + "@typescript-eslint/scope-manager": "npm:7.1.0" + "@typescript-eslint/types": "npm:7.1.0" + "@typescript-eslint/typescript-estree": "npm:7.1.0" + "@typescript-eslint/visitor-keys": "npm:7.1.0" debug: "npm:^4.3.4" peerDependencies: eslint: ^8.56.0 peerDependenciesMeta: typescript: optional: true - checksum: 10/18d6e1bda64013f7d66164164c57a10390f7979db55b265062ae9337e11e0921bffca10870e252cd0bd198f79ffa2e87a652e57110e5b1b4cc738453154c205c + checksum: 10/39238d37f5a5f7058371ee3882fb7cd8a4579883fc5f13fda645c151fcf8d15e4c0db3ea7ffa7915a55c82451b544e9340c0228b45b83085158cb97974112f19 languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:7.0.2": - version: 7.0.2 - resolution: "@typescript-eslint/scope-manager@npm:7.0.2" +"@typescript-eslint/scope-manager@npm:7.1.0": + version: 7.1.0 + resolution: "@typescript-eslint/scope-manager@npm:7.1.0" dependencies: - "@typescript-eslint/types": "npm:7.0.2" - "@typescript-eslint/visitor-keys": "npm:7.0.2" - checksum: 10/773ea6e61f741777e69a469641f3db0d3c2301c0102667825fb235ed5a65c95f6d6b31b19e734b9a215acc0c7c576c65497635b8d5928eeddb58653ceb13d2d5 + "@typescript-eslint/types": "npm:7.1.0" + "@typescript-eslint/visitor-keys": "npm:7.1.0" + checksum: 10/3fb18de864331739c1b04fe9e3bb5d926e2fdf0d1fea2871181f68d0fb52325cbc9a5b81da58b7fe7f22d6d58d62b21c83460907146bc2f54ef0720fb3f9037f languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:7.0.2": - version: 7.0.2 - resolution: "@typescript-eslint/type-utils@npm:7.0.2" +"@typescript-eslint/type-utils@npm:7.1.0": + version: 7.1.0 + resolution: "@typescript-eslint/type-utils@npm:7.1.0" dependencies: - "@typescript-eslint/typescript-estree": "npm:7.0.2" - "@typescript-eslint/utils": "npm:7.0.2" + "@typescript-eslint/typescript-estree": "npm:7.1.0" + "@typescript-eslint/utils": "npm:7.1.0" debug: "npm:^4.3.4" ts-api-utils: "npm:^1.0.1" peerDependencies: @@ -1779,23 +1779,23 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10/63bf19c9f5bbcb0f3e127f509d85dc49be4e5e51781d78f58c96786089e7c909b25d35d0248a6a758e2f7d5b5223d2262c2d597ab71f226af6beb499ae950645 + checksum: 10/439e6fadab3df3c21adfd651af4e605e1020c86c8c2400b0127c2ee914646bc73945b4add31ca7201cafeead261ad2958362c339ebdfc0798064d56daeb60661 languageName: node linkType: hard -"@typescript-eslint/types@npm:7.0.2": - version: 7.0.2 - resolution: "@typescript-eslint/types@npm:7.0.2" - checksum: 10/2cba8a0355cc7357db142fa597d02cf39e1d1cb0ec87c80e91daaa2b87f2a794d2649def9d7b2aa435691c3810d2cbd4cdc21668b19b991863f0d54d4a22da82 +"@typescript-eslint/types@npm:7.1.0": + version: 7.1.0 + resolution: "@typescript-eslint/types@npm:7.1.0" + checksum: 10/34801a14ea1444a1707de5bd3211f0ea53afc82a3c6c4543092f123267389da607c498d1a7de554ac9f071e6ef488238728a5f279ff2abaa0cbdfaa733899b67 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:7.0.2": - version: 7.0.2 - resolution: "@typescript-eslint/typescript-estree@npm:7.0.2" +"@typescript-eslint/typescript-estree@npm:7.1.0": + version: 7.1.0 + resolution: "@typescript-eslint/typescript-estree@npm:7.1.0" dependencies: - "@typescript-eslint/types": "npm:7.0.2" - "@typescript-eslint/visitor-keys": "npm:7.0.2" + "@typescript-eslint/types": "npm:7.1.0" + "@typescript-eslint/visitor-keys": "npm:7.1.0" debug: "npm:^4.3.4" globby: "npm:^11.1.0" is-glob: "npm:^4.0.3" @@ -1805,34 +1805,34 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10/307080e29c22fc69f0ce7ab7101e1629e05f45a9e541c250e03d06b61336ab0ccb5f0a7354ee3da4e38d5cade4dd2fb7bb396cd7cbe74c2c4b3e29706a70abcc + checksum: 10/7dfc6fc70ff00875728ce5d85a3c5d6cb01435082b20ff9301ebe4d8e4a31a0c997282c762c636937bd66a40b4e0154e2ce98f85d888a6c46d433e9a24c46c4c languageName: node linkType: hard -"@typescript-eslint/utils@npm:7.0.2": - version: 7.0.2 - resolution: "@typescript-eslint/utils@npm:7.0.2" +"@typescript-eslint/utils@npm:7.1.0": + version: 7.1.0 + resolution: "@typescript-eslint/utils@npm:7.1.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" "@types/json-schema": "npm:^7.0.12" "@types/semver": "npm:^7.5.0" - "@typescript-eslint/scope-manager": "npm:7.0.2" - "@typescript-eslint/types": "npm:7.0.2" - "@typescript-eslint/typescript-estree": "npm:7.0.2" + "@typescript-eslint/scope-manager": "npm:7.1.0" + "@typescript-eslint/types": "npm:7.1.0" + "@typescript-eslint/typescript-estree": "npm:7.1.0" semver: "npm:^7.5.4" peerDependencies: eslint: ^8.56.0 - checksum: 10/e68bac777419cd529371f7f29f534efaeca130c90ed9723bfc7aac451d61ca3fc4ebd310e2c015e29e8dc7be4734ae46258ca8755897d7f5e3bb502660d5372f + checksum: 10/26d64094d8b828ce6cfea660c95cdbd4d0193d338646fc773312093388bc781653fc1ca16977b3be5288579fe43f14c7108fc431da66dd95b6ed680ad44712a0 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:7.0.2": - version: 7.0.2 - resolution: "@typescript-eslint/visitor-keys@npm:7.0.2" +"@typescript-eslint/visitor-keys@npm:7.1.0": + version: 7.1.0 + resolution: "@typescript-eslint/visitor-keys@npm:7.1.0" dependencies: - "@typescript-eslint/types": "npm:7.0.2" + "@typescript-eslint/types": "npm:7.1.0" eslint-visitor-keys: "npm:^3.4.1" - checksum: 10/da6c1b0729af99216cde3a65d4e91584a81fc6c9dff7ba291089f01bf7262de375f58c4c4246e5fbc29f51258db7725d9c830f82ccbd1cda812fd13c51480cda + checksum: 10/c3e98ebf166fd1854adb0e9599dc108cdbbd95f6eb099d31deae2fd1d4df8fcd8dc9c24ad4f509b961ad900b474c246f6b4b228b5711cc504106c3e0f751a11c languageName: node linkType: hard @@ -1848,8 +1848,8 @@ __metadata: resolution: "EMS-ESP@workspace:." dependencies: "@alova/adapter-xhr": "npm:^1.0.3" - "@babel/core": "npm:^7.23.9" - "@emotion/react": "npm:^11.11.3" + "@babel/core": "npm:^7.24.0" + "@emotion/react": "npm:^11.11.4" "@emotion/styled": "npm:^11.11.0" "@mui/icons-material": "npm:^5.15.11" "@mui/material": "npm:^5.15.11" @@ -1858,12 +1858,12 @@ __metadata: "@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.58" + "@types/node": "npm:^20.11.23" + "@types/react": "npm:^18.2.61" "@types/react-dom": "npm:^18.2.19" "@types/react-router-dom": "npm:^5.3.3" - "@typescript-eslint/eslint-plugin": "npm:^7.0.2" - "@typescript-eslint/parser": "npm:^7.0.2" + "@typescript-eslint/eslint-plugin": "npm:^7.1.0" + "@typescript-eslint/parser": "npm:^7.1.0" alova: "npm:^2.17.0" async-validator: "npm:^4.2.5" concurrently: "npm:^8.2.2" @@ -1886,7 +1886,7 @@ __metadata: react-dom: "npm:latest" react-dropzone: "npm:^14.2.3" react-icons: "npm:^5.0.1" - react-router-dom: "npm:^6.22.1" + react-router-dom: "npm:^6.22.2" react-toastify: "npm:^10.0.4" rollup-plugin-visualizer: "npm:^5.12.0" sockette: "npm:^2.0.6" @@ -7192,27 +7192,27 @@ __metadata: languageName: node linkType: hard -"react-router-dom@npm:^6.22.1": - version: 6.22.1 - resolution: "react-router-dom@npm:6.22.1" +"react-router-dom@npm:^6.22.2": + version: 6.22.2 + resolution: "react-router-dom@npm:6.22.2" dependencies: - "@remix-run/router": "npm:1.15.1" - react-router: "npm:6.22.1" + "@remix-run/router": "npm:1.15.2" + react-router: "npm:6.22.2" peerDependencies: react: ">=16.8" react-dom: ">=16.8" - checksum: 10/73ab964083bb407773a5c4ca61249ed6b0a1b47fa58c39afca08a361eb25b349be2bcbaf6d89e112b020f6e55e40e62689c9fe2beae524030ce5ccede3c7d9e3 + checksum: 10/1469ea32fd5b35d44909c8e64a778620e990b43a1c6f4d5989630e769a9956e0057a54771ccde2e434a9aff7591c02752dcfe0678a1868d4e53411cec7ecf7a8 languageName: node linkType: hard -"react-router@npm:6.22.1": - version: 6.22.1 - resolution: "react-router@npm:6.22.1" +"react-router@npm:6.22.2": + version: 6.22.2 + resolution: "react-router@npm:6.22.2" dependencies: - "@remix-run/router": "npm:1.15.1" + "@remix-run/router": "npm:1.15.2" peerDependencies: react: ">=16.8" - checksum: 10/f6e814b8e3005f16a5fb0e831f0e4352076cde65ab25448d56dba87a43fd3e102f55f9b366bdf1fbd8136fc1dc141bcec8d6b85d45f309e89180fb50f173744d + checksum: 10/744c9c3d3b6f3d031ef8c34d86f16075f96d4487584f2a526f722bc5b05c5879fc5056236b824472530fc5aad0ecf6eef88d2848d5b1a32aab9849bda3a5c839 languageName: node linkType: hard diff --git a/lib/framework/MqttSettingsService.cpp b/lib/framework/MqttSettingsService.cpp index 136ea1139..aed23ebc1 100644 --- a/lib/framework/MqttSettingsService.cpp +++ b/lib/framework/MqttSettingsService.cpp @@ -39,7 +39,7 @@ void MqttSettingsService::startClient() { delete _mqttClient; _mqttClient = nullptr; } -#if CONFIG_IDF_TARGET_ESP32S3 +#ifndef TASMOTA_SDK if (_state.enableTLS) { isSecure = true; _mqttClient = new espMqttClientSecure(espMqttClientTypes::UseInternalTask::NO); @@ -92,7 +92,7 @@ const char * MqttSettingsService::getClientId() { } void MqttSettingsService::setWill(const char * topic) { -#if CONFIG_IDF_TARGET_ESP32S3 +#ifndef TASMOTA_SDK if (_state.enableTLS) { static_cast(_mqttClient)->setWill(topic, 1, true, "offline"); return; @@ -178,7 +178,7 @@ bool MqttSettingsService::configureMqtt() { // only connect if WiFi is connected and MQTT is enabled if (_state.enabled && emsesp::EMSESP::system_.network_connected() && !_state.host.isEmpty()) { _reconfigureMqtt = false; -#if CONFIG_IDF_TARGET_ESP32S3 +#ifndef TASMOTA_SDK if (_state.enableTLS) { #if EMSESP_DEBUG emsesp::EMSESP::logger().debug("Start secure MQTT with rootCA"); @@ -208,11 +208,9 @@ bool MqttSettingsService::configureMqtt() { } void MqttSettings::read(MqttSettings & settings, JsonObject root) { -#if CONFIG_IDF_TARGET_ESP32S3 #ifndef TASMOTA_SDK root["enableTLS"] = settings.enableTLS; root["rootCA"] = settings.rootCA; -#endif #endif root["enabled"] = settings.enabled; root["host"] = settings.host; @@ -248,11 +246,11 @@ StateUpdateResult MqttSettings::update(JsonObject root, MqttSettings & settings) MqttSettings newSettings = {}; bool changed = false; -#if CONFIG_IDF_TARGET_ESP32S3 #ifndef TASMOTA_SDK newSettings.enableTLS = root["enableTLS"] | false; newSettings.rootCA = root["rootCA"] | ""; -#endif +#else + newSettings.enableTLS = false; #endif newSettings.enabled = root["enabled"] | FACTORY_MQTT_ENABLED; newSettings.host = root["host"] | FACTORY_MQTT_HOST; @@ -374,7 +372,7 @@ StateUpdateResult MqttSettings::update(JsonObject root, MqttSettings & settings) emsesp::EMSESP::mqtt_.set_publish_time_heartbeat(newSettings.publish_time_heartbeat); } -#if CONFIG_IDF_TARGET_ESP32S3 +#ifndef TASMOTA_SDK // strip down to certificate only newSettings.rootCA.replace("\r", ""); newSettings.rootCA.replace("\n", ""); diff --git a/lib/framework/NetworkSettingsService.cpp b/lib/framework/NetworkSettingsService.cpp index 90b25d396..eea7b5e43 100644 --- a/lib/framework/NetworkSettingsService.cpp +++ b/lib/framework/NetworkSettingsService.cpp @@ -70,6 +70,9 @@ void NetworkSettingsService::manageSTA() { // Connect or reconnect as required if ((WiFi.getMode() & WIFI_STA) == 0) { +#ifdef TASMOTA_SDK + WiFi.enableIPv6(_state.enableIPv6); +#endif if (_state.staticIPConfig) { WiFi.config(_state.localIP, _state.gatewayIP, _state.subnetMask, _state.dnsIP1, _state.dnsIP2); // configure for static IP } @@ -388,13 +391,15 @@ void NetworkSettings::read(NetworkSettings & settings, JsonObject root) { root["password"] = settings.password; root["hostname"] = settings.hostname; root["static_ip_config"] = settings.staticIPConfig; - root["enableIPv6"] = settings.enableIPv6; root["bandwidth20"] = settings.bandwidth20; root["nosleep"] = settings.nosleep; root["enableMDNS"] = settings.enableMDNS; root["enableCORS"] = settings.enableCORS; root["CORSOrigin"] = settings.CORSOrigin; root["tx_power"] = settings.tx_power; +#ifndef TASMOTA_SDK + root["enableIPv6"] = settings.enableIPv6; +#endif // extended settings JsonUtils::writeIP(root, "local_ip", settings.localIP); @@ -416,14 +421,17 @@ StateUpdateResult NetworkSettings::update(JsonObject root, NetworkSettings & set settings.password = root["password"] | FACTORY_WIFI_PASSWORD; settings.hostname = root["hostname"] | FACTORY_WIFI_HOSTNAME; settings.staticIPConfig = root["static_ip_config"] | false; - settings.enableIPv6 = root["enableIPv6"] | false; settings.bandwidth20 = root["bandwidth20"] | false; settings.tx_power = static_cast(root["tx_power"] | 0); settings.nosleep = root["nosleep"] | false; settings.enableMDNS = root["enableMDNS"] | true; settings.enableCORS = root["enableCORS"] | false; settings.CORSOrigin = root["CORSOrigin"] | "*"; - +#ifdef TASMOTA_SDK + settings.enableIPv6 = true; +#else + settings.enableIPv6 = root["enableIPv6"] | false; +#endif // extended settings JsonUtils::readIP(root, "local_ip", settings.localIP); JsonUtils::readIP(root, "gateway_ip", settings.gatewayIP); diff --git a/lib/framework/NetworkStatus.cpp b/lib/framework/NetworkStatus.cpp index 27c37cee7..bccdcf20a 100644 --- a/lib/framework/NetworkStatus.cpp +++ b/lib/framework/NetworkStatus.cpp @@ -1,6 +1,9 @@ #include "NetworkStatus.h" #include "../../src/emsesp_stub.hpp" +#ifdef TASMOTA_SDK +#include "lwip/dns.h" +#endif NetworkStatus::NetworkStatus(AsyncWebServer * server, SecurityManager * securityManager) { server->on(NETWORK_STATUS_SERVICE_PATH, @@ -32,8 +35,13 @@ void NetworkStatus::networkStatus(AsyncWebServerRequest * request) { root["mac_address"] = ETH.macAddress(); root["subnet_mask"] = ETH.subnetMask().toString(); root["gateway_ip"] = ETH.gatewayIP().toString(); - IPAddress dnsIP1 = ETH.dnsIP(0); - IPAddress dnsIP2 = ETH.dnsIP(1); +#ifdef TASMOTA_SDK + IPAddress dnsIP1 = IPAddress(dns_getserver(0)); + IPAddress dnsIP2 = IPAddress(dns_getserver(1)); +#else + IPAddress dnsIP1 = ETH.dnsIP(0); + IPAddress dnsIP2 = ETH.dnsIP(1); +#endif if (IPUtils::isSet(dnsIP1)) { root["dns_ip_1"] = dnsIP1.toString(); } @@ -54,8 +62,13 @@ void NetworkStatus::networkStatus(AsyncWebServerRequest * request) { root["gateway_ip"] = WiFi.gatewayIP().toString(); } +#ifdef TASMOTA_SDK + IPAddress dnsIP1 = IPAddress(dns_getserver(0)); + IPAddress dnsIP2 = IPAddress(dns_getserver(1)); +#else IPAddress dnsIP1 = WiFi.dnsIP(0); IPAddress dnsIP2 = WiFi.dnsIP(1); +#endif if (dnsIP1 != INADDR_NONE) { root["dns_ip_1"] = dnsIP1.toString(); } diff --git a/platformio.ini b/platformio.ini index b8b634186..669c6bcb7 100644 --- a/platformio.ini +++ b/platformio.ini @@ -97,19 +97,15 @@ build_flags = ${espressi32_base.build_flags} '-DEMSESP_DEFAULT_BOARD_PROFILE="S32S3"' -[env:ci_s3_32M] +[env:ci_16M] 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} +board = esp32dev +board_build.partitions = esp32_partition_16M.csv +board_build.extra_flags = -DBOARD_HAS_PSRAM build_flags = ${espressi32_base.build_flags} - '-DEMSESP_DEFAULT_BOARD_PROFILE="S32S3"' + '-DEMSESP_DEFAULT_BOARD_PROFILE="E32V2"' [env:esp32_4M] extends = espressi32_base_tasmota @@ -126,7 +122,7 @@ board_upload.flash_size = 4MB board_build.partitions = esp32_asym_partition_4M.csv [env:esp32_16M] -extends = espressi32_base_tasmota +extends = espressi32_base board = esp32dev board_build.extra_flags = -DBOARD_HAS_PSRAM board_upload.flash_size = 16MB @@ -174,6 +170,19 @@ build_flags = ${espressi32_base.build_flags} '-DEMSESP_DEFAULT_BOARD_PROFILE="S32S3"' +[env:esp32_s3_32M] +extends = espressi32_base +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"' + ; to build and run: pio run -e standalone -t exec [env:standalone] platform = native diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index 2d9d54519..f2d561610 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -64,6 +64,7 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const register_telegram_type(0xE6, "UBAParametersPlus", true, MAKE_PF_CB(process_UBAParametersPlus)); register_telegram_type(0xE9, "UBAMonitorWWPlus", false, MAKE_PF_CB(process_UBAMonitorWWPlus)); register_telegram_type(0xEA, "UBAParameterWWPlus", true, MAKE_PF_CB(process_UBAParameterWWPlus)); + register_telegram_type(0x28, "WeatherComp", true, MAKE_PF_CB(process_WeatherComp)); } if (model() == EMSdevice::EMS_DEVICE_FLAG_HEATPUMP) { @@ -241,6 +242,16 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const MAKE_CF_CB(set_hyst2_off), 0, 20); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &curveOn_, DeviceValueType::BOOL, FL_(curveOn), DeviceValueUOM::NONE, MAKE_CF_CB(set_curveOn)); + register_device_value( + DeviceValueTAG::TAG_DEVICE_DATA, &curveBase_, DeviceValueType::UINT, FL_(curveBase), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_curveBase), 20, 90); + register_device_value( + DeviceValueTAG::TAG_DEVICE_DATA, &curveEnd_, DeviceValueType::UINT, FL_(curveEnd), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_curveEnd), 20, 90); + register_device_value( + DeviceValueTAG::TAG_DEVICE_DATA, &summerTemp_, DeviceValueType::UINT, FL_(summertemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_summerTemp), 0, 30); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nofrost_, DeviceValueType::BOOL, FL_(nofrostmode), DeviceValueUOM::NONE, MAKE_CF_CB(set_nofrost)); + register_device_value( + DeviceValueTAG::TAG_DEVICE_DATA, &nofrostTemp_, DeviceValueType::UINT, FL_(nofrosttemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_nofrostTemp), 0, 10); } register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &heatingActivated_, @@ -2023,6 +2034,17 @@ void Boiler::process_HIUSettings(std::shared_ptr telegram) { has_update(telegram, setReturnTemp_, 2); } +// Weather compensation, #1642 +// boiler(0x08) -W-> Me(0x0B), ?(0x28), data: 00 3C 32 10 00 05 +void Boiler::process_WeatherComp(std::shared_ptr telegram) { + has_update(telegram, curveOn_, 0); + has_update(telegram, curveEnd_, 1); + has_update(telegram, curveBase_, 2); + has_update(telegram, summerTemp_, 3); + has_update(telegram, nofrost_, 4); + has_update(telegram, nofrostTemp_, 5); +} + // HIU Settings bool Boiler::set_keepWarmTemp(const char * value, const int8_t id) { int v; @@ -3167,4 +3189,58 @@ bool Boiler::set_nomPower(const char * value, const int8_t id) { return true; } +bool Boiler::set_curveOn(const char * value, const int8_t id) { + bool v; + if (Helpers::value2bool(value, v)) { + write_command(0x28, 0, v ? 0xFF : 0); + return true; + } + return false; +} + +bool Boiler::set_curveBase(const char * value, const int8_t id) { + int v; + if (!Helpers::value2temperature(value, v)) { + return false; + } + write_command(0x28, 2, v); + return true; +} + +bool Boiler::set_curveEnd(const char * value, const int8_t id) { + int v; + if (!Helpers::value2temperature(value, v)) { + return false; + } + write_command(0x28, 1, v); + return true; +} + +bool Boiler::set_summerTemp(const char * value, const int8_t id) { + int v; + if (!Helpers::value2temperature(value, v)) { + return false; + } + write_command(0x28, 3, v); + return true; +} + +bool Boiler::set_nofrost(const char * value, const int8_t id) { + bool v; + if (Helpers::value2bool(value, v)) { + write_command(0x28, 4, v ? 0xFF : 0); + return true; + } + return false; +} + +bool Boiler::set_nofrostTemp(const char * value, const int8_t id) { + int v; + if (!Helpers::value2temperature(value, v)) { + return false; + } + write_command(0x28, 5, v); + return true; +} + } // namespace emsesp diff --git a/src/devices/boiler.h b/src/devices/boiler.h index c047f1231..074d0ba4b 100644 --- a/src/devices/boiler.h +++ b/src/devices/boiler.h @@ -155,6 +155,14 @@ class Boiler : public EMSdevice { uint16_t headertemp_; // see #1317 uint16_t heatblock_; // see #1317 + // weather compensation, see #1642 + uint8_t curveOn_; + uint8_t curveBase_; + uint8_t curveEnd_; + uint8_t summerTemp_; + uint8_t nofrost_; + uint8_t nofrostTemp_; + // info uint32_t upTimeTotal_; // Operating time uint32_t upTimeControl_; // Operating time control @@ -355,6 +363,7 @@ class Boiler : public EMSdevice { void process_HpSettings3(std::shared_ptr telegram); void process_HpEnergy(std::shared_ptr telegram); void process_HpMeters(std::shared_ptr telegram); + void process_WeatherComp(std::shared_ptr telegram); // HIU void process_HIUSettings(std::shared_ptr telegram); void process_HIUMonitor(std::shared_ptr telegram); @@ -536,6 +545,12 @@ class Boiler : public EMSdevice { bool set_delayBoiler(const char * value, const int8_t id); bool set_tempDiffBoiler(const char * value, const int8_t id); */ + bool set_curveOn(const char * value, const int8_t id); + bool set_curveBase(const char * value, const int8_t id); + bool set_curveEnd(const char * value, const int8_t id); + bool set_summerTemp(const char * value, const int8_t id); + bool set_nofrost(const char * value, const int8_t id); + bool set_nofrostTemp(const char * value, const int8_t id); bool set_nrgHeat(const char * value, const int8_t id); bool set_nrgWw(const char * value, const int8_t id); diff --git a/src/locale_translations.h b/src/locale_translations.h index 366f076d3..8f139147f 100644 --- a/src/locale_translations.h +++ b/src/locale_translations.h @@ -352,6 +352,10 @@ MAKE_TRANSLATION(pumpMode, "pumpmode", "boiler pump mode", "Kesselpumpen Modus", MAKE_TRANSLATION(headertemp, "headertemp", "low loss header", "Hydr. Weiche", "open verdeler", "", "sprzęgło hydrauliczne", "", "bouteille de déc. hydr.", "isı bloğu gidiş suyu sıc.", "comp. idr.", "nízkostratová hlavica") // TODO translate MAKE_TRANSLATION(heatblock, "heatblock", "heating block", "Wärmezelle", "Aanvoertemp. warmtecel", "", "blok grzewczy", "", "départ corps de chauffe", "Hid.denge kabı sıcaklığı", "mandata scamb. pr.", "vykurovací blok") // TODO translate +MAKE_TRANSLATION(curveOn, "curveon", "heatingcurve on", "Heizkurve an", "", "", "", "", "", "", "", "") // TODO translate +MAKE_TRANSLATION(curveBase, "curvebase", "heatingcurve base", "Heizkurve Basis", "", "", "", "", "", "", "", "") // TODO translate +MAKE_TRANSLATION(curveEnd, "curveend", "heatingcurve end", "Heizkurve Ende", "", "", "", "", "", "", "", "") // TODO translate + // heatpump/compress specific MAKE_TRANSLATION(upTimeTotal, "uptimetotal", "heatpump total uptime", "Wärmpepumpe Gesamtbetriebszeit", "", "", "łączny czas pracy pompy ciepła", "", "", "", "", "celková doba prevádzky tepelného čerpadla") // TODO translate MAKE_TRANSLATION(upTimeControl, "uptimecontrol", "total operating time heat", "Betriebszeit Heizen gesamt", "Totale bedrijfstijd", "Total tid uppvärmning", "łączny czas generowania ciepła", "total driftstid", "durée totale de fonctionnement chauffage", "ısınma toplam işletme süresi", "Tempo di funzionamento totale riscaldamento", "celkový prevádzkový čas tepla") diff --git a/src/uart/emsuart_esp32.cpp b/src/uart/emsuart_esp32.cpp index e1284d2c3..84d61a57f 100644 --- a/src/uart/emsuart_esp32.cpp +++ b/src/uart/emsuart_esp32.cpp @@ -47,8 +47,9 @@ 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_BREAK) { - length += event.size ? event.size - 1 : 0; + if (event.type == UART_DATA) { + length += event.size; + } else if (event.type == UART_BREAK) { if (length == 2 || (length >= 6 && length <= EMS_MAXBUFFERSIZE)) { uart_read_bytes(EMSUART_NUM, telegram, length, portMAX_DELAY); EMSESP::incoming_telegram(telegram, (uint8_t)(length - 1)); @@ -57,8 +58,6 @@ void EMSuart::uart_event_task(void * pvParameters) { 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;