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 = () => {
+
+
}
@@ -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 50a7f2d7e..669c6bcb7 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -51,7 +51,7 @@ extra_scripts =
[espressi32_base_tasmota]
; use Tasmota's library which removes some unused libs (like mbedtsl, so no WiFi_secure.h) and increases available heap
; Tasmota Arduino Core 2.0.14 with IPv6 support, based on IDF 4.4.6
-platform = https://github.com/tasmota/platform-espressif32/releases/download/2024.01.00/platform-espressif32.zip
+platform = https://github.com/tasmota/platform-espressif32/releases/download/2024.01.01/platform-espressif32.zip
; Tasmota Arduino Core 3.0.0-alpha based on IDF v5.1.2
; platform = https://github.com/tasmota/platform-espressif32/releases/download/2024.02.10/platform-espressif32.zip
framework = arduino
@@ -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")