Merge pull request #2916 from proddy/dev

webUI changes and comments
This commit is contained in:
Proddy
2026-01-10 22:21:48 +01:00
committed by GitHub
24 changed files with 206 additions and 191 deletions

View File

@@ -8,7 +8,7 @@ For more details go to [emsesp.org](https://emsesp.org/).
- update time saved in nvs
- 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

View File

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

View File

@@ -191,7 +191,8 @@ const SchedulerDialog = ({
const handleDOWChange = useCallback(
(_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 }));
},
[getFlagDOWnumber]

View File

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

View File

@@ -345,89 +345,91 @@ const MqttSettings = () => {
</Grid>
)}
</Grid>
<Grid container spacing={2} rowSpacing={0}>
<Grid>
<BlockFormControlLabel
control={
<Checkbox
name="ha_enabled"
checked={data.ha_enabled}
onChange={updateFormValue}
disabled={data.publish_single}
/>
}
label={LL.MQTT_PUBLISH_TEXT_3()}
/>
</Grid>
{data.ha_enabled && (
<Grid container spacing={2} rowSpacing={0}>
<Grid>
<TextField
name="discovery_type"
label={LL.MQTT_PUBLISH_TEXT_5()}
value={data.discovery_type}
variant="outlined"
onChange={updateFormValue}
margin="normal"
select
>
<MenuItem value={0}>Home Assistant</MenuItem>
<MenuItem value={1}>Domoticz</MenuItem>
<MenuItem value={2}>Domoticz (latest)</MenuItem>
</TextField>
</Grid>
<Grid>
<TextField
name="discovery_prefix"
label={LL.MQTT_PUBLISH_TEXT_4()}
variant="outlined"
value={data.discovery_prefix}
onChange={updateFormValue}
margin="normal"
/>
</Grid>
<Grid>
<TextField
name="entity_format"
label={LL.MQTT_ENTITY_FORMAT()}
value={data.entity_format}
variant="outlined"
onChange={updateFormValue}
margin="normal"
select
>
<MenuItem value={0}>{LL.MQTT_ENTITY_FORMAT_0()}</MenuItem>
<MenuItem value={3}>
{LL.MQTT_ENTITY_FORMAT_1()}&nbsp;(v3.5)
</MenuItem>
<MenuItem value={4}>
{LL.MQTT_ENTITY_FORMAT_2()}&nbsp;(v3.5)
</MenuItem>
<MenuItem value={1}>
{LL.MQTT_ENTITY_FORMAT_1()}&nbsp;(latest)
</MenuItem>
<MenuItem value={2}>
{LL.MQTT_ENTITY_FORMAT_2()}&nbsp;(latest)
</MenuItem>
</TextField>
</Grid>
<Grid>
{/* <Grid container spacing={2} rowSpacing={0}> */}
<Grid>
<BlockFormControlLabel
control={
<Checkbox
name="ha_enabled"
checked={data.ha_enabled}
onChange={updateFormValue}
disabled={data.publish_single}
/>
}
label={LL.MQTT_PUBLISH_TEXT_3()}
/>
</Grid>
{data.ha_enabled && (
<Grid container spacing={2} rowSpacing={0}>
<Grid>
<TextField
name="discovery_type"
label={LL.MQTT_PUBLISH_TEXT_5()}
value={data.discovery_type}
variant="outlined"
onChange={updateFormValue}
margin="normal"
select
>
<MenuItem value={0}>Home Assistant</MenuItem>
<MenuItem value={1}>Domoticz</MenuItem>
<MenuItem value={2}>Domoticz (latest)</MenuItem>
</TextField>
</Grid>
<Grid>
<TextField
name="discovery_prefix"
label={LL.MQTT_PUBLISH_TEXT_4()}
variant="outlined"
value={data.discovery_prefix}
onChange={updateFormValue}
margin="normal"
/>
</Grid>
<Grid>
<TextField
name="entity_format"
label={LL.MQTT_ENTITY_FORMAT()}
value={data.entity_format}
variant="outlined"
onChange={updateFormValue}
margin="normal"
select
>
<MenuItem value={0}>{LL.MQTT_ENTITY_FORMAT_0()}</MenuItem>
<MenuItem value={3}>
{LL.MQTT_ENTITY_FORMAT_1()}&nbsp;(v3.5)
</MenuItem>
<MenuItem value={4}>
{LL.MQTT_ENTITY_FORMAT_2()}&nbsp;(v3.5)
</MenuItem>
<MenuItem value={1}>
{LL.MQTT_ENTITY_FORMAT_1()}&nbsp;(latest)
</MenuItem>
<MenuItem value={2}>
{LL.MQTT_ENTITY_FORMAT_2()}&nbsp;(latest)
</MenuItem>
</TextField>
</Grid>
<Grid>
{data.discovery_type === 0 && (
<TextField
name="ha_number_mode"
label={LL.MQTT_PUBLISH_TEXT_6()}
label={LL.MQTT_INPUT_NUMBER_FORMAT()}
value={data.ha_number_mode}
variant="outlined"
onChange={updateFormValue}
sx={{ width: '20ch' }}
margin="normal"
select
>
<MenuItem value={0}>Box</MenuItem>
<MenuItem value={1}>Slider</MenuItem>
</TextField>
</Grid>
)}
</Grid>
)}
</Grid>
</Grid>
)}
<Typography sx={{ pt: 2 }} variant="h6" color="primary">
{LL.MQTT_PUBLISH_INTERVALS()}&nbsp;(0=auto)
</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 type { BoxProps } from '@mui/material';
const ButtonRow = memo<BoxProps>(({ children, ...rest }) => (
const ButtonRow: FC<PropsWithChildren<BoxProps>> = memo(({ children, ...rest }) => (
<Box
sx={{
'& 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 ErrorIcon from '@mui/icons-material/Error';
@@ -12,6 +12,7 @@ type MessageBoxLevel = 'warning' | 'success' | 'info' | 'error';
export interface MessageBoxProps extends BoxProps {
level: MessageBoxLevel;
message?: string;
children?: React.ReactNode;
}
const LEVEL_ICONS: Record<MessageBoxLevel, React.ComponentType<SvgIconProps>> = {
@@ -28,7 +29,7 @@ const LEVEL_PALETTE_PATHS: Record<MessageBoxLevel, string> = {
error: 'error.dark'
};
const MessageBox: FC<MessageBoxProps> = ({
const MessageBox: FC<PropsWithChildren<MessageBoxProps>> = ({
level,
message,
sx,

View File

@@ -219,7 +219,7 @@ const cz: Translation = {
MQTT_PUBLISH_TEXT_3: 'Povolit MQTT Discovery',
MQTT_PUBLISH_TEXT_4: 'Prefix pro Discovery témata',
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_INT_BOILER: 'Kotle a tepelná čerpadla',
MQTT_INT_THERMOSTATS: 'Termostaty',

View File

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

View File

@@ -219,7 +219,7 @@ const en: Translation = {
MQTT_PUBLISH_TEXT_3: 'Enable MQTT Discovery',
MQTT_PUBLISH_TEXT_4: 'Prefix for the Discovery topics',
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_INT_BOILER: 'Boilers and Heat Pumps',
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_4: 'Préfixe pour les topics 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_INT_BOILER: 'Chaudières et pompes à chaleur',
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_4: 'Prefisso per gli argomenti di scoperta',
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_INT_BOILER: 'Caldaie e Pompe di Calore',
MQTT_INT_THERMOSTATS: 'Termostati',

View File

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

View File

@@ -219,7 +219,7 @@ const no: Translation = {
MQTT_PUBLISH_TEXT_3: 'Aktiver MQTT Discovery',
MQTT_PUBLISH_TEXT_4: 'Prefiks for Discovery topics',
MQTT_PUBLISH_TEXT_5: 'Discovery type',
MQTT_PUBLISH_TEXT_6: 'Number mode',
MQTT_INPUT_NUMBER_FORMAT: 'Nummerformat',
MQTT_PUBLISH_INTERVALS: 'Publiseringsintervall',
MQTT_INT_BOILER: 'Fyr/Varmepumpe',
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_4: 'Prefiks dla "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_INT_BOILER: 'Kotły i pompy ciepła',
MQTT_INT_THERMOSTATS: 'Termostaty',

View File

@@ -219,7 +219,7 @@ const sk: Translation = {
MQTT_PUBLISH_TEXT_3: 'Povolenie zisťovania MQTT',
MQTT_PUBLISH_TEXT_4: 'Predpona tém Discovery',
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_INT_BOILER: 'Kotly a tepelné čerpadlá',
MQTT_INT_THERMOSTATS: 'Termostaty',

View File

@@ -219,7 +219,7 @@ const sv: Translation = {
MQTT_PUBLISH_TEXT_3: 'Aktivera MQTT Discovery',
MQTT_PUBLISH_TEXT_4: 'Prefix för Discovery topics',
MQTT_PUBLISH_TEXT_5: 'Discoverytyp',
MQTT_PUBLISH_TEXT_6: 'Number mode',
MQTT_INPUT_NUMBER_FORMAT: 'Nummerformat',
MQTT_PUBLISH_INTERVALS: 'Publiceringsintervall',
MQTT_INT_BOILER: 'Värmepump/panna',
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_4: 'Keşif konuları için ön ek',
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_INT_BOILER: 'Kazanlar ve Isı Pompaları',
MQTT_INT_THERMOSTATS: 'Termostatlar',

View File

@@ -15,5 +15,5 @@
"itty-router": "^5.0.22",
"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,
clean_session: true,
entity_format: 1,
ha_number_mode: 0,
publish_time_boiler: 10,
publish_time_thermostat: 10,
publish_time_solar: 10,

View File

@@ -1448,3 +1448,4 @@ SPIDQS
txpause
relais
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
// 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
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
// 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_percent, "%")
MAKE_WORD_CUSTOM(uom_degrees, "°C")