Merge branch 'dev' into dev

This commit is contained in:
Jakob
2025-12-13 14:34:05 +01:00
committed by GitHub
18 changed files with 294 additions and 207 deletions

View File

@@ -14,7 +14,7 @@ For more details go to [docs.emsesp.org](https://docs.emsesp.org/).
- CS6800i changes [#2448](https://github.com/emsesp/EMS-ESP32/issues/2448), [#2449](https://github.com/emsesp/EMS-ESP32/issues/2449) - CS6800i changes [#2448](https://github.com/emsesp/EMS-ESP32/issues/2448), [#2449](https://github.com/emsesp/EMS-ESP32/issues/2449)
- charging pump [#2544](https://github.com/emsesp/EMS-ESP32/issues/2544) - charging pump [#2544](https://github.com/emsesp/EMS-ESP32/issues/2544)
- hybrid CSH5800iG [#2569](https://github.com/emsesp/EMS-ESP32/issues/2569) - hybrid CSH5800iG [#2569](https://github.com/emsesp/EMS-ESP32/issues/2569)
- add EMS Device details to Home Assistant MQTT Discovery - added EMS Device details to Home Assistant MQTT Discovery
- disinfection command [#2601](https://github.com/emsesp/EMS-ESP32/issues/2601) - disinfection command [#2601](https://github.com/emsesp/EMS-ESP32/issues/2601)
- added new board profile for upcoming BBQKees E32V2.2 - added new board profile for upcoming BBQKees E32V2.2
- set differential pressure entity in Mixer device - set differential pressure entity in Mixer device
@@ -34,11 +34,10 @@ For more details go to [docs.emsesp.org](https://docs.emsesp.org/).
- pid settings [#2735](https://github.com/emsesp/EMS-ESP32/issues/2735) - pid settings [#2735](https://github.com/emsesp/EMS-ESP32/issues/2735)
- refresh MQTT button added to MQTT Settings page - refresh MQTT button added to MQTT Settings page
- heating assistance, rounding custum settings [#2763](https://github.com/emsesp/EMS-ESP32/discussions/2763) - heating assistance, rounding custum settings [#2763](https://github.com/emsesp/EMS-ESP32/discussions/2763)
- add counter 0..2 for short pulses, high frequency [#2758](https://github.com/emsesp/EMS-ESP32/issues/2758) - added counter 0..2 for short pulses, high frequency [#2758](https://github.com/emsesp/EMS-ESP32/issues/2758)
- added LWT (Last Will and Testament) to MQTT entities in Home Assistant - added LWT (Last Will and Testament) to MQTT entities in Home Assistant
- added api/metrics endpoint for prometheus integration by @gr3enk - added api/metrics endpoint for prometheus integration by @gr3enk [#2774](https://github.com/emsesp/EMS-ESP32/pull/2774)
[#2774](https://github.com/emsesp/EMS-ESP32/pull/2774) - added RTL8201 to eth phy list [#2800](https://github.com/emsesp/EMS-ESP32/issues/2800)
- add RTL8201 to eth phy list [#2800](https://github.com/emsesp/EMS-ESP32/issues/2800)
## Fixed ## Fixed
@@ -64,7 +63,7 @@ For more details go to [docs.emsesp.org](https://docs.emsesp.org/).
## Changed ## Changed
- show console log with ISO date/time [#2533](https://github.com/emsesp/EMS-ESP32/discussions/2533) - show console log with ISO date/time [#2533](https://github.com/emsesp/EMS-ESP32/discussions/2533)
- remove ESP32 CPU temperature - removed ESP32 CPU temperature
- updated core libraries like AsyncTCP, AsyncWebServer and Modbus - updated core libraries like AsyncTCP, AsyncWebServer and Modbus
- remove command `scan deep` - remove command `scan deep`
- ignore repeated `forceheatingoff` commands [#2641](https://github.com/emsesp/EMS-ESP32/discussions/2641) - ignore repeated `forceheatingoff` commands [#2641](https://github.com/emsesp/EMS-ESP32/discussions/2641)
@@ -80,4 +79,5 @@ For more details go to [docs.emsesp.org](https://docs.emsesp.org/).
- show number on entities and supported languages in log on boot - show number on entities and supported languages in log on boot
- on tx read fail delay the 3rd. retry 2 sec - on tx read fail delay the 3rd. retry 2 sec
- move vectors and lists to PSRAM - move vectors and lists to PSRAM
-remove unused last topic/payload echo-check - removed unused last topic/payload echo-check
- added Home Assistant device details to MQTT Discovery for all devices

View File

@@ -138,6 +138,7 @@ DEPFLAGS += -MF $(BUILD)/$*.d -MT $@
LINK.o = $(LD) $(LDFLAGS) $(LDLIBS) $^ -o $@ LINK.o = $(LD) $(LDFLAGS) $(LDLIBS) $^ -o $@
COMPILE.c = $(CC) $(C_STANDARD) $(CFLAGS) $(DEPFLAGS) -c $< -o $@ COMPILE.c = $(CC) $(C_STANDARD) $(CFLAGS) $(DEPFLAGS) -c $< -o $@
COMPILE.cpp = $(CXX) $(CXX_STANDARD) $(CXXFLAGS) $(DEPFLAGS) -c $< -o $@ COMPILE.cpp = $(CXX) $(CXX_STANDARD) $(CXXFLAGS) $(DEPFLAGS) -c $< -o $@
COMPILE.s = $(CC) $(CFLAGS) $(DEPFLAGS) -c $< -o $@
#---------------------------------------------------------------------- #----------------------------------------------------------------------
# Special Built-in Target # Special Built-in Target
@@ -181,6 +182,7 @@ $(BUILD)/%.o: %.cpp
$(BUILD)/%.o: %.s $(BUILD)/%.o: %.s
@mkdir -p $(@D) @mkdir -p $(@D)
@$(ECHO) Compiling $@
@$(COMPILE.s) @$(COMPILE.s)
cppcheck: $(SOURCES) cppcheck: $(SOURCES)

View File

@@ -38,8 +38,8 @@
"magic-string": "^0.30.21", "magic-string": "^0.30.21",
"mime-types": "^3.0.2", "mime-types": "^3.0.2",
"preact": "^10.28.0", "preact": "^10.28.0",
"react": "^19.2.2", "react": "^19.2.3",
"react-dom": "^19.2.2", "react-dom": "^19.2.3",
"react-icons": "^5.5.0", "react-icons": "^5.5.0",
"react-router": "^7.10.1", "react-router": "^7.10.1",
"react-toastify": "^11.0.5", "react-toastify": "^11.0.5",
@@ -48,16 +48,16 @@
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.28.5", "@babel/core": "^7.28.5",
"@eslint/js": "^9.39.1", "@eslint/js": "^9.39.2",
"@preact/compat": "^18.3.1", "@preact/compat": "^18.3.1",
"@preact/preset-vite": "^2.10.2", "@preact/preset-vite": "^2.10.2",
"@trivago/prettier-plugin-sort-imports": "^6.0.0", "@trivago/prettier-plugin-sort-imports": "^6.0.0",
"@types/node": "^25.0.0", "@types/node": "^25.0.1",
"@types/react": "^19.2.7", "@types/react": "^19.2.7",
"@types/react-dom": "^19.2.3", "@types/react-dom": "^19.2.3",
"axe-core": "^4.11.0", "axe-core": "^4.11.0",
"concurrently": "^9.2.1", "concurrently": "^9.2.1",
"eslint": "^9.39.1", "eslint": "^9.39.2",
"eslint-config-prettier": "^10.1.8", "eslint-config-prettier": "^10.1.8",
"prettier": "^3.7.4", "prettier": "^3.7.4",
"rollup-plugin-visualizer": "^6.0.5", "rollup-plugin-visualizer": "^6.0.5",

304
interface/pnpm-lock.yaml generated
View File

@@ -13,22 +13,22 @@ importers:
version: 2.3.0(alova@3.4.0) version: 2.3.0(alova@3.4.0)
'@emotion/react': '@emotion/react':
specifier: ^11.14.0 specifier: ^11.14.0
version: 11.14.0(@types/react@19.2.7)(react@19.2.2) version: 11.14.0(@types/react@19.2.7)(react@19.2.3)
'@emotion/styled': '@emotion/styled':
specifier: ^11.14.1 specifier: ^11.14.1
version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.2))(@types/react@19.2.7)(react@19.2.2) version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3)
'@mui/icons-material': '@mui/icons-material':
specifier: ^7.3.6 specifier: ^7.3.6
version: 7.3.6(@mui/material@7.3.6(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.2))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.2))(@types/react@19.2.7)(react@19.2.2))(@types/react@19.2.7)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(@types/react@19.2.7)(react@19.2.2) version: 7.3.6(@mui/material@7.3.6(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react@19.2.3)
'@mui/material': '@mui/material':
specifier: ^7.3.6 specifier: ^7.3.6
version: 7.3.6(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.2))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.2))(@types/react@19.2.7)(react@19.2.2))(@types/react@19.2.7)(react-dom@19.2.2(react@19.2.2))(react@19.2.2) version: 7.3.6(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
'@preact/compat': '@preact/compat':
specifier: ^18.3.1 specifier: ^18.3.1
version: 18.3.1(preact@10.28.0) version: 18.3.1(preact@10.28.0)
'@table-library/react-table-library': '@table-library/react-table-library':
specifier: 4.1.15 specifier: 4.1.15
version: 4.1.15(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.2))(react-dom@19.2.2(react@19.2.2))(react@19.2.2) version: 4.1.15(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
alova: alova:
specifier: 3.4.0 specifier: 3.4.0
version: 3.4.0 version: 3.4.0
@@ -54,20 +54,20 @@ importers:
specifier: ^10.28.0 specifier: ^10.28.0
version: 10.28.0 version: 10.28.0
react: react:
specifier: ^19.2.2 specifier: ^19.2.3
version: 19.2.2 version: 19.2.3
react-dom: react-dom:
specifier: ^19.2.2 specifier: ^19.2.3
version: 19.2.2(react@19.2.2) version: 19.2.3(react@19.2.3)
react-icons: react-icons:
specifier: ^5.5.0 specifier: ^5.5.0
version: 5.5.0(react@19.2.2) version: 5.5.0(react@19.2.3)
react-router: react-router:
specifier: ^7.10.1 specifier: ^7.10.1
version: 7.10.1(react-dom@19.2.2(react@19.2.2))(react@19.2.2) version: 7.10.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
react-toastify: react-toastify:
specifier: ^11.0.5 specifier: ^11.0.5
version: 11.0.5(react-dom@19.2.2(react@19.2.2))(react@19.2.2) version: 11.0.5(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
typesafe-i18n: typesafe-i18n:
specifier: ^5.26.2 specifier: ^5.26.2
version: 5.26.2(typescript@5.9.3) version: 5.26.2(typescript@5.9.3)
@@ -79,17 +79,17 @@ importers:
specifier: ^7.28.5 specifier: ^7.28.5
version: 7.28.5 version: 7.28.5
'@eslint/js': '@eslint/js':
specifier: ^9.39.1 specifier: ^9.39.2
version: 9.39.1 version: 9.39.2
'@preact/preset-vite': '@preact/preset-vite':
specifier: ^2.10.2 specifier: ^2.10.2
version: 2.10.2(@babel/core@7.28.5)(preact@10.28.0)(vite@7.2.7(@types/node@25.0.0)(terser@5.44.1)) version: 2.10.2(@babel/core@7.28.5)(preact@10.28.0)(vite@7.2.7(@types/node@25.0.1)(terser@5.44.1))
'@trivago/prettier-plugin-sort-imports': '@trivago/prettier-plugin-sort-imports':
specifier: ^6.0.0 specifier: ^6.0.0
version: 6.0.0(prettier@3.7.4) version: 6.0.0(prettier@3.7.4)
'@types/node': '@types/node':
specifier: ^25.0.0 specifier: ^25.0.1
version: 25.0.0 version: 25.0.1
'@types/react': '@types/react':
specifier: ^19.2.7 specifier: ^19.2.7
version: 19.2.7 version: 19.2.7
@@ -103,11 +103,11 @@ importers:
specifier: ^9.2.1 specifier: ^9.2.1
version: 9.2.1 version: 9.2.1
eslint: eslint:
specifier: ^9.39.1 specifier: ^9.39.2
version: 9.39.1 version: 9.39.2
eslint-config-prettier: eslint-config-prettier:
specifier: ^10.1.8 specifier: ^10.1.8
version: 10.1.8(eslint@9.39.1) version: 10.1.8(eslint@9.39.2)
prettier: prettier:
specifier: ^3.7.4 specifier: ^3.7.4
version: 3.7.4 version: 3.7.4
@@ -119,16 +119,16 @@ importers:
version: 5.44.1 version: 5.44.1
typescript-eslint: typescript-eslint:
specifier: ^8.49.0 specifier: ^8.49.0
version: 8.49.0(eslint@9.39.1)(typescript@5.9.3) version: 8.49.0(eslint@9.39.2)(typescript@5.9.3)
vite: vite:
specifier: ^7.2.7 specifier: ^7.2.7
version: 7.2.7(@types/node@25.0.0)(terser@5.44.1) version: 7.2.7(@types/node@25.0.1)(terser@5.44.1)
vite-plugin-imagemin: vite-plugin-imagemin:
specifier: ^0.6.1 specifier: ^0.6.1
version: 0.6.1(vite@7.2.7(@types/node@25.0.0)(terser@5.44.1)) version: 0.6.1(vite@7.2.7(@types/node@25.0.1)(terser@5.44.1))
vite-tsconfig-paths: vite-tsconfig-paths:
specifier: ^5.1.4 specifier: ^5.1.4
version: 5.1.4(typescript@5.9.3)(vite@7.2.7(@types/node@25.0.0)(terser@5.44.1)) version: 5.1.4(typescript@5.9.3)(vite@7.2.7(@types/node@25.0.1)(terser@5.44.1))
packages: packages:
@@ -479,8 +479,8 @@ packages:
resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/js@9.39.1': '@eslint/js@9.39.2':
resolution: {integrity: sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==} resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/object-schema@2.1.7': '@eslint/object-schema@2.1.7':
@@ -860,8 +860,8 @@ packages:
resolution: {integrity: sha512-zmPitbQ8+6zNutpwgcQuLcsEpn/Cj54Kbn7L5pX0Os5kdWplB7xPgEh/g+SWOB/qmows2gpuCaPyduq8ZZRnxA==} resolution: {integrity: sha512-zmPitbQ8+6zNutpwgcQuLcsEpn/Cj54Kbn7L5pX0Os5kdWplB7xPgEh/g+SWOB/qmows2gpuCaPyduq8ZZRnxA==}
deprecated: This is a stub types definition. minimatch provides its own type definitions, so you do not need this installed. deprecated: This is a stub types definition. minimatch provides its own type definitions, so you do not need this installed.
'@types/node@25.0.0': '@types/node@25.0.1':
resolution: {integrity: sha512-rl78HwuZlaDIUSeUKkmogkhebA+8K1Hy7tddZuJ3D0xV8pZSfsYGTsliGUol1JPzu9EKnTxPC4L1fiWouStRew==} resolution: {integrity: sha512-czWPzKIAXucn9PtsttxmumiQ9N0ok9FrBwgRWrwmVLlp86BrMExzvXRLFYRJ+Ex3g6yqj+KuaxfX1JTgV2lpfg==}
'@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==}
@@ -1027,8 +1027,8 @@ packages:
base64-js@1.5.1: base64-js@1.5.1:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
baseline-browser-mapping@2.9.6: baseline-browser-mapping@2.9.7:
resolution: {integrity: sha512-v9BVVpOTLB59C9E7aSnmIF8h7qRsFpx+A2nugVMTszEOMcfjlZMsXRm4LF23I3Z9AJxc8ANpIvzbzONoX9VJlg==} resolution: {integrity: sha512-k9xFKplee6KIio3IDbwj+uaCLpqzOwakOgmqzPezM0sFJlFKcg30vk2wOiAJtkTSfx0SSQDSe8q+mWA/fSH5Zg==}
hasBin: true hasBin: true
bin-build@3.0.0: bin-build@3.0.0:
@@ -1528,8 +1528,8 @@ packages:
resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
eslint@9.39.1: eslint@9.39.2:
resolution: {integrity: sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==} resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
@@ -2509,10 +2509,10 @@ packages:
rate-limiter-flexible@5.0.5: rate-limiter-flexible@5.0.5:
resolution: {integrity: sha512-+/dSQfo+3FYwYygUs/V2BBdwGa9nFtakDwKt4l0bnvNB53TNT++QSFewwHX9qXrZJuMe9j+TUaU21lm5ARgqdQ==} resolution: {integrity: sha512-+/dSQfo+3FYwYygUs/V2BBdwGa9nFtakDwKt4l0bnvNB53TNT++QSFewwHX9qXrZJuMe9j+TUaU21lm5ARgqdQ==}
react-dom@19.2.2: react-dom@19.2.3:
resolution: {integrity: sha512-fhyD2BLrew6qYf4NNtHff1rLXvzR25rq49p+FeqByOazc6TcSi2n8EYulo5C1PbH+1uBW++5S1SG7FcUU6mlDg==} resolution: {integrity: sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==}
peerDependencies: peerDependencies:
react: ^19.2.2 react: ^19.2.3
react-icons@5.5.0: react-icons@5.5.0:
resolution: {integrity: sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==} resolution: {integrity: sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==}
@@ -2522,8 +2522,8 @@ packages:
react-is@16.13.1: react-is@16.13.1:
resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
react-is@19.2.2: react-is@19.2.3:
resolution: {integrity: sha512-ADrk8mxPwhyj+IB8EnMMRzxnon5hJrOdEZl+mCrrHXfPGGPYHdRm1962fvXUiWAu/ZC1G+OTgBN3Puq57iS4Yg==} resolution: {integrity: sha512-qJNJfu81ByyabuG7hPFEbXqNcWSU3+eVus+KJs+0ncpGfMyYdvSmxiJxbWR65lYi1I+/0HBcliO029gc4F+PnA==}
react-router@7.10.1: react-router@7.10.1:
resolution: {integrity: sha512-gHL89dRa3kwlUYtRQ+m8NmxGI6CgqN+k4XyGjwcFoQwwCWF6xXpOCUlDovkXClS0d0XJN/5q7kc5W3kiFEd0Yw==} resolution: {integrity: sha512-gHL89dRa3kwlUYtRQ+m8NmxGI6CgqN+k4XyGjwcFoQwwCWF6xXpOCUlDovkXClS0d0XJN/5q7kc5W3kiFEd0Yw==}
@@ -2560,8 +2560,8 @@ packages:
react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
react@19.2.2: react@19.2.3:
resolution: {integrity: sha512-BdOGOY8OKRBcgoDkwqA8Q5XvOIhoNx/Sh6BnGJlet2Abt0X5BK0BDrqGyQgLhAVjD2nAg5f6o01u/OPUhG022Q==} resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
read-pkg-up@1.0.1: read-pkg-up@1.0.1:
@@ -3265,17 +3265,17 @@ snapshots:
'@emotion/memoize@0.9.0': {} '@emotion/memoize@0.9.0': {}
'@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.2)': '@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3)':
dependencies: dependencies:
'@babel/runtime': 7.28.4 '@babel/runtime': 7.28.4
'@emotion/babel-plugin': 11.13.5 '@emotion/babel-plugin': 11.13.5
'@emotion/cache': 11.14.0 '@emotion/cache': 11.14.0
'@emotion/serialize': 1.3.3 '@emotion/serialize': 1.3.3
'@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.2.2) '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.2.3)
'@emotion/utils': 1.4.2 '@emotion/utils': 1.4.2
'@emotion/weak-memoize': 0.4.0 '@emotion/weak-memoize': 0.4.0
hoist-non-react-statics: 3.3.2 hoist-non-react-statics: 3.3.2
react: 19.2.2 react: 19.2.3
optionalDependencies: optionalDependencies:
'@types/react': 19.2.7 '@types/react': 19.2.7
transitivePeerDependencies: transitivePeerDependencies:
@@ -3291,16 +3291,16 @@ snapshots:
'@emotion/sheet@1.4.0': {} '@emotion/sheet@1.4.0': {}
'@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.2))(@types/react@19.2.7)(react@19.2.2)': '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3)':
dependencies: dependencies:
'@babel/runtime': 7.28.4 '@babel/runtime': 7.28.4
'@emotion/babel-plugin': 11.13.5 '@emotion/babel-plugin': 11.13.5
'@emotion/is-prop-valid': 1.4.0 '@emotion/is-prop-valid': 1.4.0
'@emotion/react': 11.14.0(@types/react@19.2.7)(react@19.2.2) '@emotion/react': 11.14.0(@types/react@19.2.7)(react@19.2.3)
'@emotion/serialize': 1.3.3 '@emotion/serialize': 1.3.3
'@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.2.2) '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.2.3)
'@emotion/utils': 1.4.2 '@emotion/utils': 1.4.2
react: 19.2.2 react: 19.2.3
optionalDependencies: optionalDependencies:
'@types/react': 19.2.7 '@types/react': 19.2.7
transitivePeerDependencies: transitivePeerDependencies:
@@ -3308,9 +3308,9 @@ snapshots:
'@emotion/unitless@0.10.0': {} '@emotion/unitless@0.10.0': {}
'@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@19.2.2)': '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@19.2.3)':
dependencies: dependencies:
react: 19.2.2 react: 19.2.3
'@emotion/utils@1.4.2': {} '@emotion/utils@1.4.2': {}
@@ -3397,9 +3397,9 @@ snapshots:
'@esbuild/win32-x64@0.25.12': '@esbuild/win32-x64@0.25.12':
optional: true optional: true
'@eslint-community/eslint-utils@4.9.0(eslint@9.39.1)': '@eslint-community/eslint-utils@4.9.0(eslint@9.39.2)':
dependencies: dependencies:
eslint: 9.39.1 eslint: 9.39.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': {}
@@ -3434,7 +3434,7 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@eslint/js@9.39.1': {} '@eslint/js@9.39.2': {}
'@eslint/object-schema@2.1.7': {} '@eslint/object-schema@2.1.7': {}
@@ -3486,45 +3486,45 @@ snapshots:
'@mui/core-downloads-tracker@7.3.6': {} '@mui/core-downloads-tracker@7.3.6': {}
'@mui/icons-material@7.3.6(@mui/material@7.3.6(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.2))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.2))(@types/react@19.2.7)(react@19.2.2))(@types/react@19.2.7)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(@types/react@19.2.7)(react@19.2.2)': '@mui/icons-material@7.3.6(@mui/material@7.3.6(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react@19.2.3)':
dependencies: dependencies:
'@babel/runtime': 7.28.4 '@babel/runtime': 7.28.4
'@mui/material': 7.3.6(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.2))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.2))(@types/react@19.2.7)(react@19.2.2))(@types/react@19.2.7)(react-dom@19.2.2(react@19.2.2))(react@19.2.2) '@mui/material': 7.3.6(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
react: 19.2.2 react: 19.2.3
optionalDependencies: optionalDependencies:
'@types/react': 19.2.7 '@types/react': 19.2.7
'@mui/material@7.3.6(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.2))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.2))(@types/react@19.2.7)(react@19.2.2))(@types/react@19.2.7)(react-dom@19.2.2(react@19.2.2))(react@19.2.2)': '@mui/material@7.3.6(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
dependencies: dependencies:
'@babel/runtime': 7.28.4 '@babel/runtime': 7.28.4
'@mui/core-downloads-tracker': 7.3.6 '@mui/core-downloads-tracker': 7.3.6
'@mui/system': 7.3.6(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.2))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.2))(@types/react@19.2.7)(react@19.2.2))(@types/react@19.2.7)(react@19.2.2) '@mui/system': 7.3.6(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3)
'@mui/types': 7.4.9(@types/react@19.2.7) '@mui/types': 7.4.9(@types/react@19.2.7)
'@mui/utils': 7.3.6(@types/react@19.2.7)(react@19.2.2) '@mui/utils': 7.3.6(@types/react@19.2.7)(react@19.2.3)
'@popperjs/core': 2.11.8 '@popperjs/core': 2.11.8
'@types/react-transition-group': 4.4.12(@types/react@19.2.7) '@types/react-transition-group': 4.4.12(@types/react@19.2.7)
clsx: 2.1.1 clsx: 2.1.1
csstype: 3.2.3 csstype: 3.2.3
prop-types: 15.8.1 prop-types: 15.8.1
react: 19.2.2 react: 19.2.3
react-dom: 19.2.2(react@19.2.2) react-dom: 19.2.3(react@19.2.3)
react-is: 19.2.2 react-is: 19.2.3
react-transition-group: 4.4.5(react-dom@19.2.2(react@19.2.2))(react@19.2.2) react-transition-group: 4.4.5(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
optionalDependencies: optionalDependencies:
'@emotion/react': 11.14.0(@types/react@19.2.7)(react@19.2.2) '@emotion/react': 11.14.0(@types/react@19.2.7)(react@19.2.3)
'@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.2))(@types/react@19.2.7)(react@19.2.2) '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3)
'@types/react': 19.2.7 '@types/react': 19.2.7
'@mui/private-theming@7.3.6(@types/react@19.2.7)(react@19.2.2)': '@mui/private-theming@7.3.6(@types/react@19.2.7)(react@19.2.3)':
dependencies: dependencies:
'@babel/runtime': 7.28.4 '@babel/runtime': 7.28.4
'@mui/utils': 7.3.6(@types/react@19.2.7)(react@19.2.2) '@mui/utils': 7.3.6(@types/react@19.2.7)(react@19.2.3)
prop-types: 15.8.1 prop-types: 15.8.1
react: 19.2.2 react: 19.2.3
optionalDependencies: optionalDependencies:
'@types/react': 19.2.7 '@types/react': 19.2.7
'@mui/styled-engine@7.3.6(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.2))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.2))(@types/react@19.2.7)(react@19.2.2))(react@19.2.2)': '@mui/styled-engine@7.3.6(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)':
dependencies: dependencies:
'@babel/runtime': 7.28.4 '@babel/runtime': 7.28.4
'@emotion/cache': 11.14.0 '@emotion/cache': 11.14.0
@@ -3532,25 +3532,25 @@ snapshots:
'@emotion/sheet': 1.4.0 '@emotion/sheet': 1.4.0
csstype: 3.2.3 csstype: 3.2.3
prop-types: 15.8.1 prop-types: 15.8.1
react: 19.2.2 react: 19.2.3
optionalDependencies: optionalDependencies:
'@emotion/react': 11.14.0(@types/react@19.2.7)(react@19.2.2) '@emotion/react': 11.14.0(@types/react@19.2.7)(react@19.2.3)
'@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.2))(@types/react@19.2.7)(react@19.2.2) '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3)
'@mui/system@7.3.6(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.2))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.2))(@types/react@19.2.7)(react@19.2.2))(@types/react@19.2.7)(react@19.2.2)': '@mui/system@7.3.6(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3)':
dependencies: dependencies:
'@babel/runtime': 7.28.4 '@babel/runtime': 7.28.4
'@mui/private-theming': 7.3.6(@types/react@19.2.7)(react@19.2.2) '@mui/private-theming': 7.3.6(@types/react@19.2.7)(react@19.2.3)
'@mui/styled-engine': 7.3.6(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.2))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.2))(@types/react@19.2.7)(react@19.2.2))(react@19.2.2) '@mui/styled-engine': 7.3.6(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)
'@mui/types': 7.4.9(@types/react@19.2.7) '@mui/types': 7.4.9(@types/react@19.2.7)
'@mui/utils': 7.3.6(@types/react@19.2.7)(react@19.2.2) '@mui/utils': 7.3.6(@types/react@19.2.7)(react@19.2.3)
clsx: 2.1.1 clsx: 2.1.1
csstype: 3.2.3 csstype: 3.2.3
prop-types: 15.8.1 prop-types: 15.8.1
react: 19.2.2 react: 19.2.3
optionalDependencies: optionalDependencies:
'@emotion/react': 11.14.0(@types/react@19.2.7)(react@19.2.2) '@emotion/react': 11.14.0(@types/react@19.2.7)(react@19.2.3)
'@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.2))(@types/react@19.2.7)(react@19.2.2) '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3)
'@types/react': 19.2.7 '@types/react': 19.2.7
'@mui/types@7.4.9(@types/react@19.2.7)': '@mui/types@7.4.9(@types/react@19.2.7)':
@@ -3559,15 +3559,15 @@ snapshots:
optionalDependencies: optionalDependencies:
'@types/react': 19.2.7 '@types/react': 19.2.7
'@mui/utils@7.3.6(@types/react@19.2.7)(react@19.2.2)': '@mui/utils@7.3.6(@types/react@19.2.7)(react@19.2.3)':
dependencies: dependencies:
'@babel/runtime': 7.28.4 '@babel/runtime': 7.28.4
'@mui/types': 7.4.9(@types/react@19.2.7) '@mui/types': 7.4.9(@types/react@19.2.7)
'@types/prop-types': 15.7.15 '@types/prop-types': 15.7.15
clsx: 2.1.1 clsx: 2.1.1
prop-types: 15.8.1 prop-types: 15.8.1
react: 19.2.2 react: 19.2.3
react-is: 19.2.2 react-is: 19.2.3
optionalDependencies: optionalDependencies:
'@types/react': 19.2.7 '@types/react': 19.2.7
@@ -3595,18 +3595,18 @@ snapshots:
dependencies: dependencies:
preact: 10.28.0 preact: 10.28.0
'@preact/preset-vite@2.10.2(@babel/core@7.28.5)(preact@10.28.0)(vite@7.2.7(@types/node@25.0.0)(terser@5.44.1))': '@preact/preset-vite@2.10.2(@babel/core@7.28.5)(preact@10.28.0)(vite@7.2.7(@types/node@25.0.1)(terser@5.44.1))':
dependencies: dependencies:
'@babel/core': 7.28.5 '@babel/core': 7.28.5
'@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.5) '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.5)
'@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.5) '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.5)
'@prefresh/vite': 2.4.11(preact@10.28.0)(vite@7.2.7(@types/node@25.0.0)(terser@5.44.1)) '@prefresh/vite': 2.4.11(preact@10.28.0)(vite@7.2.7(@types/node@25.0.1)(terser@5.44.1))
'@rollup/pluginutils': 4.2.1 '@rollup/pluginutils': 4.2.1
babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.28.5) babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.28.5)
debug: 4.4.3 debug: 4.4.3
picocolors: 1.1.1 picocolors: 1.1.1
vite: 7.2.7(@types/node@25.0.0)(terser@5.44.1) vite: 7.2.7(@types/node@25.0.1)(terser@5.44.1)
vite-prerender-plugin: 0.5.12(vite@7.2.7(@types/node@25.0.0)(terser@5.44.1)) vite-prerender-plugin: 0.5.12(vite@7.2.7(@types/node@25.0.1)(terser@5.44.1))
transitivePeerDependencies: transitivePeerDependencies:
- preact - preact
- supports-color - supports-color
@@ -3619,7 +3619,7 @@ snapshots:
'@prefresh/utils@1.2.1': {} '@prefresh/utils@1.2.1': {}
'@prefresh/vite@2.4.11(preact@10.28.0)(vite@7.2.7(@types/node@25.0.0)(terser@5.44.1))': '@prefresh/vite@2.4.11(preact@10.28.0)(vite@7.2.7(@types/node@25.0.1)(terser@5.44.1))':
dependencies: dependencies:
'@babel/core': 7.28.5 '@babel/core': 7.28.5
'@prefresh/babel-plugin': 0.5.2 '@prefresh/babel-plugin': 0.5.2
@@ -3627,7 +3627,7 @@ snapshots:
'@prefresh/utils': 1.2.1 '@prefresh/utils': 1.2.1
'@rollup/pluginutils': 4.2.1 '@rollup/pluginutils': 4.2.1
preact: 10.28.0 preact: 10.28.0
vite: 7.2.7(@types/node@25.0.0)(terser@5.44.1) vite: 7.2.7(@types/node@25.0.1)(terser@5.44.1)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -3704,14 +3704,14 @@ snapshots:
'@sindresorhus/is@0.7.0': {} '@sindresorhus/is@0.7.0': {}
'@table-library/react-table-library@4.1.15(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.2))(react-dom@19.2.2(react@19.2.2))(react@19.2.2)': '@table-library/react-table-library@4.1.15(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
dependencies: dependencies:
'@emotion/react': 11.14.0(@types/react@19.2.7)(react@19.2.2) '@emotion/react': 11.14.0(@types/react@19.2.7)(react@19.2.3)
clsx: 1.1.1 clsx: 1.1.1
react: 19.2.2 react: 19.2.3
react-dom: 19.2.2(react@19.2.2) react-dom: 19.2.3(react@19.2.3)
react-virtualized-auto-sizer: 1.0.26(react-dom@19.2.2(react@19.2.2))(react@19.2.2) react-virtualized-auto-sizer: 1.0.26(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
react-window: 1.8.11(react-dom@19.2.2(react@19.2.2))(react@19.2.2) react-window: 1.8.11(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
'@trivago/prettier-plugin-sort-imports@6.0.0(prettier@3.7.4)': '@trivago/prettier-plugin-sort-imports@6.0.0(prettier@3.7.4)':
dependencies: dependencies:
@@ -3734,7 +3734,7 @@ snapshots:
'@types/glob@7.2.0': '@types/glob@7.2.0':
dependencies: dependencies:
'@types/minimatch': 6.0.0 '@types/minimatch': 6.0.0
'@types/node': 25.0.0 '@types/node': 25.0.1
'@types/imagemin-gifsicle@7.0.4': '@types/imagemin-gifsicle@7.0.4':
dependencies: dependencies:
@@ -3763,19 +3763,19 @@ snapshots:
'@types/imagemin@7.0.1': '@types/imagemin@7.0.1':
dependencies: dependencies:
'@types/node': 25.0.0 '@types/node': 25.0.1
'@types/json-schema@7.0.15': {} '@types/json-schema@7.0.15': {}
'@types/keyv@3.1.4': '@types/keyv@3.1.4':
dependencies: dependencies:
'@types/node': 25.0.0 '@types/node': 25.0.1
'@types/minimatch@6.0.0': '@types/minimatch@6.0.0':
dependencies: dependencies:
minimatch: 10.1.1 minimatch: 10.1.1
'@types/node@25.0.0': '@types/node@25.0.1':
dependencies: dependencies:
undici-types: 7.16.0 undici-types: 7.16.0
@@ -3797,21 +3797,21 @@ snapshots:
'@types/responselike@1.0.3': '@types/responselike@1.0.3':
dependencies: dependencies:
'@types/node': 25.0.0 '@types/node': 25.0.1
'@types/svgo@2.6.4': '@types/svgo@2.6.4':
dependencies: dependencies:
'@types/node': 25.0.0 '@types/node': 25.0.1
'@typescript-eslint/eslint-plugin@8.49.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)': '@typescript-eslint/eslint-plugin@8.49.0(@typescript-eslint/parser@8.49.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3)':
dependencies: dependencies:
'@eslint-community/regexpp': 4.12.2 '@eslint-community/regexpp': 4.12.2
'@typescript-eslint/parser': 8.49.0(eslint@9.39.1)(typescript@5.9.3) '@typescript-eslint/parser': 8.49.0(eslint@9.39.2)(typescript@5.9.3)
'@typescript-eslint/scope-manager': 8.49.0 '@typescript-eslint/scope-manager': 8.49.0
'@typescript-eslint/type-utils': 8.49.0(eslint@9.39.1)(typescript@5.9.3) '@typescript-eslint/type-utils': 8.49.0(eslint@9.39.2)(typescript@5.9.3)
'@typescript-eslint/utils': 8.49.0(eslint@9.39.1)(typescript@5.9.3) '@typescript-eslint/utils': 8.49.0(eslint@9.39.2)(typescript@5.9.3)
'@typescript-eslint/visitor-keys': 8.49.0 '@typescript-eslint/visitor-keys': 8.49.0
eslint: 9.39.1 eslint: 9.39.2
ignore: 7.0.5 ignore: 7.0.5
natural-compare: 1.4.0 natural-compare: 1.4.0
ts-api-utils: 2.1.0(typescript@5.9.3) ts-api-utils: 2.1.0(typescript@5.9.3)
@@ -3819,14 +3819,14 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/parser@8.49.0(eslint@9.39.1)(typescript@5.9.3)': '@typescript-eslint/parser@8.49.0(eslint@9.39.2)(typescript@5.9.3)':
dependencies: dependencies:
'@typescript-eslint/scope-manager': 8.49.0 '@typescript-eslint/scope-manager': 8.49.0
'@typescript-eslint/types': 8.49.0 '@typescript-eslint/types': 8.49.0
'@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3) '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3)
'@typescript-eslint/visitor-keys': 8.49.0 '@typescript-eslint/visitor-keys': 8.49.0
debug: 4.4.3 debug: 4.4.3
eslint: 9.39.1 eslint: 9.39.2
typescript: 5.9.3 typescript: 5.9.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -3849,13 +3849,13 @@ snapshots:
dependencies: dependencies:
typescript: 5.9.3 typescript: 5.9.3
'@typescript-eslint/type-utils@8.49.0(eslint@9.39.1)(typescript@5.9.3)': '@typescript-eslint/type-utils@8.49.0(eslint@9.39.2)(typescript@5.9.3)':
dependencies: dependencies:
'@typescript-eslint/types': 8.49.0 '@typescript-eslint/types': 8.49.0
'@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3) '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3)
'@typescript-eslint/utils': 8.49.0(eslint@9.39.1)(typescript@5.9.3) '@typescript-eslint/utils': 8.49.0(eslint@9.39.2)(typescript@5.9.3)
debug: 4.4.3 debug: 4.4.3
eslint: 9.39.1 eslint: 9.39.2
ts-api-utils: 2.1.0(typescript@5.9.3) ts-api-utils: 2.1.0(typescript@5.9.3)
typescript: 5.9.3 typescript: 5.9.3
transitivePeerDependencies: transitivePeerDependencies:
@@ -3878,13 +3878,13 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/utils@8.49.0(eslint@9.39.1)(typescript@5.9.3)': '@typescript-eslint/utils@8.49.0(eslint@9.39.2)(typescript@5.9.3)':
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2)
'@typescript-eslint/scope-manager': 8.49.0 '@typescript-eslint/scope-manager': 8.49.0
'@typescript-eslint/types': 8.49.0 '@typescript-eslint/types': 8.49.0
'@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3) '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3)
eslint: 9.39.1 eslint: 9.39.2
typescript: 5.9.3 typescript: 5.9.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -3958,7 +3958,7 @@ snapshots:
base64-js@1.5.1: {} base64-js@1.5.1: {}
baseline-browser-mapping@2.9.6: {} baseline-browser-mapping@2.9.7: {}
bin-build@3.0.0: bin-build@3.0.0:
dependencies: dependencies:
@@ -4015,7 +4015,7 @@ snapshots:
browserslist@4.28.1: browserslist@4.28.1:
dependencies: dependencies:
baseline-browser-mapping: 2.9.6 baseline-browser-mapping: 2.9.7
caniuse-lite: 1.0.30001760 caniuse-lite: 1.0.30001760
electron-to-chromium: 1.5.267 electron-to-chromium: 1.5.267
node-releases: 2.0.27 node-releases: 2.0.27
@@ -4505,9 +4505,9 @@ snapshots:
escape-string-regexp@4.0.0: {} escape-string-regexp@4.0.0: {}
eslint-config-prettier@10.1.8(eslint@9.39.1): eslint-config-prettier@10.1.8(eslint@9.39.2):
dependencies: dependencies:
eslint: 9.39.1 eslint: 9.39.2
eslint-scope@8.4.0: eslint-scope@8.4.0:
dependencies: dependencies:
@@ -4518,15 +4518,15 @@ snapshots:
eslint-visitor-keys@4.2.1: {} eslint-visitor-keys@4.2.1: {}
eslint@9.39.1: eslint@9.39.2:
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2)
'@eslint-community/regexpp': 4.12.2 '@eslint-community/regexpp': 4.12.2
'@eslint/config-array': 0.21.1 '@eslint/config-array': 0.21.1
'@eslint/config-helpers': 0.4.2 '@eslint/config-helpers': 0.4.2
'@eslint/core': 0.17.0 '@eslint/core': 0.17.0
'@eslint/eslintrc': 3.3.3 '@eslint/eslintrc': 3.3.3
'@eslint/js': 9.39.1 '@eslint/js': 9.39.2
'@eslint/plugin-kit': 0.4.1 '@eslint/plugin-kit': 0.4.1
'@humanfs/node': 0.16.7 '@humanfs/node': 0.16.7
'@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/module-importer': 1.0.1
@@ -5512,55 +5512,55 @@ snapshots:
rate-limiter-flexible@5.0.5: {} rate-limiter-flexible@5.0.5: {}
react-dom@19.2.2(react@19.2.2): react-dom@19.2.3(react@19.2.3):
dependencies: dependencies:
react: 19.2.2 react: 19.2.3
scheduler: 0.27.0 scheduler: 0.27.0
react-icons@5.5.0(react@19.2.2): react-icons@5.5.0(react@19.2.3):
dependencies: dependencies:
react: 19.2.2 react: 19.2.3
react-is@16.13.1: {} react-is@16.13.1: {}
react-is@19.2.2: {} react-is@19.2.3: {}
react-router@7.10.1(react-dom@19.2.2(react@19.2.2))(react@19.2.2): react-router@7.10.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3):
dependencies: dependencies:
cookie: 1.1.1 cookie: 1.1.1
react: 19.2.2 react: 19.2.3
set-cookie-parser: 2.7.2 set-cookie-parser: 2.7.2
optionalDependencies: optionalDependencies:
react-dom: 19.2.2(react@19.2.2) react-dom: 19.2.3(react@19.2.3)
react-toastify@11.0.5(react-dom@19.2.2(react@19.2.2))(react@19.2.2): react-toastify@11.0.5(react-dom@19.2.3(react@19.2.3))(react@19.2.3):
dependencies: dependencies:
clsx: 2.1.1 clsx: 2.1.1
react: 19.2.2 react: 19.2.3
react-dom: 19.2.2(react@19.2.2) react-dom: 19.2.3(react@19.2.3)
react-transition-group@4.4.5(react-dom@19.2.2(react@19.2.2))(react@19.2.2): react-transition-group@4.4.5(react-dom@19.2.3(react@19.2.3))(react@19.2.3):
dependencies: dependencies:
'@babel/runtime': 7.28.4 '@babel/runtime': 7.28.4
dom-helpers: 5.2.1 dom-helpers: 5.2.1
loose-envify: 1.4.0 loose-envify: 1.4.0
prop-types: 15.8.1 prop-types: 15.8.1
react: 19.2.2 react: 19.2.3
react-dom: 19.2.2(react@19.2.2) react-dom: 19.2.3(react@19.2.3)
react-virtualized-auto-sizer@1.0.26(react-dom@19.2.2(react@19.2.2))(react@19.2.2): react-virtualized-auto-sizer@1.0.26(react-dom@19.2.3(react@19.2.3))(react@19.2.3):
dependencies: dependencies:
react: 19.2.2 react: 19.2.3
react-dom: 19.2.2(react@19.2.2) react-dom: 19.2.3(react@19.2.3)
react-window@1.8.11(react-dom@19.2.2(react@19.2.2))(react@19.2.2): react-window@1.8.11(react-dom@19.2.3(react@19.2.3))(react@19.2.3):
dependencies: dependencies:
'@babel/runtime': 7.28.4 '@babel/runtime': 7.28.4
memoize-one: 5.2.1 memoize-one: 5.2.1
react: 19.2.2 react: 19.2.3
react-dom: 19.2.2(react@19.2.2) react-dom: 19.2.3(react@19.2.3)
react@19.2.2: {} react@19.2.3: {}
read-pkg-up@1.0.1: read-pkg-up@1.0.1:
dependencies: dependencies:
@@ -5912,13 +5912,13 @@ snapshots:
dependencies: dependencies:
typescript: 5.9.3 typescript: 5.9.3
typescript-eslint@8.49.0(eslint@9.39.1)(typescript@5.9.3): typescript-eslint@8.49.0(eslint@9.39.2)(typescript@5.9.3):
dependencies: dependencies:
'@typescript-eslint/eslint-plugin': 8.49.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3) '@typescript-eslint/eslint-plugin': 8.49.0(@typescript-eslint/parser@8.49.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3)
'@typescript-eslint/parser': 8.49.0(eslint@9.39.1)(typescript@5.9.3) '@typescript-eslint/parser': 8.49.0(eslint@9.39.2)(typescript@5.9.3)
'@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3) '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3)
'@typescript-eslint/utils': 8.49.0(eslint@9.39.1)(typescript@5.9.3) '@typescript-eslint/utils': 8.49.0(eslint@9.39.2)(typescript@5.9.3)
eslint: 9.39.1 eslint: 9.39.2
typescript: 5.9.3 typescript: 5.9.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -5963,7 +5963,7 @@ snapshots:
spdx-correct: 3.2.0 spdx-correct: 3.2.0
spdx-expression-parse: 3.0.1 spdx-expression-parse: 3.0.1
vite-plugin-imagemin@0.6.1(vite@7.2.7(@types/node@25.0.0)(terser@5.44.1)): vite-plugin-imagemin@0.6.1(vite@7.2.7(@types/node@25.0.1)(terser@5.44.1)):
dependencies: dependencies:
'@types/imagemin': 7.0.1 '@types/imagemin': 7.0.1
'@types/imagemin-gifsicle': 7.0.4 '@types/imagemin-gifsicle': 7.0.4
@@ -5988,11 +5988,11 @@ snapshots:
imagemin-webp: 6.1.0 imagemin-webp: 6.1.0
jpegtran-bin: 6.0.1 jpegtran-bin: 6.0.1
pathe: 0.2.0 pathe: 0.2.0
vite: 7.2.7(@types/node@25.0.0)(terser@5.44.1) vite: 7.2.7(@types/node@25.0.1)(terser@5.44.1)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
vite-prerender-plugin@0.5.12(vite@7.2.7(@types/node@25.0.0)(terser@5.44.1)): vite-prerender-plugin@0.5.12(vite@7.2.7(@types/node@25.0.1)(terser@5.44.1)):
dependencies: dependencies:
kolorist: 1.8.0 kolorist: 1.8.0
magic-string: 0.30.21 magic-string: 0.30.21
@@ -6000,20 +6000,20 @@ snapshots:
simple-code-frame: 1.3.0 simple-code-frame: 1.3.0
source-map: 0.7.6 source-map: 0.7.6
stack-trace: 1.0.0-pre2 stack-trace: 1.0.0-pre2
vite: 7.2.7(@types/node@25.0.0)(terser@5.44.1) vite: 7.2.7(@types/node@25.0.1)(terser@5.44.1)
vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.2.7(@types/node@25.0.0)(terser@5.44.1)): vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.2.7(@types/node@25.0.1)(terser@5.44.1)):
dependencies: dependencies:
debug: 4.4.3 debug: 4.4.3
globrex: 0.1.2 globrex: 0.1.2
tsconfck: 3.1.6(typescript@5.9.3) tsconfck: 3.1.6(typescript@5.9.3)
optionalDependencies: optionalDependencies:
vite: 7.2.7(@types/node@25.0.0)(terser@5.44.1) vite: 7.2.7(@types/node@25.0.1)(terser@5.44.1)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
- typescript - typescript
vite@7.2.7(@types/node@25.0.0)(terser@5.44.1): vite@7.2.7(@types/node@25.0.1)(terser@5.44.1):
dependencies: dependencies:
esbuild: 0.25.12 esbuild: 0.25.12
fdir: 6.5.0(picomatch@4.0.3) fdir: 6.5.0(picomatch@4.0.3)
@@ -6022,7 +6022,7 @@ snapshots:
rollup: 4.53.3 rollup: 4.53.3
tinyglobby: 0.2.15 tinyglobby: 0.2.15
optionalDependencies: optionalDependencies:
'@types/node': 25.0.0 '@types/node': 25.0.1
fsevents: 2.3.3 fsevents: 2.3.3
terser: 5.44.1 terser: 5.44.1

View File

@@ -331,7 +331,7 @@ const pl: BaseTranslation = {
SERVICES: 'Usługi', SERVICES: 'Usługi',
ALLVALUES: 'Wszystkie wartości', ALLVALUES: 'Wszystkie wartości',
SPECIAL_FUNCTIONS: 'Specjalne funkcje', SPECIAL_FUNCTIONS: 'Specjalne funkcje',
WAIT_FIRMWARE: 'Firma jest wysyłana i instaluje się', WAIT_FIRMWARE: 'Firmware ściąga się i instaluje',
INSTALL_VERSION: 'To zainstaluje wersję {1} {0}. Jesteś pewny?', INSTALL_VERSION: 'To zainstaluje wersję {1} {0}. Jesteś pewny?',
UPDATE_AVAILABLE: 'aktualizacja dostępna', UPDATE_AVAILABLE: 'aktualizacja dostępna',
LATEST_VERSION: 'Jesteś używając najnowszej wersji firmware {0}', LATEST_VERSION: 'Jesteś używając najnowszej wersji firmware {0}',

View File

@@ -793,7 +793,7 @@ void AnalogSensor::publish_values(const bool force) {
// see if we need to create the [devs] discovery section, as this needs only to be done once for all sensors // see if we need to create the [devs] discovery section, as this needs only to be done once for all sensors
if (std::none_of(sensors_.begin(), sensors_.end(), [](const auto & sensor) { return sensor.ha_registered; })) { if (std::none_of(sensors_.begin(), sensors_.end(), [](const auto & sensor) { return sensor.ha_registered; })) {
Mqtt::add_ha_dev_section(config.as<JsonObject>(), "Analog Sensors", nullptr, nullptr, nullptr, false); Mqtt::add_ha_dev_section(config.as<JsonObject>(), "Analog Sensors", nullptr, "EMS-ESP", EMSESP_APP_VERSION, true);
} }
// add default_entity_id // add default_entity_id

View File

@@ -104,14 +104,14 @@ class AnalogSensor {
uint32_t last_polltime_ = 0; // for timer uint32_t last_polltime_ = 0; // for timer
private: private:
uint8_t gpio_; uint8_t gpio_;
char name_[20]; char name_[20];
double offset_; double offset_;
double factor_; double factor_;
uint8_t uom_; uint8_t uom_;
double value_; // double because of the factor is a double double value_; // double because of the factor is a double
int8_t type_; // one of the AnalogType enum int8_t type_; // one of the AnalogType enum
bool is_system_; // if true, the sensor is a system sensor bool is_system_; // if true, the sensor is a system sensor
}; };
AnalogSensor() = default; AnalogSensor() = default;

View File

@@ -2082,24 +2082,40 @@ bool EMSdevice::generate_values(JsonObject output, const int8_t tag_filter, cons
// create the Home Assistant configs for each device value / entity // create the Home Assistant configs for each device value / entity
// this is called when an MQTT publish is done via an EMS Device in emsesp.cpp::publish_device_values() // this is called when an MQTT publish is done via an EMS Device in emsesp.cpp::publish_device_values()
void EMSdevice::mqtt_ha_entity_config_create() { void EMSdevice::mqtt_ha_entity_config_create() {
bool create_device_config = !ha_config_done(); // do we need to create the main Discovery device config with this entity? bool create_device_config = !ha_config_done(); // do we need to create the main Discovery device config with this entity?
uint16_t count = 0; uint16_t count = 0;
const char * const ** mode_options = nullptr;
// if it's a thermostat go fetch the list of modes
if (device_type() == EMSdevice::DeviceType::THERMOSTAT) {
for (auto & dv : devicevalues_) {
// make sure it's a type DeviceValueType::ENUM
if ((dv.type == DeviceValueType::ENUM) && !strcmp(dv.short_name, FL_(mode)[0])) {
// get options
mode_options = dv.options;
break;
}
}
}
// check the state of each of the device values // check the state of each of the device values
// create the discovery topic if if hasn't already been created, not a command (like reset) and is active and visible // create the discovery topic if if hasn't already been created, not a command (like reset) and is active and visible
for (auto & dv : devicevalues_) { for (auto & dv : devicevalues_) {
// create climate when we reach the haclimate entity // create climate when we reach the haclimate entity
if (!strcmp(dv.short_name, FL_(haclimate)[0]) && !dv.has_state(DeviceValueState::DV_API_MQTT_EXCLUDE) && dv.has_state(DeviceValueState::DV_ACTIVE)) { if (!strcmp(dv.short_name, FL_(haclimate)[0]) && !dv.has_state(DeviceValueState::DV_API_MQTT_EXCLUDE) && dv.has_state(DeviceValueState::DV_ACTIVE)) {
if (*(int8_t *)(dv.value_p) == 1 && (!dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED) || dv.has_state(DeviceValueState::DV_HA_CLIMATE_NO_RT))) { int8_t haclimate_value = *(int8_t *)(dv.value_p);
if (Mqtt::publish_ha_climate_config(dv.tag, true, false, dv.min, dv.max)) { // roomTemp bool has_config_created = dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED);
dv.remove_state(DeviceValueState::DV_HA_CLIMATE_NO_RT); bool has_climate_no_rt = dv.has_state(DeviceValueState::DV_HA_CLIMATE_NO_RT);
dv.add_state(DeviceValueState::DV_HA_CONFIG_CREATED); bool needs_update = !has_config_created || (haclimate_value == 1 ? has_climate_no_rt : !has_climate_no_rt);
count++;
} if (needs_update) {
} else if (*(int8_t *)(dv.value_p) == 0 bool has_room_temp = (haclimate_value == 1);
&& (!dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED) || !dv.has_state(DeviceValueState::DV_HA_CLIMATE_NO_RT))) { if (Mqtt::publish_ha_climate_config(dv, has_room_temp, mode_options, false)) {
if (Mqtt::publish_ha_climate_config(dv.tag, false, false, dv.min, dv.max)) { // no roomTemp if (has_room_temp) {
dv.add_state(DeviceValueState::DV_HA_CLIMATE_NO_RT); dv.remove_state(DeviceValueState::DV_HA_CLIMATE_NO_RT);
} else {
dv.add_state(DeviceValueState::DV_HA_CLIMATE_NO_RT);
}
dv.add_state(DeviceValueState::DV_HA_CONFIG_CREATED); dv.add_state(DeviceValueState::DV_HA_CONFIG_CREATED);
count++; count++;
} }
@@ -2116,7 +2132,7 @@ void EMSdevice::mqtt_ha_entity_config_create() {
} }
// SRC thermostats mapped to connect/src1/... // SRC thermostats mapped to connect/src1/...
if (dv.tag >= DeviceValueTAG::TAG_SRC1 && dv.tag <= DeviceValueTAG::TAG_SRC16 && !strcmp(dv.short_name, FL_(selRoomTemp)[0])) { if (dv.tag >= DeviceValueTAG::TAG_SRC1 && dv.tag <= DeviceValueTAG::TAG_SRC16 && !strcmp(dv.short_name, FL_(selRoomTemp)[0])) {
Mqtt::publish_ha_climate_config(dv.tag, true, false, dv.min, dv.max); Mqtt::publish_ha_climate_config(dv, true, mode_options, false);
} }
#ifndef EMSESP_STANDALONE #ifndef EMSESP_STANDALONE

View File

@@ -546,7 +546,7 @@ void Mqtt::ha_status() {
dev["mf"] = "EMS-ESP"; dev["mf"] = "EMS-ESP";
dev["mdl"] = "EMS-ESP"; dev["mdl"] = "EMS-ESP";
#ifndef EMSESP_STANDALONE #ifndef EMSESP_STANDALONE
dev["cu"] = "http://" + (EMSESP::system_.ethernet_connected() ? ETH.localIP().toString() : WiFi.localIP().toString()); dev["cu"] = std::string("http://") + EMSESP::system_.get_ip_or_hostname().c_str();
#endif #endif
JsonArray ids = dev["ids"].to<JsonArray>(); JsonArray ids = dev["ids"].to<JsonArray>();
ids.add(Mqtt::basename()); ids.add(Mqtt::basename());
@@ -1103,6 +1103,12 @@ bool Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdev
// https://github.com/emsesp/EMS-ESP32/discussions/1459#discussioncomment-7694873 // https://github.com/emsesp/EMS-ESP32/discussions/1459#discussioncomment-7694873
add_ha_classes(doc.as<JsonObject>(), device_type, type, uom, entity); add_ha_classes(doc.as<JsonObject>(), device_type, type, uom, entity);
// add origin
JsonObject origin_json = doc["o"].to<JsonObject>();
origin_json["name"] = "EMS-ESP";
origin_json["sw"] = EMSESP_APP_VERSION;
origin_json["url"] = "https://emsesp.org";
// add dev section // add dev section
if (device_type == EMSdevice::DeviceType::SYSTEM) { if (device_type == EMSdevice::DeviceType::SYSTEM) {
add_ha_dev_section(doc.as<JsonObject>(), nullptr, nullptr, nullptr, nullptr, false); add_ha_dev_section(doc.as<JsonObject>(), nullptr, nullptr, nullptr, nullptr, false);
@@ -1236,7 +1242,12 @@ void Mqtt::add_ha_classes(JsonObject doc, const uint8_t device_type, const uint8
} }
} }
bool Mqtt::publish_ha_climate_config(const int8_t tag, const bool has_roomtemp, const bool remove, const int16_t min, const uint32_t max) { // publish the HA climate config
// https://www.home-assistant.io/integrations/climate.mqtt/
bool Mqtt::publish_ha_climate_config(const DeviceValue & dv, const bool has_roomtemp, const char * const ** mode_options, const bool remove) {
int8_t tag = dv.tag;
int16_t min = dv.min;
uint32_t max = dv.max;
uint8_t hc_num = tag < DeviceValueTAG::TAG_SRC1 ? tag : tag - DeviceValueTAG::TAG_SRC1 + 1; uint8_t hc_num = tag < DeviceValueTAG::TAG_SRC1 ? tag : tag - DeviceValueTAG::TAG_SRC1 + 1;
const char * tagname = tag < DeviceValueTAG::TAG_SRC1 ? "hc" : "src"; const char * tagname = tag < DeviceValueTAG::TAG_SRC1 ? "hc" : "src";
const uint8_t device_type = tag < DeviceValueTAG::TAG_SRC1 ? EMSdevice::DeviceType::THERMOSTAT : EMSdevice::DeviceType::CONNECT; const uint8_t device_type = tag < DeviceValueTAG::TAG_SRC1 ? EMSdevice::DeviceType::THERMOSTAT : EMSdevice::DeviceType::CONNECT;
@@ -1353,12 +1364,45 @@ bool Mqtt::publish_ha_climate_config(const int8_t tag, const bool has_roomtemp,
doc["act_t"] = "~/boiler_data"; doc["act_t"] = "~/boiler_data";
doc["act_tpl"] = "{% if value_json.hpactivity=='cooling'%}cooling{%elif value_json.heatingactive=='on'%}heating{%else%}idle{%endif%}"; doc["act_tpl"] = "{% if value_json.hpactivity=='cooling'%}cooling{%elif value_json.heatingactive=='on'%}heating{%else%}idle{%endif%}";
// the HA climate component only responds to auto, heat and off // map EMS modes to HA climate modes
JsonArray modes = doc["modes"].to<JsonArray>(); // EMS modes: auto, manual, heat, off, night, day, nofrost, eco, comfort, cool)
// HA supports: auto, off, cool, heat, dry, fan_only
if (mode_options != nullptr) {
// scan through mode_options and add to modes
bool found_auto = false;
bool found_heat = false;
bool found_off = false;
bool found_cool = false;
for (uint8_t i = 0; i < Helpers::count_items(mode_options); i++) {
const char * mode = mode_options[i][0]; // take EN
if (!strcmp(mode, FL_(auto)[0])) {
found_auto = true;
} else if (!strcmp(mode, FL_(heat)[0])) {
found_heat = true;
} else if (!strcmp(mode, FL_(off)[0])) {
found_off = true;
} else if (!strcmp(mode, FL_(cool)[0])) {
found_cool = true;
}
}
modes.add("auto"); // only add modes if we found at least one
modes.add("heat"); if (found_auto || found_heat || found_off || found_cool) {
modes.add("off"); JsonArray modes = doc["modes"].to<JsonArray>();
if (found_auto) {
modes.add("auto");
}
if (found_heat) {
modes.add("heat");
}
if (found_off) {
modes.add("off");
}
if (found_cool) {
modes.add("cool");
}
}
}
add_ha_dev_section(doc.as<JsonObject>(), devicename, nullptr, nullptr, nullptr, false); // add dev section add_ha_dev_section(doc.as<JsonObject>(), devicename, nullptr, nullptr, nullptr, false); // add dev section
add_ha_avty_section(doc.as<JsonObject>(), topic_t, seltemp_cond, has_roomtemp ? currtemp_cond : nullptr, hc_mode_cond); // add availability section add_ha_avty_section(doc.as<JsonObject>(), topic_t, seltemp_cond, has_roomtemp ? currtemp_cond : nullptr, hc_mode_cond); // add availability section

View File

@@ -113,7 +113,7 @@ class Mqtt {
const bool create_device_config = false); const bool create_device_config = false);
static bool publish_system_ha_sensor_config(uint8_t type, const char * name, const char * entity, const uint8_t uom); static bool publish_system_ha_sensor_config(uint8_t type, const char * name, const char * entity, const uint8_t uom);
static bool publish_ha_climate_config(const int8_t tag, const bool has_roomtemp, const bool remove = false, const int16_t min = 5, const uint32_t max = 30); static bool publish_ha_climate_config(const DeviceValue & dv, const bool has_roomtemp, const char * const ** mode_options, const bool remove = false);
static void show_topic_handlers(uuid::console::Shell & shell, const uint8_t device_type); static void show_topic_handlers(uuid::console::Shell & shell, const uint8_t device_type);
static void show_mqtt(uuid::console::Shell & shell); static void show_mqtt(uuid::console::Shell & shell);

View File

@@ -211,7 +211,7 @@ void Shower::create_ha_discovery() {
doc["stat_t"] = "~/shower_active"; doc["stat_t"] = "~/shower_active";
Mqtt::add_ha_bool(doc.as<JsonObject>()); Mqtt::add_ha_bool(doc.as<JsonObject>());
Mqtt::add_ha_dev_section(doc.as<JsonObject>(), "Shower Sensor", nullptr, nullptr, nullptr, false); Mqtt::add_ha_dev_section(doc.as<JsonObject>(), "Shower Sensors", nullptr, nullptr, nullptr, false);
Mqtt::add_ha_avty_section(doc.as<JsonObject>()); // no conditions Mqtt::add_ha_avty_section(doc.as<JsonObject>()); // no conditions
snprintf(topic, sizeof(topic), "binary_sensor/%s/shower_active/config", Mqtt::basename().c_str()); snprintf(topic, sizeof(topic), "binary_sensor/%s/shower_active/config", Mqtt::basename().c_str());
@@ -239,7 +239,7 @@ void Shower::create_ha_discovery() {
doc["dev_cla"] = "duration"; doc["dev_cla"] = "duration";
// doc["ent_cat"] = "diagnostic"; // doc["ent_cat"] = "diagnostic";
Mqtt::add_ha_dev_section(doc.as<JsonObject>(), "Shower Sensor", nullptr, nullptr, nullptr, false); Mqtt::add_ha_dev_section(doc.as<JsonObject>(), "Shower Sensors", nullptr, "EMS-ESP", EMSESP_APP_VERSION, true);
Mqtt::add_ha_avty_section(doc.as<JsonObject>(), "~/shower_data", "value_json.duration is defined"); Mqtt::add_ha_avty_section(doc.as<JsonObject>(), "~/shower_data", "value_json.duration is defined");
snprintf(topic, sizeof(topic), "sensor/%s/shower_duration/config", Mqtt::basename().c_str()); snprintf(topic, sizeof(topic), "sensor/%s/shower_duration/config", Mqtt::basename().c_str());

View File

@@ -1804,6 +1804,30 @@ std::string System::get_metrics_prometheus() {
return result; return result;
} }
// return IP or hostname of the EMS-ESP device
String System::get_ip_or_hostname() {
String result = "ems-esp";
#ifndef EMSESP_STANDALONE
EMSESP::esp32React.getNetworkSettingsService()->read([&](NetworkSettings & settings) {
if (settings.enableMDNS) {
if (EMSESP::system_.ethernet_connected()) {
result = ETH.getHostname();
} else if (WiFi.status() == WL_CONNECTED) {
result = WiFi.getHostname();
}
} else {
// no DNS, use the IP
if (EMSESP::system_.ethernet_connected()) {
result = ETH.localIP().toString();
} else if (WiFi.status() == WL_CONNECTED) {
result = WiFi.localIP().toString();
}
}
});
#endif
return result;
}
// export status information including the device information // export status information including the device information
// http://ems-esp/api/system/info // http://ems-esp/api/system/info
bool System::command_info(const char * value, const int8_t id, JsonObject output) { bool System::command_info(const char * value, const int8_t id, JsonObject output) {
@@ -2371,7 +2395,6 @@ String System::getBBQKeesGatewayDetails(uint8_t detail) {
// This is to avoid timeouts in callback functions, like calling from a web hook. // This is to avoid timeouts in callback functions, like calling from a web hook.
bool System::uploadFirmwareURL(const char * url) { bool System::uploadFirmwareURL(const char * url) {
#ifndef EMSESP_STANDALONE #ifndef EMSESP_STANDALONE
static String saved_url; static String saved_url;
if (url && strlen(url) > 0) { if (url && strlen(url) > 0) {

View File

@@ -92,8 +92,8 @@ class System {
static bool command_response(const char * value, const int8_t id, JsonObject output); static bool command_response(const char * value, const int8_t id, JsonObject output);
static bool command_service(const char * cmd, const char * value); static bool command_service(const char * cmd, const char * value);
static bool get_value_info(JsonObject root, const char * cmd); static bool get_value_info(JsonObject root, const char * cmd);
static void get_value_json(JsonObject output, const std::string & circuit, const std::string & name, JsonVariant val); static void get_value_json(JsonObject output, const std::string & circuit, const std::string & name, JsonVariant val);
static std::string get_metrics_prometheus(); static std::string get_metrics_prometheus();
#if defined(EMSESP_TEST) #if defined(EMSESP_TEST)
@@ -151,6 +151,8 @@ class System {
static bool readCommand(const char * data); static bool readCommand(const char * data);
static String get_ip_or_hostname();
void dallas_gpio(uint8_t gpio) { void dallas_gpio(uint8_t gpio) {
dallas_gpio_ = gpio; dallas_gpio_ = gpio;
} }

View File

@@ -545,7 +545,7 @@ void TemperatureSensor::publish_values(const bool force) {
// see if we need to create the [devs] discovery section, as this needs only to be done once for all sensors // see if we need to create the [devs] discovery section, as this needs only to be done once for all sensors
if (std::none_of(sensors_.begin(), sensors_.end(), [](const auto & sensor) { return sensor.ha_registered; })) { if (std::none_of(sensors_.begin(), sensors_.end(), [](const auto & sensor) { return sensor.ha_registered; })) {
Mqtt::add_ha_dev_section(config.as<JsonObject>(), "Temperature Sensors", nullptr, nullptr, nullptr, false); Mqtt::add_ha_dev_section(config.as<JsonObject>(), "Temperature Sensors", nullptr, "EMS-ESP", EMSESP_APP_VERSION, true);
} }
Mqtt::add_ha_avty_section(config.as<JsonObject>(), stat_t, val_cond); Mqtt::add_ha_avty_section(config.as<JsonObject>(), stat_t, val_cond);

View File

@@ -82,7 +82,7 @@ class TemperatureSensor {
char name_[20]; char name_[20];
int16_t offset_; int16_t offset_;
bool is_system_; bool is_system_;
}; };
TemperatureSensor() = default; TemperatureSensor() = default;
@@ -124,7 +124,7 @@ class TemperatureSensor {
return sensors_.size(); return sensors_.size();
} }
bool update(const char* id, const char* name, int16_t offset, bool hide = false, bool is_system = false); bool update(const char * id, const char * name, int16_t offset, bool hide = false, bool is_system = false);
#if defined(EMSESP_TEST) #if defined(EMSESP_TEST)
void load_test_data(); void load_test_data();
@@ -166,7 +166,7 @@ class TemperatureSensor {
int16_t get_temperature_c(const uint8_t addr[]); int16_t get_temperature_c(const uint8_t addr[]);
uint64_t get_id(const uint8_t addr[]); uint64_t get_id(const uint8_t addr[]);
void get_value_json(JsonObject output, const Sensor & sensor); void get_value_json(JsonObject output, const Sensor & sensor);
void remove_ha_topic(const char* id); void remove_ha_topic(const char * id);
std::vector<Sensor, AllocatorPSRAM<Sensor>> sensors_; // our list of active sensors std::vector<Sensor, AllocatorPSRAM<Sensor>> sensors_; // our list of active sensors

View File

@@ -1 +1 @@
#define EMSESP_APP_VERSION "3.7.3-dev.35" #define EMSESP_APP_VERSION "3.7.3-dev.36"

View File

@@ -466,7 +466,7 @@ void WebCustomEntityService::publish(const bool force) {
Mqtt::add_ha_classes(config.as<JsonObject>(), EMSdevice::DeviceType::SYSTEM, entityItem.value_type, entityItem.uom); Mqtt::add_ha_classes(config.as<JsonObject>(), EMSdevice::DeviceType::SYSTEM, entityItem.value_type, entityItem.uom);
if (!ha_created) { if (!ha_created) {
Mqtt::add_ha_dev_section(config.as<JsonObject>(), "Custom Entities", nullptr, nullptr, nullptr, false); Mqtt::add_ha_dev_section(config.as<JsonObject>(), "Custom Entities", nullptr, "EMS-ESP", EMSESP_APP_VERSION, true);
} }
Mqtt::add_ha_avty_section(config.as<JsonObject>(), stat_t, val_cond); Mqtt::add_ha_avty_section(config.as<JsonObject>(), stat_t, val_cond);

View File

@@ -276,7 +276,7 @@ void WebSchedulerService::publish(const bool force) {
Mqtt::add_ha_bool(config.as<JsonObject>()); Mqtt::add_ha_bool(config.as<JsonObject>());
if (!ha_created) { if (!ha_created) {
Mqtt::add_ha_dev_section(config.as<JsonObject>(), F_(scheduler), nullptr, nullptr, nullptr, false); Mqtt::add_ha_dev_section(config.as<JsonObject>(), F_(scheduler), nullptr, "EMS-ESP", EMSESP_APP_VERSION, true);
} }
Mqtt::add_ha_avty_section(config.as<JsonObject>(), stat_t, val_cond); Mqtt::add_ha_avty_section(config.as<JsonObject>(), stat_t, val_cond);