18 Commits

Author SHA1 Message Date
Proddy
aa05e37fbb Merge pull request #2916 from proddy/dev
webUI changes and comments
2026-01-10 22:21:48 +01:00
Proddy
959a00c19a Merge branch 'emsesp:dev' into dev 2026-01-10 22:10:23 +01:00
Proddy
b42060be3a Merge pull request #2917 from MichaelDvP/dev 2026-01-10 20:23:37 +01:00
MichaelDvP
33bb433d7e always set valid gpio in load board profile 2026-01-10 19:47:03 +01:00
proddy
28a5d4ef1a fix comment 2026-01-10 19:00:15 +01:00
proddy
b78d47cbd0 minor ui change to how board profile is shown 2026-01-10 19:00:15 +01:00
proddy
8a7a1383a7 added comment reference to HA 2026-01-10 19:00:15 +01:00
Proddy
3f5163c1e4 Merge branch 'emsesp:dev' into dev 2026-01-10 18:39:48 +01:00
Proddy
fad82c8c68 Merge pull request #2915 from MichaelDvP/dev
fix board change ignore old gpio settings
2026-01-10 18:39:17 +01:00
MichaelDvP
6fc3bf30b6 HA uom L, formatting 2026-01-10 18:19:14 +01:00
proddy
43b3e74c08 input number format 2026-01-10 18:09:38 +01:00
proddy
64c9882d8c add children to avoid linting errors 2026-01-10 18:09:17 +01:00
proddy
a690510903 update 2026-01-10 18:09:02 +01:00
proddy
c732ec301a update 2026-01-10 18:08:54 +01:00
proddy
cc1f16596a add ha_number_node 2026-01-10 18:08:44 +01:00
proddy
66c74f85a4 formatting 2026-01-10 18:08:17 +01:00
proddy
db667b9437 package update 2026-01-10 18:08:06 +01:00
MichaelDvP
8799015f59 fix board change ignore old gpio settings 2026-01-10 16:06:43 +01:00
27 changed files with 219 additions and 200 deletions

View File

@@ -8,7 +8,7 @@ For more details go to [emsesp.org](https://emsesp.org/).
- update time saved in nvs - update time saved in nvs
- heatpump entities [#2883](https://github.com/emsesp/EMS-ESP32/issues/2883) - heatpump entities [#2883](https://github.com/emsesp/EMS-ESP32/issues/2883)
- HA number mode selectable box/slider (slider for max range 100) [#2900](https://github.com/emsesp/EMS-ESP32/discussions/2900) - HA input number format (mode) selectable box/slider (slider for max range 100) [#2900](https://github.com/emsesp/EMS-ESP32/discussions/2900)
## Fixed ## Fixed

View File

@@ -52,8 +52,8 @@
"@preact/compat": "^18.3.1", "@preact/compat": "^18.3.1",
"@preact/preset-vite": "^2.10.2", "@preact/preset-vite": "^2.10.2",
"@trivago/prettier-plugin-sort-imports": "^6.0.2", "@trivago/prettier-plugin-sort-imports": "^6.0.2",
"@types/node": "^25.0.3", "@types/node": "^25.0.5",
"@types/react": "^19.2.7", "@types/react": "^19.2.8",
"@types/react-dom": "^19.2.3", "@types/react-dom": "^19.2.3",
"axe-core": "^4.11.1", "axe-core": "^4.11.1",
"concurrently": "^9.2.1", "concurrently": "^9.2.1",
@@ -65,7 +65,7 @@
"typescript-eslint": "^8.52.0", "typescript-eslint": "^8.52.0",
"vite": "^7.3.1", "vite": "^7.3.1",
"vite-plugin-imagemin": "^0.6.1", "vite-plugin-imagemin": "^0.6.1",
"vite-tsconfig-paths": "^6.0.3" "vite-tsconfig-paths": "^6.0.4"
}, },
"packageManager": "pnpm@10.27.0+sha512.72d699da16b1179c14ba9e64dc71c9a40988cbdc65c264cb0e489db7de917f20dcf4d64d8723625f2969ba52d4b7e2a1170682d9ac2a5dcaeaab732b7e16f04a" "packageManager": "pnpm@10.28.0+sha512.05df71d1421f21399e053fde567cea34d446fa02c76571441bfc1c7956e98e363088982d940465fd34480d4d90a0668bc12362f8aa88000a64e83d0b0e47be48"
} }

174
interface/pnpm-lock.yaml generated
View File

@@ -13,22 +13,22 @@ importers:
version: 2.3.1(alova@3.4.1) version: 2.3.1(alova@3.4.1)
'@emotion/react': '@emotion/react':
specifier: ^11.14.0 specifier: ^11.14.0
version: 11.14.0(@types/react@19.2.7)(react@19.2.3) version: 11.14.0(@types/react@19.2.8)(react@19.2.3)
'@emotion/styled': '@emotion/styled':
specifier: ^11.14.1 specifier: ^11.14.1
version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3) version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.8)(react@19.2.3))(@types/react@19.2.8)(react@19.2.3)
'@mui/icons-material': '@mui/icons-material':
specifier: ^7.3.7 specifier: ^7.3.7
version: 7.3.7(@mui/material@7.3.7(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react@19.2.3) version: 7.3.7(@mui/material@7.3.7(@emotion/react@11.14.0(@types/react@19.2.8)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.8)(react@19.2.3))(@types/react@19.2.8)(react@19.2.3))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.8)(react@19.2.3)
'@mui/material': '@mui/material':
specifier: ^7.3.7 specifier: ^7.3.7
version: 7.3.7(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) version: 7.3.7(@emotion/react@11.14.0(@types/react@19.2.8)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.8)(react@19.2.3))(@types/react@19.2.8)(react@19.2.3))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
'@preact/compat': '@preact/compat':
specifier: ^18.3.1 specifier: ^18.3.1
version: 18.3.1(preact@10.28.2) version: 18.3.1(preact@10.28.2)
'@table-library/react-table-library': '@table-library/react-table-library':
specifier: 4.1.15 specifier: 4.1.15
version: 4.1.15(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3) version: 4.1.15(@emotion/react@11.14.0(@types/react@19.2.8)(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
alova: alova:
specifier: 3.4.1 specifier: 3.4.1
version: 3.4.1 version: 3.4.1
@@ -83,19 +83,19 @@ importers:
version: 9.39.2 version: 9.39.2
'@preact/preset-vite': '@preact/preset-vite':
specifier: ^2.10.2 specifier: ^2.10.2
version: 2.10.2(@babel/core@7.28.5)(preact@10.28.2)(vite@7.3.1(@types/node@25.0.3)(terser@5.44.1)) version: 2.10.2(@babel/core@7.28.5)(preact@10.28.2)(vite@7.3.1(@types/node@25.0.5)(terser@5.44.1))
'@trivago/prettier-plugin-sort-imports': '@trivago/prettier-plugin-sort-imports':
specifier: ^6.0.2 specifier: ^6.0.2
version: 6.0.2(prettier@3.7.4) version: 6.0.2(prettier@3.7.4)
'@types/node': '@types/node':
specifier: ^25.0.3 specifier: ^25.0.5
version: 25.0.3 version: 25.0.5
'@types/react': '@types/react':
specifier: ^19.2.7 specifier: ^19.2.8
version: 19.2.7 version: 19.2.8
'@types/react-dom': '@types/react-dom':
specifier: ^19.2.3 specifier: ^19.2.3
version: 19.2.3(@types/react@19.2.7) version: 19.2.3(@types/react@19.2.8)
axe-core: axe-core:
specifier: ^4.11.1 specifier: ^4.11.1
version: 4.11.1 version: 4.11.1
@@ -122,13 +122,13 @@ importers:
version: 8.52.0(eslint@9.39.2)(typescript@5.9.3) version: 8.52.0(eslint@9.39.2)(typescript@5.9.3)
vite: vite:
specifier: ^7.3.1 specifier: ^7.3.1
version: 7.3.1(@types/node@25.0.3)(terser@5.44.1) version: 7.3.1(@types/node@25.0.5)(terser@5.44.1)
vite-plugin-imagemin: vite-plugin-imagemin:
specifier: ^0.6.1 specifier: ^0.6.1
version: 0.6.1(vite@7.3.1(@types/node@25.0.3)(terser@5.44.1)) version: 0.6.1(vite@7.3.1(@types/node@25.0.5)(terser@5.44.1))
vite-tsconfig-paths: vite-tsconfig-paths:
specifier: ^6.0.3 specifier: ^6.0.4
version: 6.0.3(typescript@5.9.3)(vite@7.3.1(@types/node@25.0.3)(terser@5.44.1)) version: 6.0.4(typescript@5.9.3)(vite@7.3.1(@types/node@25.0.5)(terser@5.44.1))
packages: packages:
@@ -875,8 +875,8 @@ packages:
resolution: {integrity: sha512-zmPitbQ8+6zNutpwgcQuLcsEpn/Cj54Kbn7L5pX0Os5kdWplB7xPgEh/g+SWOB/qmows2gpuCaPyduq8ZZRnxA==} 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. deprecated: This is a stub types definition. minimatch provides its own type definitions, so you do not need this installed.
'@types/node@25.0.3': '@types/node@25.0.5':
resolution: {integrity: sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==} resolution: {integrity: sha512-FuLxeLuSVOqHPxSN1fkcD8DLU21gAP7nCKqGRJ/FglbCUBs0NYN6TpHcdmyLeh8C0KwGIaZQJSv+OYG+KZz+Gw==}
'@types/parse-json@4.0.2': '@types/parse-json@4.0.2':
resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==}
@@ -894,8 +894,8 @@ packages:
peerDependencies: peerDependencies:
'@types/react': '*' '@types/react': '*'
'@types/react@19.2.7': '@types/react@19.2.8':
resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==} resolution: {integrity: sha512-3MbSL37jEchWZz2p2mjntRZtPt837ij10ApxKfgmXCTuHWagYg7iA5bqPw6C8BMPfwidlvfPI/fxOc42HLhcyg==}
'@types/responselike@1.0.3': '@types/responselike@1.0.3':
resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==}
@@ -1042,8 +1042,8 @@ packages:
base64-js@1.5.1: base64-js@1.5.1:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
baseline-browser-mapping@2.9.12: baseline-browser-mapping@2.9.14:
resolution: {integrity: sha512-Mij6Lij93pTAIsSYy5cyBQ975Qh9uLEc5rwGTpomiZeXZL9yIS6uORJakb3ScHgfs0serMMfIbXzokPMuEiRyw==} resolution: {integrity: sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg==}
hasBin: true hasBin: true
bin-build@3.0.0: bin-build@3.0.0:
@@ -3003,8 +3003,8 @@ packages:
peerDependencies: peerDependencies:
vite: 5.x || 6.x || 7.x vite: 5.x || 6.x || 7.x
vite-tsconfig-paths@6.0.3: vite-tsconfig-paths@6.0.4:
resolution: {integrity: sha512-7bL7FPX/DSviaZGYUKowWF1AiDVWjMjxNbE8lyaVGDezkedWqfGhlnQ4BZXre0ZN5P4kAgIJfAlgFDVyjrCIyg==} resolution: {integrity: sha512-iIsEJ+ek5KqRTK17pmxtgIxXtqr3qDdE6OxrP9mVeGhVDNXRJTKN/l9oMbujTQNzMLe6XZ8qmpztfbkPu2TiFQ==}
peerDependencies: peerDependencies:
vite: '*' vite: '*'
peerDependenciesMeta: peerDependenciesMeta:
@@ -3280,7 +3280,7 @@ snapshots:
'@emotion/memoize@0.9.0': {} '@emotion/memoize@0.9.0': {}
'@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3)': '@emotion/react@11.14.0(@types/react@19.2.8)(react@19.2.3)':
dependencies: dependencies:
'@babel/runtime': 7.28.4 '@babel/runtime': 7.28.4
'@emotion/babel-plugin': 11.13.5 '@emotion/babel-plugin': 11.13.5
@@ -3292,7 +3292,7 @@ snapshots:
hoist-non-react-statics: 3.3.2 hoist-non-react-statics: 3.3.2
react: 19.2.3 react: 19.2.3
optionalDependencies: optionalDependencies:
'@types/react': 19.2.7 '@types/react': 19.2.8
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -3306,18 +3306,18 @@ snapshots:
'@emotion/sheet@1.4.0': {} '@emotion/sheet@1.4.0': {}
'@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3)': '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.8)(react@19.2.3))(@types/react@19.2.8)(react@19.2.3)':
dependencies: dependencies:
'@babel/runtime': 7.28.4 '@babel/runtime': 7.28.4
'@emotion/babel-plugin': 11.13.5 '@emotion/babel-plugin': 11.13.5
'@emotion/is-prop-valid': 1.4.0 '@emotion/is-prop-valid': 1.4.0
'@emotion/react': 11.14.0(@types/react@19.2.7)(react@19.2.3) '@emotion/react': 11.14.0(@types/react@19.2.8)(react@19.2.3)
'@emotion/serialize': 1.3.3 '@emotion/serialize': 1.3.3
'@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.2.3) '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.2.3)
'@emotion/utils': 1.4.2 '@emotion/utils': 1.4.2
react: 19.2.3 react: 19.2.3
optionalDependencies: optionalDependencies:
'@types/react': 19.2.7 '@types/react': 19.2.8
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -3501,23 +3501,23 @@ snapshots:
'@mui/core-downloads-tracker@7.3.7': {} '@mui/core-downloads-tracker@7.3.7': {}
'@mui/icons-material@7.3.7(@mui/material@7.3.7(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react@19.2.3)': '@mui/icons-material@7.3.7(@mui/material@7.3.7(@emotion/react@11.14.0(@types/react@19.2.8)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.8)(react@19.2.3))(@types/react@19.2.8)(react@19.2.3))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.8)(react@19.2.3)':
dependencies: dependencies:
'@babel/runtime': 7.28.4 '@babel/runtime': 7.28.4
'@mui/material': 7.3.7(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@mui/material': 7.3.7(@emotion/react@11.14.0(@types/react@19.2.8)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.8)(react@19.2.3))(@types/react@19.2.8)(react@19.2.3))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
react: 19.2.3 react: 19.2.3
optionalDependencies: optionalDependencies:
'@types/react': 19.2.7 '@types/react': 19.2.8
'@mui/material@7.3.7(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': '@mui/material@7.3.7(@emotion/react@11.14.0(@types/react@19.2.8)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.8)(react@19.2.3))(@types/react@19.2.8)(react@19.2.3))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
dependencies: dependencies:
'@babel/runtime': 7.28.4 '@babel/runtime': 7.28.4
'@mui/core-downloads-tracker': 7.3.7 '@mui/core-downloads-tracker': 7.3.7
'@mui/system': 7.3.7(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3) '@mui/system': 7.3.7(@emotion/react@11.14.0(@types/react@19.2.8)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.8)(react@19.2.3))(@types/react@19.2.8)(react@19.2.3))(@types/react@19.2.8)(react@19.2.3)
'@mui/types': 7.4.10(@types/react@19.2.7) '@mui/types': 7.4.10(@types/react@19.2.8)
'@mui/utils': 7.3.7(@types/react@19.2.7)(react@19.2.3) '@mui/utils': 7.3.7(@types/react@19.2.8)(react@19.2.3)
'@popperjs/core': 2.11.8 '@popperjs/core': 2.11.8
'@types/react-transition-group': 4.4.12(@types/react@19.2.7) '@types/react-transition-group': 4.4.12(@types/react@19.2.8)
clsx: 2.1.1 clsx: 2.1.1
csstype: 3.2.3 csstype: 3.2.3
prop-types: 15.8.1 prop-types: 15.8.1
@@ -3526,20 +3526,20 @@ snapshots:
react-is: 19.2.3 react-is: 19.2.3
react-transition-group: 4.4.5(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react-transition-group: 4.4.5(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
optionalDependencies: optionalDependencies:
'@emotion/react': 11.14.0(@types/react@19.2.7)(react@19.2.3) '@emotion/react': 11.14.0(@types/react@19.2.8)(react@19.2.3)
'@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3) '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.8)(react@19.2.3))(@types/react@19.2.8)(react@19.2.3)
'@types/react': 19.2.7 '@types/react': 19.2.8
'@mui/private-theming@7.3.7(@types/react@19.2.7)(react@19.2.3)': '@mui/private-theming@7.3.7(@types/react@19.2.8)(react@19.2.3)':
dependencies: dependencies:
'@babel/runtime': 7.28.4 '@babel/runtime': 7.28.4
'@mui/utils': 7.3.7(@types/react@19.2.7)(react@19.2.3) '@mui/utils': 7.3.7(@types/react@19.2.8)(react@19.2.3)
prop-types: 15.8.1 prop-types: 15.8.1
react: 19.2.3 react: 19.2.3
optionalDependencies: optionalDependencies:
'@types/react': 19.2.7 '@types/react': 19.2.8
'@mui/styled-engine@7.3.7(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)': '@mui/styled-engine@7.3.7(@emotion/react@11.14.0(@types/react@19.2.8)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.8)(react@19.2.3))(@types/react@19.2.8)(react@19.2.3))(react@19.2.3)':
dependencies: dependencies:
'@babel/runtime': 7.28.4 '@babel/runtime': 7.28.4
'@emotion/cache': 11.14.0 '@emotion/cache': 11.14.0
@@ -3549,42 +3549,42 @@ snapshots:
prop-types: 15.8.1 prop-types: 15.8.1
react: 19.2.3 react: 19.2.3
optionalDependencies: optionalDependencies:
'@emotion/react': 11.14.0(@types/react@19.2.7)(react@19.2.3) '@emotion/react': 11.14.0(@types/react@19.2.8)(react@19.2.3)
'@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3) '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.8)(react@19.2.3))(@types/react@19.2.8)(react@19.2.3)
'@mui/system@7.3.7(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3)': '@mui/system@7.3.7(@emotion/react@11.14.0(@types/react@19.2.8)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.8)(react@19.2.3))(@types/react@19.2.8)(react@19.2.3))(@types/react@19.2.8)(react@19.2.3)':
dependencies: dependencies:
'@babel/runtime': 7.28.4 '@babel/runtime': 7.28.4
'@mui/private-theming': 7.3.7(@types/react@19.2.7)(react@19.2.3) '@mui/private-theming': 7.3.7(@types/react@19.2.8)(react@19.2.3)
'@mui/styled-engine': 7.3.7(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) '@mui/styled-engine': 7.3.7(@emotion/react@11.14.0(@types/react@19.2.8)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.8)(react@19.2.3))(@types/react@19.2.8)(react@19.2.3))(react@19.2.3)
'@mui/types': 7.4.10(@types/react@19.2.7) '@mui/types': 7.4.10(@types/react@19.2.8)
'@mui/utils': 7.3.7(@types/react@19.2.7)(react@19.2.3) '@mui/utils': 7.3.7(@types/react@19.2.8)(react@19.2.3)
clsx: 2.1.1 clsx: 2.1.1
csstype: 3.2.3 csstype: 3.2.3
prop-types: 15.8.1 prop-types: 15.8.1
react: 19.2.3 react: 19.2.3
optionalDependencies: optionalDependencies:
'@emotion/react': 11.14.0(@types/react@19.2.7)(react@19.2.3) '@emotion/react': 11.14.0(@types/react@19.2.8)(react@19.2.3)
'@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3) '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.8)(react@19.2.3))(@types/react@19.2.8)(react@19.2.3)
'@types/react': 19.2.7 '@types/react': 19.2.8
'@mui/types@7.4.10(@types/react@19.2.7)': '@mui/types@7.4.10(@types/react@19.2.8)':
dependencies: dependencies:
'@babel/runtime': 7.28.4 '@babel/runtime': 7.28.4
optionalDependencies: optionalDependencies:
'@types/react': 19.2.7 '@types/react': 19.2.8
'@mui/utils@7.3.7(@types/react@19.2.7)(react@19.2.3)': '@mui/utils@7.3.7(@types/react@19.2.8)(react@19.2.3)':
dependencies: dependencies:
'@babel/runtime': 7.28.4 '@babel/runtime': 7.28.4
'@mui/types': 7.4.10(@types/react@19.2.7) '@mui/types': 7.4.10(@types/react@19.2.8)
'@types/prop-types': 15.7.15 '@types/prop-types': 15.7.15
clsx: 2.1.1 clsx: 2.1.1
prop-types: 15.8.1 prop-types: 15.8.1
react: 19.2.3 react: 19.2.3
react-is: 19.2.3 react-is: 19.2.3
optionalDependencies: optionalDependencies:
'@types/react': 19.2.7 '@types/react': 19.2.8
'@noble/hashes@1.8.0': {} '@noble/hashes@1.8.0': {}
@@ -3610,18 +3610,18 @@ snapshots:
dependencies: dependencies:
preact: 10.28.2 preact: 10.28.2
'@preact/preset-vite@2.10.2(@babel/core@7.28.5)(preact@10.28.2)(vite@7.3.1(@types/node@25.0.3)(terser@5.44.1))': '@preact/preset-vite@2.10.2(@babel/core@7.28.5)(preact@10.28.2)(vite@7.3.1(@types/node@25.0.5)(terser@5.44.1))':
dependencies: dependencies:
'@babel/core': 7.28.5 '@babel/core': 7.28.5
'@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.5) '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.5)
'@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.5) '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.5)
'@prefresh/vite': 2.4.11(preact@10.28.2)(vite@7.3.1(@types/node@25.0.3)(terser@5.44.1)) '@prefresh/vite': 2.4.11(preact@10.28.2)(vite@7.3.1(@types/node@25.0.5)(terser@5.44.1))
'@rollup/pluginutils': 4.2.1 '@rollup/pluginutils': 4.2.1
babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.28.5) babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.28.5)
debug: 4.4.3 debug: 4.4.3
picocolors: 1.1.1 picocolors: 1.1.1
vite: 7.3.1(@types/node@25.0.3)(terser@5.44.1) vite: 7.3.1(@types/node@25.0.5)(terser@5.44.1)
vite-prerender-plugin: 0.5.12(vite@7.3.1(@types/node@25.0.3)(terser@5.44.1)) vite-prerender-plugin: 0.5.12(vite@7.3.1(@types/node@25.0.5)(terser@5.44.1))
transitivePeerDependencies: transitivePeerDependencies:
- preact - preact
- supports-color - supports-color
@@ -3634,7 +3634,7 @@ snapshots:
'@prefresh/utils@1.2.1': {} '@prefresh/utils@1.2.1': {}
'@prefresh/vite@2.4.11(preact@10.28.2)(vite@7.3.1(@types/node@25.0.3)(terser@5.44.1))': '@prefresh/vite@2.4.11(preact@10.28.2)(vite@7.3.1(@types/node@25.0.5)(terser@5.44.1))':
dependencies: dependencies:
'@babel/core': 7.28.5 '@babel/core': 7.28.5
'@prefresh/babel-plugin': 0.5.2 '@prefresh/babel-plugin': 0.5.2
@@ -3642,7 +3642,7 @@ snapshots:
'@prefresh/utils': 1.2.1 '@prefresh/utils': 1.2.1
'@rollup/pluginutils': 4.2.1 '@rollup/pluginutils': 4.2.1
preact: 10.28.2 preact: 10.28.2
vite: 7.3.1(@types/node@25.0.3)(terser@5.44.1) vite: 7.3.1(@types/node@25.0.5)(terser@5.44.1)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -3728,9 +3728,9 @@ snapshots:
'@sindresorhus/is@0.7.0': {} '@sindresorhus/is@0.7.0': {}
'@table-library/react-table-library@4.1.15(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': '@table-library/react-table-library@4.1.15(@emotion/react@11.14.0(@types/react@19.2.8)(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
dependencies: dependencies:
'@emotion/react': 11.14.0(@types/react@19.2.7)(react@19.2.3) '@emotion/react': 11.14.0(@types/react@19.2.8)(react@19.2.3)
clsx: 1.1.1 clsx: 1.1.1
react: 19.2.3 react: 19.2.3
react-dom: 19.2.3(react@19.2.3) react-dom: 19.2.3(react@19.2.3)
@@ -3758,7 +3758,7 @@ snapshots:
'@types/glob@7.2.0': '@types/glob@7.2.0':
dependencies: dependencies:
'@types/minimatch': 6.0.0 '@types/minimatch': 6.0.0
'@types/node': 25.0.3 '@types/node': 25.0.5
'@types/imagemin-gifsicle@7.0.4': '@types/imagemin-gifsicle@7.0.4':
dependencies: dependencies:
@@ -3787,19 +3787,19 @@ snapshots:
'@types/imagemin@7.0.1': '@types/imagemin@7.0.1':
dependencies: dependencies:
'@types/node': 25.0.3 '@types/node': 25.0.5
'@types/json-schema@7.0.15': {} '@types/json-schema@7.0.15': {}
'@types/keyv@3.1.4': '@types/keyv@3.1.4':
dependencies: dependencies:
'@types/node': 25.0.3 '@types/node': 25.0.5
'@types/minimatch@6.0.0': '@types/minimatch@6.0.0':
dependencies: dependencies:
minimatch: 10.1.1 minimatch: 10.1.1
'@types/node@25.0.3': '@types/node@25.0.5':
dependencies: dependencies:
undici-types: 7.16.0 undici-types: 7.16.0
@@ -3807,25 +3807,25 @@ snapshots:
'@types/prop-types@15.7.15': {} '@types/prop-types@15.7.15': {}
'@types/react-dom@19.2.3(@types/react@19.2.7)': '@types/react-dom@19.2.3(@types/react@19.2.8)':
dependencies: dependencies:
'@types/react': 19.2.7 '@types/react': 19.2.8
'@types/react-transition-group@4.4.12(@types/react@19.2.7)': '@types/react-transition-group@4.4.12(@types/react@19.2.8)':
dependencies: dependencies:
'@types/react': 19.2.7 '@types/react': 19.2.8
'@types/react@19.2.7': '@types/react@19.2.8':
dependencies: dependencies:
csstype: 3.2.3 csstype: 3.2.3
'@types/responselike@1.0.3': '@types/responselike@1.0.3':
dependencies: dependencies:
'@types/node': 25.0.3 '@types/node': 25.0.5
'@types/svgo@2.6.4': '@types/svgo@2.6.4':
dependencies: dependencies:
'@types/node': 25.0.3 '@types/node': 25.0.5
'@typescript-eslint/eslint-plugin@8.52.0(@typescript-eslint/parser@8.52.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3)': '@typescript-eslint/eslint-plugin@8.52.0(@typescript-eslint/parser@8.52.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3)':
dependencies: dependencies:
@@ -3982,7 +3982,7 @@ snapshots:
base64-js@1.5.1: {} base64-js@1.5.1: {}
baseline-browser-mapping@2.9.12: {} baseline-browser-mapping@2.9.14: {}
bin-build@3.0.0: bin-build@3.0.0:
dependencies: dependencies:
@@ -4039,7 +4039,7 @@ snapshots:
browserslist@4.28.1: browserslist@4.28.1:
dependencies: dependencies:
baseline-browser-mapping: 2.9.12 baseline-browser-mapping: 2.9.14
caniuse-lite: 1.0.30001763 caniuse-lite: 1.0.30001763
electron-to-chromium: 1.5.267 electron-to-chromium: 1.5.267
node-releases: 2.0.27 node-releases: 2.0.27
@@ -5990,7 +5990,7 @@ snapshots:
spdx-correct: 3.2.0 spdx-correct: 3.2.0
spdx-expression-parse: 3.0.1 spdx-expression-parse: 3.0.1
vite-plugin-imagemin@0.6.1(vite@7.3.1(@types/node@25.0.3)(terser@5.44.1)): vite-plugin-imagemin@0.6.1(vite@7.3.1(@types/node@25.0.5)(terser@5.44.1)):
dependencies: dependencies:
'@types/imagemin': 7.0.1 '@types/imagemin': 7.0.1
'@types/imagemin-gifsicle': 7.0.4 '@types/imagemin-gifsicle': 7.0.4
@@ -6015,11 +6015,11 @@ snapshots:
imagemin-webp: 6.1.0 imagemin-webp: 6.1.0
jpegtran-bin: 6.0.1 jpegtran-bin: 6.0.1
pathe: 0.2.0 pathe: 0.2.0
vite: 7.3.1(@types/node@25.0.3)(terser@5.44.1) vite: 7.3.1(@types/node@25.0.5)(terser@5.44.1)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
vite-prerender-plugin@0.5.12(vite@7.3.1(@types/node@25.0.3)(terser@5.44.1)): vite-prerender-plugin@0.5.12(vite@7.3.1(@types/node@25.0.5)(terser@5.44.1)):
dependencies: dependencies:
kolorist: 1.8.0 kolorist: 1.8.0
magic-string: 0.30.21 magic-string: 0.30.21
@@ -6027,20 +6027,20 @@ snapshots:
simple-code-frame: 1.3.0 simple-code-frame: 1.3.0
source-map: 0.7.6 source-map: 0.7.6
stack-trace: 1.0.0-pre2 stack-trace: 1.0.0-pre2
vite: 7.3.1(@types/node@25.0.3)(terser@5.44.1) vite: 7.3.1(@types/node@25.0.5)(terser@5.44.1)
vite-tsconfig-paths@6.0.3(typescript@5.9.3)(vite@7.3.1(@types/node@25.0.3)(terser@5.44.1)): vite-tsconfig-paths@6.0.4(typescript@5.9.3)(vite@7.3.1(@types/node@25.0.5)(terser@5.44.1)):
dependencies: dependencies:
debug: 4.4.3 debug: 4.4.3
globrex: 0.1.2 globrex: 0.1.2
tsconfck: 3.1.6(typescript@5.9.3) tsconfck: 3.1.6(typescript@5.9.3)
optionalDependencies: optionalDependencies:
vite: 7.3.1(@types/node@25.0.3)(terser@5.44.1) vite: 7.3.1(@types/node@25.0.5)(terser@5.44.1)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
- typescript - typescript
vite@7.3.1(@types/node@25.0.3)(terser@5.44.1): vite@7.3.1(@types/node@25.0.5)(terser@5.44.1):
dependencies: dependencies:
esbuild: 0.27.2 esbuild: 0.27.2
fdir: 6.5.0(picomatch@4.0.3) fdir: 6.5.0(picomatch@4.0.3)
@@ -6049,7 +6049,7 @@ snapshots:
rollup: 4.55.1 rollup: 4.55.1
tinyglobby: 0.2.15 tinyglobby: 0.2.15
optionalDependencies: optionalDependencies:
'@types/node': 25.0.3 '@types/node': 25.0.5
fsevents: 2.3.3 fsevents: 2.3.3
terser: 5.44.1 terser: 5.44.1

View File

@@ -191,7 +191,8 @@ const SchedulerDialog = ({
const handleDOWChange = useCallback( const handleDOWChange = useCallback(
(_event: React.SyntheticEvent<HTMLElement>, flags: string[]) => { (_event: React.SyntheticEvent<HTMLElement>, flags: string[]) => {
const newFlags = getFlagDOWnumber(flags) === 0 ? FLAG_ALL_DAYS : getFlagDOWnumber(flags); const newFlags =
getFlagDOWnumber(flags) === 0 ? FLAG_ALL_DAYS : getFlagDOWnumber(flags);
setEditItem((prev) => ({ ...prev, flags: newFlags })); setEditItem((prev) => ({ ...prev, flags: newFlags }));
}, },
[getFlagDOWnumber] [getFlagDOWnumber]

View File

@@ -40,12 +40,23 @@ import { BOARD_PROFILES } from '../main/types';
import type { APIcall, BoardProfileKey, Settings } from '../main/types'; import type { APIcall, BoardProfileKey, Settings } from '../main/types';
import { createSettingsValidator } from '../main/validators'; import { createSettingsValidator } from '../main/validators';
export function boardProfileSelectItems() { export function boardProfileSelectItems(boardProfile?: string, developerMode?: boolean, LL?: any) {
return Object.keys(BOARD_PROFILES).map((code) => ( const items = Object.keys(BOARD_PROFILES).map((code) => (
<MenuItem key={code} value={code}> <MenuItem key={code} value={code}>
{BOARD_PROFILES[code as BoardProfileKey]} {BOARD_PROFILES[code as BoardProfileKey]}
</MenuItem> </MenuItem>
)); ));
if (boardProfile === 'CUSTOM' || developerMode) {
items.push(<Divider />);
items.push(
<MenuItem key="CUSTOM" value="CUSTOM">
{LL?.CUSTOM()}
</MenuItem>
);
}
return items;
} }
const ApplicationSettings = () => { const ApplicationSettings = () => {
@@ -181,7 +192,10 @@ const ApplicationSettings = () => {
}, [validateAndSubmit, doRestart]); }, [validateAndSubmit, doRestart]);
// Memoize board profile select items to prevent recreation // Memoize board profile select items to prevent recreation
const boardProfileItems = useMemo(() => boardProfileSelectItems(), []); const boardProfileItems = useMemo(
() => boardProfileSelectItems(data?.board_profile, data?.developer_mode, LL),
[data?.board_profile, data?.developer_mode, LL]
);
const content = () => { const content = () => {
if (!data || !hardwareData) { if (!data || !hardwareData) {
@@ -502,12 +516,6 @@ const ApplicationSettings = () => {
) : ( ) : (
boardProfileItems boardProfileItems
)} )}
<Divider />
{(data.board_profile === 'CUSTOM' || data.developer_mode) && (
<MenuItem key={'CUSTOM'} value={'CUSTOM'}>
{LL.CUSTOM()}&hellip;
</MenuItem>
)}
</TextField> </TextField>
{data.board_profile === 'CUSTOM' && ( {data.board_profile === 'CUSTOM' && (
<> <>

View File

@@ -345,89 +345,91 @@ const MqttSettings = () => {
</Grid> </Grid>
)} )}
</Grid> </Grid>
<Grid container spacing={2} rowSpacing={0}> {/* <Grid container spacing={2} rowSpacing={0}> */}
<Grid> <Grid>
<BlockFormControlLabel <BlockFormControlLabel
control={ control={
<Checkbox <Checkbox
name="ha_enabled" name="ha_enabled"
checked={data.ha_enabled} checked={data.ha_enabled}
onChange={updateFormValue} onChange={updateFormValue}
disabled={data.publish_single} disabled={data.publish_single}
/> />
} }
label={LL.MQTT_PUBLISH_TEXT_3()} label={LL.MQTT_PUBLISH_TEXT_3()}
/> />
</Grid> </Grid>
{data.ha_enabled && ( {data.ha_enabled && (
<Grid container spacing={2} rowSpacing={0}> <Grid container spacing={2} rowSpacing={0}>
<Grid> <Grid>
<TextField <TextField
name="discovery_type" name="discovery_type"
label={LL.MQTT_PUBLISH_TEXT_5()} label={LL.MQTT_PUBLISH_TEXT_5()}
value={data.discovery_type} value={data.discovery_type}
variant="outlined" variant="outlined"
onChange={updateFormValue} onChange={updateFormValue}
margin="normal" margin="normal"
select select
> >
<MenuItem value={0}>Home Assistant</MenuItem> <MenuItem value={0}>Home Assistant</MenuItem>
<MenuItem value={1}>Domoticz</MenuItem> <MenuItem value={1}>Domoticz</MenuItem>
<MenuItem value={2}>Domoticz (latest)</MenuItem> <MenuItem value={2}>Domoticz (latest)</MenuItem>
</TextField> </TextField>
</Grid> </Grid>
<Grid> <Grid>
<TextField <TextField
name="discovery_prefix" name="discovery_prefix"
label={LL.MQTT_PUBLISH_TEXT_4()} label={LL.MQTT_PUBLISH_TEXT_4()}
variant="outlined" variant="outlined"
value={data.discovery_prefix} value={data.discovery_prefix}
onChange={updateFormValue} onChange={updateFormValue}
margin="normal" margin="normal"
/> />
</Grid> </Grid>
<Grid> <Grid>
<TextField <TextField
name="entity_format" name="entity_format"
label={LL.MQTT_ENTITY_FORMAT()} label={LL.MQTT_ENTITY_FORMAT()}
value={data.entity_format} value={data.entity_format}
variant="outlined" variant="outlined"
onChange={updateFormValue} onChange={updateFormValue}
margin="normal" margin="normal"
select select
> >
<MenuItem value={0}>{LL.MQTT_ENTITY_FORMAT_0()}</MenuItem> <MenuItem value={0}>{LL.MQTT_ENTITY_FORMAT_0()}</MenuItem>
<MenuItem value={3}> <MenuItem value={3}>
{LL.MQTT_ENTITY_FORMAT_1()}&nbsp;(v3.5) {LL.MQTT_ENTITY_FORMAT_1()}&nbsp;(v3.5)
</MenuItem> </MenuItem>
<MenuItem value={4}> <MenuItem value={4}>
{LL.MQTT_ENTITY_FORMAT_2()}&nbsp;(v3.5) {LL.MQTT_ENTITY_FORMAT_2()}&nbsp;(v3.5)
</MenuItem> </MenuItem>
<MenuItem value={1}> <MenuItem value={1}>
{LL.MQTT_ENTITY_FORMAT_1()}&nbsp;(latest) {LL.MQTT_ENTITY_FORMAT_1()}&nbsp;(latest)
</MenuItem> </MenuItem>
<MenuItem value={2}> <MenuItem value={2}>
{LL.MQTT_ENTITY_FORMAT_2()}&nbsp;(latest) {LL.MQTT_ENTITY_FORMAT_2()}&nbsp;(latest)
</MenuItem> </MenuItem>
</TextField> </TextField>
</Grid> </Grid>
<Grid> <Grid>
{data.discovery_type === 0 && (
<TextField <TextField
name="ha_number_mode" name="ha_number_mode"
label={LL.MQTT_PUBLISH_TEXT_6()} label={LL.MQTT_INPUT_NUMBER_FORMAT()}
value={data.ha_number_mode} value={data.ha_number_mode}
variant="outlined" variant="outlined"
onChange={updateFormValue} onChange={updateFormValue}
sx={{ width: '20ch' }}
margin="normal" margin="normal"
select select
> >
<MenuItem value={0}>Box</MenuItem> <MenuItem value={0}>Box</MenuItem>
<MenuItem value={1}>Slider</MenuItem> <MenuItem value={1}>Slider</MenuItem>
</TextField> </TextField>
</Grid> )}
</Grid> </Grid>
)} </Grid>
</Grid> )}
<Typography sx={{ pt: 2 }} variant="h6" color="primary"> <Typography sx={{ pt: 2 }} variant="h6" color="primary">
{LL.MQTT_PUBLISH_INTERVALS()}&nbsp;(0=auto) {LL.MQTT_PUBLISH_INTERVALS()}&nbsp;(0=auto)
</Typography> </Typography>

View File

@@ -1,9 +1,9 @@
import { memo } from 'react'; import { type FC, type PropsWithChildren, memo } from 'react';
import { Box } from '@mui/material'; import { Box } from '@mui/material';
import type { BoxProps } from '@mui/material'; import type { BoxProps } from '@mui/material';
const ButtonRow = memo<BoxProps>(({ children, ...rest }) => ( const ButtonRow: FC<PropsWithChildren<BoxProps>> = memo(({ children, ...rest }) => (
<Box <Box
sx={{ sx={{
'& button, & a, & .MuiCard-root': { '& button, & a, & .MuiCard-root': {

View File

@@ -1,4 +1,4 @@
import { type FC, memo, useMemo } from 'react'; import { type FC, type PropsWithChildren, memo, useMemo } from 'react';
import CheckCircleOutlineOutlinedIcon from '@mui/icons-material/CheckCircleOutlineOutlined'; import CheckCircleOutlineOutlinedIcon from '@mui/icons-material/CheckCircleOutlineOutlined';
import ErrorIcon from '@mui/icons-material/Error'; import ErrorIcon from '@mui/icons-material/Error';
@@ -12,6 +12,7 @@ type MessageBoxLevel = 'warning' | 'success' | 'info' | 'error';
export interface MessageBoxProps extends BoxProps { export interface MessageBoxProps extends BoxProps {
level: MessageBoxLevel; level: MessageBoxLevel;
message?: string; message?: string;
children?: React.ReactNode;
} }
const LEVEL_ICONS: Record<MessageBoxLevel, React.ComponentType<SvgIconProps>> = { const LEVEL_ICONS: Record<MessageBoxLevel, React.ComponentType<SvgIconProps>> = {
@@ -28,7 +29,7 @@ const LEVEL_PALETTE_PATHS: Record<MessageBoxLevel, string> = {
error: 'error.dark' error: 'error.dark'
}; };
const MessageBox: FC<MessageBoxProps> = ({ const MessageBox: FC<PropsWithChildren<MessageBoxProps>> = ({
level, level,
message, message,
sx, sx,

View File

@@ -219,7 +219,7 @@ const cz: Translation = {
MQTT_PUBLISH_TEXT_3: 'Povolit MQTT Discovery', MQTT_PUBLISH_TEXT_3: 'Povolit MQTT Discovery',
MQTT_PUBLISH_TEXT_4: 'Prefix pro Discovery témata', MQTT_PUBLISH_TEXT_4: 'Prefix pro Discovery témata',
MQTT_PUBLISH_TEXT_5: 'Typ Discovery', MQTT_PUBLISH_TEXT_5: 'Typ Discovery',
MQTT_PUBLISH_TEXT_6: 'Number mode', MQTT_INPUT_NUMBER_FORMAT: 'Formát čísla',
MQTT_PUBLISH_INTERVALS: 'Intervaly publikování', MQTT_PUBLISH_INTERVALS: 'Intervaly publikování',
MQTT_INT_BOILER: 'Kotle a tepelná čerpadla', MQTT_INT_BOILER: 'Kotle a tepelná čerpadla',
MQTT_INT_THERMOSTATS: 'Termostaty', MQTT_INT_THERMOSTATS: 'Termostaty',

View File

@@ -219,7 +219,7 @@ const de: Translation = {
MQTT_PUBLISH_TEXT_3: 'Aktiviere `MQTT Discovery`', MQTT_PUBLISH_TEXT_3: 'Aktiviere `MQTT Discovery`',
MQTT_PUBLISH_TEXT_4: 'Prefix für die `Discovery`-Topics', MQTT_PUBLISH_TEXT_4: 'Prefix für die `Discovery`-Topics',
MQTT_PUBLISH_TEXT_5: 'Discovery Typ', MQTT_PUBLISH_TEXT_5: 'Discovery Typ',
MQTT_PUBLISH_TEXT_6: 'Number mode', MQTT_INPUT_NUMBER_FORMAT: 'Zahlenformat',
MQTT_PUBLISH_INTERVALS: 'Veröffentlichungs-Intervalle', MQTT_PUBLISH_INTERVALS: 'Veröffentlichungs-Intervalle',
MQTT_INT_BOILER: 'Boiler und Wärmepumpen', MQTT_INT_BOILER: 'Boiler und Wärmepumpen',
MQTT_INT_THERMOSTATS: 'Thermostate', MQTT_INT_THERMOSTATS: 'Thermostate',

View File

@@ -219,7 +219,7 @@ const en: Translation = {
MQTT_PUBLISH_TEXT_3: 'Enable MQTT Discovery', MQTT_PUBLISH_TEXT_3: 'Enable MQTT Discovery',
MQTT_PUBLISH_TEXT_4: 'Prefix for the Discovery topics', MQTT_PUBLISH_TEXT_4: 'Prefix for the Discovery topics',
MQTT_PUBLISH_TEXT_5: 'Discovery type', MQTT_PUBLISH_TEXT_5: 'Discovery type',
MQTT_PUBLISH_TEXT_6: 'Number mode', MQTT_INPUT_NUMBER_FORMAT: 'Input Number Fomat',
MQTT_PUBLISH_INTERVALS: 'Publish Intervals', MQTT_PUBLISH_INTERVALS: 'Publish Intervals',
MQTT_INT_BOILER: 'Boilers and Heat Pumps', MQTT_INT_BOILER: 'Boilers and Heat Pumps',
MQTT_INT_THERMOSTATS: 'Thermostats', MQTT_INT_THERMOSTATS: 'Thermostats',

View File

@@ -219,7 +219,7 @@ const fr: Translation = {
MQTT_PUBLISH_TEXT_3: 'Activer la découverte MQTT', MQTT_PUBLISH_TEXT_3: 'Activer la découverte MQTT',
MQTT_PUBLISH_TEXT_4: 'Préfixe pour les topics découverte', MQTT_PUBLISH_TEXT_4: 'Préfixe pour les topics découverte',
MQTT_PUBLISH_TEXT_5: 'Type de découverte', MQTT_PUBLISH_TEXT_5: 'Type de découverte',
MQTT_PUBLISH_TEXT_6: 'Number mode', MQTT_INPUT_NUMBER_FORMAT: 'Format des nombres',
MQTT_PUBLISH_INTERVALS: 'Intervalles de publication', MQTT_PUBLISH_INTERVALS: 'Intervalles de publication',
MQTT_INT_BOILER: 'Chaudières et pompes à chaleur', MQTT_INT_BOILER: 'Chaudières et pompes à chaleur',
MQTT_INT_THERMOSTATS: 'Thermostats', MQTT_INT_THERMOSTATS: 'Thermostats',

View File

@@ -219,7 +219,7 @@ const it: Translation = {
MQTT_PUBLISH_TEXT_3: 'Abilita rilevamento MQTT (Home Assistant, Domoticz)', MQTT_PUBLISH_TEXT_3: 'Abilita rilevamento MQTT (Home Assistant, Domoticz)',
MQTT_PUBLISH_TEXT_4: 'Prefisso per gli argomenti di scoperta', MQTT_PUBLISH_TEXT_4: 'Prefisso per gli argomenti di scoperta',
MQTT_PUBLISH_TEXT_5: 'Discovery type', MQTT_PUBLISH_TEXT_5: 'Discovery type',
MQTT_PUBLISH_TEXT_6: 'Number mode', MQTT_INPUT_NUMBER_FORMAT: 'Formato numero di input',
MQTT_PUBLISH_INTERVALS: 'Pubblica intervalli', MQTT_PUBLISH_INTERVALS: 'Pubblica intervalli',
MQTT_INT_BOILER: 'Caldaie e Pompe di Calore', MQTT_INT_BOILER: 'Caldaie e Pompe di Calore',
MQTT_INT_THERMOSTATS: 'Termostati', MQTT_INT_THERMOSTATS: 'Termostati',

View File

@@ -219,7 +219,7 @@ const nl: Translation = {
MQTT_PUBLISH_TEXT_3: 'Activeer MQTT Discovery', MQTT_PUBLISH_TEXT_3: 'Activeer MQTT Discovery',
MQTT_PUBLISH_TEXT_4: 'Prefix voor de Discovery topics', MQTT_PUBLISH_TEXT_4: 'Prefix voor de Discovery topics',
MQTT_PUBLISH_TEXT_5: 'Discovery type', MQTT_PUBLISH_TEXT_5: 'Discovery type',
MQTT_PUBLISH_TEXT_6: 'Number mode', MQTT_INPUT_NUMBER_FORMAT: 'Getalformaat',
MQTT_PUBLISH_INTERVALS: 'Publicatie intervallen', MQTT_PUBLISH_INTERVALS: 'Publicatie intervallen',
MQTT_INT_BOILER: 'CV ketels en warmtepompen', MQTT_INT_BOILER: 'CV ketels en warmtepompen',
MQTT_INT_THERMOSTATS: 'Thermostaten', MQTT_INT_THERMOSTATS: 'Thermostaten',

View File

@@ -219,7 +219,7 @@ const no: Translation = {
MQTT_PUBLISH_TEXT_3: 'Aktiver MQTT Discovery', MQTT_PUBLISH_TEXT_3: 'Aktiver MQTT Discovery',
MQTT_PUBLISH_TEXT_4: 'Prefiks for Discovery topics', MQTT_PUBLISH_TEXT_4: 'Prefiks for Discovery topics',
MQTT_PUBLISH_TEXT_5: 'Discovery type', MQTT_PUBLISH_TEXT_5: 'Discovery type',
MQTT_PUBLISH_TEXT_6: 'Number mode', MQTT_INPUT_NUMBER_FORMAT: 'Nummerformat',
MQTT_PUBLISH_INTERVALS: 'Publiseringsintervall', MQTT_PUBLISH_INTERVALS: 'Publiseringsintervall',
MQTT_INT_BOILER: 'Fyr/Varmepumpe', MQTT_INT_BOILER: 'Fyr/Varmepumpe',
MQTT_INT_THERMOSTATS: 'Termostat', MQTT_INT_THERMOSTATS: 'Termostat',

View File

@@ -219,7 +219,7 @@ const pl: BaseTranslation = {
MQTT_PUBLISH_TEXT_3: 'Włącz opcję "MQTT discovery"', MQTT_PUBLISH_TEXT_3: 'Włącz opcję "MQTT discovery"',
MQTT_PUBLISH_TEXT_4: 'Prefiks dla "MQTT discovery"', MQTT_PUBLISH_TEXT_4: 'Prefiks dla "MQTT discovery"',
MQTT_PUBLISH_TEXT_5: 'Typ "MQTT discovery"', MQTT_PUBLISH_TEXT_5: 'Typ "MQTT discovery"',
MQTT_PUBLISH_TEXT_6: 'Number mode', MQTT_INPUT_NUMBER_FORMAT: 'Format liczby',
MQTT_PUBLISH_INTERVALS: 'Interwały publikowania', MQTT_PUBLISH_INTERVALS: 'Interwały publikowania',
MQTT_INT_BOILER: 'Kotły i pompy ciepła', MQTT_INT_BOILER: 'Kotły i pompy ciepła',
MQTT_INT_THERMOSTATS: 'Termostaty', MQTT_INT_THERMOSTATS: 'Termostaty',

View File

@@ -219,7 +219,7 @@ const sk: Translation = {
MQTT_PUBLISH_TEXT_3: 'Povolenie zisťovania MQTT', MQTT_PUBLISH_TEXT_3: 'Povolenie zisťovania MQTT',
MQTT_PUBLISH_TEXT_4: 'Predpona tém Discovery', MQTT_PUBLISH_TEXT_4: 'Predpona tém Discovery',
MQTT_PUBLISH_TEXT_5: 'Typ zistenia', MQTT_PUBLISH_TEXT_5: 'Typ zistenia',
MQTT_PUBLISH_TEXT_6: 'Number mode', MQTT_INPUT_NUMBER_FORMAT: 'Formát čísla',
MQTT_PUBLISH_INTERVALS: 'Intervaly zverejňovania', MQTT_PUBLISH_INTERVALS: 'Intervaly zverejňovania',
MQTT_INT_BOILER: 'Kotly a tepelné čerpadlá', MQTT_INT_BOILER: 'Kotly a tepelné čerpadlá',
MQTT_INT_THERMOSTATS: 'Termostaty', MQTT_INT_THERMOSTATS: 'Termostaty',

View File

@@ -219,7 +219,7 @@ const sv: Translation = {
MQTT_PUBLISH_TEXT_3: 'Aktivera MQTT Discovery', MQTT_PUBLISH_TEXT_3: 'Aktivera MQTT Discovery',
MQTT_PUBLISH_TEXT_4: 'Prefix för Discovery topics', MQTT_PUBLISH_TEXT_4: 'Prefix för Discovery topics',
MQTT_PUBLISH_TEXT_5: 'Discoverytyp', MQTT_PUBLISH_TEXT_5: 'Discoverytyp',
MQTT_PUBLISH_TEXT_6: 'Number mode', MQTT_INPUT_NUMBER_FORMAT: 'Nummerformat',
MQTT_PUBLISH_INTERVALS: 'Publiceringsintervall', MQTT_PUBLISH_INTERVALS: 'Publiceringsintervall',
MQTT_INT_BOILER: 'Värmepump/panna', MQTT_INT_BOILER: 'Värmepump/panna',
MQTT_INT_THERMOSTATS: 'Termostater', MQTT_INT_THERMOSTATS: 'Termostater',

View File

@@ -219,7 +219,7 @@ const tr: Translation = {
MQTT_PUBLISH_TEXT_3: 'MQTT keşfi etkinleştir (Home Assistant, Domoticz)', MQTT_PUBLISH_TEXT_3: 'MQTT keşfi etkinleştir (Home Assistant, Domoticz)',
MQTT_PUBLISH_TEXT_4: 'Keşif konuları için ön ek', MQTT_PUBLISH_TEXT_4: 'Keşif konuları için ön ek',
MQTT_PUBLISH_TEXT_5: 'Domoticz Format', MQTT_PUBLISH_TEXT_5: 'Domoticz Format',
MQTT_PUBLISH_TEXT_6: 'Number mode', MQTT_INPUT_NUMBER_FORMAT: 'Sayı Biçimi',
MQTT_PUBLISH_INTERVALS: 'Yayınlama aralıkları', MQTT_PUBLISH_INTERVALS: 'Yayınlama aralıkları',
MQTT_INT_BOILER: 'Kazanlar ve Isı Pompaları', MQTT_INT_BOILER: 'Kazanlar ve Isı Pompaları',
MQTT_INT_THERMOSTATS: 'Termostatlar', MQTT_INT_THERMOSTATS: 'Termostatlar',

View File

@@ -15,5 +15,5 @@
"itty-router": "^5.0.22", "itty-router": "^5.0.22",
"prettier": "^3.7.4" "prettier": "^3.7.4"
}, },
"packageManager": "pnpm@10.27.0+sha512.72d699da16b1179c14ba9e64dc71c9a40988cbdc65c264cb0e489db7de917f20dcf4d64d8723625f2969ba52d4b7e2a1170682d9ac2a5dcaeaab732b7e16f04a" "packageManager": "pnpm@10.28.0+sha512.05df71d1421f21399e053fde567cea34d446fa02c76571441bfc1c7956e98e363088982d940465fd34480d4d90a0668bc12362f8aa88000a64e83d0b0e47be48"
} }

View File

@@ -586,6 +586,7 @@ let mqtt_settings = {
keep_alive: 60, keep_alive: 60,
clean_session: true, clean_session: true,
entity_format: 1, entity_format: 1,
ha_number_mode: 0,
publish_time_boiler: 10, publish_time_boiler: 10,
publish_time_thermostat: 10, publish_time_thermostat: 10,
publish_time_solar: 10, publish_time_solar: 10,

View File

@@ -1447,4 +1447,5 @@ SPIIO
SPIDQS SPIDQS
txpause txpause
relais relais
pinout pinout
TXEN

View File

@@ -103,7 +103,7 @@ DeviceValue::DeviceValue(uint8_t device_type,
} }
// mapping of UOM, to match order in DeviceValueUOM enum emsdevicevalue.h // mapping of UOM, to match order in DeviceValueUOM enum emsdevicevalue.h
// also maps to DeviceValueUOM in interface/src/project/types.ts for the Web UI // also maps to DeviceValueUOM in interface/src/app/main/types.ts for the Web UI
// must be an int of 4 bytes, 32bit aligned // must be an int of 4 bytes, 32bit aligned
const char * DeviceValue::DeviceValueUOM_s[] = { const char * DeviceValue::DeviceValueUOM_s[] = {

View File

@@ -245,6 +245,7 @@ MAKE_NOTRANSLATION(tag_device_data, "")
// Unit Of Measurement mapping - maps to DeviceValueUOM_s in emsdevice.cpp // Unit Of Measurement mapping - maps to DeviceValueUOM_s in emsdevice.cpp
// Translating hours/minute/seconds are done in emsdevice.cpp (uom_to_string()) // Translating hours/minute/seconds are done in emsdevice.cpp (uom_to_string())
// to keep to some form of consistency, all UOMs follow Home Assistant naming conventions - https://developers.home-assistant.io/docs/core/entity/sensor/#available-device-classes
MAKE_WORD_CUSTOM(uom_blank, " ") MAKE_WORD_CUSTOM(uom_blank, " ")
MAKE_WORD_CUSTOM(uom_percent, "%") MAKE_WORD_CUSTOM(uom_percent, "%")
MAKE_WORD_CUSTOM(uom_degrees, "°C") MAKE_WORD_CUSTOM(uom_degrees, "°C")

View File

@@ -1167,6 +1167,8 @@ void Mqtt::add_ha_classes(JsonObject doc, const uint8_t device_type, const uint8
doc[uom_ha] = "L/min"; doc[uom_ha] = "L/min";
} else if (uom == DeviceValueUOM::LH) { } else if (uom == DeviceValueUOM::LH) {
doc[uom_ha] = "L/h"; doc[uom_ha] = "L/h";
} else if (uom == DeviceValueUOM::L) {
doc[uom_ha] = "L";
} else if (uom != DeviceValueUOM::NONE) { } else if (uom != DeviceValueUOM::NONE) {
doc[uom_ha] = EMSdevice::uom_to_string(uom); // use default doc[uom_ha] = EMSdevice::uom_to_string(uom); // use default
} else if (discovery_type() != discoveryType::HOMEASSISTANT) { } else if (discovery_type() != discoveryType::HOMEASSISTANT) {

View File

@@ -2447,9 +2447,11 @@ bool System::load_board_profile(std::vector<int8_t> & data, const std::string &
} else if (board_profile == "S2MINI") { } else if (board_profile == "S2MINI") {
data = {15, 7, 11, 12, 0, PHY_type::PHY_TYPE_NONE, 0, 0, 0, 0}; // Lolin S2 Mini data = {15, 7, 11, 12, 0, PHY_type::PHY_TYPE_NONE, 0, 0, 0, 0}; // Lolin S2 Mini
// https://www.wemos.cc/en/latest/s2/s2_mini.html // https://www.wemos.cc/en/latest/s2/s2_mini.html
set_valid_system_gpios();
} else if (board_profile == "S3MINI") { } else if (board_profile == "S3MINI") {
data = {17, 18, 8, 5, 0, PHY_type::PHY_TYPE_NONE, 0, 0, 0, 0}; // Liligo S3 data = {17, 18, 8, 5, 0, PHY_type::PHY_TYPE_NONE, 0, 0, 0, 0}; // Liligo S3
// https://lilygo.cc/products/t7-s3 // https://lilygo.cc/products/t7-s3
set_valid_system_gpios();
} else if (board_profile == "S32S3") { } else if (board_profile == "S32S3") {
data = {2, 18, 5, 17, 0, PHY_type::PHY_TYPE_NONE, 0, 0, 0, 0}; // BBQKees Gateway S3 data = {2, 18, 5, 17, 0, PHY_type::PHY_TYPE_NONE, 0, 0, 0, 0}; // BBQKees Gateway S3
valid_system_gpios_ = {0, 2, 5, 17, 18}; valid_system_gpios_ = {0, 2, 5, 17, 18};

View File

@@ -113,6 +113,13 @@ StateUpdateResult WebSettings::update(JsonObject root, WebSettings & settings) {
reset_flags(); reset_flags();
// before loading new board profile free old gpios from used list to allow remapping
EMSESP::system_.remove_gpio(original_settings.led_gpio);
EMSESP::system_.remove_gpio(original_settings.dallas_gpio);
EMSESP::system_.remove_gpio(original_settings.pbutton_gpio);
EMSESP::system_.remove_gpio(original_settings.rx_gpio);
EMSESP::system_.remove_gpio(original_settings.tx_gpio);
// see if the user has changed the board profile // see if the user has changed the board profile
// this will set: led_gpio, dallas_gpio, rx_gpio, tx_gpio, pbutton_gpio, phy_type, eth_power, eth_phy_addr, eth_clock_mode, led_type // this will set: led_gpio, dallas_gpio, rx_gpio, tx_gpio, pbutton_gpio, phy_type, eth_power, eth_phy_addr, eth_clock_mode, led_type
// this will always run when EMS-ESP starts since original_settings{} is empty // this will always run when EMS-ESP starts since original_settings{} is empty
@@ -149,13 +156,6 @@ StateUpdateResult WebSettings::update(JsonObject root, WebSettings & settings) {
} }
} }
// free old gpios from used list to allow remapping
EMSESP::system_.remove_gpio(original_settings.led_gpio);
EMSESP::system_.remove_gpio(original_settings.dallas_gpio);
EMSESP::system_.remove_gpio(original_settings.pbutton_gpio);
EMSESP::system_.remove_gpio(original_settings.rx_gpio);
EMSESP::system_.remove_gpio(original_settings.tx_gpio);
// if any of the GPIOs have changed and re-validate them // if any of the GPIOs have changed and re-validate them
bool have_valid_gpios = true; bool have_valid_gpios = true;
@@ -308,8 +308,8 @@ StateUpdateResult WebSettings::update(JsonObject root, WebSettings & settings) {
} }
// save the settings if changed from the webUI // save the settings if changed from the webUI
// if we encountered an invalid GPIO, rollback changes and don't save settings, and report the error to WebUI // if we encountered an invalid GPIO, rollback changes and don't save settings,
// without a restart // and report the error to WebUI without a restart
if (!have_valid_gpios) { if (!have_valid_gpios) {
// replace settings with original settings // replace settings with original settings
settings = original_settings; settings = original_settings;