mirror of
https://github.com/emsesp/EMS-ESP32.git
synced 2026-09-13 21:54:07 +00:00
Compare commits
23
Commits
5b41217a67
...
73f2634acc
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
73f2634acc | ||
|
|
2a604008ff | ||
|
|
cd0a51f843 | ||
|
|
34cd93b7be | ||
|
|
d47915d815 | ||
|
|
cb97de7706 | ||
|
|
dbc5a73583 | ||
|
|
4d25c69c84 | ||
|
|
b430866bbb | ||
|
|
553752a7ca | ||
|
|
9c992d8fda | ||
|
|
e4d127db67 | ||
|
|
d913824b35 | ||
|
|
ae3443c637 | ||
|
|
50c34c13f0 | ||
|
|
d8fab910a8 | ||
|
|
4231192991 | ||
|
|
b47e7d1dd6 | ||
|
|
fb55327373 | ||
|
|
4aab9e095a | ||
|
|
12ae358434 | ||
|
|
e22b82e913 | ||
|
|
285361c09f |
@@ -20,6 +20,8 @@ This release is based on the latest Espressif/Arduino core version 3. It brings
|
|||||||
- LED stayed off on a healthy system when "Disable LED" was unchecked
|
- LED stayed off on a healthy system when "Disable LED" was unchecked
|
||||||
- Ethernet MAC address changed with the new SDK, breaking DHCP reservations (currently disabled)
|
- Ethernet MAC address changed with the new SDK, breaking DHCP reservations (currently disabled)
|
||||||
- "IPv4 nameserver" showed an IPv6 address when IPv6 was in use
|
- "IPv4 nameserver" showed an IPv6 address when IPv6 was in use
|
||||||
|
- HA Discovery warning on Uptime after EMS-ESP boot due to NTP not ready
|
||||||
|
- show MQTT connection error only once on the first connect failure
|
||||||
|
|
||||||
## Changed
|
## Changed
|
||||||
|
|
||||||
@@ -30,4 +32,5 @@ This release is based on the latest Espressif/Arduino core version 3. It brings
|
|||||||
- Gateway and Connect devices are shown in the Devices page, but disabled [3126](https://github.com/emsesp/EMS-ESP32/discussions/3126)
|
- Gateway and Connect devices are shown in the Devices page, but disabled [3126](https://github.com/emsesp/EMS-ESP32/discussions/3126)
|
||||||
- show control setting only for master thermostats (0x10) [#3173](https://github.com/emsesp/EMS-ESP32/issues/3173)
|
- show control setting only for master thermostats (0x10) [#3173](https://github.com/emsesp/EMS-ESP32/issues/3173)
|
||||||
- remove devices without entities not listed in 0x07 telegram
|
- remove devices without entities not listed in 0x07 telegram
|
||||||
|
- changes to the Dialogs in Dashboard page, removed the run icon in the Commands page. Renamed Execute to Run.
|
||||||
|
|
||||||
|
|||||||
@@ -26,8 +26,8 @@
|
|||||||
"@alova/adapter-xhr": "2.3.1",
|
"@alova/adapter-xhr": "2.3.1",
|
||||||
"@emotion/react": "^11.14.0",
|
"@emotion/react": "^11.14.0",
|
||||||
"@emotion/styled": "^11.14.1",
|
"@emotion/styled": "^11.14.1",
|
||||||
"@mui/icons-material": "^9.3.0",
|
"@mui/icons-material": "^9.3.1",
|
||||||
"@mui/material": "^9.3.0",
|
"@mui/material": "^9.3.1",
|
||||||
"@table-library/react-table-library": "4.1.15",
|
"@table-library/react-table-library": "4.1.15",
|
||||||
"alova": "^3.5.3",
|
"alova": "^3.5.3",
|
||||||
"jwt-decode": "^4.0.0",
|
"jwt-decode": "^4.0.0",
|
||||||
@@ -42,21 +42,21 @@
|
|||||||
"@eslint/js": "^10.0.1",
|
"@eslint/js": "^10.0.1",
|
||||||
"@preact/preset-vite": "^2.10.6",
|
"@preact/preset-vite": "^2.10.6",
|
||||||
"@trivago/prettier-plugin-sort-imports": "^6.0.2",
|
"@trivago/prettier-plugin-sort-imports": "^6.0.2",
|
||||||
"@types/node": "^26.1.2",
|
"@types/node": "^26.2.0",
|
||||||
"@types/react": "^19.2.18",
|
"@types/react": "^19.2.18",
|
||||||
"@types/react-dom": "^19.2.4",
|
"@types/react-dom": "^19.2.4",
|
||||||
"concurrently": "^10.0.4",
|
"concurrently": "^10.0.4",
|
||||||
"eslint": "^10.8.0",
|
"eslint": "^10.8.1",
|
||||||
"eslint-config-prettier": "^10.1.8",
|
"eslint-config-prettier": "^10.1.8",
|
||||||
"etag": "^1.8.1",
|
"etag": "^1.8.1",
|
||||||
"mime-types": "^3.0.2",
|
"mime-types": "^3.0.2",
|
||||||
"prettier": "^3.9.6",
|
"prettier": "^3.9.6",
|
||||||
"rollup-plugin-visualizer": "^7.0.1",
|
"rollup-plugin-visualizer": "^7.0.1",
|
||||||
"terser": "^5.49.1",
|
"terser": "^5.49.2",
|
||||||
"typescript": "^6.0.3",
|
"typescript": "^6.0.3",
|
||||||
"typescript-eslint": "^8.66.0",
|
"typescript-eslint": "^8.66.0",
|
||||||
"vite": "^8.2.0",
|
"vite": "^8.2.1",
|
||||||
"vite-plugin-imagemin": "^0.6.1"
|
"vite-plugin-imagemin": "^0.6.1"
|
||||||
},
|
},
|
||||||
"packageManager": "pnpm@11.20.0+sha512.9a6f330a95b66446ea088faf1521405a8a01f07fde7124cc9958dfed52d4bb436737e65b08f85f37b46fcba375092558ac51262b816844b22f63406ed166bfee"
|
"packageManager": "pnpm@11.21.0+sha512.521705bce689924eac72f5a3587122f362689ef6571e55ba80076fd637c11132ecffada26fad4ea79c485bfddbfd3d5a2a5b05805a77e893de71ec8a6cca3bb1"
|
||||||
}
|
}
|
||||||
|
|||||||
Generated
+159
-159
@@ -18,11 +18,11 @@ importers:
|
|||||||
specifier: ^11.14.1
|
specifier: ^11.14.1
|
||||||
version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2)
|
version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2)
|
||||||
'@mui/icons-material':
|
'@mui/icons-material':
|
||||||
specifier: ^9.3.0
|
specifier: ^9.3.1
|
||||||
version: 9.3.0(@mui/material@9.3.0(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(@types/react@19.2.18)(react@19.2.8)
|
version: 9.3.1(@mui/material@9.3.1(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(@types/react@19.2.18)(react@19.2.8)
|
||||||
'@mui/material':
|
'@mui/material':
|
||||||
specifier: ^9.3.0
|
specifier: ^9.3.1
|
||||||
version: 9.3.0(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
|
version: 9.3.1(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
|
||||||
'@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.18)(react@19.2.8)(supports-color@10.2.2))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
|
version: 4.1.15(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
|
||||||
@@ -53,16 +53,16 @@ importers:
|
|||||||
devDependencies:
|
devDependencies:
|
||||||
'@eslint/js':
|
'@eslint/js':
|
||||||
specifier: ^10.0.1
|
specifier: ^10.0.1
|
||||||
version: 10.0.1(eslint@10.8.0(supports-color@10.2.2))
|
version: 10.0.1(eslint@10.8.1(supports-color@10.2.2))
|
||||||
'@preact/preset-vite':
|
'@preact/preset-vite':
|
||||||
specifier: ^2.10.6
|
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.0(@types/node@26.1.2)(terser@5.49.1))
|
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.1(@types/node@26.2.0)(terser@5.49.2))
|
||||||
'@trivago/prettier-plugin-sort-imports':
|
'@trivago/prettier-plugin-sort-imports':
|
||||||
specifier: ^6.0.2
|
specifier: ^6.0.2
|
||||||
version: 6.0.2(prettier@3.9.6)(supports-color@10.2.2)
|
version: 6.0.2(prettier@3.9.6)(supports-color@10.2.2)
|
||||||
'@types/node':
|
'@types/node':
|
||||||
specifier: ^26.1.2
|
specifier: ^26.2.0
|
||||||
version: 26.1.2
|
version: 26.2.0
|
||||||
'@types/react':
|
'@types/react':
|
||||||
specifier: ^19.2.18
|
specifier: ^19.2.18
|
||||||
version: 19.2.18
|
version: 19.2.18
|
||||||
@@ -73,11 +73,11 @@ importers:
|
|||||||
specifier: ^10.0.4
|
specifier: ^10.0.4
|
||||||
version: 10.0.4
|
version: 10.0.4
|
||||||
eslint:
|
eslint:
|
||||||
specifier: ^10.8.0
|
specifier: ^10.8.1
|
||||||
version: 10.8.0(supports-color@10.2.2)
|
version: 10.8.1(supports-color@10.2.2)
|
||||||
eslint-config-prettier:
|
eslint-config-prettier:
|
||||||
specifier: ^10.1.8
|
specifier: ^10.1.8
|
||||||
version: 10.1.8(eslint@10.8.0(supports-color@10.2.2))
|
version: 10.1.8(eslint@10.8.1(supports-color@10.2.2))
|
||||||
etag:
|
etag:
|
||||||
specifier: ^1.8.1
|
specifier: ^1.8.1
|
||||||
version: 1.8.1
|
version: 1.8.1
|
||||||
@@ -89,22 +89,22 @@ importers:
|
|||||||
version: 3.9.6
|
version: 3.9.6
|
||||||
rollup-plugin-visualizer:
|
rollup-plugin-visualizer:
|
||||||
specifier: ^7.0.1
|
specifier: ^7.0.1
|
||||||
version: 7.0.1(rolldown@1.2.2)
|
version: 7.0.1(rolldown@1.2.3)
|
||||||
terser:
|
terser:
|
||||||
specifier: ^5.49.1
|
specifier: ^5.49.2
|
||||||
version: 5.49.1
|
version: 5.49.2
|
||||||
typescript:
|
typescript:
|
||||||
specifier: ^6.0.3
|
specifier: ^6.0.3
|
||||||
version: 6.0.3
|
version: 6.0.3
|
||||||
typescript-eslint:
|
typescript-eslint:
|
||||||
specifier: ^8.66.0
|
specifier: ^8.66.0
|
||||||
version: 8.66.0(eslint@10.8.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
|
version: 8.66.0(eslint@10.8.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
|
||||||
vite:
|
vite:
|
||||||
specifier: ^8.2.0
|
specifier: ^8.2.1
|
||||||
version: 8.2.0(@types/node@26.1.2)(terser@5.49.1)
|
version: 8.2.1(@types/node@26.2.0)(terser@5.49.2)
|
||||||
vite-plugin-imagemin:
|
vite-plugin-imagemin:
|
||||||
specifier: ^0.6.1
|
specifier: ^0.6.1
|
||||||
version: 0.6.1(supports-color@10.2.2)(vite@8.2.0(@types/node@26.1.2)(terser@5.49.1))
|
version: 0.6.1(supports-color@10.2.2)(vite@8.2.1(@types/node@26.2.0)(terser@5.49.2))
|
||||||
|
|
||||||
packages:
|
packages:
|
||||||
|
|
||||||
@@ -354,22 +354,22 @@ packages:
|
|||||||
'@jridgewell/trace-mapping@0.3.31':
|
'@jridgewell/trace-mapping@0.3.31':
|
||||||
resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
|
resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
|
||||||
|
|
||||||
'@mui/core-downloads-tracker@9.3.0':
|
'@mui/core-downloads-tracker@9.3.1':
|
||||||
resolution: {integrity: sha512-CrjNKhozfI6kSbD4bvfS8Nx+eFOVX/I5Tb3L73YBXSG0e4PyYbEwu03lp7AOM/ERdceQQrpBnQeSgL4FMZO5mg==}
|
resolution: {integrity: sha512-IAyAFNQbT7hysJ9HXphiOmWJF7G1OglzHanqCgvQgH9LA2ydxtmaTBDbcBqw6euZesyShiwvpvbnYO1GY1AyXQ==}
|
||||||
|
|
||||||
'@mui/icons-material@9.3.0':
|
'@mui/icons-material@9.3.1':
|
||||||
resolution: {integrity: sha512-6kk+cbt7fyehTRIrt3LyeoD4C36lX0biR1NMnwy0Wz7Sj6lwOh6ghY5BZzd1UncyOZGCmTZROBQxSPawcKES7A==}
|
resolution: {integrity: sha512-rZj5ccG7vkpV38o/l4ys+chfE9GFypmvZr9dSNBoYVCNBD9yC6KfKq1TYpEMshWbjic7GKQ8MA1LQlcpGgcq9Q==}
|
||||||
engines: {node: '>=14.0.0'}
|
engines: {node: '>=14.0.0'}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@mui/material': ^9.3.0
|
'@mui/material': ^9.3.1
|
||||||
'@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0
|
'@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0
|
||||||
react: ^17.0.0 || ^18.0.0 || ^19.0.0
|
react: ^17.0.0 || ^18.0.0 || ^19.0.0
|
||||||
peerDependenciesMeta:
|
peerDependenciesMeta:
|
||||||
'@types/react':
|
'@types/react':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@mui/material@9.3.0':
|
'@mui/material@9.3.1':
|
||||||
resolution: {integrity: sha512-H9WJkuaT7YthTOnz8ecygQoKZNVqvgZsTv/oJl6ttalfg6F1MkEi4fx/4j8f5+ju4U9mPX+lALLEZGVT9Jb3Gg==}
|
resolution: {integrity: sha512-NahAEGIXqS1K0bA4th1jeFxBguS59NOcLbMA0vU+fSaPWKjtwGBGGHeTwlc9PSmzMjOZKceeFWESB8fVHr31hA==}
|
||||||
engines: {node: '>=14.0.0'}
|
engines: {node: '>=14.0.0'}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@emotion/react': ^11.5.0
|
'@emotion/react': ^11.5.0
|
||||||
@@ -457,8 +457,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
|
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
|
||||||
engines: {node: '>= 8'}
|
engines: {node: '>= 8'}
|
||||||
|
|
||||||
'@oxc-project/types@0.142.0':
|
'@oxc-project/types@0.143.0':
|
||||||
resolution: {integrity: sha512-7W+2q5AKQVU36fkaryontrHn3YDt1RyUYXatw9i5H8ocYe2sPKSFB6eS8WNPeRKiN1qAWWZUPm7gwFzJGrccqQ==}
|
resolution: {integrity: sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==}
|
||||||
|
|
||||||
'@popperjs/core@2.11.8':
|
'@popperjs/core@2.11.8':
|
||||||
resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==}
|
resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==}
|
||||||
@@ -486,92 +486,92 @@ packages:
|
|||||||
preact: ^10.4.0 || ^11.0.0-0
|
preact: ^10.4.0 || ^11.0.0-0
|
||||||
vite: '>=2.0.0'
|
vite: '>=2.0.0'
|
||||||
|
|
||||||
'@rolldown/binding-android-arm64@1.2.2':
|
'@rolldown/binding-android-arm64@1.2.3':
|
||||||
resolution: {integrity: sha512-l7x215OGvo1s52JWmR8U/DAVzEDWBCIbTm28aeJV/WDTSHgcKXaZTuBT0hJMs5NggilfJTW3clZVvd24yfKJxA==}
|
resolution: {integrity: sha512-zrJtHDcaZJ1Fp7xf4hNl+7seH9Cn/N5TwLYkhgXREtBwAd/jaqW3uqeHxpDugJLVICWg4eW44kOQEGJ1r6jCGw==}
|
||||||
engines: {node: ^20.19.0 || >=22.12.0}
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [android]
|
os: [android]
|
||||||
|
|
||||||
'@rolldown/binding-darwin-arm64@1.2.2':
|
'@rolldown/binding-darwin-arm64@1.2.3':
|
||||||
resolution: {integrity: sha512-9u9Xv6c1AJZT0FfwH5vrMG5Jjcwhc1MlyrPu0XfTqkzsmqfks2M6W/o5XwAJgVVN/jHpqqngC1WevHKKTIUtIA==}
|
resolution: {integrity: sha512-ieIiibVCp0tX7TLu2cafoNPv8wJyYi01ekXpbf8q2j7F4rGAhhXb/eQh7ge9DRBY78GwmRQtvjZDux7EDbA8kA==}
|
||||||
engines: {node: ^20.19.0 || >=22.12.0}
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [darwin]
|
os: [darwin]
|
||||||
|
|
||||||
'@rolldown/binding-darwin-x64@1.2.2':
|
'@rolldown/binding-darwin-x64@1.2.3':
|
||||||
resolution: {integrity: sha512-9W1mbGZAfW3oqd85bhBkmpyHCCzL1TeG/zFFP3vg7b0rlly8cxOcre5nXwz+LHazCwac2MNWgPdPCHndABjpWQ==}
|
resolution: {integrity: sha512-Zh9tCon19eDXJoihx0rqKhMUlMYqzwj3aPsSuHmI4RWZh62dWUL+DJN4C5YQya5TcQBJU/Fe8+rY0jhXTQITqA==}
|
||||||
engines: {node: ^20.19.0 || >=22.12.0}
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [darwin]
|
os: [darwin]
|
||||||
|
|
||||||
'@rolldown/binding-freebsd-x64@1.2.2':
|
'@rolldown/binding-freebsd-x64@1.2.3':
|
||||||
resolution: {integrity: sha512-0p1lhiCSCyaerFwtrdZQUx7NqGk6LQnaRKWX7tFQqwQgvX0rjM15cIkm3pax1UpEakK14C4mOxx/jSqCBdBRqQ==}
|
resolution: {integrity: sha512-nGbJWewA1wrXXZiQhjAT5rhibGfns5ZNkDVqxsO6zJ3f3YvpoDNNmGMSbbhLuXKjNScaBJVOAboztAWVespQMg==}
|
||||||
engines: {node: ^20.19.0 || >=22.12.0}
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [freebsd]
|
os: [freebsd]
|
||||||
|
|
||||||
'@rolldown/binding-linux-arm-gnueabihf@1.2.2':
|
'@rolldown/binding-linux-arm-gnueabihf@1.2.3':
|
||||||
resolution: {integrity: sha512-e+cOJXrJ2L3zx6YzqPg+f6Wbk3V1cKB8bOhbaYdVYN3DdquzNdRAmrbETz1qnt5yp/c7JNlNjmITiA2cVneQ7w==}
|
resolution: {integrity: sha512-QNniJr5Kml0kDEB98jiDOJjXNroxIIi0IXIbdYzY26Xt1pVbeP62+KnoIZLwirOymX/0jDk/2gI/bNUv7A7OIw==}
|
||||||
engines: {node: ^20.19.0 || >=22.12.0}
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
cpu: [arm]
|
cpu: [arm]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@rolldown/binding-linux-arm64-gnu@1.2.2':
|
'@rolldown/binding-linux-arm64-gnu@1.2.3':
|
||||||
resolution: {integrity: sha512-JsSMsj6sNat/MuhG5fnBD7QgbtpHKVe30x5/bAVirDHdhoQRXJkF6xc0Jqk8O4fiCUQAzMOoH9wZi3m60c8wtg==}
|
resolution: {integrity: sha512-TkqEAcmmvH3I/q4114NB4RVt6241Dao48pF45uLcFGrwAaIn0iITgTAKP/dLjbN0R4buJjGb91+UHSoFmpgIWw==}
|
||||||
engines: {node: ^20.19.0 || >=22.12.0}
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
libc: [glibc]
|
libc: [glibc]
|
||||||
|
|
||||||
'@rolldown/binding-linux-arm64-musl@1.2.2':
|
'@rolldown/binding-linux-arm64-musl@1.2.3':
|
||||||
resolution: {integrity: sha512-B5G/zJdHaoJn9vD50eGHWkiWfmq8Uhi3IiLPJTzmZTrAalk1bztUikSXo0qga18ibE0IXboyeMUnhPjhAJ45wQ==}
|
resolution: {integrity: sha512-NHqjnxpsndf4MPymxteFAWHHfkTL8HjWh1KB7z23ofZ6QO2euONuxDXjat69dKZRALnGypg8k8SsK8vZJoXv1Q==}
|
||||||
engines: {node: ^20.19.0 || >=22.12.0}
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
libc: [musl]
|
libc: [musl]
|
||||||
|
|
||||||
'@rolldown/binding-linux-ppc64-gnu@1.2.2':
|
'@rolldown/binding-linux-ppc64-gnu@1.2.3':
|
||||||
resolution: {integrity: sha512-6mC/awzKka8W6EoekjegpfGkjz8jXWDX63pqu/HYVpyKtZfu65Jsh4QAH3Kej3CAv/c1oGX7psTmFEbr0mDxLA==}
|
resolution: {integrity: sha512-6tbrbwfz5GB9DQ4Jwo6hy9v+vR31xZlvzZ6n5Xut6Hhx5PvrA9q/HsK8KMaYQp063iqZGXwNvZtYNLD7EM/x0w==}
|
||||||
engines: {node: ^20.19.0 || >=22.12.0}
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
cpu: [ppc64]
|
cpu: [ppc64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
libc: [glibc]
|
libc: [glibc]
|
||||||
|
|
||||||
'@rolldown/binding-linux-s390x-gnu@1.2.2':
|
'@rolldown/binding-linux-s390x-gnu@1.2.3':
|
||||||
resolution: {integrity: sha512-412MX9fJLdA1IK28EZnc8jYv2HRTleOZgfLQumJ5zy7OeJLZlg/CETwFaXjNmGVxG51cFHpKLqb5LKvBC+HsHA==}
|
resolution: {integrity: sha512-oyuXxXmoZHjXC917IAPFAAv4wWAa0cM9afk8nx1+9/jNNOX1uPf8yDA6p7G0RypOfw/X0PQt5IfoquY1um+zSg==}
|
||||||
engines: {node: ^20.19.0 || >=22.12.0}
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
cpu: [s390x]
|
cpu: [s390x]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
libc: [glibc]
|
libc: [glibc]
|
||||||
|
|
||||||
'@rolldown/binding-linux-x64-gnu@1.2.2':
|
'@rolldown/binding-linux-x64-gnu@1.2.3':
|
||||||
resolution: {integrity: sha512-Q/+HI/ToJafZ1iCqGgVQXUEkIjufHCTF0gBQ2a5o3cg7GJ2h0qyq3nvvSmU+bGda2/7ygXpTY4TM6gO9OhQ0ZA==}
|
resolution: {integrity: sha512-TytMwF2KVGqP2tgd0I1OY0PAv78dZRAYcF5ssDzjM34SUXCED3uXvSd5+lHoC0bTD6eEdFz7LdQNCO1y0oVk9w==}
|
||||||
engines: {node: ^20.19.0 || >=22.12.0}
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
libc: [glibc]
|
libc: [glibc]
|
||||||
|
|
||||||
'@rolldown/binding-linux-x64-musl@1.2.2':
|
'@rolldown/binding-linux-x64-musl@1.2.3':
|
||||||
resolution: {integrity: sha512-ZKp/w41n6wCvxzxQHtQSbuphfX3Y4cCvbjkKHusrLx4lh+JWLTU7StSltO/DKARISzbj368d+qUaCjI8K2wzXw==}
|
resolution: {integrity: sha512-/E9m3qstrJFVPoULV25mVQblSNExY2+kBsYe4sy0Tn0yOOgJ8wZbZt3KnRbF/XeU2Gl1STKUQnDNTqhIE5MD4A==}
|
||||||
engines: {node: ^20.19.0 || >=22.12.0}
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
libc: [musl]
|
libc: [musl]
|
||||||
|
|
||||||
'@rolldown/binding-openharmony-arm64@1.2.2':
|
'@rolldown/binding-openharmony-arm64@1.2.3':
|
||||||
resolution: {integrity: sha512-pxE6xD4KS3eAROkKK5yrhB9/3+vhlhVGMvlQLbdpzrBGDbKrnzx3RLwPaHvasLo6jgaiBLn7e04Df9C4tYhjmA==}
|
resolution: {integrity: sha512-Kr0OcsoQI816i6HOl3vFHpd1K0eZyh76zgfj4c1nTyaTsd5r2Mj1lwM4R90y/qaCfmTn9eHy0SKwi98eitRxug==}
|
||||||
engines: {node: ^20.19.0 || >=22.12.0}
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [openharmony]
|
os: [openharmony]
|
||||||
|
|
||||||
'@rolldown/binding-win32-arm64-msvc@1.2.2':
|
'@rolldown/binding-win32-arm64-msvc@1.2.3':
|
||||||
resolution: {integrity: sha512-4MqEue5re+xIZzAWsB8sj0P1kqZySWqIuN4t6QaIO/YA6SFwySOLruvWQFzfmqk8LBK2P30KCSJwf6mJCZZ5/A==}
|
resolution: {integrity: sha512-hOtMwTqnME+/gJcH/PCZ0wn0zPUjiWOgkHpxbSJpfGKMezHltx1S7/k1SitzVa7Ww2cqrDDaFbZEhcJZO8o+Jw==}
|
||||||
engines: {node: ^20.19.0 || >=22.12.0}
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [win32]
|
os: [win32]
|
||||||
|
|
||||||
'@rolldown/binding-win32-x64-msvc@1.2.2':
|
'@rolldown/binding-win32-x64-msvc@1.2.3':
|
||||||
resolution: {integrity: sha512-NweNxxD0Nf9t8v7kodun45Ijp3EIwYY+uydPP6qBEYvfBqhIjN6dZMzlQja3tqX/aLs3F3Uz+AxDpKgRhpOZQg==}
|
resolution: {integrity: sha512-ekcqMMkI2PlhYnfzQnB/cEdYUVVJViWvoUyLrbzgDoi3Snfc1mVBwdnc306ufA5ejy8JSPjT2RlW1nQSjW7efg==}
|
||||||
engines: {node: ^20.19.0 || >=22.12.0}
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [win32]
|
os: [win32]
|
||||||
@@ -665,8 +665,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@26.1.2':
|
'@types/node@26.2.0':
|
||||||
resolution: {integrity: sha512-Vu4a5UFA9rIIFJ7rB/Vaafh9lrCQszopTCx6KjFboXTGQbPNasehVR5TEiithSDGyd1DEiUByggTZsg8jukeIg==}
|
resolution: {integrity: sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg==}
|
||||||
|
|
||||||
'@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==}
|
||||||
@@ -1344,8 +1344,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==}
|
resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==}
|
||||||
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
|
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
|
||||||
|
|
||||||
eslint@10.8.0:
|
eslint@10.8.1:
|
||||||
resolution: {integrity: sha512-nuKKvN+oIBO0koN7Tm7dlkmnkc21mtt0QJLwAKzjLq14y6lRTdVG36MZHJ8eQHwdJMwZbQNMlPOYedMq/oVJvQ==}
|
resolution: {integrity: sha512-wqA7W2jbsC/BnV9Iv1UZpKVFkO1AdNoSmYW8NWG4HNOBbkAMvIqDZ27pI2f07dqn583NcIC44ckjAcOXDL1QbQ==}
|
||||||
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
|
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -2124,8 +2124,8 @@ packages:
|
|||||||
ms@2.1.3:
|
ms@2.1.3:
|
||||||
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
|
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
|
||||||
|
|
||||||
nanoid@3.3.17:
|
nanoid@3.3.18:
|
||||||
resolution: {integrity: sha512-xQLf0A3HOMlgHq0n247/LRuAOYmB7dXJ/DvAxGvsSBij45XtBSmQycu+F8ODbHwns/XyFZagyL1+J0Offw1E0g==}
|
resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==}
|
||||||
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
|
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
@@ -2343,8 +2343,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
|
resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
postcss@8.5.25:
|
postcss@8.5.26:
|
||||||
resolution: {integrity: sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==}
|
resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==}
|
||||||
engines: {node: ^10 || ^12 || >=14}
|
engines: {node: ^10 || ^12 || >=14}
|
||||||
|
|
||||||
powershell-utils@0.1.0:
|
powershell-utils@0.1.0:
|
||||||
@@ -2498,8 +2498,8 @@ packages:
|
|||||||
deprecated: Rimraf versions prior to v4 are no longer supported
|
deprecated: Rimraf versions prior to v4 are no longer supported
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
rolldown@1.2.2:
|
rolldown@1.2.3:
|
||||||
resolution: {integrity: sha512-opwpo1tQBAcpSUJDt94B7hhLNGOKjCdE//XXjeLrnx9b83bjnw45tXdg1b09yEw/VLFBJGZpwRULMmOZo7ol+A==}
|
resolution: {integrity: sha512-rn9wpmxplLf7NLNyCk9FyWh3FM43DbY8jOzCdEPzH7uflhTftRbCEpqi6Ly2osgoU8OwObtmavMbWLaWy4LX7A==}
|
||||||
engines: {node: ^20.19.0 || >=22.12.0}
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
@@ -2739,8 +2739,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-ZOn6nJUgvgC09+doCEF3oB+r3ag7kUvlsXEGX069QRD60p+P3uP7XG9N2/at+EyIRGSN//ZY3LyEotA1YpmjuA==}
|
resolution: {integrity: sha512-ZOn6nJUgvgC09+doCEF3oB+r3ag7kUvlsXEGX069QRD60p+P3uP7XG9N2/at+EyIRGSN//ZY3LyEotA1YpmjuA==}
|
||||||
engines: {node: '>=4'}
|
engines: {node: '>=4'}
|
||||||
|
|
||||||
terser@5.49.1:
|
terser@5.49.2:
|
||||||
resolution: {integrity: sha512-7A2xlQ5EnGT8KPA92dUh6RbRYTVw8hEaEN9L1K68l4UOXFuV511NnAqObGoRqGOQofQcMypisu1s3xawCEHrvA==}
|
resolution: {integrity: sha512-rGbJiKeQ4WDe3EXlDAIaQcwftVfv2Q8o1awFNfvXolJYKkb1AuZY1RTOmqx4LJXZENbWZA7eIsYGHuEzHsi1nQ==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
@@ -2869,8 +2869,8 @@ packages:
|
|||||||
peerDependencies:
|
peerDependencies:
|
||||||
vite: 5.x || 6.x || 7.x || 8.x
|
vite: 5.x || 6.x || 7.x || 8.x
|
||||||
|
|
||||||
vite@8.2.0:
|
vite@8.2.1:
|
||||||
resolution: {integrity: sha512-pn+CFpM0lwDeKwmOq1ZaBK/9sjorZcgqxki6MbY/jPEVd9vichIlmlD4HmQ5wdP5EgqQCFRaACBxMC7uEGc6lQ==}
|
resolution: {integrity: sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==}
|
||||||
engines: {node: ^20.19.0 || >=22.12.0}
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -3208,9 +3208,9 @@ snapshots:
|
|||||||
'@esbuild/linux-loong64@0.14.54':
|
'@esbuild/linux-loong64@0.14.54':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@eslint-community/eslint-utils@4.10.1(eslint@10.8.0(supports-color@10.2.2))':
|
'@eslint-community/eslint-utils@4.10.1(eslint@10.8.1(supports-color@10.2.2))':
|
||||||
dependencies:
|
dependencies:
|
||||||
eslint: 10.8.0(supports-color@10.2.2)
|
eslint: 10.8.1(supports-color@10.2.2)
|
||||||
eslint-visitor-keys: 3.4.3
|
eslint-visitor-keys: 3.4.3
|
||||||
|
|
||||||
'@eslint-community/regexpp@4.12.2': {}
|
'@eslint-community/regexpp@4.12.2': {}
|
||||||
@@ -3231,9 +3231,9 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
'@types/json-schema': 7.0.15
|
'@types/json-schema': 7.0.15
|
||||||
|
|
||||||
'@eslint/js@10.0.1(eslint@10.8.0(supports-color@10.2.2))':
|
'@eslint/js@10.0.1(eslint@10.8.1(supports-color@10.2.2))':
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
eslint: 10.8.0(supports-color@10.2.2)
|
eslint: 10.8.1(supports-color@10.2.2)
|
||||||
|
|
||||||
'@eslint/object-schema@3.0.5': {}
|
'@eslint/object-schema@3.0.5': {}
|
||||||
|
|
||||||
@@ -3282,20 +3282,20 @@ snapshots:
|
|||||||
'@jridgewell/resolve-uri': 3.1.2
|
'@jridgewell/resolve-uri': 3.1.2
|
||||||
'@jridgewell/sourcemap-codec': 1.5.5
|
'@jridgewell/sourcemap-codec': 1.5.5
|
||||||
|
|
||||||
'@mui/core-downloads-tracker@9.3.0': {}
|
'@mui/core-downloads-tracker@9.3.1': {}
|
||||||
|
|
||||||
'@mui/icons-material@9.3.0(@mui/material@9.3.0(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(@types/react@19.2.18)(react@19.2.8)':
|
'@mui/icons-material@9.3.1(@mui/material@9.3.1(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(@types/react@19.2.18)(react@19.2.8)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/runtime': 7.29.7
|
'@babel/runtime': 7.29.7
|
||||||
'@mui/material': 9.3.0(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
|
'@mui/material': 9.3.1(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
|
||||||
react: 19.2.8
|
react: 19.2.8
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@types/react': 19.2.18
|
'@types/react': 19.2.18
|
||||||
|
|
||||||
'@mui/material@9.3.0(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
|
'@mui/material@9.3.1(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/runtime': 7.29.7
|
'@babel/runtime': 7.29.7
|
||||||
'@mui/core-downloads-tracker': 9.3.0
|
'@mui/core-downloads-tracker': 9.3.1
|
||||||
'@mui/system': 9.3.0(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(@types/react@19.2.18)(react@19.2.8)
|
'@mui/system': 9.3.0(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(@types/react@19.2.18)(react@19.2.8)
|
||||||
'@mui/types': 9.3.0(@types/react@19.2.18)
|
'@mui/types': 9.3.0(@types/react@19.2.18)
|
||||||
'@mui/utils': 9.3.0(@types/react@19.2.18)(react@19.2.8)
|
'@mui/utils': 9.3.0(@types/react@19.2.18)(react@19.2.8)
|
||||||
@@ -3381,23 +3381,23 @@ snapshots:
|
|||||||
'@nodelib/fs.scandir': 2.1.5
|
'@nodelib/fs.scandir': 2.1.5
|
||||||
fastq: 1.20.1
|
fastq: 1.20.1
|
||||||
|
|
||||||
'@oxc-project/types@0.142.0': {}
|
'@oxc-project/types@0.143.0': {}
|
||||||
|
|
||||||
'@popperjs/core@2.11.8': {}
|
'@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.0(@types/node@26.1.2)(terser@5.49.1))':
|
'@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.1(@types/node@26.2.0)(terser@5.49.2))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/core': 7.29.7(supports-color@10.2.2)
|
'@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': 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)
|
'@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.0(@types/node@26.1.2)(terser@5.49.1))
|
'@prefresh/vite': 2.4.12(preact@10.29.8)(supports-color@10.2.2)(vite@8.2.1(@types/node@26.2.0)(terser@5.49.2))
|
||||||
'@rollup/pluginutils': 5.4.0
|
'@rollup/pluginutils': 5.4.0
|
||||||
babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.29.7(supports-color@10.2.2))
|
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)
|
debug: 4.4.3(supports-color@10.2.2)
|
||||||
magic-string: 0.30.21
|
magic-string: 0.30.21
|
||||||
picocolors: 1.1.1
|
picocolors: 1.1.1
|
||||||
vite: 8.2.0(@types/node@26.1.2)(terser@5.49.1)
|
vite: 8.2.1(@types/node@26.2.0)(terser@5.49.2)
|
||||||
vite-prerender-plugin: 0.5.13(vite@8.2.0(@types/node@26.1.2)(terser@5.49.1))
|
vite-prerender-plugin: 0.5.13(vite@8.2.1(@types/node@26.2.0)(terser@5.49.2))
|
||||||
zimmerframe: 1.1.4
|
zimmerframe: 1.1.4
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- preact
|
- preact
|
||||||
@@ -3412,7 +3412,7 @@ snapshots:
|
|||||||
|
|
||||||
'@prefresh/utils@1.2.1': {}
|
'@prefresh/utils@1.2.1': {}
|
||||||
|
|
||||||
'@prefresh/vite@2.4.12(preact@10.29.8)(supports-color@10.2.2)(vite@8.2.0(@types/node@26.1.2)(terser@5.49.1))':
|
'@prefresh/vite@2.4.12(preact@10.29.8)(supports-color@10.2.2)(vite@8.2.1(@types/node@26.2.0)(terser@5.49.2))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/core': 7.29.7(supports-color@10.2.2)
|
'@babel/core': 7.29.7(supports-color@10.2.2)
|
||||||
'@prefresh/babel-plugin': 0.5.3
|
'@prefresh/babel-plugin': 0.5.3
|
||||||
@@ -3420,50 +3420,50 @@ snapshots:
|
|||||||
'@prefresh/utils': 1.2.1
|
'@prefresh/utils': 1.2.1
|
||||||
'@rollup/pluginutils': 4.2.1
|
'@rollup/pluginutils': 4.2.1
|
||||||
preact: 10.29.8
|
preact: 10.29.8
|
||||||
vite: 8.2.0(@types/node@26.1.2)(terser@5.49.1)
|
vite: 8.2.1(@types/node@26.2.0)(terser@5.49.2)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
'@rolldown/binding-android-arm64@1.2.2':
|
'@rolldown/binding-android-arm64@1.2.3':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@rolldown/binding-darwin-arm64@1.2.2':
|
'@rolldown/binding-darwin-arm64@1.2.3':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@rolldown/binding-darwin-x64@1.2.2':
|
'@rolldown/binding-darwin-x64@1.2.3':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@rolldown/binding-freebsd-x64@1.2.2':
|
'@rolldown/binding-freebsd-x64@1.2.3':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@rolldown/binding-linux-arm-gnueabihf@1.2.2':
|
'@rolldown/binding-linux-arm-gnueabihf@1.2.3':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@rolldown/binding-linux-arm64-gnu@1.2.2':
|
'@rolldown/binding-linux-arm64-gnu@1.2.3':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@rolldown/binding-linux-arm64-musl@1.2.2':
|
'@rolldown/binding-linux-arm64-musl@1.2.3':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@rolldown/binding-linux-ppc64-gnu@1.2.2':
|
'@rolldown/binding-linux-ppc64-gnu@1.2.3':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@rolldown/binding-linux-s390x-gnu@1.2.2':
|
'@rolldown/binding-linux-s390x-gnu@1.2.3':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@rolldown/binding-linux-x64-gnu@1.2.2':
|
'@rolldown/binding-linux-x64-gnu@1.2.3':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@rolldown/binding-linux-x64-musl@1.2.2':
|
'@rolldown/binding-linux-x64-musl@1.2.3':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@rolldown/binding-openharmony-arm64@1.2.2':
|
'@rolldown/binding-openharmony-arm64@1.2.3':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@rolldown/binding-win32-arm64-msvc@1.2.2':
|
'@rolldown/binding-win32-arm64-msvc@1.2.3':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@rolldown/binding-win32-x64-msvc@1.2.2':
|
'@rolldown/binding-win32-x64-msvc@1.2.3':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@rolldown/pluginutils@1.0.1': {}
|
'@rolldown/pluginutils@1.0.1': {}
|
||||||
@@ -3511,7 +3511,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': 26.1.2
|
'@types/node': 26.2.0
|
||||||
|
|
||||||
'@types/imagemin-gifsicle@7.0.4':
|
'@types/imagemin-gifsicle@7.0.4':
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -3540,23 +3540,23 @@ snapshots:
|
|||||||
|
|
||||||
'@types/imagemin@7.0.1':
|
'@types/imagemin@7.0.1':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 26.1.2
|
'@types/node': 26.2.0
|
||||||
|
|
||||||
'@types/imagemin@9.0.1':
|
'@types/imagemin@9.0.1':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 26.1.2
|
'@types/node': 26.2.0
|
||||||
|
|
||||||
'@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': 26.1.2
|
'@types/node': 26.2.0
|
||||||
|
|
||||||
'@types/minimatch@6.0.0':
|
'@types/minimatch@6.0.0':
|
||||||
dependencies:
|
dependencies:
|
||||||
minimatch: 10.2.6
|
minimatch: 10.2.6
|
||||||
|
|
||||||
'@types/node@26.1.2':
|
'@types/node@26.2.0':
|
||||||
dependencies:
|
dependencies:
|
||||||
undici-types: 8.3.0
|
undici-types: 8.3.0
|
||||||
|
|
||||||
@@ -3578,21 +3578,21 @@ snapshots:
|
|||||||
|
|
||||||
'@types/responselike@1.0.3':
|
'@types/responselike@1.0.3':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 26.1.2
|
'@types/node': 26.2.0
|
||||||
|
|
||||||
'@types/svgo@2.6.4':
|
'@types/svgo@2.6.4':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 26.1.2
|
'@types/node': 26.2.0
|
||||||
|
|
||||||
'@typescript-eslint/eslint-plugin@8.66.0(@typescript-eslint/parser@8.66.0(eslint@10.8.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3))(eslint@10.8.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)':
|
'@typescript-eslint/eslint-plugin@8.66.0(@typescript-eslint/parser@8.66.0(eslint@10.8.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3))(eslint@10.8.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@eslint-community/regexpp': 4.12.2
|
'@eslint-community/regexpp': 4.12.2
|
||||||
'@typescript-eslint/parser': 8.66.0(eslint@10.8.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
|
'@typescript-eslint/parser': 8.66.0(eslint@10.8.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
|
||||||
'@typescript-eslint/scope-manager': 8.66.0
|
'@typescript-eslint/scope-manager': 8.66.0
|
||||||
'@typescript-eslint/type-utils': 8.66.0(eslint@10.8.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
|
'@typescript-eslint/type-utils': 8.66.0(eslint@10.8.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
|
||||||
'@typescript-eslint/utils': 8.66.0(eslint@10.8.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
|
'@typescript-eslint/utils': 8.66.0(eslint@10.8.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
|
||||||
'@typescript-eslint/visitor-keys': 8.66.0
|
'@typescript-eslint/visitor-keys': 8.66.0
|
||||||
eslint: 10.8.0(supports-color@10.2.2)
|
eslint: 10.8.1(supports-color@10.2.2)
|
||||||
ignore: 7.0.6
|
ignore: 7.0.6
|
||||||
natural-compare: 1.4.0
|
natural-compare: 1.4.0
|
||||||
ts-api-utils: 2.5.0(typescript@6.0.3)
|
ts-api-utils: 2.5.0(typescript@6.0.3)
|
||||||
@@ -3600,14 +3600,14 @@ snapshots:
|
|||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
'@typescript-eslint/parser@8.66.0(eslint@10.8.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)':
|
'@typescript-eslint/parser@8.66.0(eslint@10.8.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@typescript-eslint/scope-manager': 8.66.0
|
'@typescript-eslint/scope-manager': 8.66.0
|
||||||
'@typescript-eslint/types': 8.66.0
|
'@typescript-eslint/types': 8.66.0
|
||||||
'@typescript-eslint/typescript-estree': 8.66.0(supports-color@10.2.2)(typescript@6.0.3)
|
'@typescript-eslint/typescript-estree': 8.66.0(supports-color@10.2.2)(typescript@6.0.3)
|
||||||
'@typescript-eslint/visitor-keys': 8.66.0
|
'@typescript-eslint/visitor-keys': 8.66.0
|
||||||
debug: 4.4.3(supports-color@10.2.2)
|
debug: 4.4.3(supports-color@10.2.2)
|
||||||
eslint: 10.8.0(supports-color@10.2.2)
|
eslint: 10.8.1(supports-color@10.2.2)
|
||||||
typescript: 6.0.3
|
typescript: 6.0.3
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
@@ -3630,13 +3630,13 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
typescript: 6.0.3
|
typescript: 6.0.3
|
||||||
|
|
||||||
'@typescript-eslint/type-utils@8.66.0(eslint@10.8.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)':
|
'@typescript-eslint/type-utils@8.66.0(eslint@10.8.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@typescript-eslint/types': 8.66.0
|
'@typescript-eslint/types': 8.66.0
|
||||||
'@typescript-eslint/typescript-estree': 8.66.0(supports-color@10.2.2)(typescript@6.0.3)
|
'@typescript-eslint/typescript-estree': 8.66.0(supports-color@10.2.2)(typescript@6.0.3)
|
||||||
'@typescript-eslint/utils': 8.66.0(eslint@10.8.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
|
'@typescript-eslint/utils': 8.66.0(eslint@10.8.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
|
||||||
debug: 4.4.3(supports-color@10.2.2)
|
debug: 4.4.3(supports-color@10.2.2)
|
||||||
eslint: 10.8.0(supports-color@10.2.2)
|
eslint: 10.8.1(supports-color@10.2.2)
|
||||||
ts-api-utils: 2.5.0(typescript@6.0.3)
|
ts-api-utils: 2.5.0(typescript@6.0.3)
|
||||||
typescript: 6.0.3
|
typescript: 6.0.3
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
@@ -3659,13 +3659,13 @@ snapshots:
|
|||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
'@typescript-eslint/utils@8.66.0(eslint@10.8.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)':
|
'@typescript-eslint/utils@8.66.0(eslint@10.8.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@eslint-community/eslint-utils': 4.10.1(eslint@10.8.0(supports-color@10.2.2))
|
'@eslint-community/eslint-utils': 4.10.1(eslint@10.8.1(supports-color@10.2.2))
|
||||||
'@typescript-eslint/scope-manager': 8.66.0
|
'@typescript-eslint/scope-manager': 8.66.0
|
||||||
'@typescript-eslint/types': 8.66.0
|
'@typescript-eslint/types': 8.66.0
|
||||||
'@typescript-eslint/typescript-estree': 8.66.0(supports-color@10.2.2)(typescript@6.0.3)
|
'@typescript-eslint/typescript-estree': 8.66.0(supports-color@10.2.2)(typescript@6.0.3)
|
||||||
eslint: 10.8.0(supports-color@10.2.2)
|
eslint: 10.8.1(supports-color@10.2.2)
|
||||||
typescript: 6.0.3
|
typescript: 6.0.3
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
@@ -4269,9 +4269,9 @@ snapshots:
|
|||||||
|
|
||||||
escape-string-regexp@4.0.0: {}
|
escape-string-regexp@4.0.0: {}
|
||||||
|
|
||||||
eslint-config-prettier@10.1.8(eslint@10.8.0(supports-color@10.2.2)):
|
eslint-config-prettier@10.1.8(eslint@10.8.1(supports-color@10.2.2)):
|
||||||
dependencies:
|
dependencies:
|
||||||
eslint: 10.8.0(supports-color@10.2.2)
|
eslint: 10.8.1(supports-color@10.2.2)
|
||||||
|
|
||||||
eslint-scope@9.1.2:
|
eslint-scope@9.1.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -4284,9 +4284,9 @@ snapshots:
|
|||||||
|
|
||||||
eslint-visitor-keys@5.0.1: {}
|
eslint-visitor-keys@5.0.1: {}
|
||||||
|
|
||||||
eslint@10.8.0(supports-color@10.2.2):
|
eslint@10.8.1(supports-color@10.2.2):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@eslint-community/eslint-utils': 4.10.1(eslint@10.8.0(supports-color@10.2.2))
|
'@eslint-community/eslint-utils': 4.10.1(eslint@10.8.1(supports-color@10.2.2))
|
||||||
'@eslint-community/regexpp': 4.12.2
|
'@eslint-community/regexpp': 4.12.2
|
||||||
'@eslint/config-array': 0.23.5(supports-color@10.2.2)
|
'@eslint/config-array': 0.23.5(supports-color@10.2.2)
|
||||||
'@eslint/config-helpers': 0.7.0
|
'@eslint/config-helpers': 0.7.0
|
||||||
@@ -5080,7 +5080,7 @@ snapshots:
|
|||||||
|
|
||||||
ms@2.1.3: {}
|
ms@2.1.3: {}
|
||||||
|
|
||||||
nanoid@3.3.17: {}
|
nanoid@3.3.18: {}
|
||||||
|
|
||||||
natural-compare@1.4.0: {}
|
natural-compare@1.4.0: {}
|
||||||
|
|
||||||
@@ -5277,9 +5277,9 @@ snapshots:
|
|||||||
|
|
||||||
possible-typed-array-names@1.1.0: {}
|
possible-typed-array-names@1.1.0: {}
|
||||||
|
|
||||||
postcss@8.5.25:
|
postcss@8.5.26:
|
||||||
dependencies:
|
dependencies:
|
||||||
nanoid: 3.3.17
|
nanoid: 3.3.18
|
||||||
picocolors: 1.1.1
|
picocolors: 1.1.1
|
||||||
source-map-js: 1.2.1
|
source-map-js: 1.2.1
|
||||||
|
|
||||||
@@ -5418,34 +5418,34 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
glob: 7.2.3
|
glob: 7.2.3
|
||||||
|
|
||||||
rolldown@1.2.2:
|
rolldown@1.2.3:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@oxc-project/types': 0.142.0
|
'@oxc-project/types': 0.143.0
|
||||||
'@rolldown/pluginutils': 1.0.1
|
'@rolldown/pluginutils': 1.0.1
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@rolldown/binding-android-arm64': 1.2.2
|
'@rolldown/binding-android-arm64': 1.2.3
|
||||||
'@rolldown/binding-darwin-arm64': 1.2.2
|
'@rolldown/binding-darwin-arm64': 1.2.3
|
||||||
'@rolldown/binding-darwin-x64': 1.2.2
|
'@rolldown/binding-darwin-x64': 1.2.3
|
||||||
'@rolldown/binding-freebsd-x64': 1.2.2
|
'@rolldown/binding-freebsd-x64': 1.2.3
|
||||||
'@rolldown/binding-linux-arm-gnueabihf': 1.2.2
|
'@rolldown/binding-linux-arm-gnueabihf': 1.2.3
|
||||||
'@rolldown/binding-linux-arm64-gnu': 1.2.2
|
'@rolldown/binding-linux-arm64-gnu': 1.2.3
|
||||||
'@rolldown/binding-linux-arm64-musl': 1.2.2
|
'@rolldown/binding-linux-arm64-musl': 1.2.3
|
||||||
'@rolldown/binding-linux-ppc64-gnu': 1.2.2
|
'@rolldown/binding-linux-ppc64-gnu': 1.2.3
|
||||||
'@rolldown/binding-linux-s390x-gnu': 1.2.2
|
'@rolldown/binding-linux-s390x-gnu': 1.2.3
|
||||||
'@rolldown/binding-linux-x64-gnu': 1.2.2
|
'@rolldown/binding-linux-x64-gnu': 1.2.3
|
||||||
'@rolldown/binding-linux-x64-musl': 1.2.2
|
'@rolldown/binding-linux-x64-musl': 1.2.3
|
||||||
'@rolldown/binding-openharmony-arm64': 1.2.2
|
'@rolldown/binding-openharmony-arm64': 1.2.3
|
||||||
'@rolldown/binding-win32-arm64-msvc': 1.2.2
|
'@rolldown/binding-win32-arm64-msvc': 1.2.3
|
||||||
'@rolldown/binding-win32-x64-msvc': 1.2.2
|
'@rolldown/binding-win32-x64-msvc': 1.2.3
|
||||||
|
|
||||||
rollup-plugin-visualizer@7.0.1(rolldown@1.2.2):
|
rollup-plugin-visualizer@7.0.1(rolldown@1.2.3):
|
||||||
dependencies:
|
dependencies:
|
||||||
open: 11.0.0
|
open: 11.0.0
|
||||||
picomatch: 4.0.5
|
picomatch: 4.0.5
|
||||||
source-map: 0.7.6
|
source-map: 0.7.6
|
||||||
yargs: 18.1.0
|
yargs: 18.1.0
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
rolldown: 1.2.2
|
rolldown: 1.2.3
|
||||||
|
|
||||||
run-applescript@7.1.0: {}
|
run-applescript@7.1.0: {}
|
||||||
|
|
||||||
@@ -5647,7 +5647,7 @@ snapshots:
|
|||||||
temp-dir: 1.0.0
|
temp-dir: 1.0.0
|
||||||
uuid: 3.4.0
|
uuid: 3.4.0
|
||||||
|
|
||||||
terser@5.49.1:
|
terser@5.49.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@jridgewell/source-map': 0.3.11
|
'@jridgewell/source-map': 0.3.11
|
||||||
acorn: 8.18.0
|
acorn: 8.18.0
|
||||||
@@ -5707,13 +5707,13 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
typescript: 6.0.3
|
typescript: 6.0.3
|
||||||
|
|
||||||
typescript-eslint@8.66.0(eslint@10.8.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3):
|
typescript-eslint@8.66.0(eslint@10.8.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@typescript-eslint/eslint-plugin': 8.66.0(@typescript-eslint/parser@8.66.0(eslint@10.8.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3))(eslint@10.8.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
|
'@typescript-eslint/eslint-plugin': 8.66.0(@typescript-eslint/parser@8.66.0(eslint@10.8.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3))(eslint@10.8.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
|
||||||
'@typescript-eslint/parser': 8.66.0(eslint@10.8.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
|
'@typescript-eslint/parser': 8.66.0(eslint@10.8.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
|
||||||
'@typescript-eslint/typescript-estree': 8.66.0(supports-color@10.2.2)(typescript@6.0.3)
|
'@typescript-eslint/typescript-estree': 8.66.0(supports-color@10.2.2)(typescript@6.0.3)
|
||||||
'@typescript-eslint/utils': 8.66.0(eslint@10.8.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
|
'@typescript-eslint/utils': 8.66.0(eslint@10.8.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
|
||||||
eslint: 10.8.0(supports-color@10.2.2)
|
eslint: 10.8.1(supports-color@10.2.2)
|
||||||
typescript: 6.0.3
|
typescript: 6.0.3
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
@@ -5758,7 +5758,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(supports-color@10.2.2)(vite@8.2.0(@types/node@26.1.2)(terser@5.49.1)):
|
vite-plugin-imagemin@0.6.1(supports-color@10.2.2)(vite@8.2.1(@types/node@26.2.0)(terser@5.49.2)):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/imagemin': 7.0.1
|
'@types/imagemin': 7.0.1
|
||||||
'@types/imagemin-gifsicle': 7.0.4
|
'@types/imagemin-gifsicle': 7.0.4
|
||||||
@@ -5783,11 +5783,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: 8.2.0(@types/node@26.1.2)(terser@5.49.1)
|
vite: 8.2.1(@types/node@26.2.0)(terser@5.49.2)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
vite-prerender-plugin@0.5.13(vite@8.2.0(@types/node@26.1.2)(terser@5.49.1)):
|
vite-prerender-plugin@0.5.13(vite@8.2.1(@types/node@26.2.0)(terser@5.49.2)):
|
||||||
dependencies:
|
dependencies:
|
||||||
kolorist: 1.8.0
|
kolorist: 1.8.0
|
||||||
magic-string: 0.30.21
|
magic-string: 0.30.21
|
||||||
@@ -5795,19 +5795,19 @@ 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
|
stack-trace: 1.0.0
|
||||||
vite: 8.2.0(@types/node@26.1.2)(terser@5.49.1)
|
vite: 8.2.1(@types/node@26.2.0)(terser@5.49.2)
|
||||||
|
|
||||||
vite@8.2.0(@types/node@26.1.2)(terser@5.49.1):
|
vite@8.2.1(@types/node@26.2.0)(terser@5.49.2):
|
||||||
dependencies:
|
dependencies:
|
||||||
lightningcss: 1.33.0
|
lightningcss: 1.33.0
|
||||||
picomatch: 4.0.5
|
picomatch: 4.0.5
|
||||||
postcss: 8.5.25
|
postcss: 8.5.26
|
||||||
rolldown: 1.2.2
|
rolldown: 1.2.3
|
||||||
tinyglobby: 0.2.17
|
tinyglobby: 0.2.17
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@types/node': 26.1.2
|
'@types/node': 26.2.0
|
||||||
fsevents: 2.3.3
|
fsevents: 2.3.3
|
||||||
terser: 5.49.1
|
terser: 5.49.2
|
||||||
|
|
||||||
which-typed-array@1.1.22:
|
which-typed-array@1.1.22:
|
||||||
dependencies:
|
dependencies:
|
||||||
|
|||||||
@@ -3,11 +3,9 @@ import { useBlocker } from 'react-router';
|
|||||||
|
|
||||||
import AddIcon from '@mui/icons-material/Add';
|
import AddIcon from '@mui/icons-material/Add';
|
||||||
import CancelIcon from '@mui/icons-material/Cancel';
|
import CancelIcon from '@mui/icons-material/Cancel';
|
||||||
import PlayArrowIcon from '@mui/icons-material/PlayArrow';
|
|
||||||
import WarningIcon from '@mui/icons-material/Warning';
|
import WarningIcon from '@mui/icons-material/Warning';
|
||||||
import { Box, Button, IconButton, Typography } from '@mui/material';
|
import { Box, Button, Typography } from '@mui/material';
|
||||||
|
|
||||||
import { callAction } from '@/api/app';
|
|
||||||
import {
|
import {
|
||||||
Body,
|
Body,
|
||||||
Cell,
|
Cell,
|
||||||
@@ -48,7 +46,7 @@ const DEFAULT_COMMAND_ITEM: Omit<CommandItem, 'id'> = {
|
|||||||
|
|
||||||
const commandsTheme = {
|
const commandsTheme = {
|
||||||
Table: `
|
Table: `
|
||||||
--data-table-library_grid-template-columns: repeat(1, minmax(100px, 1fr)) repeat(1, minmax(100px, 1fr)) 160px 32px;
|
--data-table-library_grid-template-columns: repeat(1, minmax(100px, 1fr)) repeat(1, minmax(100px, 1fr)) 160px;
|
||||||
`,
|
`,
|
||||||
BaseRow: `
|
BaseRow: `
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
@@ -143,21 +141,6 @@ const Commands = () => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const { send: executeCommand } = useRequest(
|
|
||||||
(id: string) => callAction({ action: 'executeCommand', param: id }),
|
|
||||||
{ immediate: false }
|
|
||||||
)
|
|
||||||
.onSuccess(() => {
|
|
||||||
toast.success(LL.EXECUTE_COMMAND_SENT());
|
|
||||||
})
|
|
||||||
.onError((error) => {
|
|
||||||
toast.error(String(error.error?.message || 'An error occurred'));
|
|
||||||
});
|
|
||||||
|
|
||||||
const execute = async (name: string) => {
|
|
||||||
await executeCommand(name);
|
|
||||||
};
|
|
||||||
|
|
||||||
const editItem = (ci: CommandItem) => {
|
const editItem = (ci: CommandItem) => {
|
||||||
setCreating(false);
|
setCreating(false);
|
||||||
setSelectedItem(ci);
|
setSelectedItem(ci);
|
||||||
@@ -222,7 +205,6 @@ const Commands = () => {
|
|||||||
<HeaderCell stiff>{LL.COMMAND(0)}</HeaderCell>
|
<HeaderCell stiff>{LL.COMMAND(0)}</HeaderCell>
|
||||||
<HeaderCell stiff>{LL.VALUE(0)}</HeaderCell>
|
<HeaderCell stiff>{LL.VALUE(0)}</HeaderCell>
|
||||||
<HeaderCell stiff>{LL.NAME(0)}</HeaderCell>
|
<HeaderCell stiff>{LL.NAME(0)}</HeaderCell>
|
||||||
<HeaderCell></HeaderCell>
|
|
||||||
</HeaderRow>
|
</HeaderRow>
|
||||||
</Header>
|
</Header>
|
||||||
<Body>
|
<Body>
|
||||||
@@ -231,16 +213,6 @@ const Commands = () => {
|
|||||||
<Cell>{ci.cmd}</Cell>
|
<Cell>{ci.cmd}</Cell>
|
||||||
<Cell>{ci.value}</Cell>
|
<Cell>{ci.value}</Cell>
|
||||||
<Cell>{ci.name}</Cell>
|
<Cell>{ci.name}</Cell>
|
||||||
<Cell>
|
|
||||||
{numChanges === 0 && (
|
|
||||||
<IconButton
|
|
||||||
onClick={() => execute(ci.name)}
|
|
||||||
style={{ backgroundColor: 'transparent' }}
|
|
||||||
>
|
|
||||||
<PlayArrowIcon color="primary" sx={{ fontSize: 16 }} />
|
|
||||||
</IconButton>
|
|
||||||
)}
|
|
||||||
</Cell>
|
|
||||||
</Row>
|
</Row>
|
||||||
))}
|
))}
|
||||||
</Body>
|
</Body>
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ const CommandsDialog = ({
|
|||||||
{ immediate: false }
|
{ immediate: false }
|
||||||
)
|
)
|
||||||
.onSuccess(() => {
|
.onSuccess(() => {
|
||||||
toast.success(LL.EXECUTE_COMMAND_SENT());
|
toast.success(LL.COMMAND_SENT());
|
||||||
})
|
})
|
||||||
.onError((error) => {
|
.onError((error) => {
|
||||||
toast.error(String(error.error?.message || 'An error occurred'));
|
toast.error(String(error.error?.message || 'An error occurred'));
|
||||||
@@ -121,8 +121,8 @@ const CommandsDialog = ({
|
|||||||
return (
|
return (
|
||||||
<Dialog sx={dialogStyle} open={open} onClose={handleClose}>
|
<Dialog sx={dialogStyle} open={open} onClose={handleClose}>
|
||||||
<DialogTitle>
|
<DialogTitle>
|
||||||
{creating ? `${LL.ADD(1)} ${LL.NEW(0)}` : LL.EDIT()}
|
{creating ? `${LL.ADD(1)} ` : LL.UPDATE() + '/' + LL.RUN()}
|
||||||
{LL.COMMAND(1)}
|
{LL.COMMAND(0)}
|
||||||
</DialogTitle>
|
</DialogTitle>
|
||||||
<DialogContent dividers>
|
<DialogContent dividers>
|
||||||
<ValidatedTextField
|
<ValidatedTextField
|
||||||
@@ -195,7 +195,7 @@ const CommandsDialog = ({
|
|||||||
onClick={execute}
|
onClick={execute}
|
||||||
color="success"
|
color="success"
|
||||||
>
|
>
|
||||||
{LL.EXECUTE()}
|
{LL.RUN()}
|
||||||
</Button>
|
</Button>
|
||||||
)}
|
)}
|
||||||
</DialogActions>
|
</DialogActions>
|
||||||
|
|||||||
@@ -334,7 +334,7 @@ const Dashboard = memo(() => {
|
|||||||
(di.dv.v === '' || di.dv.v === undefined ? (
|
(di.dv.v === '' || di.dv.v === undefined ? (
|
||||||
<IconButton
|
<IconButton
|
||||||
size="small"
|
size="small"
|
||||||
aria-label={LL.RUN_COMMAND()}
|
aria-label={LL.RUN()}
|
||||||
onClick={() => editDashboardValue(di)}
|
onClick={() => editDashboardValue(di)}
|
||||||
style={{ backgroundColor: 'transparent' }}
|
style={{ backgroundColor: 'transparent' }}
|
||||||
>
|
>
|
||||||
@@ -402,7 +402,10 @@ const Dashboard = memo(() => {
|
|||||||
{selectedDashboardItem && selectedDashboardItem.dv && (
|
{selectedDashboardItem && selectedDashboardItem.dv && (
|
||||||
<DevicesDialog
|
<DevicesDialog
|
||||||
open={deviceValueDialogOpen}
|
open={deviceValueDialogOpen}
|
||||||
onClose={() => setDeviceValueDialogOpen(false)}
|
onClose={() => {
|
||||||
|
setDeviceValueDialogOpen(false);
|
||||||
|
setSelectedDashboardItem(undefined);
|
||||||
|
}}
|
||||||
onSave={deviceValueDialogSave}
|
onSave={deviceValueDialogSave}
|
||||||
selectedItem={selectedDashboardItem.dv}
|
selectedItem={selectedDashboardItem.dv}
|
||||||
writeable={true}
|
writeable={true}
|
||||||
|
|||||||
@@ -592,6 +592,7 @@ const Devices = memo(() => {
|
|||||||
|
|
||||||
const deviceValueDialogClose = () => {
|
const deviceValueDialogClose = () => {
|
||||||
setDeviceValueDialogOpen(false);
|
setDeviceValueDialogOpen(false);
|
||||||
|
setSelectedDeviceValue(undefined);
|
||||||
if (selectedDevice !== undefined) {
|
if (selectedDevice !== undefined) {
|
||||||
void sendDeviceData(selectedDevice);
|
void sendDeviceData(selectedDevice);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ import { ValidationError, validate } from 'validators';
|
|||||||
import type Schema from 'validators/schema';
|
import type Schema from 'validators/schema';
|
||||||
import type { ValidateFieldsError } from 'validators/schema';
|
import type { ValidateFieldsError } from 'validators/schema';
|
||||||
|
|
||||||
import { DeviceValueUOM, DeviceValueUOM_s } from './types';
|
import { DeviceValueUOM, DeviceValueUOM_s, getDeviceValueKind } from './types';
|
||||||
import type { DeviceValue } from './types';
|
import type { DeviceValue } from './types';
|
||||||
|
|
||||||
interface DevicesDialogProps {
|
interface DevicesDialogProps {
|
||||||
@@ -70,7 +70,7 @@ const DevicesDialog = ({
|
|||||||
{ immediate: false }
|
{ immediate: false }
|
||||||
)
|
)
|
||||||
.onSuccess(() => {
|
.onSuccess(() => {
|
||||||
toast.success(LL.EXECUTE_COMMAND_SENT());
|
toast.success(LL.COMMAND_SENT());
|
||||||
})
|
})
|
||||||
.onError((error) => {
|
.onError((error) => {
|
||||||
toast.error(String(error.error?.message || 'An error occurred'));
|
toast.error(String(error.error?.message || 'An error occurred'));
|
||||||
@@ -119,18 +119,20 @@ const DevicesDialog = ({
|
|||||||
return undefined;
|
return undefined;
|
||||||
};
|
};
|
||||||
|
|
||||||
const isCommand =
|
const kind = getDeviceValueKind(selectedItem);
|
||||||
(selectedItem.v === '' || selectedItem.v === undefined) &&
|
|
||||||
Boolean(selectedItem.c);
|
const dialogTitle =
|
||||||
const isSchedulerImmediate = selectedItem.v === undefined;
|
kind === 'command' || kind === 'deviceCommand'
|
||||||
const dialogTitle = isCommand
|
? LL.RUN() + ' ' + LL.COMMAND(0)
|
||||||
? isSchedulerImmediate
|
: kind === 'scheduler'
|
||||||
? LL.EXECUTE() + ' ' + LL.SCHEDULE(0)
|
? LL.UPDATE() + ' ' + LL.SCHEDULE(0)
|
||||||
: LL.RUN_COMMAND()
|
|
||||||
: writeable
|
: writeable
|
||||||
? LL.CHANGE_VALUE()
|
? LL.CHANGE_VALUE()
|
||||||
: LL.VALUE(0);
|
: LL.VALUE(0);
|
||||||
const buttonLabel = isCommand ? LL.EXECUTE() : LL.UPDATE();
|
|
||||||
|
const buttonLabel =
|
||||||
|
kind === 'command' || kind === 'deviceCommand' ? LL.RUN() : LL.UPDATE();
|
||||||
|
|
||||||
const helperText = showHelperText(editItem);
|
const helperText = showHelperText(editItem);
|
||||||
|
|
||||||
const valueLabel = LL.VALUE(0);
|
const valueLabel = LL.VALUE(0);
|
||||||
@@ -142,7 +144,7 @@ const DevicesDialog = ({
|
|||||||
<Typography sx={{ mb: 2 }} color="warning" variant="body2">
|
<Typography sx={{ mb: 2 }} color="warning" variant="body2">
|
||||||
{editItem.id.slice(2)}
|
{editItem.id.slice(2)}
|
||||||
</Typography>
|
</Typography>
|
||||||
{!isSchedulerImmediate && (
|
{kind !== 'command' && (
|
||||||
<Grid container>
|
<Grid container>
|
||||||
<Grid size={12}>
|
<Grid size={12}>
|
||||||
{editItem.l ? (
|
{editItem.l ? (
|
||||||
@@ -227,11 +229,15 @@ const DevicesDialog = ({
|
|||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
startIcon={
|
startIcon={
|
||||||
isCommand ? <PlayArrowIcon /> : <WarningIcon color="warning" />
|
kind === 'command' ? (
|
||||||
|
<PlayArrowIcon />
|
||||||
|
) : kind === 'deviceEntity' || kind === 'deviceCommand' ? (
|
||||||
|
<WarningIcon color="warning" />
|
||||||
|
) : undefined
|
||||||
}
|
}
|
||||||
variant="outlined"
|
variant="outlined"
|
||||||
onClick={doAction}
|
onClick={doAction}
|
||||||
color={isCommand ? 'success' : 'primary'}
|
color={kind !== 'value' ? 'success' : 'primary'}
|
||||||
>
|
>
|
||||||
{buttonLabel}
|
{buttonLabel}
|
||||||
</Button>
|
</Button>
|
||||||
|
|||||||
@@ -210,6 +210,18 @@ export enum DeviceValueUOM {
|
|||||||
HERTZ
|
HERTZ
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export type DeviceValueKind =
|
||||||
|
'value' | 'scheduler' | 'command' | 'deviceCommand' | 'deviceEntity';
|
||||||
|
|
||||||
|
export function getDeviceValueKind(item: DeviceValue): DeviceValueKind {
|
||||||
|
if (!item.c) return 'value';
|
||||||
|
if (item.v !== undefined && item.l !== undefined && item.u === undefined)
|
||||||
|
return 'scheduler';
|
||||||
|
if (item.v === undefined && item.l === undefined) return 'command';
|
||||||
|
if (item.u === DeviceValueUOM.NONE) return 'deviceCommand';
|
||||||
|
return 'deviceEntity';
|
||||||
|
}
|
||||||
|
|
||||||
export const DeviceValueUOM_s = [
|
export const DeviceValueUOM_s = [
|
||||||
'',
|
'',
|
||||||
'°C',
|
'°C',
|
||||||
|
|||||||
@@ -37,13 +37,11 @@ const cs: Translation = {
|
|||||||
VALUE: '{{value|Value}}',
|
VALUE: '{{value|Value}}',
|
||||||
DEVICES: 'Zařízení',
|
DEVICES: 'Zařízení',
|
||||||
SENSORS: 'Senzory',
|
SENSORS: 'Senzory',
|
||||||
RUN_COMMAND: 'Zavolat příkaz',
|
|
||||||
CHANGE_VALUE: 'Změnit hodnotu',
|
CHANGE_VALUE: 'Změnit hodnotu',
|
||||||
CANCEL: 'Zrušit',
|
CANCEL: 'Zrušit',
|
||||||
REMOVE_ALL: 'Odebrat vše',
|
REMOVE_ALL: 'Odebrat vše',
|
||||||
APPLY_CHANGES: 'Použít změny ({0})',
|
APPLY_CHANGES: 'Použít změny ({0})',
|
||||||
UPDATE: 'Aktualizovat',
|
UPDATE: 'Aktualizovat',
|
||||||
EXECUTE: 'Provést',
|
|
||||||
REMOVE: 'Odebrat',
|
REMOVE: 'Odebrat',
|
||||||
PROBLEM_UPDATING: 'Problém s aktualizací',
|
PROBLEM_UPDATING: 'Problém s aktualizací',
|
||||||
PROBLEM_LOADING: 'Problém s načítáním',
|
PROBLEM_LOADING: 'Problém s načítáním',
|
||||||
@@ -368,7 +366,8 @@ const cs: Translation = {
|
|||||||
COMMANDS: 'Příkazy',
|
COMMANDS: 'Příkazy',
|
||||||
COMMANDS_UPDATED: 'Příkazy byly aktualizovány',
|
COMMANDS_UPDATED: 'Příkazy byly aktualizovány',
|
||||||
COMMANDS_HELP_1: 'Definujte vlastní příkazy pro magistrali EMS',
|
COMMANDS_HELP_1: 'Definujte vlastní příkazy pro magistrali EMS',
|
||||||
EXECUTE_COMMAND_SENT: 'Příkaz odeslán',
|
COMMAND_SENT: 'Příkaz odeslán',
|
||||||
|
RUN: 'Spustit příkaz'
|
||||||
};
|
};
|
||||||
|
|
||||||
export default cs;
|
export default cs;
|
||||||
|
|||||||
@@ -37,13 +37,11 @@ const de: Translation = {
|
|||||||
VALUE: '{{wert|Wert}}',
|
VALUE: '{{wert|Wert}}',
|
||||||
DEVICES: 'Geräte',
|
DEVICES: 'Geräte',
|
||||||
SENSORS: 'Sensoren',
|
SENSORS: 'Sensoren',
|
||||||
RUN_COMMAND: 'Befehl ausführen',
|
|
||||||
CHANGE_VALUE: 'Wert ändern',
|
CHANGE_VALUE: 'Wert ändern',
|
||||||
CANCEL: 'Abbrechen',
|
CANCEL: 'Abbrechen',
|
||||||
REMOVE_ALL: 'Alles entfernen',
|
REMOVE_ALL: 'Alles entfernen',
|
||||||
APPLY_CHANGES: 'Änderungen anwenden ({0})',
|
APPLY_CHANGES: 'Änderungen anwenden ({0})',
|
||||||
UPDATE: 'Aktualisieren',
|
UPDATE: 'Aktualisieren',
|
||||||
EXECUTE: 'Ausführen',
|
|
||||||
REMOVE: 'Entfernen',
|
REMOVE: 'Entfernen',
|
||||||
PROBLEM_UPDATING: 'Problem beim Aktualisieren',
|
PROBLEM_UPDATING: 'Problem beim Aktualisieren',
|
||||||
PROBLEM_LOADING: 'Problem beim Laden',
|
PROBLEM_LOADING: 'Problem beim Laden',
|
||||||
@@ -368,7 +366,8 @@ const de: Translation = {
|
|||||||
COMMANDS: 'Befehle',
|
COMMANDS: 'Befehle',
|
||||||
COMMANDS_UPDATED: 'Befehle wurden aktualisiert',
|
COMMANDS_UPDATED: 'Befehle wurden aktualisiert',
|
||||||
COMMANDS_HELP_1: 'Definieren Sie eigene Befehle für die EMS-Magistral',
|
COMMANDS_HELP_1: 'Definieren Sie eigene Befehle für die EMS-Magistral',
|
||||||
EXECUTE_COMMAND_SENT: 'Befehl gesendet',
|
COMMAND_SENT: 'Befehl gesendet',
|
||||||
|
RUN: 'Befehl ausführen'
|
||||||
};
|
};
|
||||||
|
|
||||||
export default de;
|
export default de;
|
||||||
|
|||||||
@@ -37,13 +37,11 @@ const en: Translation = {
|
|||||||
VALUE: '{{value|Value}}',
|
VALUE: '{{value|Value}}',
|
||||||
DEVICES: 'Devices',
|
DEVICES: 'Devices',
|
||||||
SENSORS: 'Sensors',
|
SENSORS: 'Sensors',
|
||||||
RUN_COMMAND: 'Call Command',
|
|
||||||
CHANGE_VALUE: 'Change Value',
|
CHANGE_VALUE: 'Change Value',
|
||||||
CANCEL: 'Cancel',
|
CANCEL: 'Cancel',
|
||||||
REMOVE_ALL: 'Remove All',
|
REMOVE_ALL: 'Remove All',
|
||||||
APPLY_CHANGES: 'Apply Changes ({0})',
|
APPLY_CHANGES: 'Apply Changes ({0})',
|
||||||
UPDATE: 'Update',
|
UPDATE: 'Update',
|
||||||
EXECUTE: 'Execute',
|
|
||||||
REMOVE: 'Remove',
|
REMOVE: 'Remove',
|
||||||
PROBLEM_UPDATING: 'Problem updating',
|
PROBLEM_UPDATING: 'Problem updating',
|
||||||
PROBLEM_LOADING: 'Problem loading',
|
PROBLEM_LOADING: 'Problem loading',
|
||||||
@@ -368,7 +366,8 @@ const en: Translation = {
|
|||||||
COMMANDS: 'Commands',
|
COMMANDS: 'Commands',
|
||||||
COMMANDS_UPDATED: 'Commands updated',
|
COMMANDS_UPDATED: 'Commands updated',
|
||||||
COMMANDS_HELP_1: 'Define reusable named commands below. These can be executed from the console, API/MQTT, or referenced by the Scheduler',
|
COMMANDS_HELP_1: 'Define reusable named commands below. These can be executed from the console, API/MQTT, or referenced by the Scheduler',
|
||||||
EXECUTE_COMMAND_SENT: 'Command sent',
|
COMMAND_SENT: 'Command sent',
|
||||||
|
RUN: 'Run'
|
||||||
};
|
};
|
||||||
|
|
||||||
export default en;
|
export default en;
|
||||||
|
|||||||
@@ -37,13 +37,11 @@ const fr: Translation = {
|
|||||||
VALUE: 'Valeur',
|
VALUE: 'Valeur',
|
||||||
DEVICES: 'Appareils',
|
DEVICES: 'Appareils',
|
||||||
SENSORS: 'Capteurs',
|
SENSORS: 'Capteurs',
|
||||||
RUN_COMMAND: 'Lancer une commande',
|
|
||||||
CHANGE_VALUE: 'Changer la valeur',
|
CHANGE_VALUE: 'Changer la valeur',
|
||||||
CANCEL: 'Annuler',
|
CANCEL: 'Annuler',
|
||||||
REMOVE_ALL: 'Supprimer tout',
|
REMOVE_ALL: 'Supprimer tout',
|
||||||
APPLY_CHANGES: 'Appliquer les changements ({0})',
|
APPLY_CHANGES: 'Appliquer les changements ({0})',
|
||||||
UPDATE: 'Update',
|
UPDATE: 'Update',
|
||||||
EXECUTE: 'Execute',
|
|
||||||
REMOVE: 'Enlever',
|
REMOVE: 'Enlever',
|
||||||
PROBLEM_UPDATING: 'Problème lors de la mise à jour',
|
PROBLEM_UPDATING: 'Problème lors de la mise à jour',
|
||||||
PROBLEM_LOADING: 'Problème lors du chargement',
|
PROBLEM_LOADING: 'Problème lors du chargement',
|
||||||
@@ -368,7 +366,8 @@ const fr: Translation = {
|
|||||||
COMMANDS: 'Commandes',
|
COMMANDS: 'Commandes',
|
||||||
COMMANDS_UPDATED: 'Commandes mises à jour',
|
COMMANDS_UPDATED: 'Commandes mises à jour',
|
||||||
COMMANDS_HELP_1: 'Définir des commandes personnalisées pour la magistral EMS',
|
COMMANDS_HELP_1: 'Définir des commandes personnalisées pour la magistral EMS',
|
||||||
EXECUTE_COMMAND_SENT: 'Commande envoyée',
|
COMMAND_SENT: 'Commande envoyée',
|
||||||
|
RUN: 'Exécuter une commande'
|
||||||
};
|
};
|
||||||
|
|
||||||
export default fr;
|
export default fr;
|
||||||
|
|||||||
@@ -37,13 +37,11 @@ const it: Translation = {
|
|||||||
VALUE: '{{valore|Valore}}',
|
VALUE: '{{valore|Valore}}',
|
||||||
DEVICES: 'Dispositivi',
|
DEVICES: 'Dispositivi',
|
||||||
SENSORS: 'Sensori',
|
SENSORS: 'Sensori',
|
||||||
RUN_COMMAND: 'Esegui',
|
|
||||||
CHANGE_VALUE: 'Cambia Valore',
|
CHANGE_VALUE: 'Cambia Valore',
|
||||||
CANCEL: 'Annulla',
|
CANCEL: 'Annulla',
|
||||||
REMOVE_ALL: 'Rimuovi tutto',
|
REMOVE_ALL: 'Rimuovi tutto',
|
||||||
APPLY_CHANGES: 'Applica Cambiamenti ({0})',
|
APPLY_CHANGES: 'Applica Cambiamenti ({0})',
|
||||||
UPDATE: 'Update',
|
UPDATE: 'Update',
|
||||||
EXECUTE: 'Execute',
|
|
||||||
REMOVE: 'Elimina',
|
REMOVE: 'Elimina',
|
||||||
PROBLEM_UPDATING: 'Problema aggiornamento',
|
PROBLEM_UPDATING: 'Problema aggiornamento',
|
||||||
PROBLEM_LOADING: 'Problema caricamento',
|
PROBLEM_LOADING: 'Problema caricamento',
|
||||||
@@ -368,7 +366,8 @@ const it: Translation = {
|
|||||||
COMMANDS: 'Comandi',
|
COMMANDS: 'Comandi',
|
||||||
COMMANDS_UPDATED: 'Comandi aggiornati',
|
COMMANDS_UPDATED: 'Comandi aggiornati',
|
||||||
COMMANDS_HELP_1: 'Definisci comandi personalizzati per la magistrali EMS',
|
COMMANDS_HELP_1: 'Definisci comandi personalizzati per la magistrali EMS',
|
||||||
EXECUTE_COMMAND_SENT: 'Comando inviato',
|
COMMAND_SENT: 'Comando inviato',
|
||||||
|
RUN: 'Esegui comando'
|
||||||
};
|
};
|
||||||
|
|
||||||
export default it;
|
export default it;
|
||||||
|
|||||||
@@ -37,13 +37,11 @@ const nl: Translation = {
|
|||||||
VALUE: '{{waarde|Waarde}}',
|
VALUE: '{{waarde|Waarde}}',
|
||||||
DEVICES: 'Apparaten',
|
DEVICES: 'Apparaten',
|
||||||
SENSORS: 'Sensoren',
|
SENSORS: 'Sensoren',
|
||||||
RUN_COMMAND: 'Call commando',
|
|
||||||
CHANGE_VALUE: 'Wijzig waarde',
|
CHANGE_VALUE: 'Wijzig waarde',
|
||||||
CANCEL: 'Annuleren',
|
CANCEL: 'Annuleren',
|
||||||
REMOVE_ALL: 'Verwijderen alles',
|
REMOVE_ALL: 'Verwijderen alles',
|
||||||
APPLY_CHANGES: 'Aanpassen ({0})',
|
APPLY_CHANGES: 'Aanpassen ({0})',
|
||||||
UPDATE: 'Update',
|
UPDATE: 'Update',
|
||||||
EXECUTE: 'Uitvoeren',
|
|
||||||
REMOVE: 'Verwijderen',
|
REMOVE: 'Verwijderen',
|
||||||
PROBLEM_UPDATING: 'Probleem met updaten',
|
PROBLEM_UPDATING: 'Probleem met updaten',
|
||||||
PROBLEM_LOADING: 'Probleem met laden',
|
PROBLEM_LOADING: 'Probleem met laden',
|
||||||
@@ -368,7 +366,8 @@ const nl: Translation = {
|
|||||||
COMMANDS: 'Commando\'s',
|
COMMANDS: 'Commando\'s',
|
||||||
COMMANDS_UPDATED: 'Commando\'s bijgewerkt',
|
COMMANDS_UPDATED: 'Commando\'s bijgewerkt',
|
||||||
COMMANDS_HELP_1: 'Definieer hergebruikbare benoemde commando\'s hieronder. Deze kunnen worden uitgevoerd vanuit de console, API/MQTT, of worden aangeroepen door de Scheduler',
|
COMMANDS_HELP_1: 'Definieer hergebruikbare benoemde commando\'s hieronder. Deze kunnen worden uitgevoerd vanuit de console, API/MQTT, of worden aangeroepen door de Scheduler',
|
||||||
EXECUTE_COMMAND_SENT: 'Commando verzonden',
|
COMMAND_SENT: 'Commando verzonden',
|
||||||
|
RUN: 'Commando uitvoeren'
|
||||||
};
|
};
|
||||||
|
|
||||||
export default nl;
|
export default nl;
|
||||||
|
|||||||
@@ -37,13 +37,11 @@ const no: Translation = {
|
|||||||
VALUE: '{{verdi|Verdi}}',
|
VALUE: '{{verdi|Verdi}}',
|
||||||
DEVICES: 'Enheter',
|
DEVICES: 'Enheter',
|
||||||
SENSORS: 'Sensorer',
|
SENSORS: 'Sensorer',
|
||||||
RUN_COMMAND: 'Kjør kommando',
|
|
||||||
CHANGE_VALUE: 'Endre Verdi',
|
CHANGE_VALUE: 'Endre Verdi',
|
||||||
CANCEL: 'Avbryt',
|
CANCEL: 'Avbryt',
|
||||||
REMOVE_ALL: 'Fjern alles',
|
REMOVE_ALL: 'Fjern alles',
|
||||||
APPLY_CHANGES: 'Utfør endringer({0})',
|
APPLY_CHANGES: 'Utfør endringer({0})',
|
||||||
UPDATE: 'Oppdater',
|
UPDATE: 'Oppdater',
|
||||||
EXECUTE: 'Utfør',
|
|
||||||
REMOVE: 'Fjern',
|
REMOVE: 'Fjern',
|
||||||
PROBLEM_UPDATING: 'Problem med oppdatering',
|
PROBLEM_UPDATING: 'Problem med oppdatering',
|
||||||
PROBLEM_LOADING: 'Problem med opplasting',
|
PROBLEM_LOADING: 'Problem med opplasting',
|
||||||
@@ -368,7 +366,8 @@ const no: Translation = {
|
|||||||
COMMANDS: 'Kommandoer',
|
COMMANDS: 'Kommandoer',
|
||||||
COMMANDS_UPDATED: 'Kommandoer oppdatert',
|
COMMANDS_UPDATED: 'Kommandoer oppdatert',
|
||||||
COMMANDS_HELP_1: 'Definer egne kommandoer for EMS-Magistral',
|
COMMANDS_HELP_1: 'Definer egne kommandoer for EMS-Magistral',
|
||||||
EXECUTE_COMMAND_SENT: 'Kommando sendt',
|
COMMAND_SENT: 'Kommando sendt',
|
||||||
|
RUN: 'Kjør'
|
||||||
};
|
};
|
||||||
|
|
||||||
export default no;
|
export default no;
|
||||||
|
|||||||
@@ -37,13 +37,11 @@ const pl: BaseTranslation = {
|
|||||||
VALUE: '{{W|w|w}}artość',
|
VALUE: '{{W|w|w}}artość',
|
||||||
DEVICES: 'Urządzenia',
|
DEVICES: 'Urządzenia',
|
||||||
SENSORS: 'Czujniki',
|
SENSORS: 'Czujniki',
|
||||||
RUN_COMMAND: 'Wykonaj komendę',
|
|
||||||
CHANGE_VALUE: 'Zmiana wartości',
|
CHANGE_VALUE: 'Zmiana wartości',
|
||||||
CANCEL: 'Anuluj',
|
CANCEL: 'Anuluj',
|
||||||
REMOVE_ALL: 'Usuń wszystko',
|
REMOVE_ALL: 'Usuń wszystko',
|
||||||
APPLY_CHANGES: 'Zapisz zmiany ({0})',
|
APPLY_CHANGES: 'Zapisz zmiany ({0})',
|
||||||
UPDATE: 'Zmień',
|
UPDATE: 'Zmień',
|
||||||
EXECUTE: 'Wykonaj',
|
|
||||||
REMOVE: 'Usuń',
|
REMOVE: 'Usuń',
|
||||||
PROBLEM_UPDATING: 'Problem z uaktualnieniem!',
|
PROBLEM_UPDATING: 'Problem z uaktualnieniem!',
|
||||||
PROBLEM_LOADING: 'Problem z załadowaniem!',
|
PROBLEM_LOADING: 'Problem z załadowaniem!',
|
||||||
@@ -368,7 +366,8 @@ const pl: BaseTranslation = {
|
|||||||
COMMANDS: 'Komendy',
|
COMMANDS: 'Komendy',
|
||||||
COMMANDS_UPDATED: 'Komendy zostały zaktualizowane',
|
COMMANDS_UPDATED: 'Komendy zostały zaktualizowane',
|
||||||
COMMANDS_HELP_1: 'Zdefiniuj niestandardowe komendy dla magistrali EMS',
|
COMMANDS_HELP_1: 'Zdefiniuj niestandardowe komendy dla magistrali EMS',
|
||||||
EXECUTE_COMMAND_SENT: 'Komenda wysłana',
|
COMMAND_SENT: 'Komenda wysłana',
|
||||||
|
RUN: 'Wykonaj'
|
||||||
};
|
};
|
||||||
|
|
||||||
export default pl;
|
export default pl;
|
||||||
|
|||||||
@@ -37,13 +37,11 @@ const sk: Translation = {
|
|||||||
VALUE: '{{hodnota|Hodnota}}',
|
VALUE: '{{hodnota|Hodnota}}',
|
||||||
DEVICES: 'Zariadenia',
|
DEVICES: 'Zariadenia',
|
||||||
SENSORS: 'Snímače',
|
SENSORS: 'Snímače',
|
||||||
RUN_COMMAND: 'Volať príkaz',
|
|
||||||
CHANGE_VALUE: 'Zmena hodnoty',
|
CHANGE_VALUE: 'Zmena hodnoty',
|
||||||
CANCEL: 'Zrušiť',
|
CANCEL: 'Zrušiť',
|
||||||
REMOVE_ALL: 'Odstrániť všetko',
|
REMOVE_ALL: 'Odstrániť všetko',
|
||||||
APPLY_CHANGES: 'Aplikovať zmeny ({0})',
|
APPLY_CHANGES: 'Aplikovať zmeny ({0})',
|
||||||
UPDATE: 'Aktualizovať',
|
UPDATE: 'Aktualizovať',
|
||||||
EXECUTE: 'Spustiť',
|
|
||||||
REMOVE: 'Odstrániť',
|
REMOVE: 'Odstrániť',
|
||||||
PROBLEM_UPDATING: 'Problém s aktualizáciou',
|
PROBLEM_UPDATING: 'Problém s aktualizáciou',
|
||||||
PROBLEM_LOADING: 'Problém s načítaním',
|
PROBLEM_LOADING: 'Problém s načítaním',
|
||||||
@@ -368,7 +366,8 @@ const sk: Translation = {
|
|||||||
COMMANDS: 'Príkazy',
|
COMMANDS: 'Príkazy',
|
||||||
COMMANDS_UPDATED: 'Príkazy aktualizované',
|
COMMANDS_UPDATED: 'Príkazy aktualizované',
|
||||||
COMMANDS_HELP_1: 'Definujte vlastné príkazy pre magistrali EMS',
|
COMMANDS_HELP_1: 'Definujte vlastné príkazy pre magistrali EMS',
|
||||||
EXECUTE_COMMAND_SENT: 'Príkaz odoslaný',
|
COMMAND_SENT: 'Príkaz odoslaný',
|
||||||
|
RUN: 'Volať príkaz'
|
||||||
};
|
};
|
||||||
|
|
||||||
export default sk;
|
export default sk;
|
||||||
|
|||||||
@@ -37,13 +37,11 @@ const sv: Translation = {
|
|||||||
VALUE: '{{värde|Värde}}',
|
VALUE: '{{värde|Värde}}',
|
||||||
DEVICES: 'Enheter',
|
DEVICES: 'Enheter',
|
||||||
SENSORS: 'Sensorer',
|
SENSORS: 'Sensorer',
|
||||||
RUN_COMMAND: 'Kör kommando',
|
|
||||||
CHANGE_VALUE: 'Ändra värde',
|
CHANGE_VALUE: 'Ändra värde',
|
||||||
CANCEL: 'Avbryt',
|
CANCEL: 'Avbryt',
|
||||||
REMOVE_ALL: 'Ta bort allt',
|
REMOVE_ALL: 'Ta bort allt',
|
||||||
APPLY_CHANGES: 'Utför ändringar ({0})',
|
APPLY_CHANGES: 'Utför ändringar ({0})',
|
||||||
UPDATE: 'Uppdatera',
|
UPDATE: 'Uppdatera',
|
||||||
EXECUTE: 'Utför',
|
|
||||||
REMOVE: 'Ta bort',
|
REMOVE: 'Ta bort',
|
||||||
PROBLEM_UPDATING: 'Problem vid uppdatering',
|
PROBLEM_UPDATING: 'Problem vid uppdatering',
|
||||||
PROBLEM_LOADING: 'Problem vid hämtning',
|
PROBLEM_LOADING: 'Problem vid hämtning',
|
||||||
@@ -368,7 +366,8 @@ const sv: Translation = {
|
|||||||
COMMANDS: 'Kommandon',
|
COMMANDS: 'Kommandon',
|
||||||
COMMANDS_UPDATED: 'Kommandon uppdaterade',
|
COMMANDS_UPDATED: 'Kommandon uppdaterade',
|
||||||
COMMANDS_HELP_1: 'Definiera egna kommandon för EMS-Magistral',
|
COMMANDS_HELP_1: 'Definiera egna kommandon för EMS-Magistral',
|
||||||
EXECUTE_COMMAND_SENT: 'Kommando skickat',
|
COMMAND_SENT: 'Kommando skickat',
|
||||||
|
RUN: 'Kör kommando'
|
||||||
};
|
};
|
||||||
|
|
||||||
export default sv;
|
export default sv;
|
||||||
|
|||||||
@@ -37,13 +37,11 @@ const tr: Translation = {
|
|||||||
VALUE: '{{değer|Değer}}',
|
VALUE: '{{değer|Değer}}',
|
||||||
DEVICES: 'Cihazlar',
|
DEVICES: 'Cihazlar',
|
||||||
SENSORS: 'Sensörler',
|
SENSORS: 'Sensörler',
|
||||||
RUN_COMMAND: 'Çalıştırma Komutu',
|
|
||||||
CHANGE_VALUE: 'Değeri Değiştir',
|
CHANGE_VALUE: 'Değeri Değiştir',
|
||||||
CANCEL: 'İptal',
|
CANCEL: 'İptal',
|
||||||
REMOVE_ALL: 'Tümünü Kaldır',
|
REMOVE_ALL: 'Tümünü Kaldır',
|
||||||
APPLY_CHANGES: 'Değişiklikleri Uygula ({0})',
|
APPLY_CHANGES: 'Değişiklikleri Uygula ({0})',
|
||||||
UPDATE: 'Update',
|
UPDATE: 'Update',
|
||||||
EXECUTE: 'Uygulamak',
|
|
||||||
REMOVE: 'Kaldır',
|
REMOVE: 'Kaldır',
|
||||||
PROBLEM_UPDATING: 'Güncelleme Sorunu',
|
PROBLEM_UPDATING: 'Güncelleme Sorunu',
|
||||||
PROBLEM_LOADING: 'Yükleme Sorunu',
|
PROBLEM_LOADING: 'Yükleme Sorunu',
|
||||||
@@ -368,7 +366,8 @@ const tr: Translation = {
|
|||||||
COMMANDS: 'Komutlar',
|
COMMANDS: 'Komutlar',
|
||||||
COMMANDS_UPDATED: 'Komutlar güncellendi',
|
COMMANDS_UPDATED: 'Komutlar güncellendi',
|
||||||
COMMANDS_HELP_1: 'Özel komutları EMS hattına tanımlayın',
|
COMMANDS_HELP_1: 'Özel komutları EMS hattına tanımlayın',
|
||||||
EXECUTE_COMMAND_SENT: 'Komut gönderildi',
|
COMMAND_SENT: 'Komut gönderildi',
|
||||||
|
RUN: 'Komutu çalıştır'
|
||||||
};
|
};
|
||||||
|
|
||||||
export default tr;
|
export default tr;
|
||||||
|
|||||||
@@ -22,6 +22,10 @@
|
|||||||
#define NTP_SETTINGS_FILE "/config/ntpSettings.json"
|
#define NTP_SETTINGS_FILE "/config/ntpSettings.json"
|
||||||
#define EMSESP_SETTINGS_FILE "/config/emsespSettings.json"
|
#define EMSESP_SETTINGS_FILE "/config/emsespSettings.json"
|
||||||
|
|
||||||
|
// AP provision modes, mirrors src/ESP32React/APSettingsService.h
|
||||||
|
#define AP_MODE_DISCONNECTED 1
|
||||||
|
#define AP_MODE_NEVER 2
|
||||||
|
|
||||||
class DummySettings {
|
class DummySettings {
|
||||||
public:
|
public:
|
||||||
// SYSTEM
|
// SYSTEM
|
||||||
@@ -81,7 +85,7 @@ class DummySettings {
|
|||||||
String password = "ems-esp";
|
String password = "ems-esp";
|
||||||
|
|
||||||
// AP
|
// AP
|
||||||
uint8_t provisionMode = 0;
|
uint8_t provisionMode = AP_MODE_DISCONNECTED; // always
|
||||||
|
|
||||||
// NTP
|
// NTP
|
||||||
String server = "pool.ntp.org";
|
String server = "pool.ntp.org";
|
||||||
|
|||||||
@@ -18,5 +18,5 @@
|
|||||||
"@trivago/prettier-plugin-sort-imports": "^6.0.2",
|
"@trivago/prettier-plugin-sort-imports": "^6.0.2",
|
||||||
"prettier": "^3.9.6"
|
"prettier": "^3.9.6"
|
||||||
},
|
},
|
||||||
"packageManager": "pnpm@11.20.0+sha512.9a6f330a95b66446ea088faf1521405a8a01f07fde7124cc9958dfed52d4bb436737e65b08f85f37b46fcba375092558ac51262b816844b22f63406ed166bfee"
|
"packageManager": "pnpm@11.21.0+sha512.521705bce689924eac72f5a3587122f362689ef6571e55ba80076fd637c11132ecffada26fad4ea79c485bfddbfd3d5a2a5b05805a77e893de71ec8a6cca3bb1"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1344,3 +1344,4 @@ IILE
|
|||||||
Sumr
|
Sumr
|
||||||
eraseap
|
eraseap
|
||||||
roomtempoffset
|
roomtempoffset
|
||||||
|
dhcpc
|
||||||
@@ -7,7 +7,7 @@ Workflow:
|
|||||||
3. Write that block to test/test_api/test_api.h.
|
3. Write that block to test/test_api/test_api.h.
|
||||||
4. Run `pio run -e native-test -t exec`.
|
4. Run `pio run -e native-test -t exec`.
|
||||||
|
|
||||||
run with `python3 scripts/generate_test_api.py`
|
run with `python3 ./scripts/generate_test_api.py`
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import subprocess
|
import subprocess
|
||||||
|
|||||||
@@ -31,7 +31,8 @@ StateUpdateResult APSettings::update(JsonObject root, APSettings & settings) {
|
|||||||
APSettings newSettings{};
|
APSettings newSettings{};
|
||||||
newSettings.provisionMode = static_cast<uint8_t>(root["provision_mode"] | FACTORY_AP_PROVISION_MODE);
|
newSettings.provisionMode = static_cast<uint8_t>(root["provision_mode"] | FACTORY_AP_PROVISION_MODE);
|
||||||
|
|
||||||
switch (settings.provisionMode) {
|
// coerce removed/invalid modes (e.g. legacy AP_MODE_ALWAYS = 0) to the current default
|
||||||
|
switch (newSettings.provisionMode) {
|
||||||
case AP_MODE_DISCONNECTED:
|
case AP_MODE_DISCONNECTED:
|
||||||
case AP_MODE_NEVER:
|
case AP_MODE_NEVER:
|
||||||
break;
|
break;
|
||||||
@@ -53,11 +54,17 @@ StateUpdateResult APSettings::update(JsonObject root, APSettings & settings) {
|
|||||||
return StateUpdateResult::UNCHANGED;
|
return StateUpdateResult::UNCHANGED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const uint8_t previousProvisionMode = settings.provisionMode;
|
||||||
settings = newSettings;
|
settings = newSettings;
|
||||||
|
|
||||||
// if the AP mode has changed, force a disconnect and reconnect
|
// FS load at boot uses this updater before Network::begin(); skip reconnect on that first apply.
|
||||||
if (settings.provisionMode != newSettings.provisionMode) {
|
// Subsequent provision-mode changes (UI/API) must reload Network's cached AP settings.
|
||||||
emsesp::EMSESP::network_.reconnect();
|
static bool appliedOnce = false;
|
||||||
|
const bool modeChanged = previousProvisionMode != settings.provisionMode;
|
||||||
|
if (appliedOnce && modeChanged) {
|
||||||
|
emsesp::EMSESP::network_.schedule_reconnect();
|
||||||
}
|
}
|
||||||
|
appliedOnce = true;
|
||||||
|
|
||||||
return StateUpdateResult::CHANGED;
|
return StateUpdateResult::CHANGED;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ enum APNetworkStatus { ACTIVE = 0, INACTIVE };
|
|||||||
|
|
||||||
class APSettings {
|
class APSettings {
|
||||||
public:
|
public:
|
||||||
uint8_t provisionMode = FACTORY_AP_PROVISION_MODE; // 0 = on, 2 = off
|
uint8_t provisionMode = FACTORY_AP_PROVISION_MODE; // 1 = on disconnect, 2 = off
|
||||||
String ssid = FACTORY_AP_SSID;
|
String ssid = FACTORY_AP_SSID;
|
||||||
String password = FACTORY_AP_PASSWORD;
|
String password = FACTORY_AP_PASSWORD;
|
||||||
uint8_t channel = FACTORY_AP_CHANNEL;
|
uint8_t channel = FACTORY_AP_CHANNEL;
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ void AnalogSensor::start(const bool factory_settings) {
|
|||||||
Command::add(
|
Command::add(
|
||||||
EMSdevice::DeviceType::ANALOGSENSOR,
|
EMSdevice::DeviceType::ANALOGSENSOR,
|
||||||
F_(setvalue),
|
F_(setvalue),
|
||||||
[&](const char * value, const int8_t id, JsonObject) { return command_setvalue(value, id); },
|
[this](const char * value, const int8_t id, JsonObject) { return command_setvalue(value, id); },
|
||||||
FL_(setiovalue_cmd),
|
FL_(setiovalue_cmd),
|
||||||
CommandFlag::ADMIN_ONLY);
|
CommandFlag::ADMIN_ONLY);
|
||||||
|
|
||||||
@@ -195,7 +195,7 @@ void AnalogSensor::reload(bool get_nvs) {
|
|||||||
Command::add(
|
Command::add(
|
||||||
EMSdevice::DeviceType::ANALOGSENSOR,
|
EMSdevice::DeviceType::ANALOGSENSOR,
|
||||||
sensor.name,
|
sensor.name,
|
||||||
[&](const char * value, const int8_t, JsonObject) { return command_setvalue(value, sensor.gpio); },
|
[this, gpio = sensor.gpio](const char * value, const int8_t, JsonObject) { return command_setvalue(value, gpio); },
|
||||||
sensor.type == AnalogType::COUNTER || (sensor.type >= AnalogType::CNT_0 && sensor.type <= AnalogType::CNT_2) ? FL_(counter)
|
sensor.type == AnalogType::COUNTER || (sensor.type >= AnalogType::CNT_0 && sensor.type <= AnalogType::CNT_2) ? FL_(counter)
|
||||||
: sensor.type == AnalogType::DIGITAL_OUT ? FL_(digital_out)
|
: sensor.type == AnalogType::DIGITAL_OUT ? FL_(digital_out)
|
||||||
: sensor.type == AnalogType::RGB ? FL_(RGB)
|
: sensor.type == AnalogType::RGB ? FL_(RGB)
|
||||||
|
|||||||
@@ -492,7 +492,7 @@ uint8_t Command::call(const uint8_t device_type, const char * command, const cha
|
|||||||
}
|
}
|
||||||
|
|
||||||
// add a command to the list, which does not return json
|
// add a command to the list, which does not return json
|
||||||
void Command::add(const uint8_t device_type, const uint8_t device_id, const char * cmd, const cmd_function_p cb, const char * const * description, uint8_t flags) {
|
void Command::add(const uint8_t device_type, const uint8_t device_id, const char * cmd, const cmd_function_p & cb, const char * const * description, uint8_t flags) {
|
||||||
// if the command already exists for that device type don't add it
|
// if the command already exists for that device type don't add it
|
||||||
if (find_command(device_type, device_id, cmd, flags) != nullptr) {
|
if (find_command(device_type, device_id, cmd, flags) != nullptr) {
|
||||||
return;
|
return;
|
||||||
@@ -508,13 +508,13 @@ void Command::add(const uint8_t device_type, const uint8_t device_id, const char
|
|||||||
|
|
||||||
// add a command with no json output
|
// add a command with no json output
|
||||||
// system/temperature/analog devices uses device_id 0
|
// system/temperature/analog devices uses device_id 0
|
||||||
void Command::add(const uint8_t device_type, const char * cmd, const cmd_function_p cb, const char * const * description, uint8_t flags) {
|
void Command::add(const uint8_t device_type, const char * cmd, const cmd_function_p & cb, const char * const * description, uint8_t flags) {
|
||||||
add(device_type, 0, cmd, cb, description, flags);
|
add(device_type, 0, cmd, cb, description, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
// add a command to the list, which does return a json object as output
|
// add a command to the list, which does return a json object as output
|
||||||
// these commands bypass the readonly check (they are actions, not entity setters)
|
// these commands bypass the readonly check (they are actions, not entity setters)
|
||||||
void Command::add_json(const uint8_t device_type, const char * cmd, const cmd_function_p cb, const char * const * description, uint8_t flags) {
|
void Command::add_json(const uint8_t device_type, const char * cmd, const cmd_function_p & cb, const char * const * description, uint8_t flags) {
|
||||||
// if the command already exists for that device type don't add it
|
// if the command already exists for that device type don't add it
|
||||||
if (find_command(device_type, 0, cmd, flags) != nullptr) {
|
if (find_command(device_type, 0, cmd, flags) != nullptr) {
|
||||||
return;
|
return;
|
||||||
@@ -828,7 +828,7 @@ uint8_t Command::json_message(uint8_t error_code, const char * message, const Js
|
|||||||
// e.g. //one/two////three/// becomes /one/two/three
|
// e.g. //one/two////three/// becomes /one/two/three
|
||||||
std::string SUrlParser::path() {
|
std::string SUrlParser::path() {
|
||||||
std::string s = "/"; // set up the beginning slash
|
std::string s = "/"; // set up the beginning slash
|
||||||
for (const std::string & f : m_folders) {
|
for (const auto & f : m_folders) {
|
||||||
s += f;
|
s += f;
|
||||||
s += "/";
|
s += "/";
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-4
@@ -72,7 +72,7 @@ class Command {
|
|||||||
const uint8_t flags,
|
const uint8_t flags,
|
||||||
const bool has_json_output,
|
const bool has_json_output,
|
||||||
const char * cmd,
|
const char * cmd,
|
||||||
const cmd_function_p cmdfunction,
|
const cmd_function_p & cmdfunction,
|
||||||
const char * const * description)
|
const char * const * description)
|
||||||
: device_type_(device_type)
|
: device_type_(device_type)
|
||||||
, device_id_(device_id)
|
, device_id_(device_id)
|
||||||
@@ -108,17 +108,17 @@ class Command {
|
|||||||
static void add(const uint8_t device_type,
|
static void add(const uint8_t device_type,
|
||||||
const uint8_t device_id,
|
const uint8_t device_id,
|
||||||
const char * cmd,
|
const char * cmd,
|
||||||
const cmd_function_p cb,
|
const cmd_function_p & cb,
|
||||||
const char * const * description,
|
const char * const * description,
|
||||||
uint8_t flags = CommandFlag::CMD_FLAG_DEFAULT);
|
uint8_t flags = CommandFlag::CMD_FLAG_DEFAULT);
|
||||||
|
|
||||||
// same for system/temperature/analog devices
|
// same for system/temperature/analog devices
|
||||||
static void
|
static void
|
||||||
add(const uint8_t device_type, const char * cmd, const cmd_function_p cb, const char * const * description, uint8_t flags = CommandFlag::CMD_FLAG_DEFAULT);
|
add(const uint8_t device_type, const char * cmd, const cmd_function_p & cb, const char * const * description, uint8_t flags = CommandFlag::CMD_FLAG_DEFAULT);
|
||||||
// command that writes a JSON object as its output; bypasses the readonly check
|
// command that writes a JSON object as its output; bypasses the readonly check
|
||||||
static void add_json(const uint8_t device_type,
|
static void add_json(const uint8_t device_type,
|
||||||
const char * cmd,
|
const char * cmd,
|
||||||
const cmd_function_p cb,
|
const cmd_function_p & cb,
|
||||||
const char * const * description,
|
const char * const * description,
|
||||||
uint8_t flags = CommandFlag::CMD_FLAG_DEFAULT);
|
uint8_t flags = CommandFlag::CMD_FLAG_DEFAULT);
|
||||||
|
|
||||||
|
|||||||
@@ -199,10 +199,9 @@ static void setup_commands(std::shared_ptr<Commands> const & commands) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
commands->add_command(ShellContext::MAIN,
|
commands->add_command(ShellContext::MAIN, CommandFlags::ADMIN, string_vector{F_(wifi), F_(reconnect)}, [](Shell &, const std::vector<std::string> &) {
|
||||||
CommandFlags::ADMIN,
|
EMSESP::network_.reconnect();
|
||||||
string_vector{F_(wifi), F_(reconnect)},
|
});
|
||||||
[](Shell &, const std::vector<std::string> &) { EMSESP::network_.reconnect(); });
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// SET commands
|
// SET commands
|
||||||
@@ -367,9 +366,7 @@ static void setup_commands(std::shared_ptr<Commands> const & commands) {
|
|||||||
// EMS device commands
|
// EMS device commands
|
||||||
//
|
//
|
||||||
|
|
||||||
commands->add_command(ShellContext::MAIN, CommandFlags::ADMIN, {F_(scan)}, [](Shell &, const std::vector<std::string> &) {
|
commands->add_command(ShellContext::MAIN, CommandFlags::ADMIN, {F_(scan)}, [](Shell &, const std::vector<std::string> &) { EMSESP::scan_devices(); });
|
||||||
EMSESP::scan_devices();
|
|
||||||
});
|
|
||||||
|
|
||||||
/* removed scan deep
|
/* removed scan deep
|
||||||
commands->add_command(ShellContext::MAIN, CommandFlags::ADMIN, {F_(scan)}, {F_(deep_optional)}, [](Shell & shell, const std::vector<std::string> & arguments) {
|
commands->add_command(ShellContext::MAIN, CommandFlags::ADMIN, {F_(scan)}, {F_(deep_optional)}, [](Shell & shell, const std::vector<std::string> & arguments) {
|
||||||
|
|||||||
+14
-14
@@ -52,7 +52,7 @@ bool EMSdevice::has_entities() const {
|
|||||||
}
|
}
|
||||||
bool found = false;
|
bool found = false;
|
||||||
EMSESP::webCustomizationService.read([&](WebCustomization & settings) {
|
EMSESP::webCustomizationService.read([&](WebCustomization & settings) {
|
||||||
for (EntityCustomization entityCustomization : settings.entityCustomizations) {
|
for (const auto & entityCustomization : settings.entityCustomizations) {
|
||||||
if (entityCustomization.device_id == device_id() && entityCustomization.entity_ids.size()) {
|
if (entityCustomization.device_id == device_id() && entityCustomization.entity_ids.size()) {
|
||||||
found = true;
|
found = true;
|
||||||
break;
|
break;
|
||||||
@@ -572,7 +572,7 @@ void EMSdevice::add_device_value(int8_t tag, // to b
|
|||||||
int8_t numeric_operator, // to divide or multiply, see DeviceValueNumOps::
|
int8_t numeric_operator, // to divide or multiply, see DeviceValueNumOps::
|
||||||
const char * const * name, // list of names, including shortname and translations
|
const char * const * name, // list of names, including shortname and translations
|
||||||
uint8_t uom, // unit of measure from DeviceValueUOM
|
uint8_t uom, // unit of measure from DeviceValueUOM
|
||||||
const cmd_function_p f, // command function pointer
|
const cmd_function_p & f, // command function pointer
|
||||||
int16_t min, // min allowed value
|
int16_t min, // min allowed value
|
||||||
uint32_t max // max allowed value
|
uint32_t max // max allowed value
|
||||||
) {
|
) {
|
||||||
@@ -636,7 +636,7 @@ void EMSdevice::add_device_value(int8_t tag, // to b
|
|||||||
|
|
||||||
// scan through customizations to see if it's on the exclusion list by matching the productID and deviceID
|
// scan through customizations to see if it's on the exclusion list by matching the productID and deviceID
|
||||||
EMSESP::webCustomizationService.read([&](WebCustomization & settings) {
|
EMSESP::webCustomizationService.read([&](WebCustomization & settings) {
|
||||||
for (EntityCustomization entityCustomization : settings.entityCustomizations) {
|
for (const auto & entityCustomization : settings.entityCustomizations) {
|
||||||
if ((entityCustomization.product_id == product_id()) && (entityCustomization.device_id == device_id())) {
|
if ((entityCustomization.product_id == product_id()) && (entityCustomization.device_id == device_id())) {
|
||||||
char entity[70];
|
char entity[70];
|
||||||
if (tag < DeviceValueTAG::TAG_HC1) {
|
if (tag < DeviceValueTAG::TAG_HC1) {
|
||||||
@@ -645,7 +645,7 @@ void EMSdevice::add_device_value(int8_t tag, // to b
|
|||||||
snprintf(entity, sizeof(entity), "%s/%s", tag_to_mqtt(tag), short_name);
|
snprintf(entity, sizeof(entity), "%s/%s", tag_to_mqtt(tag), short_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const std::string & entity_id : entityCustomization.entity_ids) {
|
for (const auto & entity_id : entityCustomization.entity_ids) {
|
||||||
// if there is an appended custom name, strip it to get the true entity name
|
// if there is an appended custom name, strip it to get the true entity name
|
||||||
// and extract the new custom name
|
// and extract the new custom name
|
||||||
auto custom_name_pos = entity_id.find('|');
|
auto custom_name_pos = entity_id.find('|');
|
||||||
@@ -706,7 +706,7 @@ void EMSdevice::register_device_value(int8_t tag,
|
|||||||
const char * const * options_single,
|
const char * const * options_single,
|
||||||
const char * const * name,
|
const char * const * name,
|
||||||
uint8_t uom,
|
uint8_t uom,
|
||||||
const cmd_function_p f) {
|
const cmd_function_p & f) {
|
||||||
// create a multi-list from the options
|
// create a multi-list from the options
|
||||||
add_device_value(tag, value_p, type, nullptr, options_single, 0, name, uom, f, 0, 0);
|
add_device_value(tag, value_p, type, nullptr, options_single, 0, name, uom, f, 0, 0);
|
||||||
};
|
};
|
||||||
@@ -718,7 +718,7 @@ void EMSdevice::register_device_value(int8_t tag,
|
|||||||
const char * const * options_single,
|
const char * const * options_single,
|
||||||
const char * const * name,
|
const char * const * name,
|
||||||
uint8_t uom,
|
uint8_t uom,
|
||||||
const cmd_function_p f,
|
const cmd_function_p & f,
|
||||||
int16_t min,
|
int16_t min,
|
||||||
uint32_t max) {
|
uint32_t max) {
|
||||||
// create a multi-list from the options
|
// create a multi-list from the options
|
||||||
@@ -731,7 +731,7 @@ void EMSdevice::register_device_value(int8_t tag,
|
|||||||
int8_t numeric_operator,
|
int8_t numeric_operator,
|
||||||
const char * const * name,
|
const char * const * name,
|
||||||
uint8_t uom,
|
uint8_t uom,
|
||||||
const cmd_function_p f) {
|
const cmd_function_p & f) {
|
||||||
add_device_value(tag, value_p, type, nullptr, nullptr, numeric_operator, name, uom, f, 0, 0);
|
add_device_value(tag, value_p, type, nullptr, nullptr, numeric_operator, name, uom, f, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -741,14 +741,14 @@ void EMSdevice::register_device_value(int8_t tag,
|
|||||||
int8_t numeric_operator,
|
int8_t numeric_operator,
|
||||||
const char * const * name,
|
const char * const * name,
|
||||||
uint8_t uom,
|
uint8_t uom,
|
||||||
const cmd_function_p f,
|
const cmd_function_p & f,
|
||||||
int16_t min,
|
int16_t min,
|
||||||
uint32_t max) {
|
uint32_t max) {
|
||||||
add_device_value(tag, value_p, type, nullptr, nullptr, numeric_operator, name, uom, f, min, max);
|
add_device_value(tag, value_p, type, nullptr, nullptr, numeric_operator, name, uom, f, min, max);
|
||||||
}
|
}
|
||||||
|
|
||||||
// no options, no function
|
// no options, no function
|
||||||
void EMSdevice::register_device_value(int8_t tag, void * value_p, uint8_t type, const char * const * name, uint8_t uom, const cmd_function_p f) {
|
void EMSdevice::register_device_value(int8_t tag, void * value_p, uint8_t type, const char * const * name, uint8_t uom, const cmd_function_p & f) {
|
||||||
add_device_value(tag, value_p, type, nullptr, nullptr, 0, name, uom, f, 0, 0);
|
add_device_value(tag, value_p, type, nullptr, nullptr, 0, name, uom, f, 0, 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -758,7 +758,7 @@ void EMSdevice::register_device_value(int8_t tag,
|
|||||||
uint8_t type,
|
uint8_t type,
|
||||||
const char * const * name,
|
const char * const * name,
|
||||||
uint8_t uom,
|
uint8_t uom,
|
||||||
const cmd_function_p f,
|
const cmd_function_p & f,
|
||||||
int16_t min,
|
int16_t min,
|
||||||
uint32_t max) {
|
uint32_t max) {
|
||||||
add_device_value(tag, value_p, type, nullptr, nullptr, 0, name, uom, f, min, max);
|
add_device_value(tag, value_p, type, nullptr, nullptr, 0, name, uom, f, min, max);
|
||||||
@@ -773,7 +773,7 @@ void EMSdevice::register_device_value(int8_t tag,
|
|||||||
const char * const ** options,
|
const char * const ** options,
|
||||||
const char * const * name,
|
const char * const * name,
|
||||||
uint8_t uom,
|
uint8_t uom,
|
||||||
const cmd_function_p f,
|
const cmd_function_p & f,
|
||||||
int16_t min,
|
int16_t min,
|
||||||
uint32_t max) {
|
uint32_t max) {
|
||||||
add_device_value(tag, value_p, type, options, nullptr, 0, name, uom, f, min, max);
|
add_device_value(tag, value_p, type, options, nullptr, 0, name, uom, f, min, max);
|
||||||
@@ -786,7 +786,7 @@ void EMSdevice::register_device_value(int8_t tag,
|
|||||||
const char * const ** options,
|
const char * const ** options,
|
||||||
const char * const * name,
|
const char * const * name,
|
||||||
uint8_t uom,
|
uint8_t uom,
|
||||||
const cmd_function_p f) {
|
const cmd_function_p & f) {
|
||||||
add_device_value(tag, value_p, type, options, nullptr, 0, name, uom, f, 0, 0);
|
add_device_value(tag, value_p, type, options, nullptr, 0, name, uom, f, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1210,10 +1210,10 @@ void EMSdevice::generate_values_web_customization(JsonArray output) {
|
|||||||
// this is when the mask has it's high bit (0x80) set
|
// this is when the mask has it's high bit (0x80) set
|
||||||
// https://github.com/emsesp/EMS-ESP32/issues/891
|
// https://github.com/emsesp/EMS-ESP32/issues/891
|
||||||
EMSESP::webCustomizationService.read([&](WebCustomization & settings) {
|
EMSESP::webCustomizationService.read([&](WebCustomization & settings) {
|
||||||
for (EntityCustomization entityCustomization : settings.entityCustomizations) {
|
for (const auto & entityCustomization : settings.entityCustomizations) {
|
||||||
if (entityCustomization.device_id == device_id()) {
|
if (entityCustomization.device_id == device_id()) {
|
||||||
// entity_ids is a list of all entities with the mask prefixed in the string
|
// entity_ids is a list of all entities with the mask prefixed in the string
|
||||||
for (const std::string & entity_id : entityCustomization.entity_ids) {
|
for (const auto & entity_id : entityCustomization.entity_ids) {
|
||||||
uint8_t mask = Helpers::hextoint(entity_id.substr(0, 2).c_str());
|
uint8_t mask = Helpers::hextoint(entity_id.substr(0, 2).c_str());
|
||||||
if (mask & 0x80) {
|
if (mask & 0x80) {
|
||||||
JsonObject obj = output.add<JsonObject>();
|
JsonObject obj = output.add<JsonObject>();
|
||||||
|
|||||||
+10
-9
@@ -298,7 +298,7 @@ class EMSdevice {
|
|||||||
int8_t numeric_operator,
|
int8_t numeric_operator,
|
||||||
const char * const * name,
|
const char * const * name,
|
||||||
uint8_t uom,
|
uint8_t uom,
|
||||||
const cmd_function_p f,
|
const cmd_function_p & f,
|
||||||
int16_t min,
|
int16_t min,
|
||||||
uint32_t max);
|
uint32_t max);
|
||||||
|
|
||||||
@@ -308,14 +308,14 @@ class EMSdevice {
|
|||||||
const char * const ** options,
|
const char * const ** options,
|
||||||
const char * const * name,
|
const char * const * name,
|
||||||
uint8_t uom,
|
uint8_t uom,
|
||||||
const cmd_function_p f,
|
const cmd_function_p & f,
|
||||||
int16_t min,
|
int16_t min,
|
||||||
uint32_t max);
|
uint32_t max);
|
||||||
|
|
||||||
void erase_device_values();
|
void erase_device_values();
|
||||||
|
|
||||||
void
|
void
|
||||||
register_device_value(int8_t tag, void * value_p, uint8_t type, const char * const ** options, const char * const * name, uint8_t uom, const cmd_function_p f);
|
register_device_value(int8_t tag, void * value_p, uint8_t type, const char * const ** options, const char * const * name, uint8_t uom, const cmd_function_p & f);
|
||||||
|
|
||||||
void register_device_value(int8_t tag, void * value_p, uint8_t type, const char * const ** options, const char * const * name, uint8_t uom);
|
void register_device_value(int8_t tag, void * value_p, uint8_t type, const char * const ** options, const char * const * name, uint8_t uom);
|
||||||
|
|
||||||
@@ -325,7 +325,7 @@ class EMSdevice {
|
|||||||
int8_t numeric_operator,
|
int8_t numeric_operator,
|
||||||
const char * const * name,
|
const char * const * name,
|
||||||
uint8_t uom,
|
uint8_t uom,
|
||||||
const cmd_function_p f = nullptr);
|
const cmd_function_p & f = nullptr);
|
||||||
|
|
||||||
void register_device_value(int8_t tag,
|
void register_device_value(int8_t tag,
|
||||||
void * value_p,
|
void * value_p,
|
||||||
@@ -333,7 +333,7 @@ class EMSdevice {
|
|||||||
int8_t numeric_operator,
|
int8_t numeric_operator,
|
||||||
const char * const * name,
|
const char * const * name,
|
||||||
uint8_t uom,
|
uint8_t uom,
|
||||||
const cmd_function_p f,
|
const cmd_function_p & f,
|
||||||
int16_t min,
|
int16_t min,
|
||||||
uint32_t max);
|
uint32_t max);
|
||||||
|
|
||||||
@@ -344,7 +344,7 @@ class EMSdevice {
|
|||||||
const char * const * options_single,
|
const char * const * options_single,
|
||||||
const char * const * name,
|
const char * const * name,
|
||||||
uint8_t uom,
|
uint8_t uom,
|
||||||
const cmd_function_p f = nullptr);
|
const cmd_function_p & f = nullptr);
|
||||||
|
|
||||||
// single list of options, with no translations, with min and max
|
// single list of options, with no translations, with min and max
|
||||||
void register_device_value(int8_t tag,
|
void register_device_value(int8_t tag,
|
||||||
@@ -353,15 +353,16 @@ class EMSdevice {
|
|||||||
const char * const * options_single,
|
const char * const * options_single,
|
||||||
const char * const * name,
|
const char * const * name,
|
||||||
uint8_t uom,
|
uint8_t uom,
|
||||||
const cmd_function_p f,
|
const cmd_function_p & f,
|
||||||
int16_t min,
|
int16_t min,
|
||||||
uint32_t max);
|
uint32_t max);
|
||||||
|
|
||||||
// no options, optional function f
|
// no options, optional function f
|
||||||
void register_device_value(int8_t tag, void * value_p, uint8_t type, const char * const * name, uint8_t uom, const cmd_function_p f = nullptr);
|
void register_device_value(int8_t tag, void * value_p, uint8_t type, const char * const * name, uint8_t uom, const cmd_function_p & f = nullptr);
|
||||||
|
|
||||||
// no options, with min/max
|
// no options, with min/max
|
||||||
void register_device_value(int8_t tag, void * value_p, uint8_t type, const char * const * name, uint8_t uom, const cmd_function_p f, int16_t min, uint32_t max);
|
void
|
||||||
|
register_device_value(int8_t tag, void * value_p, uint8_t type, const char * const * name, uint8_t uom, const cmd_function_p & f, int16_t min, uint32_t max);
|
||||||
|
|
||||||
void write_command(const uint16_t type_id, const uint8_t offset, uint8_t * message_data, const uint8_t message_length, const uint16_t validate_typeid) const;
|
void write_command(const uint16_t type_id, const uint8_t offset, uint8_t * message_data, const uint8_t message_length, const uint16_t validate_typeid) const;
|
||||||
void write_command(const uint16_t type_id, const uint8_t offset, const uint8_t value, const uint16_t validate_typeid) const;
|
void write_command(const uint16_t type_id, const uint8_t offset, const uint8_t value, const uint16_t validate_typeid) const;
|
||||||
|
|||||||
@@ -192,6 +192,11 @@ class DeviceValue {
|
|||||||
int16_t min; // min range
|
int16_t min; // min range
|
||||||
uint32_t max; // max range
|
uint32_t max; // max range
|
||||||
|
|
||||||
|
// optional custom name from customization. Allocated on heap only when actually set,
|
||||||
|
// so unnamed entities (the vast majority) don't pay for an inline std::string.
|
||||||
|
// Prefer custom_fullname() / set_custom_fullname() / has_custom_fullname() over direct access.
|
||||||
|
std::unique_ptr<std::string> custom_fullname_;
|
||||||
|
|
||||||
DeviceValue(uint8_t device_type, // EMSdevice::DeviceType
|
DeviceValue(uint8_t device_type, // EMSdevice::DeviceType
|
||||||
int8_t tag, // DeviceValueTAG::*
|
int8_t tag, // DeviceValueTAG::*
|
||||||
void * value_p, // pointer to variable of any type
|
void * value_p, // pointer to variable of any type
|
||||||
@@ -245,11 +250,6 @@ class DeviceValue {
|
|||||||
static const char * const * DeviceValueTAG_s[];
|
static const char * const * DeviceValueTAG_s[];
|
||||||
static const char * const DeviceValueTAG_mqtt[];
|
static const char * const DeviceValueTAG_mqtt[];
|
||||||
static uint8_t NUM_TAGS; // # tags
|
static uint8_t NUM_TAGS; // # tags
|
||||||
|
|
||||||
private:
|
|
||||||
// optional custom name from customization. Allocated on heap only when actually set,
|
|
||||||
// so unnamed entities (the vast majority) don't pay for an inline std::string.
|
|
||||||
std::unique_ptr<std::string> custom_fullname_;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}; // namespace emsesp
|
}; // namespace emsesp
|
||||||
|
|||||||
+11
-11
@@ -55,18 +55,18 @@ AsyncWebServer webServer(80);
|
|||||||
|
|
||||||
#if defined(EMSESP_STANDALONE)
|
#if defined(EMSESP_STANDALONE)
|
||||||
FS dummyFS;
|
FS dummyFS;
|
||||||
auto & fsRef = dummyFS;
|
FS * const fsRef = &dummyFS;
|
||||||
#else
|
#else
|
||||||
auto & fsRef = LittleFS;
|
FS * const fsRef = &LittleFS;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ESP32React EMSESP::esp32React(&webServer, &fsRef);
|
ESP32React EMSESP::esp32React(&webServer, fsRef);
|
||||||
WebSettingsService EMSESP::webSettingsService = WebSettingsService(&webServer, &fsRef, EMSESP::esp32React.getSecurityManager());
|
WebSettingsService EMSESP::webSettingsService = WebSettingsService(&webServer, fsRef, EMSESP::esp32React.getSecurityManager());
|
||||||
WebCustomizationService EMSESP::webCustomizationService = WebCustomizationService(&webServer, &fsRef, EMSESP::esp32React.getSecurityManager());
|
WebCustomizationService EMSESP::webCustomizationService = WebCustomizationService(&webServer, fsRef, EMSESP::esp32React.getSecurityManager());
|
||||||
WebSchedulerService EMSESP::webSchedulerService = WebSchedulerService(&webServer, &fsRef, EMSESP::esp32React.getSecurityManager());
|
WebSchedulerService EMSESP::webSchedulerService = WebSchedulerService(&webServer, fsRef, EMSESP::esp32React.getSecurityManager());
|
||||||
WebCommandService EMSESP::webCommandService = WebCommandService(&webServer, &fsRef, EMSESP::esp32React.getSecurityManager());
|
WebCommandService EMSESP::webCommandService = WebCommandService(&webServer, fsRef, EMSESP::esp32React.getSecurityManager());
|
||||||
WebCustomEntityService EMSESP::webCustomEntityService = WebCustomEntityService(&webServer, &fsRef, EMSESP::esp32React.getSecurityManager());
|
WebCustomEntityService EMSESP::webCustomEntityService = WebCustomEntityService(&webServer, fsRef, EMSESP::esp32React.getSecurityManager());
|
||||||
WebModulesService EMSESP::webModulesService = WebModulesService(&webServer, &fsRef, EMSESP::esp32React.getSecurityManager());
|
WebModulesService EMSESP::webModulesService = WebModulesService(&webServer, fsRef, EMSESP::esp32React.getSecurityManager());
|
||||||
|
|
||||||
WebActivityService EMSESP::webActivityService = WebActivityService(&webServer, EMSESP::esp32React.getSecurityManager());
|
WebActivityService EMSESP::webActivityService = WebActivityService(&webServer, EMSESP::esp32React.getSecurityManager());
|
||||||
WebStatusService EMSESP::webStatusService = WebStatusService(&webServer, EMSESP::esp32React.getSecurityManager());
|
WebStatusService EMSESP::webStatusService = WebStatusService(&webServer, EMSESP::esp32React.getSecurityManager());
|
||||||
@@ -186,7 +186,7 @@ void EMSESP::erase_device(const uint8_t type_id) {
|
|||||||
|
|
||||||
// clears list of recognized devices, entities and telegrams
|
// clears list of recognized devices, entities and telegrams
|
||||||
void EMSESP::clear_all_devices() {
|
void EMSESP::clear_all_devices() {
|
||||||
for (auto & emsdevice : emsdevices) {
|
for (const auto & emsdevice : emsdevices) {
|
||||||
emsdevice->erase_device_values();
|
emsdevice->erase_device_values();
|
||||||
}
|
}
|
||||||
emsdevices.clear();
|
emsdevices.clear();
|
||||||
@@ -1484,7 +1484,7 @@ bool EMSESP::add_device(const uint8_t device_id, const uint8_t product_id, const
|
|||||||
|
|
||||||
// see if we have a custom device name in our Customizations list, and if so set it
|
// see if we have a custom device name in our Customizations list, and if so set it
|
||||||
webCustomizationService.read([&](WebCustomization const & settings) {
|
webCustomizationService.read([&](WebCustomization const & settings) {
|
||||||
for (EntityCustomization e : settings.entityCustomizations) {
|
for (const auto & e : settings.entityCustomizations) {
|
||||||
if ((e.device_id == device_id) && (e.product_id == product_id)) {
|
if ((e.device_id == device_id) && (e.product_id == product_id)) {
|
||||||
LOG_DEBUG("Have customizations for %s with deviceID 0x%02X productID %d", e.custom_name.c_str(), device_id, product_id);
|
LOG_DEBUG("Have customizations for %s with deviceID 0x%02X productID %d", e.custom_name.c_str(), device_id, product_id);
|
||||||
emsdevices.back()->custom_name(e.custom_name);
|
emsdevices.back()->custom_name(e.custom_name);
|
||||||
|
|||||||
+1
-1
@@ -101,7 +101,7 @@ class Module {}; // forward declaration
|
|||||||
|
|
||||||
// for Command Function callbacks (Command::cmd_function_p). The unified callback takes a JsonObject
|
// for Command Function callbacks (Command::cmd_function_p). The unified callback takes a JsonObject
|
||||||
// output which entity/setter commands ignore.
|
// output which entity/setter commands ignore.
|
||||||
#define MAKE_CF_CB(__f) [&](const char * value, const int8_t id, JsonObject output) { return __f(value, id); }
|
#define MAKE_CF_CB(__f) [this](const char * value, const int8_t id, JsonObject output) { return __f(value, id); }
|
||||||
|
|
||||||
namespace emsesp {
|
namespace emsesp {
|
||||||
|
|
||||||
|
|||||||
+8
-5
@@ -67,7 +67,6 @@ bool LED::loop(uint8_t healthcheck, bool button_busy) {
|
|||||||
set_led(Color::YELLOW); // Yellow
|
set_led(Color::YELLOW); // Yellow
|
||||||
} else {
|
} else {
|
||||||
reset_led();
|
reset_led();
|
||||||
previous_healthcheck_ = System::HEALTHCHECK_RESET;
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -75,7 +74,6 @@ bool LED::loop(uint8_t healthcheck, bool button_busy) {
|
|||||||
// check the system health.
|
// check the system health.
|
||||||
// Set the sequence accordingly, only if the healthcheck is not 0 and has changed
|
// Set the sequence accordingly, only if the healthcheck is not 0 and has changed
|
||||||
if (healthcheck != previous_healthcheck_) {
|
if (healthcheck != previous_healthcheck_) {
|
||||||
previous_healthcheck_ = healthcheck;
|
|
||||||
color_steps_[0] = Color::OFF;
|
color_steps_[0] = Color::OFF;
|
||||||
color_steps_[1] = Color::OFF;
|
color_steps_[1] = Color::OFF;
|
||||||
color_steps_[2] = Color::OFF;
|
color_steps_[2] = Color::OFF;
|
||||||
@@ -83,9 +81,7 @@ bool LED::loop(uint8_t healthcheck, bool button_busy) {
|
|||||||
// if the healthcheck is 0, i.e. system is healthy, reset the LED
|
// if the healthcheck is 0, i.e. system is healthy, reset the LED
|
||||||
if (healthcheck == 0) {
|
if (healthcheck == 0) {
|
||||||
reset_led();
|
reset_led();
|
||||||
return false;
|
} else {
|
||||||
}
|
|
||||||
|
|
||||||
// 1 flash (blue) is the EMS bus is not connected
|
// 1 flash (blue) is the EMS bus is not connected
|
||||||
// 2 flashes (red, red) if the network (wifi or ethernet) is not connected
|
// 2 flashes (red, red) if the network (wifi or ethernet) is not connected
|
||||||
// 3 flashes (red, red, blue) is both the bus and the network are not connected
|
// 3 flashes (red, red, blue) is both the bus and the network are not connected
|
||||||
@@ -110,6 +106,9 @@ bool LED::loop(uint8_t healthcheck, bool button_busy) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
previous_healthcheck_ = healthcheck; // must be set after reset_led(), which invalidates it
|
||||||
|
}
|
||||||
|
|
||||||
// there's nothing to flash, so leave the LED in the state reset_led() gave it.
|
// there's nothing to flash, so leave the LED in the state reset_led() gave it.
|
||||||
// Running the sequence here would keep writing Color::OFF and a healthy system would never show green.
|
// Running the sequence here would keep writing Color::OFF and a healthy system would never show green.
|
||||||
if (healthcheck == 0 || button_busy) {
|
if (healthcheck == 0 || button_busy) {
|
||||||
@@ -131,6 +130,10 @@ void LED::reset_led() {
|
|||||||
color_steps_[1] = Color::OFF;
|
color_steps_[1] = Color::OFF;
|
||||||
color_steps_[2] = Color::OFF;
|
color_steps_[2] = Color::OFF;
|
||||||
|
|
||||||
|
// invalidate the last health state so the sequence is rebuilt on the next check,
|
||||||
|
// needed because the color steps above have been cleared
|
||||||
|
previous_healthcheck_ = System::HEALTHCHECK_RESET;
|
||||||
|
|
||||||
// rewind the sequence so it starts from the top if the health degrades again
|
// rewind the sequence so it starts from the top if the health degrades again
|
||||||
led_long_timer_ = 1; // 1 will kick it off immediately
|
led_long_timer_ = 1; // 1 will kick it off immediately
|
||||||
led_short_timer_ = 0;
|
led_short_timer_ = 0;
|
||||||
|
|||||||
+42
-18
@@ -313,6 +313,31 @@ void Mqtt::on_publish(uint16_t packetId) const {
|
|||||||
LOG_DEBUG("Packet %d sent successful", packetId);
|
LOG_DEBUG("Packet %d sent successful", packetId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// gracefully disconnect from the broker by sending a proper MQTT DISCONNECT packet.
|
||||||
|
// this is called just before a restart so the broker ends our session cleanly
|
||||||
|
// (avoids a lingering session that shows up as "session taken over" on reconnect).
|
||||||
|
//
|
||||||
|
// the disconnect is deferred inside espMqttClient - the DISCONNECT packet is only
|
||||||
|
// queued and actually sent when loop() runs the state machine. On PSRAM boards the
|
||||||
|
// client has its own task that keeps pumping loop(), so it flushes on its own. On
|
||||||
|
// non-PSRAM boards (UseInternalTask::NO) nothing drives loop() once we're mid-restart,
|
||||||
|
// so we pump it here until the client is fully disconnected, bounded by a timeout.
|
||||||
|
void Mqtt::disconnect() {
|
||||||
|
if (!mqttClient_) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
mqttClient_->disconnect(); // graceful - queues the DISCONNECT packet
|
||||||
|
|
||||||
|
if (EMSESP::system_.PSram() == 0) {
|
||||||
|
uint32_t start = uuid::get_uptime();
|
||||||
|
while (!mqttClient_->disconnected() && (uuid::get_uptime() - start) < MQTT_DISCONNECT_TIMEOUT) {
|
||||||
|
mqttClient_->loop();
|
||||||
|
delay(2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// called when MQTT settings have changed via the MQTT Settings or Application Settings Web pages
|
// called when MQTT settings have changed via the MQTT Settings or Application Settings Web pages
|
||||||
void Mqtt::reset_mqtt() {
|
void Mqtt::reset_mqtt() {
|
||||||
if (!enabled()) {
|
if (!enabled()) {
|
||||||
@@ -447,8 +472,8 @@ bool Mqtt::get_publish_onchange(uint8_t device_type) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
void Mqtt::on_disconnect(espMqttClientTypes::DisconnectReason reason) {
|
void Mqtt::on_disconnect(espMqttClientTypes::DisconnectReason reason) {
|
||||||
// only show the error once, not every 2 seconds
|
// only show the error once on the first connect failure
|
||||||
if (!connecting_) {
|
if (connectcount_) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
connecting_ = false;
|
connecting_ = false;
|
||||||
@@ -587,9 +612,11 @@ void Mqtt::ha_status() {
|
|||||||
|
|
||||||
// These come from the info MQTT topic - and handled in the publish_ha_sensor_config function
|
// These come from the info MQTT topic - and handled in the publish_ha_sensor_config function
|
||||||
publish_system_ha_sensor_config(DeviceValueType::STRING, "Version", "version", DeviceValueUOM::NONE);
|
publish_system_ha_sensor_config(DeviceValueType::STRING, "Version", "version", DeviceValueUOM::NONE);
|
||||||
publish_system_ha_sensor_config(DeviceValueType::STRING, "Boot time", "bootTime", DeviceValueUOM::UPTIME);
|
publish_system_ha_sensor_config(DeviceValueType::STRING,
|
||||||
|
"Uptime",
|
||||||
|
"bootTime",
|
||||||
|
DeviceValueUOM::UPTIME); // called Uptime in HA and derives value from bootTime element in info topic
|
||||||
}
|
}
|
||||||
|
|
||||||
// add sub or pub task to the queue.
|
// add sub or pub task to the queue.
|
||||||
// the base is not included in the topic
|
// the base is not included in the topic
|
||||||
bool Mqtt::queue_message(const uint8_t operation, const std::string & topic, const std::string & payload, const bool retain) {
|
bool Mqtt::queue_message(const uint8_t operation, const std::string & topic, const std::string & payload, const bool retain) {
|
||||||
@@ -988,8 +1015,9 @@ bool Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdev
|
|||||||
|
|
||||||
// set the entity_id. This is breaking change in HA 2025.10.0 - see https://github.com/home-assistant/core/pull/151775
|
// set the entity_id. This is breaking change in HA 2025.10.0 - see https://github.com/home-assistant/core/pull/151775
|
||||||
// extract the string from topic up to the / using std::string
|
// extract the string from topic up to the / using std::string
|
||||||
|
// it must be lowercase (although HA will slugify it and not reject it)
|
||||||
std::string topic_str(topic);
|
std::string topic_str(topic);
|
||||||
doc["def_ent_id"] = topic_str.substr(0, topic_str.find("/")) + "." + uniq_id;
|
doc["def_ent_id"] = Helpers::toLower(topic_str.substr(0, topic_str.find("/"))) + "." + Helpers::toLower(uniq_id);
|
||||||
|
|
||||||
char sample_val[30] = "0"; // sample, correct(!) entity value, used only to prevent warning/error in HA if real value is not published yet
|
char sample_val[30] = "0"; // sample, correct(!) entity value, used only to prevent warning/error in HA if real value is not published yet
|
||||||
|
|
||||||
@@ -1067,7 +1095,7 @@ bool Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdev
|
|||||||
snprintf(stat_t, sizeof(stat_t), "~/%s", tag_to_topic(device_type, tag).c_str());
|
snprintf(stat_t, sizeof(stat_t), "~/%s", tag_to_topic(device_type, tag).c_str());
|
||||||
|
|
||||||
// Override - there are exceptions for DeviceType::SYSTEM, which uses the heartbeat topic
|
// Override - there are exceptions for DeviceType::SYSTEM, which uses the heartbeat topic
|
||||||
// and when fetching the version and bootTime we want to take this from the info topic instead
|
// and when fetching the version and uptime we want to take this from the info topic instead
|
||||||
if (device_type == EMSdevice::DeviceType::SYSTEM) {
|
if (device_type == EMSdevice::DeviceType::SYSTEM) {
|
||||||
// handle the exceptions
|
// handle the exceptions
|
||||||
if (strncmp(entity, "version", 7) == 0) {
|
if (strncmp(entity, "version", 7) == 0) {
|
||||||
@@ -1100,12 +1128,17 @@ bool Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdev
|
|||||||
|
|
||||||
// don't bother with value template conditions if using Domoticz which doesn't fully support MQTT Discovery
|
// don't bother with value template conditions if using Domoticz which doesn't fully support MQTT Discovery
|
||||||
if (discovery_type() == discoveryType::HOMEASSISTANT) {
|
if (discovery_type() == discoveryType::HOMEASSISTANT) {
|
||||||
|
// handle special cases for value_template depending on the uom
|
||||||
if (uom == DeviceValueUOM::TIMESTAMP) {
|
if (uom == DeviceValueUOM::TIMESTAMP) {
|
||||||
// special case for timestamp, using "value_template": "{{ (value_json.bootTime | as_datetime).isoformat() }}",
|
// uptime
|
||||||
char val_tpl[100];
|
char val_tpl[100];
|
||||||
snprintf(val_tpl, sizeof(val_tpl), "{{ (value_json.%s | as_datetime).isoformat() }}", entity);
|
snprintf(val_tpl, sizeof(val_tpl), "{{ (value_json.%s | as_datetime).isoformat() }}", entity);
|
||||||
doc["val_tpl"] = val_tpl;
|
doc["val_tpl"] = val_tpl;
|
||||||
|
} else if (uom == DeviceValueUOM::UPTIME) {
|
||||||
|
// uptime
|
||||||
|
doc["val_tpl"] = (std::string) "{{" + val_obj + " if " + val_cond + " else '' }}";
|
||||||
} else {
|
} else {
|
||||||
|
// default
|
||||||
doc["val_tpl"] = (std::string) "{{" + val_obj + " if " + val_cond + " else " + sample_val + "}}";
|
doc["val_tpl"] = (std::string) "{{" + val_obj + " if " + val_cond + " else " + sample_val + "}}";
|
||||||
}
|
}
|
||||||
add_ha_avty_section(doc.as<JsonObject>(), stat_t, val_cond); // adds availability section
|
add_ha_avty_section(doc.as<JsonObject>(), stat_t, val_cond); // adds availability section
|
||||||
@@ -1141,7 +1174,7 @@ bool Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdev
|
|||||||
// https://developers.home-assistant.io/docs/core/entity/sensor/
|
// https://developers.home-assistant.io/docs/core/entity/sensor/
|
||||||
// Home Assistant tracks the min, max and mean value during the statistics period
|
// Home Assistant tracks the min, max and mean value during the statistics period
|
||||||
// For statistics, the sensor must have state_class set to either MEASUREMENT, TOTAL or TOTAL_INCREASING
|
// For statistics, the sensor must have state_class set to either MEASUREMENT, TOTAL or TOTAL_INCREASING
|
||||||
// When set to MEASUREMENT the device_class must cannot be DATE, ENUM, ENERGY, GAS, MONETARY, TIMESTAMP, VOLUME or WATER
|
// When set to MEASUREMENT the device_class must cannot be DATE, ENUM, ENERGY, GAS, MONETARY, TIMESTAMP, UPTIME, VOLUME or WATER
|
||||||
//
|
//
|
||||||
void Mqtt::add_ha_classes(JsonObject doc, const uint8_t device_type, const uint8_t type, const uint8_t uom, const char * entity, bool display_only) {
|
void Mqtt::add_ha_classes(JsonObject doc, const uint8_t device_type, const uint8_t type, const uint8_t uom, const char * entity, bool display_only) {
|
||||||
if (device_type == EMSdevice::DeviceType::SYSTEM) {
|
if (device_type == EMSdevice::DeviceType::SYSTEM) {
|
||||||
@@ -1280,7 +1313,7 @@ void Mqtt::add_ha_classes(JsonObject doc, const uint8_t device_type, const uint8
|
|||||||
doc[sc_ha] = sc_ha_measurement;
|
doc[sc_ha] = sc_ha_measurement;
|
||||||
doc[dc_ha] = "timestamp";
|
doc[dc_ha] = "timestamp";
|
||||||
break;
|
break;
|
||||||
case DeviceValueUOM::UPTIME:
|
case DeviceValueUOM::UPTIME: // no state class for uptime
|
||||||
doc[dc_ha] = "uptime";
|
doc[dc_ha] = "uptime";
|
||||||
break;
|
break;
|
||||||
case DeviceValueUOM::MV:
|
case DeviceValueUOM::MV:
|
||||||
@@ -1602,9 +1635,6 @@ void Mqtt::add_ha_avty_section(JsonObject doc, const char * state_t, const char
|
|||||||
avty_json["t"] = state;
|
avty_json["t"] = state;
|
||||||
snprintf(tpl, sizeof(tpl), "{{'online' if %s else 'offline'}}", cond1);
|
snprintf(tpl, sizeof(tpl), "{{'online' if %s else 'offline'}}", cond1);
|
||||||
avty_json["val_tpl"] = tpl;
|
avty_json["val_tpl"] = tpl;
|
||||||
if (!avty.add(avty_json)) {
|
|
||||||
LOG_WARNING("Failed to add availability condition 1 (low memory)");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// condition 2
|
// condition 2
|
||||||
@@ -1613,9 +1643,6 @@ void Mqtt::add_ha_avty_section(JsonObject doc, const char * state_t, const char
|
|||||||
avty_json["t"] = state;
|
avty_json["t"] = state;
|
||||||
snprintf(tpl, sizeof(tpl), "{{'online' if %s else 'offline'}}", cond2);
|
snprintf(tpl, sizeof(tpl), "{{'online' if %s else 'offline'}}", cond2);
|
||||||
avty_json["val_tpl"] = tpl;
|
avty_json["val_tpl"] = tpl;
|
||||||
if (!avty.add(avty_json)) {
|
|
||||||
LOG_WARNING("Failed to add availability condition 2 (low memory)");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// negative condition
|
// negative condition
|
||||||
@@ -1624,9 +1651,6 @@ void Mqtt::add_ha_avty_section(JsonObject doc, const char * state_t, const char
|
|||||||
avty_json["t"] = state;
|
avty_json["t"] = state;
|
||||||
snprintf(tpl, sizeof(tpl), "{{'offline' if %s else 'online'}}", negcond);
|
snprintf(tpl, sizeof(tpl), "{{'offline' if %s else 'online'}}", negcond);
|
||||||
avty_json["val_tpl"] = tpl;
|
avty_json["val_tpl"] = tpl;
|
||||||
if (!avty.add(avty_json)) {
|
|
||||||
LOG_WARNING("Failed to add negative availability condition (low memory)");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-5
@@ -63,6 +63,7 @@ class Mqtt {
|
|||||||
|
|
||||||
static constexpr uint8_t MQTT_TOPIC_MAX_SIZE = 128; // fixed, not a user setting anymore
|
static constexpr uint8_t MQTT_TOPIC_MAX_SIZE = 128; // fixed, not a user setting anymore
|
||||||
static constexpr uint16_t MQTT_QUEUE_MAX_SIZE = 300;
|
static constexpr uint16_t MQTT_QUEUE_MAX_SIZE = 300;
|
||||||
|
static constexpr uint32_t MQTT_DISCONNECT_TIMEOUT = 1000; // max ms to flush a graceful disconnect on non-PSRAM boards
|
||||||
|
|
||||||
static void on_connect();
|
static void on_connect();
|
||||||
static void on_disconnect(espMqttClientTypes::DisconnectReason reason);
|
static void on_disconnect(espMqttClientTypes::DisconnectReason reason);
|
||||||
@@ -132,11 +133,7 @@ class Mqtt {
|
|||||||
return mqttClient_ ? mqttClient_->connected() : false;
|
return mqttClient_ ? mqttClient_->connected() : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void disconnect() {
|
static void disconnect();
|
||||||
if (mqttClient_) {
|
|
||||||
mqttClient_->disconnect();
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool enabled() {
|
static bool enabled() {
|
||||||
return mqtt_enabled_;
|
return mqtt_enabled_;
|
||||||
|
|||||||
+76
-6
@@ -249,11 +249,12 @@ void Network::reconnect() {
|
|||||||
|
|
||||||
// pick the first phase that has the hardware/config to even be attempted on this device.
|
// pick the first phase that has the hardware/config to even be attempted on this device.
|
||||||
// boards without an Ethernet PHY skip straight to WIFI; without a configured SSID, straight to AP
|
// boards without an Ethernet PHY skip straight to WIFI; without a configured SSID, straight to AP
|
||||||
|
// (unless AP provision mode is Never — then stay on WIFI and keep waiting)
|
||||||
NetPhase Network::initialPhase() const {
|
NetPhase Network::initialPhase() const {
|
||||||
if (phy_type_ != PHY_type::PHY_TYPE_NONE) {
|
if (phy_type_ != PHY_type::PHY_TYPE_NONE) {
|
||||||
return NetPhase::ETHERNET;
|
return NetPhase::ETHERNET;
|
||||||
}
|
}
|
||||||
if (!ssid_.isEmpty()) {
|
if (!ssid_.isEmpty() || ap_provisionMode_ == AP_MODE_NEVER) {
|
||||||
return NetPhase::WIFI;
|
return NetPhase::WIFI;
|
||||||
}
|
}
|
||||||
return NetPhase::AP;
|
return NetPhase::AP;
|
||||||
@@ -262,6 +263,12 @@ NetPhase Network::initialPhase() const {
|
|||||||
// network loop, looking for new and disconnecting networks
|
// network loop, looking for new and disconnecting networks
|
||||||
void Network::loop() {
|
void Network::loop() {
|
||||||
#ifndef EMSESP_STANDALONE
|
#ifndef EMSESP_STANDALONE
|
||||||
|
// a reconnect was requested from another task, run it here where nothing is mid-request
|
||||||
|
if (reconnect_pending_) {
|
||||||
|
reconnect_pending_ = false;
|
||||||
|
reconnect();
|
||||||
|
}
|
||||||
|
|
||||||
// if we already have a Wifi or Ethernet connection then re-check every NETWORK_RECONNECTION_DELAY_LONG, otherwise NETWORK_RECONNECTION_DELAY_SHORT
|
// if we already have a Wifi or Ethernet connection then re-check every NETWORK_RECONNECTION_DELAY_LONG, otherwise NETWORK_RECONNECTION_DELAY_SHORT
|
||||||
const unsigned long currentMillis = uuid::get_uptime_ms();
|
const unsigned long currentMillis = uuid::get_uptime_ms();
|
||||||
const uint32_t reconnectDelay =
|
const uint32_t reconnectDelay =
|
||||||
@@ -522,6 +529,22 @@ void Network::startWIFI() {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// Ethernet management
|
// Ethernet management
|
||||||
// Brings up the ETH driver / netif exactly once. After ETH.begin() returns true the driver
|
// Brings up the ETH driver / netif exactly once. After ETH.begin() returns true the driver
|
||||||
// continues to run autonomously (link negotiation, DHCP, etc)
|
// continues to run autonomously (link negotiation, DHCP, etc)
|
||||||
@@ -533,8 +556,12 @@ void Network::startEthernet() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// already up and running, nothing to do
|
// The driver is installed once and then left alone. Re-running the bring-up on a live interface
|
||||||
if (ethernet_connect_pending_ || ethernet_connected()) {
|
// 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.
|
||||||
|
if (ethernet_started_ || ethernet_connect_pending_ || ethernet_connected()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -577,16 +604,45 @@ void Network::startEthernet() {
|
|||||||
eth_phy_type_t type = (phy_type_ == PHY_type::PHY_TYPE_LAN8720) ? ETH_PHY_LAN8720
|
eth_phy_type_t type = (phy_type_ == PHY_type::PHY_TYPE_LAN8720) ? ETH_PHY_LAN8720
|
||||||
: (phy_type_ == PHY_type::PHY_TYPE_TLK110) ? ETH_PHY_TLK110
|
: (phy_type_ == PHY_type::PHY_TYPE_TLK110) ? ETH_PHY_TLK110
|
||||||
: ETH_PHY_RTL8201; // Type of the Ethernet PHY (LAN8720 or TLK110)
|
: ETH_PHY_RTL8201; // Type of the Ethernet PHY (LAN8720 or TLK110)
|
||||||
|
|
||||||
|
// must be in place before ETH.begin() so it beats the esp_netif glue to the START event
|
||||||
|
strlcpy(eth_hostname, hostname_.c_str(), sizeof(eth_hostname));
|
||||||
|
if (!eth_hostname_handler_registered_ && esp_event_handler_register(ETH_EVENT, ETHERNET_EVENT_START, ethApplyHostname, nullptr) == ESP_OK) {
|
||||||
|
eth_hostname_handler_registered_ = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (ETH.begin(type, eth_phy_addr_, 23, 18, eth_power_, (eth_clock_mode_t)eth_clock_mode_)) {
|
if (ETH.begin(type, eth_phy_addr_, 23, 18, eth_power_, (eth_clock_mode_t)eth_clock_mode_)) {
|
||||||
LOG_DEBUG("Ethernet module found - starting");
|
// LOG_DEBUG("Ethernet module found - initialising");
|
||||||
|
ethernet_started_ = true;
|
||||||
ethernet_connect_pending_ = true;
|
ethernet_connect_pending_ = true;
|
||||||
ETH.setHostname(hostname_.c_str()); // Push hostname to the ETH netif immediately after it's created
|
|
||||||
|
// check whether DHCP already announced us under lwIP's default hostname, before we correct it
|
||||||
|
esp_netif_t * eth_netif = ETH.netif();
|
||||||
|
const char * old_hostname = nullptr;
|
||||||
|
bool stale_dhcp = false;
|
||||||
|
if (eth_netif != nullptr && !staticIPConfig_) {
|
||||||
|
esp_netif_dhcp_status_t dhcp_status = ESP_NETIF_DHCP_INIT;
|
||||||
|
stale_dhcp = esp_netif_get_hostname(eth_netif, &old_hostname) == ESP_OK && old_hostname != nullptr && hostname_ != old_hostname
|
||||||
|
&& esp_netif_dhcpc_get_status(eth_netif, &dhcp_status) == ESP_OK && dhcp_status == ESP_NETIF_DHCP_STARTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ETH.setHostname(hostname_.c_str())) {
|
||||||
|
LOG_WARNING("Failed to set Ethernet hostname to %s", hostname_.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
// the DHCP server has already been given the wrong name, so re-run the client to re-announce
|
||||||
|
if (stale_dhcp) {
|
||||||
|
LOG_DEBUG("Restarting Ethernet DHCP client to announce hostname %s", hostname_.c_str());
|
||||||
|
esp_netif_dhcpc_stop(eth_netif);
|
||||||
|
esp_netif_dhcpc_start(eth_netif);
|
||||||
|
}
|
||||||
|
|
||||||
ETH.enableIPv6(true);
|
ETH.enableIPv6(true);
|
||||||
if (staticIPConfig_) {
|
if (staticIPConfig_) {
|
||||||
ETH.config(localIP_, gatewayIP_, subnetMask_, dnsIP1_, dnsIP2_);
|
ETH.config(localIP_, gatewayIP_, subnetMask_, dnsIP1_, dnsIP2_);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
LOG_ERROR("Failed to start Ethernet module");
|
LOG_ERROR("Failed to start Ethernet");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -631,6 +687,11 @@ void Network::findNetworks() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const NetIface candidate = iface_from_desc(desc);
|
const NetIface candidate = iface_from_desc(desc);
|
||||||
|
// AP is disabled in settings — don't treat SoftAP as a usable network
|
||||||
|
if (candidate == NetIface::AP && ap_provisionMode_ == AP_MODE_NEVER) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (iface_priority(candidate) <= iface_priority(best_iface)) {
|
if (iface_priority(candidate) <= iface_priority(best_iface)) {
|
||||||
continue; // already have something at least as good
|
continue; // already have something at least as good
|
||||||
}
|
}
|
||||||
@@ -709,13 +770,18 @@ void Network::findNetworks() {
|
|||||||
: "AP");
|
: "AP");
|
||||||
|
|
||||||
// give up on this interface and try the next one. ETHERNET -> WIFI (or straight to AP if no SSID configured); WIFI -> AP.
|
// give up on this interface and try the next one. ETHERNET -> WIFI (or straight to AP if no SSID configured); WIFI -> AP.
|
||||||
|
// AP_MODE_NEVER: never promote to the AP phase — keep waiting on the current interface.
|
||||||
if (connect_retry_ >= MAX_NETWORK_RECONNECTION_ATTEMPTS && phase_ != NetPhase::AP) {
|
if (connect_retry_ >= MAX_NETWORK_RECONNECTION_ATTEMPTS && phase_ != NetPhase::AP) {
|
||||||
if (phase_ == NetPhase::ETHERNET) {
|
if (phase_ == NetPhase::ETHERNET) {
|
||||||
if (ssid_.isEmpty()) {
|
if (ssid_.isEmpty()) {
|
||||||
if (!ethernet_ever_connected_) {
|
if (!ethernet_ever_connected_) {
|
||||||
|
if (ap_provisionMode_ == AP_MODE_NEVER) {
|
||||||
|
LOG_WARNING("Ethernet failed to connect after %u attempts (AP provision mode is Never)", connect_retry_);
|
||||||
|
} else {
|
||||||
LOG_WARNING("Ethernet failed to connect after %u attempts, falling back to AP", connect_retry_);
|
LOG_WARNING("Ethernet failed to connect after %u attempts, falling back to AP", connect_retry_);
|
||||||
phase_ = NetPhase::AP;
|
phase_ = NetPhase::AP;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
LOG_WARNING("Ethernet failed to connect after %u attempts, switching to WiFi", connect_retry_);
|
LOG_WARNING("Ethernet failed to connect after %u attempts, switching to WiFi", connect_retry_);
|
||||||
phase_ = NetPhase::WIFI;
|
phase_ = NetPhase::WIFI;
|
||||||
@@ -723,9 +789,13 @@ void Network::findNetworks() {
|
|||||||
ethernet_connect_pending_ = false;
|
ethernet_connect_pending_ = false;
|
||||||
} else if (phase_ == NetPhase::WIFI) {
|
} else if (phase_ == NetPhase::WIFI) {
|
||||||
if (!wifi_ever_connected_) {
|
if (!wifi_ever_connected_) {
|
||||||
|
if (ap_provisionMode_ == AP_MODE_NEVER) {
|
||||||
|
LOG_WARNING("WiFi failed to connect after %u attempts (AP provision mode is Never)", connect_retry_);
|
||||||
|
} else {
|
||||||
LOG_WARNING("WiFi failed to connect after %u attempts, falling back to AP", connect_retry_);
|
LOG_WARNING("WiFi failed to connect after %u attempts, falling back to AP", connect_retry_);
|
||||||
phase_ = NetPhase::AP;
|
phase_ = NetPhase::AP;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
wifi_connect_pending_ = false;
|
wifi_connect_pending_ = false;
|
||||||
}
|
}
|
||||||
connect_retry_ = 0;
|
connect_retry_ = 0;
|
||||||
|
|||||||
@@ -138,6 +138,11 @@ class Network {
|
|||||||
|
|
||||||
void reconnect();
|
void reconnect();
|
||||||
|
|
||||||
|
// ask for a reconnect() to run from the next Network::loop()
|
||||||
|
void schedule_reconnect() {
|
||||||
|
reconnect_pending_ = true;
|
||||||
|
}
|
||||||
|
|
||||||
// map a netif description string (from esp_netif_get_desc) to a NetIface
|
// map a netif description string (from esp_netif_get_desc) to a NetIface
|
||||||
static NetIface iface_from_desc(const char * desc) {
|
static NetIface iface_from_desc(const char * desc) {
|
||||||
if (!desc) {
|
if (!desc) {
|
||||||
@@ -202,10 +207,13 @@ class Network {
|
|||||||
|
|
||||||
volatile bool wifi_connect_pending_ = false;
|
volatile bool wifi_connect_pending_ = false;
|
||||||
volatile bool ethernet_connect_pending_ = false;
|
volatile bool ethernet_connect_pending_ = false;
|
||||||
|
volatile bool reconnect_pending_ = false; // set by schedule_reconnect(), actioned in loop()
|
||||||
|
|
||||||
NetPhase phase_ = NetPhase::ETHERNET;
|
NetPhase phase_ = NetPhase::ETHERNET;
|
||||||
|
|
||||||
bool wifi_events_registered_ = false; // ensure WiFi.onEvent() handlers are registered only once across begin()/reconnect() cycles
|
bool wifi_events_registered_ = false; // ensure WiFi.onEvent() handlers are registered only once across begin()/reconnect() cycles
|
||||||
|
bool eth_hostname_handler_registered_ = false; // for the ETHERNET_EVENT_START hostname handler
|
||||||
|
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 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 ethernet_ever_connected_ = false; // set true once we've successfully obtained an IP
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -36,7 +36,7 @@ void Shower::start() {
|
|||||||
Command::add_json(
|
Command::add_json(
|
||||||
EMSdevice::DeviceType::BOILER,
|
EMSdevice::DeviceType::BOILER,
|
||||||
F_(coldshot),
|
F_(coldshot),
|
||||||
[&](const char * value, const int8_t id, JsonObject output) {
|
[this](const char * value, const int8_t id, JsonObject output) {
|
||||||
LOG_INFO("Forcing coldshot...");
|
LOG_INFO("Forcing coldshot...");
|
||||||
if (shower_state_) {
|
if (shower_state_) {
|
||||||
output["message"] = "OK";
|
output["message"] = "OK";
|
||||||
|
|||||||
+6
-6
@@ -153,10 +153,10 @@ bool System::command_sendmail(const char * value, const int8_t) {
|
|||||||
bool success = false;
|
bool success = false;
|
||||||
|
|
||||||
#ifndef EMSESP_STANDALONE
|
#ifndef EMSESP_STANDALONE
|
||||||
WiFiClient * basic_client = new WiFiClient;
|
auto * basic_client = new WiFiClient;
|
||||||
ESP_SSLClient * ssl_client = new ESP_SSLClient;
|
auto * ssl_client = new ESP_SSLClient;
|
||||||
ReadyClient * r_client = new ReadyClient(*ssl_client);
|
auto * r_client = new ReadyClient(*ssl_client);
|
||||||
SMTPClient * smtp = new SMTPClient(*r_client);
|
auto * smtp = new SMTPClient(*r_client);
|
||||||
|
|
||||||
ssl_client->setClient(basic_client);
|
ssl_client->setClient(basic_client);
|
||||||
ssl_client->setInsecure();
|
ssl_client->setInsecure();
|
||||||
@@ -586,7 +586,7 @@ void System::system_restart(const char * partitionname) {
|
|||||||
}
|
}
|
||||||
Serial.flush(); // wait for hardware TX buffer to drain
|
Serial.flush(); // wait for hardware TX buffer to drain
|
||||||
|
|
||||||
Mqtt::disconnect(); // gracefully disconnect MQTT, needed for QOS1
|
Mqtt::disconnect(); // gracefully disconnect MQTT (flushes the DISCONNECT before reboot, needed for QOS1)
|
||||||
EMSuart::stop(); // stop UART so there is no interference
|
EMSuart::stop(); // stop UART so there is no interference
|
||||||
#ifndef EMSESP_STANDALONE
|
#ifndef EMSESP_STANDALONE
|
||||||
delay(1000); // wait 1 second
|
delay(1000); // wait 1 second
|
||||||
@@ -1545,7 +1545,7 @@ bool System::check_upgrade() {
|
|||||||
EMSESP::esp32React.getAPSettingsService()->update([&](APSettings & apSettings) {
|
EMSESP::esp32React.getAPSettingsService()->update([&](APSettings & apSettings) {
|
||||||
if (apSettings.provisionMode == 0) {
|
if (apSettings.provisionMode == 0) {
|
||||||
apSettings.provisionMode = AP_MODE_DISCONNECTED; // AP_MODE_DISCONNECTED is the new default
|
apSettings.provisionMode = AP_MODE_DISCONNECTED; // AP_MODE_DISCONNECTED is the new default
|
||||||
LOG_INFO("Upgrade: Setting AP provision mode to auto");
|
LOG_INFO("Upgrade: Setting AP provision mode to on disconnect");
|
||||||
return StateUpdateResult::CHANGED;
|
return StateUpdateResult::CHANGED;
|
||||||
}
|
}
|
||||||
return StateUpdateResult::UNCHANGED;
|
return StateUpdateResult::UNCHANGED;
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
#define EMSESP_APP_VERSION "3.9.0-dev.2"
|
#define EMSESP_APP_VERSION "3.9.0-dev.3"
|
||||||
|
|||||||
@@ -317,7 +317,7 @@ void WebCustomizationService::customization_entities(AsyncWebServerRequest * req
|
|||||||
|
|
||||||
// add deleted entities from file
|
// add deleted entities from file
|
||||||
read([&](WebCustomization & settings) {
|
read([&](WebCustomization & settings) {
|
||||||
for (EntityCustomization entityCustomization : settings.entityCustomizations) {
|
for (const auto & entityCustomization : settings.entityCustomizations) {
|
||||||
if (entityCustomization.device_id == device_id) {
|
if (entityCustomization.device_id == device_id) {
|
||||||
for (const auto & entity_id : entityCustomization.entity_ids) {
|
for (const auto & entity_id : entityCustomization.entity_ids) {
|
||||||
uint8_t mask = Helpers::hextoint(entity_id.substr(0, 2).c_str());
|
uint8_t mask = Helpers::hextoint(entity_id.substr(0, 2).c_str());
|
||||||
|
|||||||
@@ -421,9 +421,9 @@ bool WebStatusService::refresh_versions_cache() {
|
|||||||
#ifdef EMSESP_STANDALONE
|
#ifdef EMSESP_STANDALONE
|
||||||
return false;
|
return false;
|
||||||
#else
|
#else
|
||||||
// detect scheme from EMSESP_VERSIONS_URL (case-insensitive). One code path for HTTP and HTTPS,
|
// detect scheme from VERSIONS_URL (case-insensitive). One code path for HTTP and HTTPS,
|
||||||
// using ESP_SSLClient as a plain TCP passthrough when SSL is disabled.
|
// using ESP_SSLClient as a plain TCP passthrough when SSL is disabled.
|
||||||
String url = EMSESP_VERSIONS_URL;
|
String url = VERSIONS_URL;
|
||||||
String lower = url;
|
String lower = url;
|
||||||
lower.toLowerCase();
|
lower.toLowerCase();
|
||||||
const bool is_https = lower.startsWith("https://");
|
const bool is_https = lower.startsWith("https://");
|
||||||
|
|||||||
@@ -4,8 +4,6 @@
|
|||||||
#define EMSESP_SYSTEM_STATUS_SERVICE_PATH "/rest/systemStatus"
|
#define EMSESP_SYSTEM_STATUS_SERVICE_PATH "/rest/systemStatus"
|
||||||
#define EMSESP_ACTION_SERVICE_PATH "/rest/action"
|
#define EMSESP_ACTION_SERVICE_PATH "/rest/action"
|
||||||
|
|
||||||
#define EMSESP_VERSIONS_URL "http://emsesp.org/versions.json"
|
|
||||||
|
|
||||||
#include "../core/firmwareVersion.h"
|
#include "../core/firmwareVersion.h"
|
||||||
#include "../emsesp_version.h"
|
#include "../emsesp_version.h"
|
||||||
|
|
||||||
@@ -72,6 +70,8 @@ class WebStatusService {
|
|||||||
|
|
||||||
bool refresh_versions_cache(); // does the actual HTTPS fetch + parse, returns true on success
|
bool refresh_versions_cache(); // does the actual HTTPS fetch + parse, returns true on success
|
||||||
|
|
||||||
|
static constexpr const char * VERSIONS_URL = "http://emsesp.org/versions.json";
|
||||||
|
|
||||||
static constexpr uint32_t VERSIONS_REFRESH_INTERVAL_MS = 60UL * 60UL * 1000UL; // 1 hour on success
|
static constexpr uint32_t VERSIONS_REFRESH_INTERVAL_MS = 60UL * 60UL * 1000UL; // 1 hour on success
|
||||||
static constexpr uint32_t VERSIONS_RETRY_INTERVAL_MS = 5UL * 60UL * 1000UL; // 5 min after failure
|
static constexpr uint32_t VERSIONS_RETRY_INTERVAL_MS = 5UL * 60UL * 1000UL; // 5 min after failure
|
||||||
static constexpr uint32_t VERSIONS_INITIAL_FETCH_DELAY_MS = 5UL * 1000UL; // 5 s after a link comes up
|
static constexpr uint32_t VERSIONS_INITIAL_FETCH_DELAY_MS = 5UL * 1000UL; // 5 s after a link comes up
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user