Compare commits

..
25 Commits
Author SHA1 Message Date
Proddy afb8efec53 Merge pull request #3194 from MichaelDvP/dev
small changes and fixes from #3181
2026-08-20 13:32:06 +02:00
MichaelDvP 84b23f19e5 dev.4 2026-08-20 13:23:05 +02:00
MichaelDvP 668d59a2cd update modbus 2026-08-20 12:44:32 +02:00
MichaelDvP 88f258d7e9 use http_request for version cache 2026-08-20 12:44:21 +02:00
MichaelDvP c45441e3be cleanup sample_value 2026-08-20 12:37:10 +02:00
MichaelDvP 2994535158 add back burnminpower for 0xe6, #3193 2026-08-20 12:36:35 +02:00
MichaelDvP fdfb560cf9 min value for coolstart, #3192 2026-08-20 12:35:55 +02:00
MichaelDvP d56c5897fa fix standalone 2026-08-19 16:40:51 +02:00
MichaelDvP cec0fbc95d revert dev7 mqtt changes 2026-08-19 16:37:10 +02:00
MichaelDvP 8f118e07a3 fix standalone 2026-08-19 16:30:08 +02:00
MichaelDvP b05ae6dbbb fix http timeout setting, dev.8 2026-08-19 15:46:11 +02:00
MichaelDvP 469ca8bf05 revert mqtt dev7 changes 2026-08-19 11:49:29 +02:00
MichaelDvP edd1677526 http timeouts 2026-08-19 11:49:04 +02:00
MichaelDvP c363e0e2c8 do not rebuild all HA configs on a mqtt reconnect, limit by heap 2026-08-17 14:11:42 +02:00
MichaelDvP d397a14b41 prevent unsuccessful mqtt connections, dev7 2026-08-17 11:37:19 +02:00
MichaelDvP 822096b635 detect network disconnect faster 2026-08-17 11:36:18 +02:00
MichaelDvP 0defebfdb6 update pkg 2026-08-17 11:35:40 +02:00
MichaelDvP 574c4e45d5 val_tpl for undefined: 'None' 2026-08-16 10:16:34 +02:00
MichaelDvP 48c118fed7 typo 2026-08-14 15:35:34 +02:00
MichaelDvP ef4335156c remote emulation for UI800 is RT800 2026-08-13 09:49:24 +02:00
MichaelDvP 4d4269cdf7 hc/control setting for UI800 thermostat #3181 2026-08-12 11:44:11 +02:00
MichaelDvP 95a8b78d1d revert commit #9c992d8 2026-08-12 08:54:05 +02:00
MichaelDvP 982b0f304e test with 'None' for undefined HA values 2026-08-11 09:36:30 +02:00
MichaelDvP 1d9a0b6257 set boottime for RTC (if rtc is set) 2026-08-10 10:11:43 +02:00
MichaelDvP 52486ed5b4 HA val_tpl for undefined boottime None 2026-08-10 10:11:01 +02:00
24 changed files with 6334 additions and 6343 deletions
+2 -1
View File
@@ -21,7 +21,7 @@ This release is based on the latest Espressif/Arduino core version 3. It brings
- 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 - 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 - hc/control setting for UI800 thermostats [#3181](https://github.com/emsesp/EMS-ESP32/discussions/3181)
## Changed ## Changed
@@ -33,4 +33,5 @@ This release is based on the latest Espressif/Arduino core version 3. It brings
- 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. - changes to the Dialogs in Dashboard page, removed the run icon in the Commands page. Renamed Execute to Run.
- set `None` for undefined values in HA `val_tpl`
+6008 -5981
View File
File diff suppressed because it is too large Load Diff
+7 -7
View File
@@ -23,13 +23,13 @@
"standalone-devcontainer": "concurrently -c \"auto\" \"typesafe-i18n\" \"pnpm:mock-rest\" \"vite --host\"" "standalone-devcontainer": "concurrently -c \"auto\" \"typesafe-i18n\" \"pnpm:mock-rest\" \"vite --host\""
}, },
"dependencies": { "dependencies": {
"@alova/adapter-xhr": "2.3.1", "@alova/adapter-xhr": "2.3.3",
"@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.1", "@mui/icons-material": "^9.3.1",
"@mui/material": "^9.3.1", "@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.4",
"jwt-decode": "^4.0.0", "jwt-decode": "^4.0.0",
"preact": "^10.29.8", "preact": "^10.29.8",
"react": "^19.2.8", "react": "^19.2.8",
@@ -45,18 +45,18 @@
"@types/node": "^26.2.0", "@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.5",
"eslint": "^10.8.1", "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.1.1",
"terser": "^5.49.2", "terser": "^5.50.0",
"typescript": "^6.0.3", "typescript": "^6.0.3",
"typescript-eslint": "^8.66.0", "typescript-eslint": "^8.67.0",
"vite": "^8.2.1", "vite": "^8.2.1",
"vite-plugin-imagemin": "^0.6.1" "vite-plugin-imagemin": "^0.6.1"
}, },
"packageManager": "pnpm@11.21.0+sha512.521705bce689924eac72f5a3587122f362689ef6571e55ba80076fd637c11132ecffada26fad4ea79c485bfddbfd3d5a2a5b05805a77e893de71ec8a6cca3bb1" "packageManager": "pnpm@11.22.0+sha512.1ff870c4c6133dfd88fb2afc46dd13d47f09c9794b438c6fdb47ca98caf3bc16381ee0be93a091b8e3824cf01f889f46d7d9e20910fb0be1ab0fb5baa80dd621"
} }
+201 -194
View File
@@ -9,8 +9,8 @@ importers:
.: .:
dependencies: dependencies:
'@alova/adapter-xhr': '@alova/adapter-xhr':
specifier: 2.3.1 specifier: 2.3.3
version: 2.3.1(alova@3.5.3) version: 2.3.3(alova@3.5.4)
'@emotion/react': '@emotion/react':
specifier: ^11.14.0 specifier: ^11.14.0
version: 11.14.0(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2) version: 11.14.0(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2)
@@ -27,8 +27,8 @@ importers:
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)
alova: alova:
specifier: ^3.5.3 specifier: ^3.5.4
version: 3.5.3 version: 3.5.4
jwt-decode: jwt-decode:
specifier: ^4.0.0 specifier: ^4.0.0
version: 4.0.0 version: 4.0.0
@@ -56,7 +56,7 @@ importers:
version: 10.0.1(eslint@10.8.1(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.1(@types/node@26.2.0)(terser@5.49.2)) version: 2.10.6(@babel/core@7.29.7(supports-color@10.2.2))(preact@10.29.8)(supports-color@10.2.2)(vite@8.2.1(@types/node@26.2.0)(terser@5.50.0))
'@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)
@@ -70,8 +70,8 @@ importers:
specifier: ^19.2.4 specifier: ^19.2.4
version: 19.2.4(@types/react@19.2.18) version: 19.2.4(@types/react@19.2.18)
concurrently: concurrently:
specifier: ^10.0.4 specifier: ^10.0.5
version: 10.0.4 version: 10.0.5
eslint: eslint:
specifier: ^10.8.1 specifier: ^10.8.1
version: 10.8.1(supports-color@10.2.2) version: 10.8.1(supports-color@10.2.2)
@@ -88,34 +88,31 @@ importers:
specifier: ^3.9.6 specifier: ^3.9.6
version: 3.9.6 version: 3.9.6
rollup-plugin-visualizer: rollup-plugin-visualizer:
specifier: ^7.0.1 specifier: ^7.1.1
version: 7.0.1(rolldown@1.2.3) version: 7.1.1(rolldown@1.2.4)
terser: terser:
specifier: ^5.49.2 specifier: ^5.50.0
version: 5.49.2 version: 5.50.0
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.67.0
version: 8.66.0(eslint@10.8.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) version: 8.67.0(eslint@10.8.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)
vite: vite:
specifier: ^8.2.1 specifier: ^8.2.1
version: 8.2.1(@types/node@26.2.0)(terser@5.49.2) version: 8.2.1(@types/node@26.2.0)(terser@5.50.0)
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.1(@types/node@26.2.0)(terser@5.49.2)) version: 0.6.1(supports-color@10.2.2)(vite@8.2.1(@types/node@26.2.0)(terser@5.50.0))
packages: packages:
'@alova/adapter-xhr@2.3.1': '@alova/adapter-xhr@2.3.3':
resolution: {integrity: sha512-mhViueeSJ6yfyEUvHIWyZlb6V8+9GJCzwU1hUsvjXSZHpkzGCeNUefxjjFC++K9UBsvUzJ5KGeyeqoToUQg3gg==} resolution: {integrity: sha512-+ZtON7Gw/1bVsX3IXRaQ3g93CbO+OYfhDO6Q8IAiVTToBOaGX9NZTdziziEhHCFu5xlx4cVFVm7TJw+OT3H4GQ==}
peerDependencies: peerDependencies:
alova: ^3.0.20 alova: ^3.0.20
'@alova/shared@1.3.2':
resolution: {integrity: sha512-1XvDLWgYpVZ99MmLl1f3Fw4T6S6pPYk5afz5cwRVjuq8JXEGsDn9IygDKfvRyWqkqCBx7Jif07LIct1O+MVEow==}
'@alova/shared@1.3.4': '@alova/shared@1.3.4':
resolution: {integrity: sha512-kdYHUqO35AEdnQHnzevyf+VhhfD0jc+EBbZv/aYkA4rwjVjf+vB6D/ZkTwiYFH1yQjwiGwF1ZbJv5a7rKGyNiw==} resolution: {integrity: sha512-kdYHUqO35AEdnQHnzevyf+VhhfD0jc+EBbZv/aYkA4rwjVjf+vB6D/ZkTwiYFH1yQjwiGwF1ZbJv5a7rKGyNiw==}
@@ -457,8 +454,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.143.0': '@oxc-project/types@0.144.0':
resolution: {integrity: sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==} resolution: {integrity: sha512-nuhZIOLuI6TFQ32I/WnUx+SCPY7SdSKwgnFHydAuoS1+Z4BRcaP+RRJmGzl9lw+0OFF7UmaESf7KQRXaNLHypg==}
'@popperjs/core@2.11.8': '@popperjs/core@2.11.8':
resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==}
@@ -486,92 +483,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.3': '@rolldown/binding-android-arm64@1.2.4':
resolution: {integrity: sha512-zrJtHDcaZJ1Fp7xf4hNl+7seH9Cn/N5TwLYkhgXREtBwAd/jaqW3uqeHxpDugJLVICWg4eW44kOQEGJ1r6jCGw==} resolution: {integrity: sha512-jHC2cnyKz5xU2fhECtFl8OZ83cYNt13GZQD+0uMJ/X3o+ijmd56okHhTUwxVSHPx1IRVIJEZ1/1pPzeLCU6XKA==}
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.3': '@rolldown/binding-darwin-arm64@1.2.4':
resolution: {integrity: sha512-ieIiibVCp0tX7TLu2cafoNPv8wJyYi01ekXpbf8q2j7F4rGAhhXb/eQh7ge9DRBY78GwmRQtvjZDux7EDbA8kA==} resolution: {integrity: sha512-Dc5mPD8F5F/FS8i01syd7FTF6yB2fVthH/TRkjwJkzUK6EpoxHtqvZQP5Zwq80/5z19TWYHIg1KOHboCgVx/aQ==}
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.3': '@rolldown/binding-darwin-x64@1.2.4':
resolution: {integrity: sha512-Zh9tCon19eDXJoihx0rqKhMUlMYqzwj3aPsSuHmI4RWZh62dWUL+DJN4C5YQya5TcQBJU/Fe8+rY0jhXTQITqA==} resolution: {integrity: sha512-fpDm4oBo6SqLvWUYCmFhdde3U9KH2fRNNMeAnAPAIwxRL345xutL0EtEUcuoxsoazdJGv/MuDBQHlCDrtbvqOg==}
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.3': '@rolldown/binding-freebsd-x64@1.2.4':
resolution: {integrity: sha512-nGbJWewA1wrXXZiQhjAT5rhibGfns5ZNkDVqxsO6zJ3f3YvpoDNNmGMSbbhLuXKjNScaBJVOAboztAWVespQMg==} resolution: {integrity: sha512-rSJoreDE/HoIzoaib6MTp5jQtCTdMHKIvItAKT/ImS6Y6Ww76oUaeMyp4Vc/fAgd/ehji068IxetHXAnqUwN9A==}
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.3': '@rolldown/binding-linux-arm-gnueabihf@1.2.4':
resolution: {integrity: sha512-QNniJr5Kml0kDEB98jiDOJjXNroxIIi0IXIbdYzY26Xt1pVbeP62+KnoIZLwirOymX/0jDk/2gI/bNUv7A7OIw==} resolution: {integrity: sha512-/jm8OGHgn7oGaJu3i/qZI9spUGcJ+y/lk43ttQ/iO1tOd9NissG6o97bighBCiL+BKRngmcDuR6ikfwYdJmVuQ==}
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.3': '@rolldown/binding-linux-arm64-gnu@1.2.4':
resolution: {integrity: sha512-TkqEAcmmvH3I/q4114NB4RVt6241Dao48pF45uLcFGrwAaIn0iITgTAKP/dLjbN0R4buJjGb91+UHSoFmpgIWw==} resolution: {integrity: sha512-tIP06BeD9EqvECBrPZ+sqdPlYrT+aYaAiu1wYziVx5elRK/ftm33JxVDy2bXGbr6J0CrtirCkR87/X5a2euEng==}
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.3': '@rolldown/binding-linux-arm64-musl@1.2.4':
resolution: {integrity: sha512-NHqjnxpsndf4MPymxteFAWHHfkTL8HjWh1KB7z23ofZ6QO2euONuxDXjat69dKZRALnGypg8k8SsK8vZJoXv1Q==} resolution: {integrity: sha512-Ql1Q0EQqVThvn9VAVlwNzsUvbSFtCMGjLpRRi4pk5i7NZZ4n5ISiLMjHYtus4VQ2PvkSw24zyaCVsiS+sXPj1w==}
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.3': '@rolldown/binding-linux-ppc64-gnu@1.2.4':
resolution: {integrity: sha512-6tbrbwfz5GB9DQ4Jwo6hy9v+vR31xZlvzZ6n5Xut6Hhx5PvrA9q/HsK8KMaYQp063iqZGXwNvZtYNLD7EM/x0w==} resolution: {integrity: sha512-GjbjXD4XXfN19D0LZNbmiCBUoDiRACsYHr0yaIbbn8aFsXjHZifcYqu/W5Er5X2X990WjHXFrxarn5chzItorQ==}
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.3': '@rolldown/binding-linux-s390x-gnu@1.2.4':
resolution: {integrity: sha512-oyuXxXmoZHjXC917IAPFAAv4wWAa0cM9afk8nx1+9/jNNOX1uPf8yDA6p7G0RypOfw/X0PQt5IfoquY1um+zSg==} resolution: {integrity: sha512-p5WR0NOwaRmJ/B1b6IjEFLLivwEsf3PrdBIhRbhTCQisbo2SvHHpG4ELB/+FgQNnB88LTOF86upmJmbvZdQ2lw==}
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.3': '@rolldown/binding-linux-x64-gnu@1.2.4':
resolution: {integrity: sha512-TytMwF2KVGqP2tgd0I1OY0PAv78dZRAYcF5ssDzjM34SUXCED3uXvSd5+lHoC0bTD6eEdFz7LdQNCO1y0oVk9w==} resolution: {integrity: sha512-4/GyVjmhR+Tc6HLJvwc1sOhPqAZtySiSMesOZyX6JQ5XBxoTDEMKQzvo07NIK6nTon/SivlZqvhzvuVBNQhObQ==}
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.3': '@rolldown/binding-linux-x64-musl@1.2.4':
resolution: {integrity: sha512-/E9m3qstrJFVPoULV25mVQblSNExY2+kBsYe4sy0Tn0yOOgJ8wZbZt3KnRbF/XeU2Gl1STKUQnDNTqhIE5MD4A==} resolution: {integrity: sha512-l9eeLsCNvPpmSXUej0etw/J1eqV0Jj1D5G/xG6YTijmE6dkv6E2QezgWbTfQk63v952DPqrjOCoiqxq7Bw0YUQ==}
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.3': '@rolldown/binding-openharmony-arm64@1.2.4':
resolution: {integrity: sha512-Kr0OcsoQI816i6HOl3vFHpd1K0eZyh76zgfj4c1nTyaTsd5r2Mj1lwM4R90y/qaCfmTn9eHy0SKwi98eitRxug==} resolution: {integrity: sha512-e0F355MSTMm3+UOqtV3L24gFUp2N5m1f8L/7d56deik6va+AXdrt9F8LbzGpeWGWRbZEDq4m8NVnJDeBtf9DZg==}
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.3': '@rolldown/binding-win32-arm64-msvc@1.2.4':
resolution: {integrity: sha512-hOtMwTqnME+/gJcH/PCZ0wn0zPUjiWOgkHpxbSJpfGKMezHltx1S7/k1SitzVa7Ww2cqrDDaFbZEhcJZO8o+Jw==} resolution: {integrity: sha512-AWLi0uBRYh6QlE7OKhiz+phZC0qwtij2QZmhmOdsLdFn64m7oMpooE9ICE3lhm9xMb4SpDo2WbHcxX1iFLFtqw==}
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.3': '@rolldown/binding-win32-x64-msvc@1.2.4':
resolution: {integrity: sha512-ekcqMMkI2PlhYnfzQnB/cEdYUVVJViWvoUyLrbzgDoi3Snfc1mVBwdnc306ufA5ejy8JSPjT2RlW1nQSjW7efg==} resolution: {integrity: sha512-UwSDJOg3dqCAejWdxclJjCsh3Qq4vLYMDxmyHqo1btz3stK2VqgwNd3mm5tuIwzSlGIQ/1H9Hr+Zn09mrezNqQ==}
engines: {node: ^20.19.0 || >=22.12.0} engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
@@ -693,63 +690,63 @@ packages:
'@types/svgo@2.6.4': '@types/svgo@2.6.4':
resolution: {integrity: sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==} resolution: {integrity: sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==}
'@typescript-eslint/eslint-plugin@8.66.0': '@typescript-eslint/eslint-plugin@8.67.0':
resolution: {integrity: sha512-p088eaGrzYz1s+7cov0aMOCkNGTJlVxF4jgubf28c8L0Cv9Rloj8YBHnv4hXLq6IIEE1AsjNWavO+k+8kP2Y0A==} resolution: {integrity: sha512-Un7Heoyj65NREbKAyIrFxeM143NZpExWmy1Nep4DLeQOeLlTeumPjoNKnBrU5D5moWXbPJgRa5Uwcdu0faVNGQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
'@typescript-eslint/parser': ^8.66.0 '@typescript-eslint/parser': ^8.67.0
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.1.0' typescript: '>=4.8.4 <6.1.0'
'@typescript-eslint/parser@8.66.0': '@typescript-eslint/parser@8.67.0':
resolution: {integrity: sha512-X6ypGChaWYk6PBtUg2BwuTZEFFcHJAtGTVJ9/lCTOufhZ4i9fNolQNnktq+kkMCwMj7V8Svsq7+TxSDslmhE0g==} resolution: {integrity: sha512-fUBfTuuEulWqX6V8+O3PtScV01tzYYRUDTAirHFKoRAt7nOzoGiPt0M/bB47wWNy0coOOcgEwAMUtBpykMxl6w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.1.0' typescript: '>=4.8.4 <6.1.0'
'@typescript-eslint/project-service@8.66.0': '@typescript-eslint/project-service@8.67.0':
resolution: {integrity: sha512-7MthGPTt4BP69lSryqpqq8HQqxuzynssckL/jyDyk3+TNMQ3y2jFWkptCrktWvBrP+EH787Nl5N5Qpw7WZg+5g==} resolution: {integrity: sha512-cvE8c7ulYeXN9fYuszhCeCsbzyVEXuhrRCybnBre7TUmqb5nRmBfQAwCj0O3WJFDeyAZt4VYv51vMCC9LHSdYw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
typescript: '>=4.8.4 <6.1.0' typescript: '>=4.8.4 <6.1.0'
'@typescript-eslint/scope-manager@8.66.0': '@typescript-eslint/scope-manager@8.67.0':
resolution: {integrity: sha512-8TGcH25j9zqJ/IULB/ppyhRvxA8QYfFEZ7nfbg6/BN9spDgb8fPWQXlE5l8TWBL50EtUx007uZ1o9VOwrq2/9g==} resolution: {integrity: sha512-EgvsleTwS4E+WzzSvem8fAUubLwatMNF1B5hHSLQxcvs7q2dtRhGyujHwLJSYlG41niJ7GP24Aha2+0mb1b2kg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/tsconfig-utils@8.66.0': '@typescript-eslint/tsconfig-utils@8.67.0':
resolution: {integrity: sha512-9D5gLYZG4rOjcoag8MQ/fWI8WqA9wcPDyOGyWtWFhvM1lHRbliqUSPIY5J3zqCU1tvSwzXxnnjhQhz5Ne7mJ4g==} resolution: {integrity: sha512-vV+LUSv5njUWsknE71fqKTlXUva+R76SaeORd6Zojcunk/6DvKFXONU3BrAs2H49mbygUXt6gbYunzwqNwlhdg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
typescript: '>=4.8.4 <6.1.0' typescript: '>=4.8.4 <6.1.0'
'@typescript-eslint/type-utils@8.66.0': '@typescript-eslint/type-utils@8.67.0':
resolution: {integrity: sha512-LG2dWfjZQQp0ADtAu/EWJVayefGL2UEZ3CDeI44D9v3rXB/WYUqE/jpO28KrEKul5AySrmI+Zh1v6v+xW2U9+g==} resolution: {integrity: sha512-aVWDXbRmdXO9siTfX4ditQI1T9+zVcNazT48EJCD0v40/9RIFoUgZ05CmGEq9H2gixRpjUn/iplwvlcvutJW/Q==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.1.0' typescript: '>=4.8.4 <6.1.0'
'@typescript-eslint/types@8.66.0': '@typescript-eslint/types@8.67.0':
resolution: {integrity: sha512-H6gcYaSDOyvL3AD/jHUtUFo2jqGgn/F6nuyuZSu0QTesxL+cP4dQoIMrODRofuJC09g64+WgZ6tE19Y1N2YIFQ==} resolution: {integrity: sha512-sBtgslww8nsMYUjhdPBiSyUqSzT8uR6g93A2QXnQC8+cGdjz0CyaOdqHDRJb1AtORbZCNUJBBeFA/tNR2uQmww==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/typescript-estree@8.66.0': '@typescript-eslint/typescript-estree@8.67.0':
resolution: {integrity: sha512-8/x4INiiQb10jGgXYD7116/zQ+OL84ZIFn0za68wwFHCanT/VLbBEroWht8RV8fn0/ZCAoazHLQgwUC0UQcDfg==} resolution: {integrity: sha512-EKQBCE9yNlRJYm7jdTW5AhDacDUmSwQb0FAJAmK2EKYrNXIsa2vxcSZx6PvJ/dEdI6lS+Y9W+EXckLj0iPFGcw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
typescript: '>=4.8.4 <6.1.0' typescript: '>=4.8.4 <6.1.0'
'@typescript-eslint/utils@8.66.0': '@typescript-eslint/utils@8.67.0':
resolution: {integrity: sha512-jasearZPolBw5NJNYGMwxzHMF83niVWmMU1VdHzG1CyfI2VS7f7nZltnKtHcg20hW+7Uo5GfK4MeDPoU3qI8EA==} resolution: {integrity: sha512-U9D1FdwEWBwok3hxxSdhclMb0twvt9QnjIQ0VfQ1AiX2epnpSgv2ubVDsayOFyY8K6FX+AQ7E0FKWVG3iKsj1A==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.1.0' typescript: '>=4.8.4 <6.1.0'
'@typescript-eslint/visitor-keys@8.66.0': '@typescript-eslint/visitor-keys@8.67.0':
resolution: {integrity: sha512-dkKR8q+lKciskj1Y3vthHktl+3cMLWGyVUP23bRiPZ5O9BRT++4EqDDV+TVeIKBL1VXVEqrJlz8MYbcnvJcAlg==} resolution: {integrity: sha512-fkv8dHRDqfGtTHuJeebdrQ7cX6Ad4WAS00rgHh9UGvMycF1mjBfsxry1XsLIFhWZ6Judlh6UdzK+TYlbpCXgnA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
acorn-jsx@5.3.2: acorn-jsx@5.3.2:
@@ -765,16 +762,16 @@ packages:
ajv@6.15.0: ajv@6.15.0:
resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==}
alova@3.5.3: alova@3.5.4:
resolution: {integrity: sha512-p+kLE+DvK5Oo5P3R8Z81GMKKR1n0pJXfp0pxmHHRBsF6zcBZbENxYPkCDMtw92uRz+UPaJ5q1sPQjRymIhlVdg==} resolution: {integrity: sha512-F4NHWWqnTZiqu0pg0X666LEyp04TbM2wWjZJ2vWxuhb1o4KRhh7xZiw74SP6ruXBAdTJLmems77qYWa0TGHYoQ==}
engines: {node: '>= 18.0.0'} engines: {node: '>= 18.0.0'}
ansi-regex@2.1.1: ansi-regex@2.1.1:
resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
ansi-regex@6.2.2: ansi-regex@6.3.0:
resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} resolution: {integrity: sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==}
engines: {node: '>=12'} engines: {node: '>=12'}
ansi-styles@2.2.1: ansi-styles@2.2.1:
@@ -977,8 +974,8 @@ packages:
concat-map@0.0.1: concat-map@0.0.1:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
concurrently@10.0.4: concurrently@10.0.5:
resolution: {integrity: sha512-trZql+7l/0+WRAsAnEdctr4+iiOS6ZrViI6H8QWcCF9MFS/LT0dKpe8vluB1to6it+OxSI4VospFTIFMW8DJRw==} resolution: {integrity: sha512-JaP/CoftUrCcAFW/g//RbgEGwlelnEae6cfBLgH6ZdO6s8jPkn6p9SB9u6pdVxYXoiSnFqseOlHfrEfF82TVOg==}
engines: {node: '>=22'} engines: {node: '>=22'}
hasBin: true hasBin: true
@@ -1097,8 +1094,8 @@ packages:
resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==}
engines: {node: '>=18'} engines: {node: '>=18'}
default-browser@5.5.0: default-browser@5.5.1:
resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} resolution: {integrity: sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==}
engines: {node: '>=18'} engines: {node: '>=18'}
define-data-property@1.1.4: define-data-property@1.1.4:
@@ -2175,8 +2172,8 @@ packages:
resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
engines: {node: '>=6'} engines: {node: '>=6'}
open@11.0.0: open@11.0.1:
resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} resolution: {integrity: sha512-NzwMUB6C1D0+Kd+9iMS/H4k+Ck3cTX6Ckyfr/gAGlmvSE1LUQZnEZvWBi4PYmMwH/S5SMeTXnE+9uAz8uF+pWw==}
engines: {node: '>=20'} engines: {node: '>=20'}
optionator@0.9.4: optionator@0.9.4:
@@ -2351,6 +2348,10 @@ packages:
resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==}
engines: {node: '>=20'} engines: {node: '>=20'}
powershell-utils@0.2.0:
resolution: {integrity: sha512-ZlsFlG7MtSFCoc5xreOvBAozCJ6Pf06opgJjh9ONEv418xpZSAzNjstD36C6+JwOnfSqOW/9uDkqKjezTdxZhw==}
engines: {node: '>=20'}
preact@10.29.8: preact@10.29.8:
resolution: {integrity: sha512-ej2aVZ+vZ8WO7tvlQWRM9N63A0KzF9q4mWJfDUHgYaIofWY9hu74QdnQrjoPMmZi2/nZ5gN0bJCQF49xQqx09Q==} resolution: {integrity: sha512-ej2aVZ+vZ8WO7tvlQWRM9N63A0KzF9q4mWJfDUHgYaIofWY9hu74QdnQrjoPMmZi2/nZ5gN0bJCQF49xQqx09Q==}
peerDependencies: peerDependencies:
@@ -2498,13 +2499,13 @@ 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.3: rolldown@1.2.4:
resolution: {integrity: sha512-rn9wpmxplLf7NLNyCk9FyWh3FM43DbY8jOzCdEPzH7uflhTftRbCEpqi6Ly2osgoU8OwObtmavMbWLaWy4LX7A==} resolution: {integrity: sha512-rSr7irW0K7QRWzjdJXqZowkcRdDtjRduh43rBltnVKd0VFq839l1lJoDvGJb6gl7+4rTTCrPWu+YfujUL8Ug7w==}
engines: {node: ^20.19.0 || >=22.12.0} engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true hasBin: true
rollup-plugin-visualizer@7.0.1: rollup-plugin-visualizer@7.1.1:
resolution: {integrity: sha512-UJUT4+1Ho4OcWmPYU3sYXgUqI8B8Ayfe06MX7y0qCJ1K8aGoKtR/NDd/2nZqM7ADkrzny+I99Ul7GgyoiVNAgg==} resolution: {integrity: sha512-ThaGiHTU8XW02OkK80TrTHATraJmM9OAduU4otal+7gyXLpYEtmGBLfx5kW+EHvvLwn03YGW2NnwKUIqsYlJAA==}
engines: {node: '>=22'} engines: {node: '>=22'}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
@@ -2629,6 +2630,10 @@ packages:
resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==}
engines: {node: '>= 12'} engines: {node: '>= 12'}
source-map@0.8.0:
resolution: {integrity: sha512-d8EqvL+k/SOXCreS/SUzg2ciyHqBBLcN/yuRjFsbvVhHTE2pgei7oAhmPM7kWFbkX6OSMQfUq4KbkF3au9lhYQ==}
engines: {node: '>= 12'}
spdx-correct@3.2.0: spdx-correct@3.2.0:
resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==}
@@ -2739,8 +2744,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.2: terser@5.50.0:
resolution: {integrity: sha512-rGbJiKeQ4WDe3EXlDAIaQcwftVfv2Q8o1awFNfvXolJYKkb1AuZY1RTOmqx4LJXZENbWZA7eIsYGHuEzHsi1nQ==} resolution: {integrity: sha512-CN9BVxWhgS/hRxtUMjtC2uRWSTcSfQFHMDWma6sKKfIivCD91sM+FOPfvwoaRMqCSrUpe1nv3jDamd9eEQ4y+w==}
engines: {node: '>=10'} engines: {node: '>=10'}
hasBin: true hasBin: true
@@ -2805,8 +2810,8 @@ packages:
peerDependencies: peerDependencies:
typescript: '>=3.5.1' typescript: '>=3.5.1'
typescript-eslint@8.66.0: typescript-eslint@8.67.0:
resolution: {integrity: sha512-QlEbBPz/RuJ1XUHj29nm3t0F/O/cSlEnntozqPOYHnnTGAXFamnMBu5i9Vn6vhUPHGAjR+Vl+5J8vPN/BMUrJw==} resolution: {integrity: sha512-S2udFs8tCKEKffuJ4TB1idGUZiXdCPGi3IPBGWXarbLQ5UPXORV8QEVzJ4gCRduURMb5EkpNCdjbk0eDIuI8Yg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
@@ -2936,8 +2941,8 @@ packages:
wrappy@1.0.2: wrappy@1.0.2:
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
wsl-utils@0.3.1: wsl-utils@1.0.0:
resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} resolution: {integrity: sha512-Hl0ZOAs672vg+06kfujwRhoS6/jehvULrlFkuF2dRu6pHgA8U06h3xqNIqNNU1LTXPcedxByAR4GS6pwQK0mgA==}
engines: {node: '>=20'} engines: {node: '>=20'}
xtend@4.0.2: xtend@4.0.2:
@@ -2982,12 +2987,10 @@ packages:
snapshots: snapshots:
'@alova/adapter-xhr@2.3.1(alova@3.5.3)': '@alova/adapter-xhr@2.3.3(alova@3.5.4)':
dependencies: dependencies:
'@alova/shared': 1.3.2 '@alova/shared': 1.3.4
alova: 3.5.3 alova: 3.5.4
'@alova/shared@1.3.2': {}
'@alova/shared@1.3.4': {} '@alova/shared@1.3.4': {}
@@ -3381,23 +3384,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.143.0': {} '@oxc-project/types@0.144.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.1(@types/node@26.2.0)(terser@5.49.2))': '@preact/preset-vite@2.10.6(@babel/core@7.29.7(supports-color@10.2.2))(preact@10.29.8)(supports-color@10.2.2)(vite@8.2.1(@types/node@26.2.0)(terser@5.50.0))':
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.1(@types/node@26.2.0)(terser@5.49.2)) '@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.50.0))
'@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.1(@types/node@26.2.0)(terser@5.49.2) vite: 8.2.1(@types/node@26.2.0)(terser@5.50.0)
vite-prerender-plugin: 0.5.13(vite@8.2.1(@types/node@26.2.0)(terser@5.49.2)) vite-prerender-plugin: 0.5.13(vite@8.2.1(@types/node@26.2.0)(terser@5.50.0))
zimmerframe: 1.1.4 zimmerframe: 1.1.4
transitivePeerDependencies: transitivePeerDependencies:
- preact - preact
@@ -3412,7 +3415,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.1(@types/node@26.2.0)(terser@5.49.2))': '@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.50.0))':
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 +3423,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.1(@types/node@26.2.0)(terser@5.49.2) vite: 8.2.1(@types/node@26.2.0)(terser@5.50.0)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@rolldown/binding-android-arm64@1.2.3': '@rolldown/binding-android-arm64@1.2.4':
optional: true optional: true
'@rolldown/binding-darwin-arm64@1.2.3': '@rolldown/binding-darwin-arm64@1.2.4':
optional: true optional: true
'@rolldown/binding-darwin-x64@1.2.3': '@rolldown/binding-darwin-x64@1.2.4':
optional: true optional: true
'@rolldown/binding-freebsd-x64@1.2.3': '@rolldown/binding-freebsd-x64@1.2.4':
optional: true optional: true
'@rolldown/binding-linux-arm-gnueabihf@1.2.3': '@rolldown/binding-linux-arm-gnueabihf@1.2.4':
optional: true optional: true
'@rolldown/binding-linux-arm64-gnu@1.2.3': '@rolldown/binding-linux-arm64-gnu@1.2.4':
optional: true optional: true
'@rolldown/binding-linux-arm64-musl@1.2.3': '@rolldown/binding-linux-arm64-musl@1.2.4':
optional: true optional: true
'@rolldown/binding-linux-ppc64-gnu@1.2.3': '@rolldown/binding-linux-ppc64-gnu@1.2.4':
optional: true optional: true
'@rolldown/binding-linux-s390x-gnu@1.2.3': '@rolldown/binding-linux-s390x-gnu@1.2.4':
optional: true optional: true
'@rolldown/binding-linux-x64-gnu@1.2.3': '@rolldown/binding-linux-x64-gnu@1.2.4':
optional: true optional: true
'@rolldown/binding-linux-x64-musl@1.2.3': '@rolldown/binding-linux-x64-musl@1.2.4':
optional: true optional: true
'@rolldown/binding-openharmony-arm64@1.2.3': '@rolldown/binding-openharmony-arm64@1.2.4':
optional: true optional: true
'@rolldown/binding-win32-arm64-msvc@1.2.3': '@rolldown/binding-win32-arm64-msvc@1.2.4':
optional: true optional: true
'@rolldown/binding-win32-x64-msvc@1.2.3': '@rolldown/binding-win32-x64-msvc@1.2.4':
optional: true optional: true
'@rolldown/pluginutils@1.0.1': {} '@rolldown/pluginutils@1.0.1': {}
@@ -3584,14 +3587,14 @@ snapshots:
dependencies: dependencies:
'@types/node': 26.2.0 '@types/node': 26.2.0
'@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/eslint-plugin@8.67.0(@typescript-eslint/parser@8.67.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.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) '@typescript-eslint/parser': 8.67.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.67.0
'@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/type-utils': 8.67.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.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) '@typescript-eslint/utils': 8.67.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.67.0
eslint: 10.8.1(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
@@ -3600,41 +3603,41 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@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/parser@8.67.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.67.0
'@typescript-eslint/types': 8.66.0 '@typescript-eslint/types': 8.67.0
'@typescript-eslint/typescript-estree': 8.66.0(supports-color@10.2.2)(typescript@6.0.3) '@typescript-eslint/typescript-estree': 8.67.0(supports-color@10.2.2)(typescript@6.0.3)
'@typescript-eslint/visitor-keys': 8.66.0 '@typescript-eslint/visitor-keys': 8.67.0
debug: 4.4.3(supports-color@10.2.2) debug: 4.4.3(supports-color@10.2.2)
eslint: 10.8.1(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
'@typescript-eslint/project-service@8.66.0(supports-color@10.2.2)(typescript@6.0.3)': '@typescript-eslint/project-service@8.67.0(supports-color@10.2.2)(typescript@6.0.3)':
dependencies: dependencies:
'@typescript-eslint/tsconfig-utils': 8.66.0(typescript@6.0.3) '@typescript-eslint/tsconfig-utils': 8.67.0(typescript@6.0.3)
'@typescript-eslint/types': 8.66.0 '@typescript-eslint/types': 8.67.0
debug: 4.4.3(supports-color@10.2.2) debug: 4.4.3(supports-color@10.2.2)
typescript: 6.0.3 typescript: 6.0.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/scope-manager@8.66.0': '@typescript-eslint/scope-manager@8.67.0':
dependencies: dependencies:
'@typescript-eslint/types': 8.66.0 '@typescript-eslint/types': 8.67.0
'@typescript-eslint/visitor-keys': 8.66.0 '@typescript-eslint/visitor-keys': 8.67.0
'@typescript-eslint/tsconfig-utils@8.66.0(typescript@6.0.3)': '@typescript-eslint/tsconfig-utils@8.67.0(typescript@6.0.3)':
dependencies: dependencies:
typescript: 6.0.3 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/type-utils@8.67.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.67.0
'@typescript-eslint/typescript-estree': 8.66.0(supports-color@10.2.2)(typescript@6.0.3) '@typescript-eslint/typescript-estree': 8.67.0(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/utils': 8.67.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.1(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)
@@ -3642,14 +3645,14 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/types@8.66.0': {} '@typescript-eslint/types@8.67.0': {}
'@typescript-eslint/typescript-estree@8.66.0(supports-color@10.2.2)(typescript@6.0.3)': '@typescript-eslint/typescript-estree@8.67.0(supports-color@10.2.2)(typescript@6.0.3)':
dependencies: dependencies:
'@typescript-eslint/project-service': 8.66.0(supports-color@10.2.2)(typescript@6.0.3) '@typescript-eslint/project-service': 8.67.0(supports-color@10.2.2)(typescript@6.0.3)
'@typescript-eslint/tsconfig-utils': 8.66.0(typescript@6.0.3) '@typescript-eslint/tsconfig-utils': 8.67.0(typescript@6.0.3)
'@typescript-eslint/types': 8.66.0 '@typescript-eslint/types': 8.67.0
'@typescript-eslint/visitor-keys': 8.66.0 '@typescript-eslint/visitor-keys': 8.67.0
debug: 4.4.3(supports-color@10.2.2) debug: 4.4.3(supports-color@10.2.2)
minimatch: 10.2.6 minimatch: 10.2.6
semver: 7.8.5 semver: 7.8.5
@@ -3659,20 +3662,20 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@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/utils@8.67.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.1(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.67.0
'@typescript-eslint/types': 8.66.0 '@typescript-eslint/types': 8.67.0
'@typescript-eslint/typescript-estree': 8.66.0(supports-color@10.2.2)(typescript@6.0.3) '@typescript-eslint/typescript-estree': 8.67.0(supports-color@10.2.2)(typescript@6.0.3)
eslint: 10.8.1(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
'@typescript-eslint/visitor-keys@8.66.0': '@typescript-eslint/visitor-keys@8.67.0':
dependencies: dependencies:
'@typescript-eslint/types': 8.66.0 '@typescript-eslint/types': 8.67.0
eslint-visitor-keys: 5.0.1 eslint-visitor-keys: 5.0.1
acorn-jsx@5.3.2(acorn@8.18.0): acorn-jsx@5.3.2(acorn@8.18.0):
@@ -3688,14 +3691,14 @@ snapshots:
json-schema-traverse: 0.4.1 json-schema-traverse: 0.4.1
uri-js: 4.4.1 uri-js: 4.4.1
alova@3.5.3: alova@3.5.4:
dependencies: dependencies:
'@alova/shared': 1.3.4 '@alova/shared': 1.3.4
rate-limiter-flexible: 5.0.5 rate-limiter-flexible: 5.0.5
ansi-regex@2.1.1: {} ansi-regex@2.1.1: {}
ansi-regex@6.2.2: {} ansi-regex@6.3.0: {}
ansi-styles@2.2.1: {} ansi-styles@2.2.1: {}
@@ -3910,7 +3913,7 @@ snapshots:
concat-map@0.0.1: {} concat-map@0.0.1: {}
concurrently@10.0.4: concurrently@10.0.5:
dependencies: dependencies:
chalk: 5.6.2 chalk: 5.6.2
rxjs: 7.8.2 rxjs: 7.8.2
@@ -4060,7 +4063,7 @@ snapshots:
default-browser-id@5.0.1: {} default-browser-id@5.0.1: {}
default-browser@5.5.0: default-browser@5.5.1:
dependencies: dependencies:
bundle-name: 4.1.0 bundle-name: 4.1.0
default-browser-id: 5.0.1 default-browser-id: 5.0.1
@@ -5133,14 +5136,14 @@ snapshots:
dependencies: dependencies:
mimic-fn: 2.1.0 mimic-fn: 2.1.0
open@11.0.0: open@11.0.1:
dependencies: dependencies:
default-browser: 5.5.0 default-browser: 5.5.1
define-lazy-prop: 3.0.0 define-lazy-prop: 3.0.0
is-in-ssh: 1.0.0 is-in-ssh: 1.0.0
is-inside-container: 1.0.0 is-inside-container: 1.0.0
powershell-utils: 0.1.0 powershell-utils: 0.2.0
wsl-utils: 0.3.1 wsl-utils: 1.0.0
optionator@0.9.4: optionator@0.9.4:
dependencies: dependencies:
@@ -5285,6 +5288,8 @@ snapshots:
powershell-utils@0.1.0: {} powershell-utils@0.1.0: {}
powershell-utils@0.2.0: {}
preact@10.29.8: {} preact@10.29.8: {}
prelude-ls@1.2.1: {} prelude-ls@1.2.1: {}
@@ -5418,34 +5423,34 @@ snapshots:
dependencies: dependencies:
glob: 7.2.3 glob: 7.2.3
rolldown@1.2.3: rolldown@1.2.4:
dependencies: dependencies:
'@oxc-project/types': 0.143.0 '@oxc-project/types': 0.144.0
'@rolldown/pluginutils': 1.0.1 '@rolldown/pluginutils': 1.0.1
optionalDependencies: optionalDependencies:
'@rolldown/binding-android-arm64': 1.2.3 '@rolldown/binding-android-arm64': 1.2.4
'@rolldown/binding-darwin-arm64': 1.2.3 '@rolldown/binding-darwin-arm64': 1.2.4
'@rolldown/binding-darwin-x64': 1.2.3 '@rolldown/binding-darwin-x64': 1.2.4
'@rolldown/binding-freebsd-x64': 1.2.3 '@rolldown/binding-freebsd-x64': 1.2.4
'@rolldown/binding-linux-arm-gnueabihf': 1.2.3 '@rolldown/binding-linux-arm-gnueabihf': 1.2.4
'@rolldown/binding-linux-arm64-gnu': 1.2.3 '@rolldown/binding-linux-arm64-gnu': 1.2.4
'@rolldown/binding-linux-arm64-musl': 1.2.3 '@rolldown/binding-linux-arm64-musl': 1.2.4
'@rolldown/binding-linux-ppc64-gnu': 1.2.3 '@rolldown/binding-linux-ppc64-gnu': 1.2.4
'@rolldown/binding-linux-s390x-gnu': 1.2.3 '@rolldown/binding-linux-s390x-gnu': 1.2.4
'@rolldown/binding-linux-x64-gnu': 1.2.3 '@rolldown/binding-linux-x64-gnu': 1.2.4
'@rolldown/binding-linux-x64-musl': 1.2.3 '@rolldown/binding-linux-x64-musl': 1.2.4
'@rolldown/binding-openharmony-arm64': 1.2.3 '@rolldown/binding-openharmony-arm64': 1.2.4
'@rolldown/binding-win32-arm64-msvc': 1.2.3 '@rolldown/binding-win32-arm64-msvc': 1.2.4
'@rolldown/binding-win32-x64-msvc': 1.2.3 '@rolldown/binding-win32-x64-msvc': 1.2.4
rollup-plugin-visualizer@7.0.1(rolldown@1.2.3): rollup-plugin-visualizer@7.1.1(rolldown@1.2.4):
dependencies: dependencies:
open: 11.0.0 open: 11.0.1
picomatch: 4.0.5 picomatch: 4.0.5
source-map: 0.7.6 source-map: 0.8.0
yargs: 18.1.0 yargs: 18.1.0
optionalDependencies: optionalDependencies:
rolldown: 1.2.3 rolldown: 1.2.4
run-applescript@7.1.0: {} run-applescript@7.1.0: {}
@@ -5537,6 +5542,8 @@ snapshots:
source-map@0.7.6: {} source-map@0.7.6: {}
source-map@0.8.0: {}
spdx-correct@3.2.0: spdx-correct@3.2.0:
dependencies: dependencies:
spdx-expression-parse: 3.0.1 spdx-expression-parse: 3.0.1
@@ -5584,7 +5591,7 @@ snapshots:
strip-ansi@7.2.0: strip-ansi@7.2.0:
dependencies: dependencies:
ansi-regex: 6.2.2 ansi-regex: 6.3.0
strip-bom@2.0.0: strip-bom@2.0.0:
dependencies: dependencies:
@@ -5647,7 +5654,7 @@ snapshots:
temp-dir: 1.0.0 temp-dir: 1.0.0
uuid: 3.4.0 uuid: 3.4.0
terser@5.49.2: terser@5.50.0:
dependencies: dependencies:
'@jridgewell/source-map': 0.3.11 '@jridgewell/source-map': 0.3.11
acorn: 8.18.0 acorn: 8.18.0
@@ -5707,12 +5714,12 @@ snapshots:
dependencies: dependencies:
typescript: 6.0.3 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): typescript-eslint@8.67.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.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/eslint-plugin': 8.67.0(@typescript-eslint/parser@8.67.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.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) '@typescript-eslint/parser': 8.67.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.67.0(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/utils': 8.67.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) eslint: 10.8.1(supports-color@10.2.2)
typescript: 6.0.3 typescript: 6.0.3
transitivePeerDependencies: transitivePeerDependencies:
@@ -5758,7 +5765,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.1(@types/node@26.2.0)(terser@5.49.2)): vite-plugin-imagemin@0.6.1(supports-color@10.2.2)(vite@8.2.1(@types/node@26.2.0)(terser@5.50.0)):
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 +5790,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.1(@types/node@26.2.0)(terser@5.49.2) vite: 8.2.1(@types/node@26.2.0)(terser@5.50.0)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
vite-prerender-plugin@0.5.13(vite@8.2.1(@types/node@26.2.0)(terser@5.49.2)): vite-prerender-plugin@0.5.13(vite@8.2.1(@types/node@26.2.0)(terser@5.50.0)):
dependencies: dependencies:
kolorist: 1.8.0 kolorist: 1.8.0
magic-string: 0.30.21 magic-string: 0.30.21
@@ -5795,19 +5802,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.1(@types/node@26.2.0)(terser@5.49.2) vite: 8.2.1(@types/node@26.2.0)(terser@5.50.0)
vite@8.2.1(@types/node@26.2.0)(terser@5.49.2): vite@8.2.1(@types/node@26.2.0)(terser@5.50.0):
dependencies: dependencies:
lightningcss: 1.33.0 lightningcss: 1.33.0
picomatch: 4.0.5 picomatch: 4.0.5
postcss: 8.5.26 postcss: 8.5.26
rolldown: 1.2.3 rolldown: 1.2.4
tinyglobby: 0.2.17 tinyglobby: 0.2.17
optionalDependencies: optionalDependencies:
'@types/node': 26.2.0 '@types/node': 26.2.0
fsevents: 2.3.3 fsevents: 2.3.3
terser: 5.49.2 terser: 5.50.0
which-typed-array@1.1.22: which-typed-array@1.1.22:
dependencies: dependencies:
@@ -5837,7 +5844,7 @@ snapshots:
wrappy@1.0.2: {} wrappy@1.0.2: {}
wsl-utils@0.3.1: wsl-utils@1.0.0:
dependencies: dependencies:
is-wsl: 3.1.1 is-wsl: 3.1.1
powershell-utils: 0.1.0 powershell-utils: 0.1.0
+3 -1
View File
@@ -64,9 +64,11 @@ class ESP_SSLClient : public Stream {
} }
void flush() override { void flush() override {
} }
void stop() { void stop() {
} }
void setTimeout(uint32_t) {
}
}; };
#endif // ESP_SSLClient_h #endif // ESP_SSLClient_h
+3 -1
View File
@@ -39,7 +39,9 @@ class WiFiClient {
} }
void stop() { void stop() {
} }
void setTimeout(uint32_t){
}
// ESP32 socket option passthrough (e.g. TCP_NODELAY) // ESP32 socket option passthrough (e.g. TCP_NODELAY)
int setSocketOption(int, int, const void *, size_t) { int setSocketOption(int, int, const void *, size_t) {
return 0; return 0;
+11 -2
View File
@@ -184,7 +184,12 @@ bool MqttSettingsService::configureMqtt() {
static_cast<espMqttClientSecure *>(_mqttClient)->setKeepAlive(_state.keepAlive); static_cast<espMqttClientSecure *>(_mqttClient)->setKeepAlive(_state.keepAlive);
static_cast<espMqttClientSecure *>(_mqttClient)->setCleanSession(_state.cleanSession); static_cast<espMqttClientSecure *>(_mqttClient)->setCleanSession(_state.cleanSession);
static_cast<espMqttClientSecure *>(_mqttClient)->setWill(will_topic, 1, true, "offline"); // QOS 1, retain static_cast<espMqttClientSecure *>(_mqttClient)->setWill(will_topic, 1, true, "offline"); // QOS 1, retain
return _mqttClient->connect(); // return _mqttClient->connect();
if (_mqttClient->connect()) {
emsesp::EMSESP::logger().info("Starting MQTT service");
return true;
}
return false;
} }
static_cast<espMqttClient *>(_mqttClient)->setServer(_state.host.c_str(), _state.port); static_cast<espMqttClient *>(_mqttClient)->setServer(_state.host.c_str(), _state.port);
if (_state.username.length() > 0) { if (_state.username.length() > 0) {
@@ -194,7 +199,11 @@ bool MqttSettingsService::configureMqtt() {
static_cast<espMqttClient *>(_mqttClient)->setKeepAlive(_state.keepAlive); static_cast<espMqttClient *>(_mqttClient)->setKeepAlive(_state.keepAlive);
static_cast<espMqttClient *>(_mqttClient)->setCleanSession(_state.cleanSession); static_cast<espMqttClient *>(_mqttClient)->setCleanSession(_state.cleanSession);
static_cast<espMqttClient *>(_mqttClient)->setWill(will_topic, 1, true, "offline"); // QOS 1, retain static_cast<espMqttClient *>(_mqttClient)->setWill(will_topic, 1, true, "offline"); // QOS 1, retain
return _mqttClient->connect(); // return _mqttClient->connect();
if (_mqttClient->connect()) {
emsesp::EMSESP::logger().info("Starting MQTT service");
return true;
}
} }
return false; return false;
+7 -1
View File
@@ -111,6 +111,12 @@ void AnalogSensor::start(const bool factory_settings) {
Mqtt::subscribe(EMSdevice::DeviceType::ANALOGSENSOR, topic, nullptr); // use empty function callback Mqtt::subscribe(EMSdevice::DeviceType::ANALOGSENSOR, topic, nullptr); // use empty function callback
} }
void AnalogSensor::ha_reset() {
for (const auto & sensor : sensors_) {
remove_ha_topic(sensor.type(), sensor.gpio());
}
}
// load settings from the customization file, sorts them and initializes the GPIOs // load settings from the customization file, sorts them and initializes the GPIOs
void AnalogSensor::reload(bool get_nvs) { void AnalogSensor::reload(bool get_nvs) {
exclude_types_.clear(); exclude_types_.clear();
@@ -729,7 +735,7 @@ void AnalogSensor::publish_values(const bool force) {
} }
// 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 (Mqtt::discovery_type() == Mqtt::discoveryType::HOMEASSISTANT) { if (Mqtt::discovery_type() == Mqtt::discoveryType::HOMEASSISTANT) {
config["val_tpl"] = (std::string) "{{" + val_obj + " if " + val_cond + "}}"; config["val_tpl"] = (std::string) "{{" + val_obj + " if " + val_cond + " else 'None'}}";
} else { } else {
config["val_tpl"] = (std::string) "{{" + val_obj + "}}"; config["val_tpl"] = (std::string) "{{" + val_obj + "}}";
} }
+1
View File
@@ -144,6 +144,7 @@ class AnalogSensor {
void publish_values(const bool force); void publish_values(const bool force);
void reload(bool get_nvs = false); void reload(bool get_nvs = false);
bool updated_values(); bool updated_values();
void ha_reset();
// return back reference to the sensor list, used by other classes // return back reference to the sensor list, used by other classes
const std::vector<Sensor, AllocatorPSRAM<Sensor>> & sensors() const { const std::vector<Sensor, AllocatorPSRAM<Sensor>> & sensors() const {
+2 -2
View File
@@ -657,8 +657,8 @@ void EMSESP::reset_mqtt_ha() {
} }
// force the re-creating of the temperature and analog sensor topics (for HA) // force the re-creating of the temperature and analog sensor topics (for HA)
temperaturesensor_.reload(); temperaturesensor_.ha_reset();
analogsensor_.reload(); analogsensor_.ha_reset();
// rebuild MQTT HA config topics for shower, custom entities and scheduler // rebuild MQTT HA config topics for shower, custom entities and scheduler
shower_.ha_reset(); shower_.ha_reset();
+23 -22
View File
@@ -179,28 +179,29 @@ const std::initializer_list<Modbus::EntityModbusInfo> Modbus::modbus_register_ma
REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(fanWork), 257, 1), // fanwork REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(fanWork), 257, 1), // fanwork
REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(ignWork), 258, 1), // ignwork REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(ignWork), 258, 1), // ignwork
REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(oilPreHeat), 259, 1), // oilpreheat REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(oilPreHeat), 259, 1), // oilpreheat
REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(burnMaxPower), 260, 1), // burnmaxpower REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(burnMinPower), 260, 1), // burnminpower
REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(burnMinPeriod), 261, 1), // burnminperiod REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(burnMaxPower), 261, 1), // burnmaxpower
REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(absBurnPow), 262, 1), // absburnpow REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(burnMinPeriod), 262, 1), // burnminperiod
REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(heatblock), 263, 1), // heatblock REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(absBurnPow), 263, 1), // absburnpow
REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(boilHystOn), 264, 1), // boilhyston REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(heatblock), 264, 1), // heatblock
REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(boilHystOff), 265, 1), // boilhystoff REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(boilHystOn), 265, 1), // boilhyston
REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(boil2HystOn), 266, 1), // boil2hyston REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(boilHystOff), 266, 1), // boilhystoff
REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(boil2HystOff), 267, 1), // boil2hystoff REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(boil2HystOn), 267, 1), // boil2hyston
REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(curveOn), 268, 1), // curveon REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(boil2HystOff), 268, 1), // boil2hystoff
REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(curveBase), 269, 1), // curvebase REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(curveOn), 269, 1), // curveon
REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(curveEnd), 270, 1), // curveend REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(curveBase), 270, 1), // curvebase
REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(summertemp), 271, 1), // summertemp REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(curveEnd), 271, 1), // curveend
REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(nofrostmode), 272, 1), // nofrostmode REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(summertemp), 272, 1), // summertemp
REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(nofrosttemp), 273, 1), // nofrosttemp REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(nofrostmode), 273, 1), // nofrostmode
REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(gasMeterHeat), 274, 2), // gasmeterheat REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(nofrosttemp), 274, 1), // nofrosttemp
REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(nrgHeat2), 276, 2), // nrgheat2 REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(gasMeterHeat), 275, 2), // gasmeterheat
REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(nomPower), 278, 1), // nompower REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(nrgHeat2), 277, 2), // nrgheat2
REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(netFlowTemp), 279, 1), // netflowtemp REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(nomPower), 279, 1), // nompower
REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(heatValve), 280, 1), // heatvalve REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(netFlowTemp), 280, 1), // netflowtemp
REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(keepWarmTemp), 281, 1), // keepwarmtemp REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(heatValve), 281, 1), // heatvalve
REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(setReturnTemp), 282, 1), // setreturntemp REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(keepWarmTemp), 282, 1), // keepwarmtemp
REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(heatingOn), 283, 1), // heating REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(setReturnTemp), 283, 1), // setreturntemp
REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DEVICE_DATA, FL_(heatingOn), 284, 1), // heating
REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DHW, FL_(nrgWw), 0, 2), // nrg REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DHW, FL_(nrgWw), 0, 2), // nrg
REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DHW, FL_(meterWw), 2, 2), // meter REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DHW, FL_(meterWw), 2, 2), // meter
REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DHW, FL_(upTimeCompWw), 4, 2), // uptimecomp REGISTER_MAPPING(dt::BOILER, TAG_TYPE_DHW, FL_(upTimeCompWw), 4, 2), // uptimecomp
+7 -17
View File
@@ -351,6 +351,7 @@ void Mqtt::reset_mqtt() {
if (mqttClient_->connected()) { if (mqttClient_->connected()) {
mqttClient_->disconnect(true); // force a disconnect mqttClient_->disconnect(true); // force a disconnect
} }
load_settings(); // reload MQTT settings
} }
// load the settings from service // load the settings from service
@@ -473,7 +474,7 @@ bool Mqtt::get_publish_onchange(uint8_t device_type) {
} }
void Mqtt::on_disconnect(espMqttClientTypes::DisconnectReason reason) { void Mqtt::on_disconnect(espMqttClientTypes::DisconnectReason reason) {
// only show the error once on the first connect failure // only show the error once on the first connect failure
if (connectcount_) { if (!connecting_) {
return; return;
} }
connecting_ = false; connecting_ = false;
@@ -511,8 +512,6 @@ void Mqtt::on_connect() {
connecting_ = true; connecting_ = true;
queuecount_ = mqttClient_->queueSize(); queuecount_ = mqttClient_->queueSize();
load_settings(); // reload MQTT settings - in case they have changes
if (ha_enabled_) { if (ha_enabled_) {
queue_unsubscribe_message(discovery_prefix_ + "/+/" + Mqtt::basename() + "/#"); queue_unsubscribe_message(discovery_prefix_ + "/+/" + Mqtt::basename() + "/#");
EMSESP::reset_mqtt_ha(); // re-create all HA devices if there are any EMSESP::reset_mqtt_ha(); // re-create all HA devices if there are any
@@ -1019,8 +1018,6 @@ bool Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdev
std::string topic_str(topic); std::string topic_str(topic);
doc["def_ent_id"] = Helpers::toLower(topic_str.substr(0, topic_str.find("/"))) + "." + Helpers::toLower(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
// we add the command topic parameter for commands // we add the command topic parameter for commands
if (has_cmd) { if (has_cmd) {
// add category // add category
@@ -1043,13 +1040,11 @@ bool Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdev
for (uint8_t i = 0; i < options_size; i++) { for (uint8_t i = 0; i < options_size; i++) {
option_list.add(Helpers::itoa(i)); // as a string option_list.add(Helpers::itoa(i)); // as a string
} }
snprintf(sample_val, sizeof(sample_val), "'0'");
} else { } else {
// use strings // use strings
for (uint8_t i = 0; i < options_size; i++) { for (uint8_t i = 0; i < options_size; i++) {
option_list.add(Helpers::translated_word(options[i])); option_list.add(Helpers::translated_word(options[i]));
} }
snprintf(sample_val, sizeof(sample_val), "'%s'", Helpers::translated_word(options[0]));
} }
} else if (type != DeviceValueType::STRING && type != DeviceValueType::BOOL) { } else if (type != DeviceValueType::STRING && type != DeviceValueType::BOOL) {
// For numeric's add the range and mode // For numeric's add the range and mode
@@ -1071,7 +1066,6 @@ bool Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdev
if (dv_set_min != 0 || dv_set_max != 0) { if (dv_set_min != 0 || dv_set_max != 0) {
doc["min"] = dv_set_min; doc["min"] = dv_set_min;
doc["max"] = dv_set_max; doc["max"] = dv_set_max;
snprintf(sample_val, sizeof(sample_val), "%i", dv_set_min);
} }
} }
@@ -1123,7 +1117,6 @@ bool Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdev
// has no unit of measure or icon, and must be true/false (not on/off or 1/0) // has no unit of measure or icon, and must be true/false (not on/off or 1/0)
if (type == DeviceValueType::BOOL) { if (type == DeviceValueType::BOOL) {
add_ha_bool(doc.as<JsonObject>()); add_ha_bool(doc.as<JsonObject>());
strlcpy(sample_val, "false", sizeof(sample_val)); // default is "false"
} }
// 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
@@ -1134,12 +1127,9 @@ bool Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdev
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 // 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 'None'}}";
} }
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
} else { } else {
@@ -1436,7 +1426,7 @@ bool Mqtt::publish_ha_climate_config(const DeviceValue & dv, const bool has_room
snprintf(mode_str_tpl, snprintf(mode_str_tpl,
sizeof(mode_str_tpl), sizeof(mode_str_tpl),
"{%%if %s%%}off{%%elif %s=='%s'%%}heat{%%elif %s=='%s'%%}heat{%%elif %s=='%s'%%}heat{%%elif %s=='%s'%%}off{%%elif %s=='%s'%%}off{%%elif " "{%%if %s%%}None{%%elif %s=='%s'%%}heat{%%elif %s=='%s'%%}heat{%%elif %s=='%s'%%}heat{%%elif %s=='%s'%%}off{%%elif %s=='%s'%%}off{%%elif "
"%s=='%s'%%}off{%%else%%}auto{%%endif%%}", "%s=='%s'%%}off{%%else%%}auto{%%endif%%}",
hc_mode_cond, hc_mode_cond,
hc_mode_s, hc_mode_s,
@@ -1473,15 +1463,15 @@ bool Mqtt::publish_ha_climate_config(const DeviceValue & dv, const bool has_room
doc["mode_stat_tpl"] = mode_str_tpl; doc["mode_stat_tpl"] = mode_str_tpl;
doc["temp_cmd_t"] = temp_cmd_s; doc["temp_cmd_t"] = temp_cmd_s;
doc["temp_stat_t"] = topic_t; doc["temp_stat_t"] = topic_t;
doc["temp_stat_tpl"] = (std::string) "{{" + seltemp_s + " if " + seltemp_cond + " else 0}}"; doc["temp_stat_tpl"] = (std::string) "{{" + seltemp_s + " if " + seltemp_cond + " else 'None'}}";
if (has_roomtemp) { if (has_roomtemp) {
doc["curr_temp_t"] = topic_t; doc["curr_temp_t"] = topic_t;
doc["curr_temp_tpl"] = (std::string) "{{" + currtemp_s + " if " + currtemp_cond + " else 0}}"; doc["curr_temp_tpl"] = (std::string) "{{" + currtemp_s + " if " + currtemp_cond + " else 'None'}}";
} }
if (tag >= DeviceValueTAG::TAG_SRC1) { if (tag >= DeviceValueTAG::TAG_SRC1) {
doc["curr_hum_t"] = topic_t; doc["curr_hum_t"] = topic_t;
doc["curr_hum_tpl"] = (std::string) "{{" + currhum_s + " if " + currhum_cond + " else 0}}"; doc["curr_hum_tpl"] = (std::string) "{{" + currhum_s + " if " + currhum_cond + " else 'None'}}";
} }
doc["min_temp"] = Helpers::render_value(min_s, min, 0, EMSESP::system_.fahrenheit() ? 2 : 0); doc["min_temp"] = Helpers::render_value(min_s, min, 0, EMSESP::system_.fahrenheit() ? 2 : 0);
+4 -5
View File
@@ -268,6 +268,10 @@ void Network::loop() {
reconnect_pending_ = false; reconnect_pending_ = false;
reconnect(); reconnect();
} }
// already have a connection: verify it's still alive
if (network_ip_ != 0 || last_disconnect_reason_ != 0) {
checkConnection();
}
// 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();
@@ -281,11 +285,6 @@ void Network::loop() {
startWIFI(); // WiFi startWIFI(); // WiFi
startAP(); // Captive Portal (AP) startAP(); // Captive Portal (AP)
// already have a connection: verify it's still alive
if (network_ip_ != 0 || last_disconnect_reason_ != 0) {
checkConnection();
}
findNetworks(); // detect any new network connections findNetworks(); // detect any new network connections
} }
+1 -1
View File
@@ -229,7 +229,7 @@ void Shower::create_ha_discovery() {
// 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 (Mqtt::discovery_type() == Mqtt::discoveryType::HOMEASSISTANT) { if (Mqtt::discovery_type() == Mqtt::discoveryType::HOMEASSISTANT) {
doc["val_tpl"] = "{{value_json.duration if value_json.duration is defined else 0}}"; doc["val_tpl"] = "{{value_json.duration if value_json.duration is defined else 'None'}}";
} else { } else {
doc["val_tpl"] = "{{value_json.duration}}"; doc["val_tpl"] = "{{value_json.duration}}";
} }
+3 -1
View File
@@ -712,9 +712,11 @@ int http_request(std::string url, const std::string & method, const std::string
// assets / large CDN responses. Such servers do not negotiate max_fragment_length, so the body // assets / large CDN responses. Such servers do not negotiate max_fragment_length, so the body
// can't be decoded and reads return 0. If this path is ever used to fetch large or CDN-hosted // can't be decoded and reads return 0. If this path is ever used to fetch large or CDN-hosted
// payloads, bump the RX buffer to 16384 (see uploadFirmwareURL in core/system.cpp for reference). // payloads, bump the RX buffer to 16384 (see uploadFirmwareURL in core/system.cpp for reference).
ssl_client->setBufferSizes(1024, 1024); ssl_client->setBufferSizes(16384, 1024);
ssl_client->setSessionTimeout(120); // Set the timeout in seconds (>=120 seconds) ssl_client->setSessionTimeout(120); // Set the timeout in seconds (>=120 seconds)
} }
basic_client->setTimeout(5000); // socket-level read timeout
ssl_client->setTimeout(5); // Stream::readBytes timeout used by Update
ssl_client->setClient(basic_client, is_https); // enableSSL = false for plain HTTP ssl_client->setClient(basic_client, is_https); // enableSSL = false for plain HTTP
url.replace(0, is_https ? 8 : 7, ""); url.replace(0, is_https ? 8 : 7, "");
+8 -6
View File
@@ -146,8 +146,8 @@ bool System::command_sendmail(const char * value, const int8_t) {
LOG_DEBUG("Command sendmail port %d%s called with '%s'", LOG_DEBUG("Command sendmail port %d%s called with '%s'",
port, port,
security == EMAIL_SECURITY::SSL ? " (SSL)" security == EMAIL_SECURITY::SSL ? " (SSL)"
: security == EMAIL_SECURITY::STARTTLS ? "" : security == EMAIL_SECURITY::STARTTLS ? " (STARTTLS)"
: " (STARTTLS)", : "",
value); value);
bool success = false; bool success = false;
@@ -160,7 +160,9 @@ bool System::command_sendmail(const char * value, const int8_t) {
ssl_client->setClient(basic_client); ssl_client->setClient(basic_client);
ssl_client->setInsecure(); ssl_client->setInsecure();
ssl_client->setBufferSizes(1024, 1024); ssl_client->setBufferSizes(16384, 1024);
basic_client->setTimeout(5000); // socket-level read timeout
ssl_client->setTimeout(5); // Stream::readBytes timeout used by Update
r_client->addPort(port, r_client->addPort(port,
security == EMAIL_SECURITY::NONE ? readymail_protocol_plain_text security == EMAIL_SECURITY::NONE ? readymail_protocol_plain_text
: security == EMAIL_SECURITY::SSL ? readymail_protocol_ssl : security == EMAIL_SECURITY::SSL ? readymail_protocol_ssl
@@ -840,7 +842,7 @@ bool System::loop() {
void System::send_info_mqtt() { void System::send_info_mqtt() {
static uint8_t _connection = 0; static uint8_t _connection = 0;
uint8_t connection = (EMSESP::network_.ethernet_connected() ? 1 : 0) + (EMSESP::network_.wifi_connected() ? 2 : 0) + (ntp_connected_ ? 4 : 0) uint8_t connection = (EMSESP::network_.ethernet_connected() ? 1 : 0) + (EMSESP::network_.wifi_connected() ? 2 : 0) + (ntp_connected_ ? 4 : 0)
+ (EMSESP::network_.has_ipv6() ? 8 : 0); + (EMSESP::network_.has_ipv6() ? 8 : 0);
// check if connection status has changed // check if connection status has changed
if (!Mqtt::connected() || connection == _connection) { if (!Mqtt::connected() || connection == _connection) {
return; return;
@@ -853,7 +855,7 @@ void System::send_info_mqtt() {
// if NTP is enabled send the boot_time in local time in ISO 8601 format (eg: 2022-11-15 20:46:38) // if NTP is enabled send the boot_time in local time in ISO 8601 format (eg: 2022-11-15 20:46:38)
// https://github.com/emsesp/EMS-ESP32/issues/751 // https://github.com/emsesp/EMS-ESP32/issues/751
if (ntp_connected_) { if (time(nullptr) > 1500000000L) {
char time_string[25]; char time_string[25];
time_t now = time(nullptr) - uuid::get_uptime_sec(); time_t now = time(nullptr) - uuid::get_uptime_sec();
strftime(time_string, 25, "%FT%T%z", localtime(&now)); strftime(time_string, 25, "%FT%T%z", localtime(&now));
@@ -3108,7 +3110,7 @@ bool System::uploadFirmwareURL(const char * url) {
ssl_client.setSessionTimeout(120); ssl_client.setSessionTimeout(120);
} }
basic_client.setTimeout(15000); // socket-level read timeout basic_client.setTimeout(15000); // socket-level read timeout
ssl_client.setTimeout(15000); // Stream::readBytes timeout used by Update ssl_client.setTimeout(15); // Stream::readBytes timeout used by Update
ssl_client.setClient(&basic_client, is_https); // enableSSL = false for plain HTTP ssl_client.setClient(&basic_client, is_https); // enableSSL = false for plain HTTP
const uint16_t port = is_https ? 443 : 80; const uint16_t port = is_https ? 443 : 80;
+9 -6
View File
@@ -45,17 +45,20 @@ void TemperatureSensor::start(const bool factory_settings) {
Mqtt::subscribe(EMSdevice::DeviceType::TEMPERATURESENSOR, topic, nullptr); // use empty function callback Mqtt::subscribe(EMSdevice::DeviceType::TEMPERATURESENSOR, topic, nullptr); // use empty function callback
} }
void TemperatureSensor::ha_reset() {
for (auto & sensor : sensors_) {
remove_ha_topic(sensor.id());
sensor.ha_registered = false; // force HA configs to be re-created
}
}
// load settings // load settings
void TemperatureSensor::reload() { void TemperatureSensor::reload() {
EMSESP::webSettingsService.read([&](WebSettings const & settings) { EMSESP::webSettingsService.read([&](WebSettings const & settings) {
dallas_gpio_ = settings.dallas_gpio; dallas_gpio_ = settings.dallas_gpio;
parasite_ = settings.dallas_parasite; parasite_ = settings.dallas_parasite;
}); });
ha_reset();
for (auto & sensor : sensors_) {
remove_ha_topic(sensor.id());
sensor.ha_registered = false; // force HA configs to be re-created
}
} }
void TemperatureSensor::loop() { void TemperatureSensor::loop() {
@@ -543,7 +546,7 @@ void TemperatureSensor::publish_values(const bool force) {
// for the value template, there's a problem still with Domoticz probably due to the special characters. // for the value template, there's a problem still with Domoticz probably due to the special characters.
// See https://github.com/emsesp/EMS-ESP32/issues/1360 // See https://github.com/emsesp/EMS-ESP32/issues/1360
if (Mqtt::discovery_type() == Mqtt::discoveryType::HOMEASSISTANT) { if (Mqtt::discovery_type() == Mqtt::discoveryType::HOMEASSISTANT) {
config["val_tpl"] = (std::string) "{{" + val_obj + " if " + val_cond + " else -55}}"; config["val_tpl"] = (std::string) "{{" + val_obj + " if " + val_cond + " else 'None'}}";
} else { } else {
config["val_tpl"] = (std::string) "{{" + val_obj + "}}"; // omit value conditional Jinja2 template code config["val_tpl"] = (std::string) "{{" + val_obj + "}}"; // omit value conditional Jinja2 template code
} }
+1
View File
@@ -93,6 +93,7 @@ class TemperatureSensor {
void publish_sensor(const Sensor & sensor); void publish_sensor(const Sensor & sensor);
void publish_values(const bool force); void publish_values(const bool force);
void reload(); void reload();
void ha_reset();
bool updated_values(); bool updated_values();
bool get_value_info(JsonObject output, const char * cmd, const int8_t id = -1); bool get_value_info(JsonObject output, const char * cmd, const int8_t id = -1);
+8 -8
View File
@@ -220,13 +220,13 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const
register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &fanWork_, DeviceValueType::BOOL, FL_(fanWork), DeviceValueUOM::NONE); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &fanWork_, DeviceValueType::BOOL, FL_(fanWork), DeviceValueUOM::NONE);
register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &ignWork_, DeviceValueType::BOOL, FL_(ignWork), DeviceValueUOM::NONE); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &ignWork_, DeviceValueType::BOOL, FL_(ignWork), DeviceValueUOM::NONE);
register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &oilPreHeat_, DeviceValueType::BOOL, FL_(oilPreHeat), DeviceValueUOM::NONE); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &oilPreHeat_, DeviceValueType::BOOL, FL_(oilPreHeat), DeviceValueUOM::NONE);
// remove burnMinPower, #2918 // remove burnMinPower, #2918, add back for 0xE6, #3193
// register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, register_device_value(DeviceValueTAG::TAG_DEVICE_DATA,
// &burnMinPower_, &burnMinPower_,
// DeviceValueType::UINT8, DeviceValueType::UINT8,
// FL_(burnMinPower), FL_(burnMinPower),
// DeviceValueUOM::PERCENT, DeviceValueUOM::PERCENT,
// MAKE_CF_CB(set_min_power)); MAKE_CF_CB(set_min_power));
register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, register_device_value(DeviceValueTAG::TAG_DEVICE_DATA,
&burnMaxPower_, &burnMaxPower_,
DeviceValueType::UINT8, DeviceValueType::UINT8,
@@ -1622,7 +1622,7 @@ void Boiler::process_UBAParametersPlus(const std::shared_ptr<const Telegram> & t
has_update(telegram, heatingActivated_, 0); has_update(telegram, heatingActivated_, 0);
has_update(telegram, heatingTemp_, 1); has_update(telegram, heatingTemp_, 1);
has_update(telegram, burnMaxPower_, 4); has_update(telegram, burnMaxPower_, 4);
// has_update(telegram, burnMinPower_, 5); // removed #2918 has_update(telegram, burnMinPower_, 5); // removed #2918
has_update(telegram, boilHystOff_, 8); has_update(telegram, boilHystOff_, 8);
has_update(telegram, boilHystOn_, 9); has_update(telegram, boilHystOn_, 9);
has_update(telegram, burnMinPeriod_, 10); has_update(telegram, burnMinPeriod_, 10);
+16 -2
View File
@@ -2401,7 +2401,7 @@ bool Thermostat::set_control(const char * value, const int8_t id) {
} }
// BC400 // BC400
// 1-RC100, 2-RC100H, 3-RC200 // 1-RC100, 2-RC100H, 3-RC200
} else if (model() == EMSdevice::EMS_DEVICE_FLAG_BC400 || model() == EMSdevice::EMS_DEVICE_FLAG_UI800) { } else if (model() == EMSdevice::EMS_DEVICE_FLAG_BC400) {
if (Helpers::value2enum(value, ctrl, FL_(enum_control2))) { if (Helpers::value2enum(value, ctrl, FL_(enum_control2))) {
write_command(hpmode_typeids[hc->hc()], 3, ctrl); write_command(hpmode_typeids[hc->hc()], 3, ctrl);
hc->control = ctrl; // set in advance, dont wait for verify hc->control = ctrl; // set in advance, dont wait for verify
@@ -2421,6 +2421,20 @@ bool Thermostat::set_control(const char * value, const int8_t id) {
} }
return true; return true;
} }
} else if (model() == EMSdevice::EMS_DEVICE_FLAG_UI800) {
if (Helpers::value2enum(value, ctrl, FL_(enum_control3))) {
write_command(hpmode_typeids[hc->hc()], 3, ctrl);
hc->control = ctrl; // set in advance, dont wait for verify
if (hc->remotetemp != EMS_VALUE_INT16_NOTSET && ctrl > 0) {
if (ctrl == 6) {
Roomctrl::set_remotetemp(Roomctrl::RT800, hc->hc(), hc->remotetemp);
} else {
hc->remotetemp = EMS_VALUE_INT16_NOTSET;
Roomctrl::set_remotetemp(0, hc->hc(), hc->remotetemp);
}
}
return true;
}
// RC100 or RC300 // RC100 or RC300
// 1-RC200, 2-RC100, 3-RC100H // 1-RC200, 2-RC100, 3-RC100H
} else if (isRC300() || model() == EMSdevice::EMS_DEVICE_FLAG_RC100) { } else if (isRC300() || model() == EMSdevice::EMS_DEVICE_FLAG_RC100) {
@@ -4701,7 +4715,7 @@ void Thermostat::register_device_values() {
1, 1,
10); 10);
register_device_value( register_device_value(
DeviceValueTAG::TAG_DEVICE_DATA, &coolstart, DeviceValueType::UINT8, FL_(coolstart), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_coolstart), 20, 35); DeviceValueTAG::TAG_DEVICE_DATA, &coolstart, DeviceValueType::UINT8, FL_(coolstart), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_coolstart), 24, 35);
register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, register_device_value(DeviceValueTAG::TAG_DEVICE_DATA,
&heatondelay, &heatondelay,
DeviceValueType::UINT8, DeviceValueType::UINT8,
+1 -1
View File
@@ -1 +1 @@
#define EMSESP_APP_VERSION "3.9.0-dev.3" #define EMSESP_APP_VERSION "3.9.0-dev.4"
+1 -1
View File
@@ -501,7 +501,7 @@ void WebCustomEntityService::publish(const bool force) {
snprintf(val_cond, sizeof(val_cond), "%s is defined", val_obj); snprintf(val_cond, sizeof(val_cond), "%s is defined", val_obj);
// 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 (Mqtt::discovery_type() == Mqtt::discoveryType::HOMEASSISTANT) { if (Mqtt::discovery_type() == Mqtt::discoveryType::HOMEASSISTANT) {
config["val_tpl"] = (std::string) "{{" + val_obj + " if " + val_cond + "}}"; config["val_tpl"] = (std::string) "{{" + val_obj + " if " + val_cond + " else 'None'}}";
} else { } else {
config["val_tpl"] = (std::string) "{{" + val_obj + "}}"; config["val_tpl"] = (std::string) "{{" + val_obj + "}}";
} }
+1 -1
View File
@@ -275,7 +275,7 @@ void WebSchedulerService::publish(const bool force) {
char val_tpl[150]; char val_tpl[150];
if (Mqtt::discovery_type() == Mqtt::discoveryType::HOMEASSISTANT) { if (Mqtt::discovery_type() == Mqtt::discoveryType::HOMEASSISTANT) {
snprintf(val_tpl, sizeof(val_tpl), "{{%s if %s}}", val_obj, val_cond); snprintf(val_tpl, sizeof(val_tpl), "{{%s if %s else 'None'}}", val_obj, val_cond);
} else { } else {
snprintf(val_tpl, sizeof(val_tpl), "{{%s}}", val_obj); // omit value conditional Jinja2 template code snprintf(val_tpl, sizeof(val_tpl), "{{%s}}", val_obj); // omit value conditional Jinja2 template code
} }
+6 -82
View File
@@ -23,6 +23,7 @@
#include <WiFiClient.h> #include <WiFiClient.h>
#include <ESP_SSLClient.h> #include <ESP_SSLClient.h>
#endif #endif
#include "shuntingYard.h"
namespace emsesp { namespace emsesp {
@@ -421,91 +422,14 @@ bool WebStatusService::refresh_versions_cache() {
#ifdef EMSESP_STANDALONE #ifdef EMSESP_STANDALONE
return false; return false;
#else #else
// detect scheme from VERSIONS_URL (case-insensitive). One code path for HTTP and HTTPS, std::string result;
// using ESP_SSLClient as a plain TCP passthrough when SSL is disabled. JsonDocument doc;
String url = VERSIONS_URL; auto http_code = http_request(VERSIONS_URL, "GET", "", doc.as<JsonObjectConst>(), result);
String lower = url;
lower.toLowerCase();
const bool is_https = lower.startsWith("https://");
if (!is_https && !lower.startsWith("http://")) {
#if defined(EMSESP_DEBUG)
EMSESP::logger().debug("versions.json: unsupported scheme");
#endif
return false;
}
const int scheme_len = is_https ? 8 : 7;
WiFiClient basic_client;
ESP_SSLClient ssl_client;
if (is_https) {
ssl_client.setInsecure();
ssl_client.setBufferSizes(16384, 1024); // versions.json fits easily but TLS records may be full-size
ssl_client.setSessionTimeout(120);
}
basic_client.setTimeout(5000);
ssl_client.setTimeout(5000);
ssl_client.setClient(&basic_client, is_https);
// split into host and path
String rest = url.substring(scheme_len);
String host;
String path;
int s = rest.indexOf('/');
if (s < 0) {
host = rest;
path = "/";
} else {
host = rest.substring(0, s);
path = rest.substring(s);
}
if (!ssl_client.connect(host.c_str(), is_https ? 443 : 80)) {
#if defined(EMSESP_DEBUG)
EMSESP::logger().debug("versions.json: connection failed");
#endif
return false;
}
// minimal HTTP/1.0 GET so we don't have to handle chunked encoding
ssl_client.print("GET ");
ssl_client.print(path);
ssl_client.println(" HTTP/1.0");
ssl_client.print("Host: ");
ssl_client.println(host);
ssl_client.println("User-Agent: EMS-ESP");
ssl_client.println("Connection: close");
ssl_client.print("\r\n");
// wait for the first byte. The 5 seconds is GitHub's SLO
uint32_t ms = millis();
while (ssl_client.connected() && !ssl_client.available() && millis() - ms < 5000) {
delay(1);
}
// parse status line
String status_line = ssl_client.readStringUntil('\n');
int sp = status_line.indexOf(' ');
int http_code = (sp >= 0) ? status_line.substring(sp + 1, sp + 4).toInt() : 0;
if (http_code != 200) { if (http_code != 200) {
ssl_client.stop(); EMSESP::logger().warning("versions.json: HTTP error code %d", http_code);
#if defined(EMSESP_DEBUG)
EMSESP::logger().debug("versions.json: HTTP error code %d", http_code);
#endif
return false; return false;
} }
DeserializationError err = deserializeJson(doc, result);
// skip headers
while (ssl_client.connected() || ssl_client.available()) {
String line = ssl_client.readStringUntil('\n');
line.trim();
if (line.isEmpty()) {
break;
}
}
JsonDocument doc(PSRAM_DOC);
DeserializationError err = deserializeJson(doc, ssl_client);
ssl_client.stop();
if (err) { if (err) {
#if defined(EMSESP_DEBUG) #if defined(EMSESP_DEBUG)
EMSESP::logger().debug("versions.json: parse error"); EMSESP::logger().debug("versions.json: parse error");