Merge pull request #3215 from proddy/dev

Network optimizations
This commit is contained in:
Proddy
2026-09-03 21:08:11 +02:00
committed by GitHub
16 changed files with 258 additions and 173 deletions
+2
View File
@@ -12,6 +12,7 @@ This release is based on the latest Espressif/Arduino core version 3. It brings
- Commands Service that can be called via MQTT or API or used in the Scheduler Service
- option to disable factory reset [#3150](https://github.com/emsesp/EMS-ESP32/issues/3150)
- TLS support with 4MB boards without PSRAM
- added eth_10mbit to Network Settings, which forces 10BASE-T half-duplex & autonegotiation off, halving the PHYs power draw. Its off by default as it will cause issues on managed switches with a port forced to 100Mb [#3213](https://github.com/emsesp/EMS-ESP32/pull/3213)
## Fixed
@@ -36,4 +37,5 @@ This release is based on the latest Espressif/Arduino core version 3. It brings
- changes to the Dialogs in Dashboard page, removed the run icon in the Commands page. Renamed Execute to Run.
- set `None` for undefined values in HA `val_tpl`
- changes in WebUI - remove multiple calls systemInfo endpoint, Vewrsion pages checks for internet connection [#3195](https://github.com/emsesp/EMS-ESP32/pull/3195)
- multiple optimization in network, power down WiFi when Ethernet and WiFi nosleep is instant when selected [#3213](https://github.com/emsesp/EMS-ESP32/pull/3213)
+2 -1
View File
@@ -16,7 +16,8 @@
"enableMDNS": true,
"enableCORS": false,
"CORSOrigin": "*",
"tx_power": 0
"tx_power": 0,
"eth_10mbit": false
},
"AP": {
"provision_mode": 2,
+3 -3
View File
@@ -42,7 +42,7 @@
"@eslint/js": "^10.0.1",
"@preact/preset-vite": "^2.10.6",
"@trivago/prettier-plugin-sort-imports": "^6.0.2",
"@types/node": "^26.4.0",
"@types/node": "^26.4.1",
"@types/react": "^19.2.18",
"@types/react-dom": "^19.2.5",
"concurrently": "^10.0.5",
@@ -54,9 +54,9 @@
"rollup-plugin-visualizer": "^7.1.1",
"terser": "^5.51.2",
"typescript": "^6.0.3",
"typescript-eslint": "^8.68.0",
"typescript-eslint": "^8.69.0",
"vite": "^8.2.2",
"vite-plugin-imagemin": "^0.6.1"
},
"packageManager": "pnpm@11.24.0+sha512.bd27e345e976dcb0be0b7a1228217b049a817e21b1f355c90dbe7dc46671895a8bc1e6d06c24554505ea93ea0b45f489a27ec1bfbc8de6a9659fca0f16fa0000"
"packageManager": "pnpm@11.25.0+sha512.5cde925b4f075f725eb71fbae18a42ffe784524789f19b61c731cb8721ec28aaee160e01a8d5af4fedb2a42cdbf300efe23db356b0d4a17b4d63e11f8ab7c956"
}
+98 -98
View File
@@ -56,13 +56,13 @@ importers:
version: 10.0.1(eslint@10.9.1(supports-color@10.2.2))
'@preact/preset-vite':
specifier: ^2.10.6
version: 2.10.6(@babel/core@7.29.7(supports-color@10.2.2))(preact@10.29.8)(supports-color@10.2.2)(vite@8.2.2(@types/node@26.4.0)(terser@5.51.2))
version: 2.10.6(@babel/core@7.29.7(supports-color@10.2.2))(preact@10.29.8)(supports-color@10.2.2)(vite@8.2.2(@types/node@26.4.1)(terser@5.51.2))
'@trivago/prettier-plugin-sort-imports':
specifier: ^6.0.2
version: 6.0.2(prettier@3.9.6)(supports-color@10.2.2)
'@types/node':
specifier: ^26.4.0
version: 26.4.0
specifier: ^26.4.1
version: 26.4.1
'@types/react':
specifier: ^19.2.18
version: 19.2.18
@@ -97,14 +97,14 @@ importers:
specifier: ^6.0.3
version: 6.0.3
typescript-eslint:
specifier: ^8.68.0
version: 8.68.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
specifier: ^8.69.0
version: 8.69.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
vite:
specifier: ^8.2.2
version: 8.2.2(@types/node@26.4.0)(terser@5.51.2)
version: 8.2.2(@types/node@26.4.1)(terser@5.51.2)
vite-plugin-imagemin:
specifier: ^0.6.1
version: 0.6.1(supports-color@10.2.2)(vite@8.2.2(@types/node@26.4.0)(terser@5.51.2))
version: 0.6.1(supports-color@10.2.2)(vite@8.2.2(@types/node@26.4.1)(terser@5.51.2))
packages:
@@ -668,8 +668,8 @@ packages:
resolution: {integrity: sha512-zmPitbQ8+6zNutpwgcQuLcsEpn/Cj54Kbn7L5pX0Os5kdWplB7xPgEh/g+SWOB/qmows2gpuCaPyduq8ZZRnxA==}
deprecated: This is a stub types definition. minimatch provides its own type definitions, so you do not need this installed.
'@types/node@26.4.0':
resolution: {integrity: sha512-faiGnoIrLH/V8cibOMEAZ8pMw6oXqSukl29ra4mN8GdaB2ZewzeaLj+INpV5N+Z1eKWzY+IzaIZH2EIR6YZRNQ==}
'@types/node@26.4.1':
resolution: {integrity: sha512-k97ENvZWtvA6yqz5/FS6a7duDgOPEeOQOc2iKS/nY6mX6qJUKtLnWzQS+Xj6tXweyj6ZcTAK2Qecetnvi9nCLA==}
'@types/parse-json@4.0.2':
resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==}
@@ -696,63 +696,63 @@ packages:
'@types/svgo@2.6.4':
resolution: {integrity: sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==}
'@typescript-eslint/eslint-plugin@8.68.0':
resolution: {integrity: sha512-WASHDpCm6qO5jj9g1a+8NiW5+GCkAyLReR56/4VruYmNgfUmqpxOfZ2Yfb8xGfJPWv5Qi6LSD8sXdces3vbp/Q==}
'@typescript-eslint/eslint-plugin@8.69.0':
resolution: {integrity: sha512-t5jQTKPIgVW1PE6dR6H6Qz5gm8zjMlX5/2gRaOGd9eO6V7J+tQc6iWKukEe7dY8u9HyYasQ0yfF0/FSSTEO2gA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
'@typescript-eslint/parser': ^8.68.0
'@typescript-eslint/parser': ^8.69.0
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.1.0'
'@typescript-eslint/parser@8.68.0':
resolution: {integrity: sha512-fHq2VC1kpyYfvEcbiMjOpySY4WS7voEp89yAThrHRX5sm9j2lzYppCb2umFMEed4fWcyeLjHxrz0mpjNBaBxMQ==}
'@typescript-eslint/parser@8.69.0':
resolution: {integrity: sha512-l4b0DhWioGg6Gt2ebGlvfkFMOjRsauxtsnDRwUSRX1qHq3HdTfQHV8wW9zEXeciai6HfeaKOedQn2Zoofx3WBw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.1.0'
'@typescript-eslint/project-service@8.68.0':
resolution: {integrity: sha512-5GQtWZCXFcFYux955pvoS02WLc49pXNlvIxocKjS0clvwo3in1RdlzVKyiqQH9vE5AKWFLTaUgeQkOrTS+0Qxw==}
'@typescript-eslint/project-service@8.69.0':
resolution: {integrity: sha512-yi4obFrHMmnsesWehHbkg9zMA7Jt8cXT+mKM08G999pH1yT6nqgsHx7MYm0uY1wAj8CqiBXYRJ7WAT0QdQHQXg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.1.0'
'@typescript-eslint/scope-manager@8.68.0':
resolution: {integrity: sha512-T5eXpcaJNg8bhjHJ8Rjp68Vq/QBteYtTKY8TZqVNPaUbuz0f6jI9t6aDkylwvalpAB9XTTFeFOjrjXAZ3YvmVA==}
'@typescript-eslint/scope-manager@8.69.0':
resolution: {integrity: sha512-ewfspqWvSxKSOaplqAUNbaSFO0eB6w1EtQ+esfYFRm3614Ty4uNtExkcbgd6nWsXphbqKyf9ZYdbZdv2xEoWEQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/tsconfig-utils@8.68.0':
resolution: {integrity: sha512-F7zrGQfiJHojPwi8vhxZQC1tWtJzvL74cK/nqri2lk8YUXvYaYwl263xOJ69jDWPUk1hmcdoayFwk9lX09npVw==}
'@typescript-eslint/tsconfig-utils@8.69.0':
resolution: {integrity: sha512-xNqK7YTDZsLniQMV/4rpFR8Z5JlqeRvVjuG1YgF/mdPVH84HSD19L8CczMA0qg2RfwEV231GHH3VnToJDo4MfQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.1.0'
'@typescript-eslint/type-utils@8.68.0':
resolution: {integrity: sha512-X77zqoY1EjeWGs/0JNxeaMfp5C5lIz4Tw8y66F1Ne8Faq6g424sBNYM6xBAqElfGZPLpWS+CZAp0DXyKDzWiHg==}
'@typescript-eslint/type-utils@8.69.0':
resolution: {integrity: sha512-ZfoJAVg3JZndQEpEl9petVlxau3lRuElc4HRMuAlLCf8to04/iHz692RUSNmXKDjEuJmIL+KZ2/BsOcBc16dsA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.1.0'
'@typescript-eslint/types@8.68.0':
resolution: {integrity: sha512-9RnpsGJjrAllCMefGVVsImJM24YurhC0Q1h4UbvivtvOqXmR/vEJge2OoE++z9m6hyg8T1Q8t5SNT6tHSbrxcg==}
'@typescript-eslint/types@8.69.0':
resolution: {integrity: sha512-K3VrubUPhlo9VDBS6QdI8YB5j7ClpqLRdefcz6PFrhnwicehBweqQ9Evhl4l+FYz0HdDmMqIiSX0aldGRYtDCA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/typescript-estree@8.68.0':
resolution: {integrity: sha512-OKKsD0tYmoNiU5PW2zehO1yO56jYOm1ShYlxon/Z0SJNidAkdVg86eg9ruRuoXf8xfnuWZGbwDsStkoXbZtIIA==}
'@typescript-eslint/typescript-estree@8.69.0':
resolution: {integrity: sha512-AdFkgqck3Vudb/kWnxlyafU/4aBhHrbQ9locP2N4psXTy5mOBg0SHJumnLvx7r6g1gV4DKvUFwV2nJZBoqOD8w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.1.0'
'@typescript-eslint/utils@8.68.0':
resolution: {integrity: sha512-PB5gJMMOg0Q5P1tsgWtEAqQacJXq0qEqRHDX/YJ4FaTMLfZPpHB3gjl2EJuiZyPABxmj4ZQYiY9m1bdAJ5y7tQ==}
'@typescript-eslint/utils@8.69.0':
resolution: {integrity: sha512-tUbx60BBqQa31kXF5MCsOOLL5E/WzUuxIn7YpAvq+eaUlqvk8/NXnXMBNAdLCr0icjkzem7iUA5QqWHe/hJ1aw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.1.0'
'@typescript-eslint/visitor-keys@8.68.0':
resolution: {integrity: sha512-YR65gGdGvTUAWLldC3xLOvOzamdGzB4A5/N8rehEaHs3Zvoe39BhgY+u0SPch1OvrVTfLcc55wsSgK2NcnTS/A==}
'@typescript-eslint/visitor-keys@8.69.0':
resolution: {integrity: sha512-+rmdgPA+EXkNgKYvHvFfhrs35utXbwaC5PGpDquSXcoXQDKUA5UjV0LmTucG/4JXkM31BTu4TilHtrN8IVBe8w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
acorn-jsx@5.3.2:
@@ -1689,8 +1689,8 @@ packages:
resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
engines: {node: '>= 4'}
ignore@7.0.6:
resolution: {integrity: sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==}
ignore@7.0.8:
resolution: {integrity: sha512-YYNsSlXBjMk92SKnkwvB5LOVSa6OznlFUGcsvrFgNJbJCd0M1XKeFVRc8ZByeCqz32FivYNHJVooLmdqrmvp/Q==}
engines: {node: '>= 4'}
imagemin-gifsicle@7.0.0:
@@ -2816,8 +2816,8 @@ packages:
peerDependencies:
typescript: '>=3.5.1'
typescript-eslint@8.68.0:
resolution: {integrity: sha512-MHy0Y0ynqeEbx/S45+i/bBssdy3X6KNBfmJAP35GrgtNxu2TQ5K5xsFDhAnmsq1jvpdoZOPG1LGtJo0HWqYCrQ==}
typescript-eslint@8.69.0:
resolution: {integrity: sha512-B3MltX0VqjUBNEe3b3sSuiRbfa6XrfHFtBiPamjT5AsW/dfq+y+bc0wyuS9DxAS1LyzCxRp2+rxzpLUvqM2BvA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
@@ -2988,8 +2988,8 @@ packages:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}
zimmerframe@1.1.4:
resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==}
zimmerframe@1.1.5:
resolution: {integrity: sha512-msJxIvYDYcoNL+PJsu+7qmpDWsYmAxTY+2TNYXXF0hzBzBk0BMecOqDOG/EckUoKCuKwObfbugIl8QpqHDXeFA==}
snapshots:
@@ -3394,20 +3394,20 @@ snapshots:
'@popperjs/core@2.11.8': {}
'@preact/preset-vite@2.10.6(@babel/core@7.29.7(supports-color@10.2.2))(preact@10.29.8)(supports-color@10.2.2)(vite@8.2.2(@types/node@26.4.0)(terser@5.51.2))':
'@preact/preset-vite@2.10.6(@babel/core@7.29.7(supports-color@10.2.2))(preact@10.29.8)(supports-color@10.2.2)(vite@8.2.2(@types/node@26.4.1)(terser@5.51.2))':
dependencies:
'@babel/core': 7.29.7(supports-color@10.2.2)
'@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2)
'@babel/plugin-transform-react-jsx-development': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2)
'@prefresh/vite': 2.4.12(preact@10.29.8)(supports-color@10.2.2)(vite@8.2.2(@types/node@26.4.0)(terser@5.51.2))
'@prefresh/vite': 2.4.12(preact@10.29.8)(supports-color@10.2.2)(vite@8.2.2(@types/node@26.4.1)(terser@5.51.2))
'@rollup/pluginutils': 5.4.0
babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.29.7(supports-color@10.2.2))
debug: 4.4.3(supports-color@10.2.2)
magic-string: 0.30.21
picocolors: 1.1.1
vite: 8.2.2(@types/node@26.4.0)(terser@5.51.2)
vite-prerender-plugin: 0.5.13(vite@8.2.2(@types/node@26.4.0)(terser@5.51.2))
zimmerframe: 1.1.4
vite: 8.2.2(@types/node@26.4.1)(terser@5.51.2)
vite-prerender-plugin: 0.5.13(vite@8.2.2(@types/node@26.4.1)(terser@5.51.2))
zimmerframe: 1.1.5
transitivePeerDependencies:
- preact
- rollup
@@ -3421,7 +3421,7 @@ snapshots:
'@prefresh/utils@1.2.1': {}
'@prefresh/vite@2.4.12(preact@10.29.8)(supports-color@10.2.2)(vite@8.2.2(@types/node@26.4.0)(terser@5.51.2))':
'@prefresh/vite@2.4.12(preact@10.29.8)(supports-color@10.2.2)(vite@8.2.2(@types/node@26.4.1)(terser@5.51.2))':
dependencies:
'@babel/core': 7.29.7(supports-color@10.2.2)
'@prefresh/babel-plugin': 0.5.3
@@ -3429,7 +3429,7 @@ snapshots:
'@prefresh/utils': 1.2.1
'@rollup/pluginutils': 4.2.1
preact: 10.29.8
vite: 8.2.2(@types/node@26.4.0)(terser@5.51.2)
vite: 8.2.2(@types/node@26.4.1)(terser@5.51.2)
transitivePeerDependencies:
- supports-color
@@ -3523,7 +3523,7 @@ snapshots:
'@types/glob@7.2.0':
dependencies:
'@types/minimatch': 6.0.0
'@types/node': 26.4.0
'@types/node': 26.4.1
'@types/imagemin-gifsicle@7.0.4':
dependencies:
@@ -3552,23 +3552,23 @@ snapshots:
'@types/imagemin@7.0.1':
dependencies:
'@types/node': 26.4.0
'@types/node': 26.4.1
'@types/imagemin@9.0.1':
dependencies:
'@types/node': 26.4.0
'@types/node': 26.4.1
'@types/json-schema@7.0.15': {}
'@types/keyv@3.1.4':
dependencies:
'@types/node': 26.4.0
'@types/node': 26.4.1
'@types/minimatch@6.0.0':
dependencies:
minimatch: 10.2.6
'@types/node@26.4.0':
'@types/node@26.4.1':
dependencies:
undici-types: 8.3.0
@@ -3590,63 +3590,63 @@ snapshots:
'@types/responselike@1.0.3':
dependencies:
'@types/node': 26.4.0
'@types/node': 26.4.1
'@types/svgo@2.6.4':
dependencies:
'@types/node': 26.4.0
'@types/node': 26.4.1
'@typescript-eslint/eslint-plugin@8.68.0(@typescript-eslint/parser@8.68.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3))(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)':
'@typescript-eslint/eslint-plugin@8.69.0(@typescript-eslint/parser@8.69.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3))(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)':
dependencies:
'@eslint-community/regexpp': 4.12.2
'@typescript-eslint/parser': 8.68.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
'@typescript-eslint/scope-manager': 8.68.0
'@typescript-eslint/type-utils': 8.68.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
'@typescript-eslint/utils': 8.68.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
'@typescript-eslint/visitor-keys': 8.68.0
'@typescript-eslint/parser': 8.69.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
'@typescript-eslint/scope-manager': 8.69.0
'@typescript-eslint/type-utils': 8.69.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
'@typescript-eslint/utils': 8.69.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
'@typescript-eslint/visitor-keys': 8.69.0
eslint: 10.9.1(supports-color@10.2.2)
ignore: 7.0.6
ignore: 7.0.8
natural-compare: 1.4.0
ts-api-utils: 2.5.0(typescript@6.0.3)
typescript: 6.0.3
transitivePeerDependencies:
- supports-color
'@typescript-eslint/parser@8.68.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)':
'@typescript-eslint/parser@8.69.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)':
dependencies:
'@typescript-eslint/scope-manager': 8.68.0
'@typescript-eslint/types': 8.68.0
'@typescript-eslint/typescript-estree': 8.68.0(supports-color@10.2.2)(typescript@6.0.3)
'@typescript-eslint/visitor-keys': 8.68.0
'@typescript-eslint/scope-manager': 8.69.0
'@typescript-eslint/types': 8.69.0
'@typescript-eslint/typescript-estree': 8.69.0(supports-color@10.2.2)(typescript@6.0.3)
'@typescript-eslint/visitor-keys': 8.69.0
debug: 4.4.3(supports-color@10.2.2)
eslint: 10.9.1(supports-color@10.2.2)
typescript: 6.0.3
transitivePeerDependencies:
- supports-color
'@typescript-eslint/project-service@8.68.0(supports-color@10.2.2)(typescript@6.0.3)':
'@typescript-eslint/project-service@8.69.0(supports-color@10.2.2)(typescript@6.0.3)':
dependencies:
'@typescript-eslint/tsconfig-utils': 8.68.0(typescript@6.0.3)
'@typescript-eslint/types': 8.68.0
'@typescript-eslint/tsconfig-utils': 8.69.0(typescript@6.0.3)
'@typescript-eslint/types': 8.69.0
debug: 4.4.3(supports-color@10.2.2)
typescript: 6.0.3
transitivePeerDependencies:
- supports-color
'@typescript-eslint/scope-manager@8.68.0':
'@typescript-eslint/scope-manager@8.69.0':
dependencies:
'@typescript-eslint/types': 8.68.0
'@typescript-eslint/visitor-keys': 8.68.0
'@typescript-eslint/types': 8.69.0
'@typescript-eslint/visitor-keys': 8.69.0
'@typescript-eslint/tsconfig-utils@8.68.0(typescript@6.0.3)':
'@typescript-eslint/tsconfig-utils@8.69.0(typescript@6.0.3)':
dependencies:
typescript: 6.0.3
'@typescript-eslint/type-utils@8.68.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)':
'@typescript-eslint/type-utils@8.69.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)':
dependencies:
'@typescript-eslint/types': 8.68.0
'@typescript-eslint/typescript-estree': 8.68.0(supports-color@10.2.2)(typescript@6.0.3)
'@typescript-eslint/utils': 8.68.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
'@typescript-eslint/types': 8.69.0
'@typescript-eslint/typescript-estree': 8.69.0(supports-color@10.2.2)(typescript@6.0.3)
'@typescript-eslint/utils': 8.69.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
debug: 4.4.3(supports-color@10.2.2)
eslint: 10.9.1(supports-color@10.2.2)
ts-api-utils: 2.5.0(typescript@6.0.3)
@@ -3654,14 +3654,14 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@typescript-eslint/types@8.68.0': {}
'@typescript-eslint/types@8.69.0': {}
'@typescript-eslint/typescript-estree@8.68.0(supports-color@10.2.2)(typescript@6.0.3)':
'@typescript-eslint/typescript-estree@8.69.0(supports-color@10.2.2)(typescript@6.0.3)':
dependencies:
'@typescript-eslint/project-service': 8.68.0(supports-color@10.2.2)(typescript@6.0.3)
'@typescript-eslint/tsconfig-utils': 8.68.0(typescript@6.0.3)
'@typescript-eslint/types': 8.68.0
'@typescript-eslint/visitor-keys': 8.68.0
'@typescript-eslint/project-service': 8.69.0(supports-color@10.2.2)(typescript@6.0.3)
'@typescript-eslint/tsconfig-utils': 8.69.0(typescript@6.0.3)
'@typescript-eslint/types': 8.69.0
'@typescript-eslint/visitor-keys': 8.69.0
debug: 4.4.3(supports-color@10.2.2)
minimatch: 10.2.6
semver: 7.8.5
@@ -3671,20 +3671,20 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@typescript-eslint/utils@8.68.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)':
'@typescript-eslint/utils@8.69.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)':
dependencies:
'@eslint-community/eslint-utils': 4.10.1(eslint@10.9.1(supports-color@10.2.2))
'@typescript-eslint/scope-manager': 8.68.0
'@typescript-eslint/types': 8.68.0
'@typescript-eslint/typescript-estree': 8.68.0(supports-color@10.2.2)(typescript@6.0.3)
'@typescript-eslint/scope-manager': 8.69.0
'@typescript-eslint/types': 8.69.0
'@typescript-eslint/typescript-estree': 8.69.0(supports-color@10.2.2)(typescript@6.0.3)
eslint: 10.9.1(supports-color@10.2.2)
typescript: 6.0.3
transitivePeerDependencies:
- supports-color
'@typescript-eslint/visitor-keys@8.68.0':
'@typescript-eslint/visitor-keys@8.69.0':
dependencies:
'@typescript-eslint/types': 8.68.0
'@typescript-eslint/types': 8.69.0
eslint-visitor-keys: 5.0.1
acorn-jsx@5.3.2(acorn@8.18.0):
@@ -4707,7 +4707,7 @@ snapshots:
ignore@5.3.2: {}
ignore@7.0.6: {}
ignore@7.0.8: {}
imagemin-gifsicle@7.0.0:
dependencies:
@@ -5724,12 +5724,12 @@ snapshots:
dependencies:
typescript: 6.0.3
typescript-eslint@8.68.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3):
typescript-eslint@8.69.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3):
dependencies:
'@typescript-eslint/eslint-plugin': 8.68.0(@typescript-eslint/parser@8.68.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3))(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
'@typescript-eslint/parser': 8.68.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
'@typescript-eslint/typescript-estree': 8.68.0(supports-color@10.2.2)(typescript@6.0.3)
'@typescript-eslint/utils': 8.68.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
'@typescript-eslint/eslint-plugin': 8.69.0(@typescript-eslint/parser@8.69.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3))(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
'@typescript-eslint/parser': 8.69.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
'@typescript-eslint/typescript-estree': 8.69.0(supports-color@10.2.2)(typescript@6.0.3)
'@typescript-eslint/utils': 8.69.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
eslint: 10.9.1(supports-color@10.2.2)
typescript: 6.0.3
transitivePeerDependencies:
@@ -5775,7 +5775,7 @@ snapshots:
spdx-correct: 3.2.0
spdx-expression-parse: 3.0.1
vite-plugin-imagemin@0.6.1(supports-color@10.2.2)(vite@8.2.2(@types/node@26.4.0)(terser@5.51.2)):
vite-plugin-imagemin@0.6.1(supports-color@10.2.2)(vite@8.2.2(@types/node@26.4.1)(terser@5.51.2)):
dependencies:
'@types/imagemin': 7.0.1
'@types/imagemin-gifsicle': 7.0.4
@@ -5800,11 +5800,11 @@ snapshots:
imagemin-webp: 6.1.0
jpegtran-bin: 6.0.1
pathe: 0.2.0
vite: 8.2.2(@types/node@26.4.0)(terser@5.51.2)
vite: 8.2.2(@types/node@26.4.1)(terser@5.51.2)
transitivePeerDependencies:
- supports-color
vite-prerender-plugin@0.5.13(vite@8.2.2(@types/node@26.4.0)(terser@5.51.2)):
vite-prerender-plugin@0.5.13(vite@8.2.2(@types/node@26.4.1)(terser@5.51.2)):
dependencies:
kolorist: 1.8.0
magic-string: 0.30.21
@@ -5812,9 +5812,9 @@ snapshots:
simple-code-frame: 1.3.0
source-map: 0.7.6
stack-trace: 1.0.0
vite: 8.2.2(@types/node@26.4.0)(terser@5.51.2)
vite: 8.2.2(@types/node@26.4.1)(terser@5.51.2)
vite@8.2.2(@types/node@26.4.0)(terser@5.51.2):
vite@8.2.2(@types/node@26.4.1)(terser@5.51.2):
dependencies:
lightningcss: 1.33.0
picomatch: 4.0.7
@@ -5822,7 +5822,7 @@ snapshots:
rolldown: 1.2.6
tinyglobby: 0.2.17
optionalDependencies:
'@types/node': 26.4.0
'@types/node': 26.4.1
fsevents: 2.3.3
terser: 5.51.2
@@ -5896,4 +5896,4 @@ snapshots:
yocto-queue@0.1.0: {}
zimmerframe@1.1.4: {}
zimmerframe@1.1.5: {}
@@ -22,6 +22,7 @@ import {
import * as NetworkApi from 'api/network';
import { API } from 'api/app';
import { readSystemStatus } from 'api/system';
import { updateState, useRequest } from 'alova/client';
import type { APIcall } from 'app/main/types';
@@ -50,6 +51,8 @@ import { isNetworkOpen, networkSecurityMode } from './WiFiNetworkSelector';
const NetworkSettings = () => {
const { LL } = useI18nContext();
const { data: hardwareData } = useRequest(readSystemStatus);
const { selectedNetwork, deselectNetwork } = useContext(WiFiConnectionContext);
const [initialized, setInitialized] = useState(false);
@@ -92,7 +95,8 @@ const NetworkSettings = () => {
nosleep: true,
enableMDNS: true,
enableCORS: false,
CORSOrigin: '*'
CORSOrigin: '*',
eth_10mbit: current_data ? current_data.eth_10mbit : false
})
);
}
@@ -136,7 +140,7 @@ const NetworkSettings = () => {
};
const content = () => {
if (!data) {
if (!data || !hardwareData) {
return <FormLoader onRetry={loadData} errorMessage={errorMessage || ''} />;
}
@@ -246,6 +250,23 @@ const NetworkSettings = () => {
}
label={LL.NETWORK_LOW_BAND()}
/>
{hardwareData.esp_platform === 'ESP32' && (
<>
<Typography sx={{ pt: 2 }} variant="h6" color="primary">
Ethernet
</Typography>
<BlockFormControlLabel
control={
<Checkbox
name="eth_10mbit"
checked={data.eth_10mbit}
onChange={updateFormValue}
/>
}
label="Force 10Mbit half-duplex"
/>
</>
)}
<Typography sx={{ pt: 2 }} variant="h6" color="primary">
{LL.GENERAL_OPTIONS()}
</Typography>
+1
View File
@@ -54,6 +54,7 @@ export interface NetworkSettingsType {
enableMDNS: boolean;
enableCORS: boolean;
CORSOrigin: string;
eth_10mbit: boolean;
[key: string]: unknown;
}
+1
View File
@@ -31,6 +31,7 @@ class DummySettings {
// SYSTEM
bool bandwidth20 = false;
bool nosleep = true;
bool eth_10mbit = false;
// MQTT
uint16_t publish_time = 10;
+1 -1
View File
@@ -18,5 +18,5 @@
"@trivago/prettier-plugin-sort-imports": "^6.0.2",
"prettier": "^3.9.6"
},
"packageManager": "pnpm@11.24.0+sha512.bd27e345e976dcb0be0b7a1228217b049a817e21b1f355c90dbe7dc46671895a8bc1e6d06c24554505ea93ea0b45f489a27ec1bfbc8de6a9659fca0f16fa0000"
"packageManager": "pnpm@11.25.0+sha512.5cde925b4f075f725eb71fbae18a42ffe784524789f19b61c731cb8721ec28aaee160e01a8d5af4fedb2a42cdbf300efe23db356b0d4a17b4d63e11f8ab7c956"
}
+5 -4
View File
@@ -95,9 +95,9 @@ let system_status = {
// network_status: 10, // ethernet connected
// network_status: 6, // wifi disconnected
wifi_rssi: -41,
esp_platform: 'ESP32S3',
esp_platform: 'ESP32',
build_flags: 'DEMO',
cpu_type: 'ESP32-S3',
cpu_type: 'ESP32',
cpu_rev: 0,
cpu_cores: 2,
cpu_freq_mhz: 240,
@@ -202,8 +202,8 @@ system_status.partitions[0].version = THIS_VERSION; // app0
// set the ESP platform - using ESP32 will disable OTA and automatic version downloading
let emulate_esp: string;
emulate_esp = 'ESP32S3';
// emulate_esp = 'ESP32';
// emulate_esp = 'ESP32S3';
emulate_esp = 'ESP32';
switch (emulate_esp) {
// ESP32 4MB
@@ -582,6 +582,7 @@ let network_settings = {
enableMDNS: true,
enableCORS: false,
CORSOrigin: '*',
eth_10mbit: false,
local_ip: '',
gateway_ip: '',
subnet_mask: '',
+2
View File
@@ -1346,3 +1346,5 @@ eraseap
roomtempoffset
dhcpc
wifioff
autonegotiation
Mbit
@@ -24,6 +24,7 @@ void NetworkSettings::read(NetworkSettings & settings, JsonObject root) {
root["enableCORS"] = settings.enableCORS;
root["CORSOrigin"] = settings.CORSOrigin;
root["tx_power"] = settings.tx_power;
root["eth_10mbit"] = settings.eth_10mbit;
// extended settings
JsonUtils::writeIP(root, "local_ip", settings.localIP);
@@ -51,6 +52,7 @@ StateUpdateResult NetworkSettings::update(JsonObject root, NetworkSettings & set
settings.enableMDNS = root["enableMDNS"] | true;
settings.enableCORS = root["enableCORS"];
settings.CORSOrigin = root["CORSOrigin"] | "*";
settings.eth_10mbit = root["eth_10mbit"];
// extended settings
JsonUtils::readIP(root, "local_ip", settings.localIP);
+1
View File
@@ -39,6 +39,7 @@ class NetworkSettings {
bool enableMDNS = true;
bool enableCORS = false;
String CORSOrigin = "*";
bool eth_10mbit = false; // force 10BASE-T half-duplex, no auto-negotiation
// optional configuration for static IP address
IPAddress localIP;
+3
View File
@@ -28,4 +28,7 @@ void setup() {
void loop() {
application.loop();
#ifndef EMSESP_STANDALONE
delay(1); // block for a tick so the idle task gets to run and the core can clock-gate
#endif
}
+90 -44
View File
@@ -49,9 +49,10 @@ void Network::begin() {
nosleep_ = settings.nosleep;
tx_power_ = settings.tx_power;
bssid_ = settings.bssid;
eth_10mbit_ = settings.eth_10mbit;
});
// read Ethernet settings
// read Ethernet hardware settings
EMSESP::webSettingsService.read([&](WebSettings & settings) {
phy_type_ = settings.phy_type;
eth_power_ = settings.eth_power;
@@ -78,39 +79,16 @@ void Network::begin() {
phase_ = initialPhase();
// Initialise WiFi once when the Network service starts.
// persistent(false) keeps credentials in RAM so we don't auto-join leftover NVS config.
WiFi.persistent(false);
WiFi.setAutoReconnect(false);
WiFi.mode(WIFI_STA);
startWiFiRadio();
// Keep the radio up. disconnect(wifioff=true) maps to STA.end() -> esp_wifi_stop()
if (WiFi.STA.started()) {
WiFi.disconnect(false, true); // drop leftover association, wipe RAM config
#if CONFIG_IDF_TARGET_ESP32
// Ethernet is switched off but the board still has a PHY wired up. Hold its power/oscillator
// enable low so an unused LAN8720 isn't left clocked and burning current for the whole uptime.
if (phy_type_ == PHY_type::PHY_TYPE_NONE && eth_power_ != -1) {
pinMode(eth_power_, OUTPUT);
digitalWrite(eth_power_, LOW);
}
WiFi.setScanMethod(WIFI_ALL_CHANNEL_SCAN);
WiFi.setHostname(hostname_.c_str()); // updates shared default_hostname buffer
WiFi.enableSTA(true); // no-op if already STA; recreates netif after a full off
WiFi.STA.setHostname(hostname_.c_str()); // pushes to esp_netif_set_hostname
WiFi.enableIPv6(true);
if (staticIPConfig_) {
WiFi.config(localIP_, gatewayIP_, subnetMask_, dnsIP1_, dnsIP2_); // configure for static IP
}
// www.esp32.com/viewtopic.php?t=12055
if (bandwidth20_) {
esp_wifi_set_bandwidth(static_cast<wifi_interface_t>(ESP_IF_WIFI_STA), WIFI_BW_HT20);
} else {
esp_wifi_set_bandwidth(static_cast<wifi_interface_t>(ESP_IF_WIFI_STA), WIFI_BW_HT40);
}
if (nosleep_) {
WiFi.setSleep(false); // turn off sleep - WIFI_PS_NONE
}
// scan settings give connect issues since arduino 2.0.14 and arduino 3.x.x with some wifi systems
// WiFi.setScanMethod(WIFI_ALL_CHANNEL_SCAN); // default is FAST_SCAN
// WiFi.setSortMethod(WIFI_CONNECT_AP_BY_SIGNAL); // is default, no need to set
#endif
// avoid duplicate registration, so register the lambdas only once across the lifetime of this Network instance
if (!wifi_events_registered_) {
@@ -326,6 +304,10 @@ void Network::checkConnection() {
network_iface_ = NetIface::NONE;
if (lost_iface == NetIface::ETHERNET) {
LOG_WARNING("Ethernet connection lost");
// restore the radio now so the WiFi and AP fallbacks have something to work with
if (wifi_radio_off_) {
startWiFiRadio();
}
return;
}
begin();
@@ -502,6 +484,59 @@ const char * Network::disconnectReason([[maybe_unused]] uint8_t code) {
return "";
}
// Bring up the STA interface and apply all the radio-level settings to it
// Safe to call repeatedly - enableSTA() is a no-op when the STA is already running, and recreates the netif after stopWiFiRadio() has torn it down
void Network::startWiFiRadio() {
#ifndef EMSESP_STANDALONE
WiFi.persistent(false); // keep credentials in RAM so we don't auto-join leftover NVS config
WiFi.setAutoReconnect(false);
WiFi.mode(WIFI_STA);
// Keep the radio up. disconnect(wifioff=true) maps to STA.end() -> esp_wifi_stop()
if (WiFi.STA.started()) {
WiFi.disconnect(false, true); // drop leftover association, wipe RAM config
}
// scan settings give connect issues since arduino 2.0.14 and arduino 3.x.x with some wifi systems
WiFi.setScanMethod(WIFI_ALL_CHANNEL_SCAN); // default is FAST_SCAN
WiFi.setHostname(hostname_.c_str()); // updates shared default_hostname buffer
WiFi.enableSTA(true); // no-op if already STA; recreates netif after a full off
WiFi.STA.setHostname(hostname_.c_str()); // pushes to esp_netif_set_hostname
WiFi.enableIPv6(true);
if (staticIPConfig_) {
WiFi.config(localIP_, gatewayIP_, subnetMask_, dnsIP1_, dnsIP2_); // configure for static IP
}
// www.esp32.com/viewtopic.php?t=12055
if (bandwidth20_) {
esp_wifi_set_bandwidth(static_cast<wifi_interface_t>(ESP_IF_WIFI_STA), WIFI_BW_HT20);
} else {
esp_wifi_set_bandwidth(static_cast<wifi_interface_t>(ESP_IF_WIFI_STA), WIFI_BW_HT40);
}
if (nosleep_) {
WiFi.setSleep(false); // turn off sleep - WIFI_PS_NONE
} else {
WiFi.setSleep(true); // WIFI_PS_MIN_MODEM
}
wifi_radio_off_ = false;
#endif
}
// Power down the WiFi radio completely (esp_wifi_stop), used when Ethernet is carrying the traffic.
// An idle STA still keeps the receiver powered. It also unloads the driver's DMA buffer pool of around 20KB
void Network::stopWiFiRadio() {
#ifndef EMSESP_STANDALONE
if (wifi_radio_off_) {
return;
}
WiFi.mode(WIFI_OFF);
wifi_radio_off_ = true;
wifi_connect_pending_ = false;
LOG_DEBUG("Powering down WiFi radio, Ethernet is active");
#endif
}
// WiFi management
void Network::startWIFI() {
#ifndef EMSESP_STANDALONE
@@ -510,6 +545,11 @@ void Network::startWIFI() {
return;
}
// the radio was powered down while Ethernet was up, so bring it back before trying to associate
if (wifi_radio_off_) {
startWiFiRadio();
}
// exit if WiFi or Ethernet is already connected, or if we have no SSID or another Wifi.begin() is already in progress
if (WiFi.isConnected() || ssid_.isEmpty() || ethernet_connected() || wifi_connect_pending_) {
return;
@@ -529,14 +569,7 @@ void Network::startWIFI() {
}
#if CONFIG_IDF_TARGET_ESP32 && !defined(EMSESP_STANDALONE)
// Unlike WiFi, which stamps the hostname onto the STA netif as it is created, the Arduino ETH class
// leaves it unset, so lwIP falls back to CONFIG_LWIP_LOCAL_HOSTNAME ("tasmota" in the SDK we build
// against). esp_eth_start() polls the PHY synchronously, so on a warm reboot where the link never
// dropped the DHCP DISCOVER can go out before ETH.begin() has even returned. This handler is
// registered ahead of the esp_netif glue and therefore runs first, applying the hostname before the
// netif is handed to lwIP.
static char eth_hostname[33] = {0};
static void ethApplyHostname(void * /*arg*/, esp_event_base_t /*base*/, int32_t /*event_id*/, void * /*event_data*/) {
if (eth_hostname[0] != '\0' && ETH.netif() != nullptr) {
esp_netif_set_hostname(ETH.netif(), eth_hostname);
@@ -555,11 +588,7 @@ void Network::startEthernet() {
return;
}
// The driver is installed once and then left alone. Re-running the bring-up on a live interface
// tears it down behind our back: pinMode() on the PHY power pin hands the pin from the Ethernet
// bus back to GPIO, which fires the peripheral manager's deinit callback and calls ETH.end(),
// destroying the netif, its event group and the event handlers from the main loop task while the
// arduino_events task may be dispatching a link-up on the other core.
// Ensure the Ethernet driver is installed once and then left alone
if (ethernet_started_ || ethernet_connect_pending_ || ethernet_connected()) {
return;
}
@@ -610,6 +639,13 @@ void Network::startEthernet() {
eth_hostname_handler_registered_ = true;
}
// Forcing 10BASE-T roughly halves the PHY's power draw
if (eth_10mbit_) {
ETH.setAutoNegotiation(false);
ETH.setLinkSpeed(10);
ETH.setFullDuplex(false);
}
if (ETH.begin(type, eth_phy_addr_, 23, 18, eth_power_, (eth_clock_mode_t)eth_clock_mode_)) {
// LOG_DEBUG("Ethernet module found - initialising");
ethernet_started_ = true;
@@ -739,6 +775,11 @@ void Network::findNetworks() {
stopAP();
}
// Ethernet is carrying the traffic so the STA is dead weight - shut the radio down.
if (network_iface_ == NetIface::ETHERNET) {
stopWiFiRadio();
}
// count the number of restarts (for Wifi and Eth)
if (juststopped_) {
juststopped_ = false;
@@ -823,6 +864,11 @@ void Network::startAP() {
return;
}
// the AP needs the radio, which may have been powered down while Ethernet was up
if (wifi_radio_off_) {
startWiFiRadio();
}
if (!WiFi.softAPConfig(ap_localIP_, ap_gatewayIP_, ap_subnetMask_)) {
LOG_DEBUG("softAPConfig failed");
return;
+4
View File
@@ -186,6 +186,8 @@ class Network {
void startAP();
void startWIFI();
void startEthernet();
void startWiFiRadio();
void stopWiFiRadio();
void setWiFiPower(uint8_t tx_power);
const char * disconnectReason(uint8_t code);
void stopAP();
@@ -216,6 +218,7 @@ class Network {
bool ethernet_started_ = false; // ETH.begin() succeeded; the driver runs for the lifetime of the boot
bool wifi_ever_connected_ = false; // set true once we've successfully obtained an IP
bool ethernet_ever_connected_ = false; // set true once we've successfully obtained an IP
bool wifi_radio_off_ = false; // STA powered down because Ethernet is carrying the traffic
// Network and AP settings
bool enableMDNS_;
@@ -236,6 +239,7 @@ class Network {
int8_t eth_power_;
uint8_t eth_phy_addr_;
uint8_t eth_clock_mode_;
bool eth_10mbit_;
// AP settings
uint8_t ap_provisionMode_;
+1 -1
View File
@@ -1 +1 @@
#define EMSESP_APP_VERSION "3.9.0-dev.6"
#define EMSESP_APP_VERSION "3.9.0-dev.7"