diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md
index 1f2ee87d0..8e854164d 100644
--- a/CHANGELOG_LATEST.md
+++ b/CHANGELOG_LATEST.md
@@ -11,6 +11,9 @@ For more details go to [docs.emsesp.org](https://docs.emsesp.org/).
- boiler auxheatersource [#2489](https://github.com/emsesp/EMS-ESP32/discussions/2489)
- thermostat last error for RC100/300 [#2501](https://github.com/emsesp/EMS-ESP32/issues/2501)
- boiler 0xC6 telegram [#1963](https://github.com/emsesp/EMS-ESP32/issues/1963)
+- HA optimistic [#2551](https://github.com/emsesp/EMS-ESP32/issues/2551)
+- 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)
## Fixed
@@ -21,6 +24,7 @@ For more details go to [docs.emsesp.org](https://docs.emsesp.org/).
- also rebuild HA config on mqtt connect for scheduler, custom and shower
- FB100 controls the hc, not the master [#2510](https://github.com/emsesp/EMS-ESP32/issues/2510)
- IPM DHW module, [#2524](https://github.com/emsesp/EMS-ESP32/issues/2524)
+- charge optimization [#2543](https://github.com/emsesp/EMS-ESP32/issues/2543)
## Changed
diff --git a/interface/package.json b/interface/package.json
index 2ed0ed383..4fa01c7c6 100644
--- a/interface/package.json
+++ b/interface/package.json
@@ -24,41 +24,41 @@
"@alova/adapter-xhr": "2.1.1",
"@emotion/react": "^11.14.0",
"@emotion/styled": "^11.14.0",
- "@mui/icons-material": "^7.0.2",
- "@mui/material": "^7.0.2",
+ "@mui/icons-material": "^7.1.0",
+ "@mui/material": "^7.1.0",
"@table-library/react-table-library": "4.1.15",
- "formidable": "^3.5.4",
"alova": "3.2.10",
"async-validator": "^4.2.5",
+ "formidable": "^3.5.4",
"jwt-decode": "^4.0.0",
"magic-string": "^0.30.17",
"mime-types": "^3.0.1",
- "preact": "^10.26.5",
+ "preact": "^10.26.6",
"react": "^19.1.0",
"react-dom": "^19.1.0",
"react-icons": "^5.5.0",
- "react-router": "^7.5.1",
+ "react-router": "^7.6.0",
"react-toastify": "^11.0.5",
"typesafe-i18n": "^5.26.2",
"typescript": "^5.8.3"
},
"devDependencies": {
- "@babel/core": "^7.26.10",
- "@eslint/js": "^9.25.1",
+ "@babel/core": "^7.27.1",
+ "@eslint/js": "^9.26.0",
"@preact/compat": "^18.3.1",
"@preact/preset-vite": "^2.10.1",
"@trivago/prettier-plugin-sort-imports": "^5.2.2",
- "@types/node": "^22.14.1",
- "@types/react": "^19.1.2",
- "@types/react-dom": "^19.1.2",
+ "@types/node": "^22.15.17",
+ "@types/react": "^19.1.3",
+ "@types/react-dom": "^19.1.3",
"concurrently": "^9.1.2",
- "eslint": "^9.25.1",
- "eslint-config-prettier": "^10.1.2",
+ "eslint": "^9.26.0",
+ "eslint-config-prettier": "^10.1.5",
"prettier": "^3.5.3",
"rollup-plugin-visualizer": "^5.14.0",
"terser": "^5.39.0",
- "typescript-eslint": "8.31.0",
- "vite": "^6.3.2",
+ "typescript-eslint": "8.32.0",
+ "vite": "^6.3.5",
"vite-plugin-imagemin": "^0.6.1",
"vite-tsconfig-paths": "^5.1.4"
},
diff --git a/interface/src/api/app.ts b/interface/src/api/app.ts
index a56f4db53..d670a5749 100644
--- a/interface/src/api/app.ts
+++ b/interface/src/api/app.ts
@@ -143,7 +143,8 @@ export const readCustomEntities = () =>
o_name: ei.name,
o_writeable: ei.writeable,
o_value: ei.value,
- o_deleted: ei.deleted
+ o_deleted: ei.deleted,
+ o_hide: ei.hide
}));
}
});
diff --git a/interface/src/app/main/CustomEntities.tsx b/interface/src/app/main/CustomEntities.tsx
index 73e109827..fac37a376 100644
--- a/interface/src/app/main/CustomEntities.tsx
+++ b/interface/src/app/main/CustomEntities.tsx
@@ -76,6 +76,7 @@ const CustomEntities = () => {
ei.factor !== ei.o_factor ||
ei.value_type !== ei.o_value_type ||
ei.writeable !== ei.o_writeable ||
+ ei.hide !== ei.o_hide ||
ei.deleted !== ei.o_deleted ||
(ei.value || '') !== (ei.o_value || '')
);
@@ -147,6 +148,7 @@ const CustomEntities = () => {
factor: condensed_ei.factor,
uom: condensed_ei.uom,
writeable: condensed_ei.writeable,
+ hide: condensed_ei.hide,
value_type: condensed_ei.value_type,
value: condensed_ei.value
}))
@@ -209,6 +211,7 @@ const CustomEntities = () => {
value_type: item.value_type,
writeable: item.writeable,
deleted: false,
+ hide: item.hide,
value: item.value
});
setDialogOpen(true);
diff --git a/interface/src/app/main/CustomEntitiesDialog.tsx b/interface/src/app/main/CustomEntitiesDialog.tsx
index 32550cf6c..152dd2c80 100644
--- a/interface/src/app/main/CustomEntitiesDialog.tsx
+++ b/interface/src/app/main/CustomEntitiesDialog.tsx
@@ -2,7 +2,11 @@ import { useEffect, useState } from 'react';
import AddIcon from '@mui/icons-material/Add';
import CancelIcon from '@mui/icons-material/Cancel';
+import CommentsDisabledOutlinedIcon from '@mui/icons-material/CommentsDisabledOutlined';
import DoneIcon from '@mui/icons-material/Done';
+import EditOffOutlinedIcon from '@mui/icons-material/EditOffOutlined';
+import EditOutlinedIcon from '@mui/icons-material/EditOutlined';
+import InsertCommentOutlinedIcon from '@mui/icons-material/InsertCommentOutlined';
import RemoveIcon from '@mui/icons-material/RemoveCircleOutline';
import {
Box,
@@ -128,6 +132,20 @@ const CustomEntitiesDialog = ({
onChange={updateFormValue}
/>
+
+ }
+ checkedIcon={}
+ checked={editItem.hide}
+ onChange={updateFormValue}
+ name="hide"
+ />
+ }
+ label="API/Mqtt"
+ />
+
-
+
}
+ checkedIcon={}
checked={editItem.writeable}
onChange={updateFormValue}
name="writeable"
diff --git a/interface/src/app/main/Customizations.tsx b/interface/src/app/main/Customizations.tsx
index 06d25b478..4da4ec2ae 100644
--- a/interface/src/app/main/Customizations.tsx
+++ b/interface/src/app/main/Customizations.tsx
@@ -306,7 +306,7 @@ const Customizations = () => {
const filter_entity = (de: DeviceEntity) =>
(de.m & selectedFilters || !selectedFilters) &&
- formatName(de, true).includes(search);
+ formatName(de, true).toLowerCase().includes(search.toLowerCase());
const maskDisabled = (set: boolean) => {
setDeviceEntities(
diff --git a/interface/src/app/main/Devices.tsx b/interface/src/app/main/Devices.tsx
index 5f5de5fb1..5d6affdc0 100644
--- a/interface/src/app/main/Devices.tsx
+++ b/interface/src/app/main/Devices.tsx
@@ -600,9 +600,11 @@ const Devices = () => {
? deviceData.nodes.filter(
(dv) =>
hasMask(dv.id, DeviceEntityMask.DV_FAVORITE) &&
- dv.id.slice(2).includes(search)
+ dv.id.slice(2).toLowerCase().includes(search.toLowerCase())
)
- : deviceData.nodes.filter((dv) => dv.id.slice(2).includes(search));
+ : deviceData.nodes.filter((dv) =>
+ dv.id.slice(2).toLowerCase().includes(search.toLowerCase())
+ );
const deviceIndex = coreData.devices.findIndex(
(d) => d.id === device_select.state.id
diff --git a/interface/src/app/main/types.ts b/interface/src/app/main/types.ts
index 38b521563..2f967eacd 100644
--- a/interface/src/app/main/types.ts
+++ b/interface/src/app/main/types.ts
@@ -384,6 +384,7 @@ export interface EntityItem {
value_type: number;
value?: unknown;
writeable: boolean;
+ hide: boolean;
deleted?: boolean;
o_id?: number;
o_ram?: number;
@@ -397,6 +398,7 @@ export interface EntityItem {
o_deleted?: boolean;
o_writeable?: boolean;
o_value?: unknown;
+ o_hide?: boolean;
}
export interface Entities {
diff --git a/interface/src/app/settings/MqttSettings.tsx b/interface/src/app/settings/MqttSettings.tsx
index 8cbac5d9e..c8567e435 100644
--- a/interface/src/app/settings/MqttSettings.tsx
+++ b/interface/src/app/settings/MqttSettings.tsx
@@ -254,102 +254,112 @@ const MqttSettings = () => {
}
label={LL.MQTT_RESPONSE()}
/>
- {!data.ha_enabled && (
-
+
+
+
+ }
+ label={LL.MQTT_PUBLISH_TEXT_1()}
+ />
+
+ {data.publish_single && (
}
- label={LL.MQTT_PUBLISH_TEXT_1()}
+ label={LL.MQTT_PUBLISH_TEXT_2()}
/>
- {data.publish_single && (
+ )}
+
+
+
+
+ }
+ label={LL.MQTT_PUBLISH_TEXT_3()}
+ />
+ {data.ha_enabled && data.discovery_type === 0 && (
+
+ }
+ label="Optimistic"
+ />
+ )}
+
+ {data.ha_enabled && (
+
-
- }
- label={LL.MQTT_PUBLISH_TEXT_2()}
+
+
+
+
+
+
+
+
- )}
-
- )}
- {!data.publish_single && (
-
-
-
- }
- label={LL.MQTT_PUBLISH_TEXT_3()}
- />
-
- {data.ha_enabled && (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
- )}
-
- )}
+
+ )}
+
{LL.MQTT_PUBLISH_INTERVALS()} (0=auto)
@@ -442,7 +452,7 @@ const MqttSettings = () => {
=8.0.0
+ checksum: 10c0/c0f4f2bd73b7b7a9de74b716a664873d08ab71ab439e51befe77d61915af41a81ecec93b408778b3a7856185244c34c2c8ee28912072ec14def84ba2dec70adf
+ languageName: node
+ linkType: hard
+
"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.12.1":
version: 4.12.1
resolution: "@eslint-community/regexpp@npm:4.12.1"
@@ -653,10 +839,10 @@ __metadata:
languageName: node
linkType: hard
-"@eslint/js@npm:9.25.1, @eslint/js@npm:^9.25.1":
- version: 9.25.1
- resolution: "@eslint/js@npm:9.25.1"
- checksum: 10c0/87d86b512ab109bfd3b9317ced3220ea3d444ac3bfa7abd853ca7f724d72c36e213062f9def16a632365d97dc29e0094312e3682a9767590ee6f43b3d5d873fd
+"@eslint/js@npm:9.26.0, @eslint/js@npm:^9.26.0":
+ version: 9.26.0
+ resolution: "@eslint/js@npm:9.26.0"
+ checksum: 10c0/89fa45b7ff7f3c2589ea1f04a31b4f6d41ad85ecac98e519195e8b3a908b103c892ac19c4aec0629cfeccefd9e5b63c2f1269183d63016e7de722b97a085dcf4
languageName: node
linkType: hard
@@ -790,38 +976,56 @@ __metadata:
languageName: node
linkType: hard
-"@mui/core-downloads-tracker@npm:^7.0.2":
- version: 7.0.2
- resolution: "@mui/core-downloads-tracker@npm:7.0.2"
- checksum: 10c0/20cb142d8c38b93c6290eb7d57f0d1d34a6821168e3085d139dbe6b82e9e9101095521869e6e0c9c12126757a32300bb01c15aacd3f308a0d9d18ce42944116c
+"@modelcontextprotocol/sdk@npm:^1.8.0":
+ version: 1.11.0
+ resolution: "@modelcontextprotocol/sdk@npm:1.11.0"
+ dependencies:
+ content-type: "npm:^1.0.5"
+ cors: "npm:^2.8.5"
+ cross-spawn: "npm:^7.0.3"
+ eventsource: "npm:^3.0.2"
+ express: "npm:^5.0.1"
+ express-rate-limit: "npm:^7.5.0"
+ pkce-challenge: "npm:^5.0.0"
+ raw-body: "npm:^3.0.0"
+ zod: "npm:^3.23.8"
+ zod-to-json-schema: "npm:^3.24.1"
+ checksum: 10c0/10ce5ebe54b238df614051e0f2ef8f037fee6ceda7a870f5892c84efe21cbdcdb7e932d9be25e91982e0eb40e4c8ed33da9b0b2ca01df6baa76eb0cd5cb89ce6
languageName: node
linkType: hard
-"@mui/icons-material@npm:^7.0.2":
- version: 7.0.2
- resolution: "@mui/icons-material@npm:7.0.2"
+"@mui/core-downloads-tracker@npm:^7.1.0":
+ version: 7.1.0
+ resolution: "@mui/core-downloads-tracker@npm:7.1.0"
+ checksum: 10c0/6821bfa3884ce35480e843d196031d0d44a5da6e54d48171a44fc815c95e9fd9e1428b2a8a13545ab1cebecc2786cc302442808fcea459ad5daf42cfcc409d3b
+ languageName: node
+ linkType: hard
+
+"@mui/icons-material@npm:^7.1.0":
+ version: 7.1.0
+ resolution: "@mui/icons-material@npm:7.1.0"
dependencies:
- "@babel/runtime": "npm:^7.27.0"
+ "@babel/runtime": "npm:^7.27.1"
peerDependencies:
- "@mui/material": ^7.0.2
+ "@mui/material": ^7.1.0
"@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0
react: ^17.0.0 || ^18.0.0 || ^19.0.0
peerDependenciesMeta:
"@types/react":
optional: true
- checksum: 10c0/5c4e6348046cbdc305477a26fe100ad47f0f88a8d2eca37f5807c9c55c05bce61e66a1e1f7e57c239a1132de3fdbe7a13a79d661e4ebf2d9586fa292a88eb687
+ checksum: 10c0/d83c5a1506526525fa93053b4ecd4ff498236a415f7594e75252fbec7e4584bb8470db3e04198a4924e8bd67af96cbaf93a9dee0f0ef9fa19a999bd6ade01734
languageName: node
linkType: hard
-"@mui/material@npm:^7.0.2":
- version: 7.0.2
- resolution: "@mui/material@npm:7.0.2"
+"@mui/material@npm:^7.1.0":
+ version: 7.1.0
+ resolution: "@mui/material@npm:7.1.0"
dependencies:
- "@babel/runtime": "npm:^7.27.0"
- "@mui/core-downloads-tracker": "npm:^7.0.2"
- "@mui/system": "npm:^7.0.2"
- "@mui/types": "npm:^7.4.1"
- "@mui/utils": "npm:^7.0.2"
+ "@babel/runtime": "npm:^7.27.1"
+ "@mui/core-downloads-tracker": "npm:^7.1.0"
+ "@mui/system": "npm:^7.1.0"
+ "@mui/types": "npm:^7.4.2"
+ "@mui/utils": "npm:^7.1.0"
"@popperjs/core": "npm:^2.11.8"
"@types/react-transition-group": "npm:^4.4.12"
clsx: "npm:^2.1.1"
@@ -832,7 +1036,7 @@ __metadata:
peerDependencies:
"@emotion/react": ^11.5.0
"@emotion/styled": ^11.3.0
- "@mui/material-pigment-css": ^7.0.2
+ "@mui/material-pigment-css": ^7.1.0
"@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0
react: ^17.0.0 || ^18.0.0 || ^19.0.0
react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0
@@ -845,16 +1049,16 @@ __metadata:
optional: true
"@types/react":
optional: true
- checksum: 10c0/ca854ca668ec06d57ea9b26d968c1187b56e12cd48b1ed9cccf1c7c1753878e161364cfadbb826cfa2274137080d3cc87d4968a77a71d61f80c123e6978984f8
+ checksum: 10c0/c85fb340af32fdeb46a48e799a442af2a140bd75eca3c24919462e7c1a27ebb6457f1e9da68aea6f4557b54f662915fa42c6c9a642549d0d668275b18bbe865e
languageName: node
linkType: hard
-"@mui/private-theming@npm:^7.0.2":
- version: 7.0.2
- resolution: "@mui/private-theming@npm:7.0.2"
+"@mui/private-theming@npm:^7.1.0":
+ version: 7.1.0
+ resolution: "@mui/private-theming@npm:7.1.0"
dependencies:
- "@babel/runtime": "npm:^7.27.0"
- "@mui/utils": "npm:^7.0.2"
+ "@babel/runtime": "npm:^7.27.1"
+ "@mui/utils": "npm:^7.1.0"
prop-types: "npm:^15.8.1"
peerDependencies:
"@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0
@@ -862,15 +1066,15 @@ __metadata:
peerDependenciesMeta:
"@types/react":
optional: true
- checksum: 10c0/a2154b0473cab717742abe8f54e2c674ba53f4cd495970addfa5c9c0f3dcbf9d49000503b592873ad389e0c42fae28b40912e0c47d44378a0afbb70fbbb4613a
+ checksum: 10c0/e27c8c6da0cdcb5a82b6284e1474331a4cf79fb34007ec86ecddf9e5811dd276e9b7f1245eee6ffbc4ee19409e253cf91360d8aedefcf0ff79f418ed4fa75e41
languageName: node
linkType: hard
-"@mui/styled-engine@npm:^7.0.2":
- version: 7.0.2
- resolution: "@mui/styled-engine@npm:7.0.2"
+"@mui/styled-engine@npm:^7.1.0":
+ version: 7.1.0
+ resolution: "@mui/styled-engine@npm:7.1.0"
dependencies:
- "@babel/runtime": "npm:^7.27.0"
+ "@babel/runtime": "npm:^7.27.1"
"@emotion/cache": "npm:^11.13.5"
"@emotion/serialize": "npm:^1.3.3"
"@emotion/sheet": "npm:^1.4.0"
@@ -885,19 +1089,19 @@ __metadata:
optional: true
"@emotion/styled":
optional: true
- checksum: 10c0/3a8293bf2e28afe0a11e655634881ac1cf814a8fa56bd4eb4d7a9b97e007c6eb6b991f4f1b780bdac81481f9a28b0b690d4e6ed184315ce2c9bd81c0ef12165b
+ checksum: 10c0/face9438a12537dbf57b35cc231c3be990af22bdce73172256ba0380673bfa90d200a49b08ede835862f8fbc7e2afde35436647a0ddd186058230acc91e18f4b
languageName: node
linkType: hard
-"@mui/system@npm:^7.0.2":
- version: 7.0.2
- resolution: "@mui/system@npm:7.0.2"
+"@mui/system@npm:^7.1.0":
+ version: 7.1.0
+ resolution: "@mui/system@npm:7.1.0"
dependencies:
- "@babel/runtime": "npm:^7.27.0"
- "@mui/private-theming": "npm:^7.0.2"
- "@mui/styled-engine": "npm:^7.0.2"
- "@mui/types": "npm:^7.4.1"
- "@mui/utils": "npm:^7.0.2"
+ "@babel/runtime": "npm:^7.27.1"
+ "@mui/private-theming": "npm:^7.1.0"
+ "@mui/styled-engine": "npm:^7.1.0"
+ "@mui/types": "npm:^7.4.2"
+ "@mui/utils": "npm:^7.1.0"
clsx: "npm:^2.1.1"
csstype: "npm:^3.1.3"
prop-types: "npm:^15.8.1"
@@ -913,30 +1117,30 @@ __metadata:
optional: true
"@types/react":
optional: true
- checksum: 10c0/d8a399d8e9ebd0021a355299e46389c9c5ad6e22f308e268b2a07fe99cc8106a4fa026f4fe3050bc1f31959ca9a98e10115d278a9ab412ade0cbc5ec8e7b2af4
+ checksum: 10c0/9123bb82f39bdf9bde5b4d78b83db409c4cc86a308110b172b01860349c9a366378b10c6a51c9847375bc8bec91726a79dc3389d6df3db2aa71064983c367c9d
languageName: node
linkType: hard
-"@mui/types@npm:^7.4.1":
- version: 7.4.1
- resolution: "@mui/types@npm:7.4.1"
+"@mui/types@npm:^7.4.2":
+ version: 7.4.2
+ resolution: "@mui/types@npm:7.4.2"
dependencies:
- "@babel/runtime": "npm:^7.27.0"
+ "@babel/runtime": "npm:^7.27.1"
peerDependencies:
"@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0
peerDependenciesMeta:
"@types/react":
optional: true
- checksum: 10c0/958a1dd29956b4646058c7bf5615cb5211736568b9997e8baac4698b02189cdfd7aa880fa935c59138dfa9e9163549ca6c509142da28add835abeff3c68d6ccf
+ checksum: 10c0/9401abf306c5c993e7b21136684f80d4aefe28e00d435fccb963611bf009af71dfcf65e509c1db720a0c7d5bf9a364706aa38bd8c0a3b47718aca60f7063aac7
languageName: node
linkType: hard
-"@mui/utils@npm:^7.0.2":
- version: 7.0.2
- resolution: "@mui/utils@npm:7.0.2"
+"@mui/utils@npm:^7.1.0":
+ version: 7.1.0
+ resolution: "@mui/utils@npm:7.1.0"
dependencies:
- "@babel/runtime": "npm:^7.27.0"
- "@mui/types": "npm:^7.4.1"
+ "@babel/runtime": "npm:^7.27.1"
+ "@mui/types": "npm:^7.4.2"
"@types/prop-types": "npm:^15.7.14"
clsx: "npm:^2.1.1"
prop-types: "npm:^15.8.1"
@@ -947,7 +1151,14 @@ __metadata:
peerDependenciesMeta:
"@types/react":
optional: true
- checksum: 10c0/2409d6f9ede9b5c5bdff6893d1f077eb84fa816ac5a7e36a9b6878b1f228e89d9b3bf684d64328f7a62d5036a2c02fb4934a4f9a12648796b833e5390e48d0dd
+ checksum: 10c0/1fa21c44c54161b2239207c1900f3960a1cea5c7a3fda5f830308c8a08b05a46c7bc2dbb467baf5c2d3742677b2b19be1508d17a1dff388c9226d3663460ad08
+ languageName: node
+ linkType: hard
+
+"@noble/hashes@npm:^1.1.5":
+ version: 1.8.0
+ resolution: "@noble/hashes@npm:1.8.0"
+ checksum: 10c0/06a0b52c81a6fa7f04d67762e08b2c476a00285858150caeaaff4037356dd5e119f45b2a530f638b77a5eeca013168ec1b655db41bae3236cb2e9d511484fc77
languageName: node
linkType: hard
@@ -1000,6 +1211,15 @@ __metadata:
languageName: node
linkType: hard
+"@paralleldrive/cuid2@npm:^2.2.2":
+ version: 2.2.2
+ resolution: "@paralleldrive/cuid2@npm:2.2.2"
+ dependencies:
+ "@noble/hashes": "npm:^1.1.5"
+ checksum: 10c0/af5826df93de437121308f4f4ce0b2eeb89b60bb57a1a6592fb89c0d40d311ad1d9f3f6a4db2cce6f2bcf572de1aa3f85704254e89b18ce61c41ebb06564c4ee
+ languageName: node
+ linkType: hard
+
"@pkgjs/parseargs@npm:^0.11.0":
version: 0.11.0
resolution: "@pkgjs/parseargs@npm:0.11.0"
@@ -1399,7 +1619,7 @@ __metadata:
languageName: node
linkType: hard
-"@types/node@npm:*, @types/node@npm:^22.15.2":
+"@types/node@npm:*":
version: 22.15.2
resolution: "@types/node@npm:22.15.2"
dependencies:
@@ -1408,6 +1628,15 @@ __metadata:
languageName: node
linkType: hard
+"@types/node@npm:^22.15.17":
+ version: 22.15.17
+ resolution: "@types/node@npm:22.15.17"
+ dependencies:
+ undici-types: "npm:~6.21.0"
+ checksum: 10c0/fb92aa10b628683c5b965749f955bc2322485ecb0ea6c2f4cae5f2c7537a16834607e67083a9e9281faaae8d7dee9ada8d6a5c0de9a52c17d82912ef00c0fdd4
+ languageName: node
+ linkType: hard
+
"@types/parse-json@npm:^4.0.0":
version: 4.0.2
resolution: "@types/parse-json@npm:4.0.2"
@@ -1422,12 +1651,12 @@ __metadata:
languageName: node
linkType: hard
-"@types/react-dom@npm:^19.1.2":
- version: 19.1.2
- resolution: "@types/react-dom@npm:19.1.2"
+"@types/react-dom@npm:^19.1.3":
+ version: 19.1.3
+ resolution: "@types/react-dom@npm:19.1.3"
peerDependencies:
"@types/react": ^19.0.0
- checksum: 10c0/100c341cacba9ec8ae1d47ee051072a3450e9573bf8eeb7262490e341cb246ea0f95a07a1f2077e61cf92648f812a0324c602fcd811bd87b7ce41db2811510cd
+ checksum: 10c0/bb1e3f7a446958f5aa7e46f74cf8470dab7444ab958a57efacca1abcc9847e4ca71e2df68515176ed8fe3fc89315bd949d60f1f346cbadbdbf302bff59d3961b
languageName: node
linkType: hard
@@ -1440,12 +1669,12 @@ __metadata:
languageName: node
linkType: hard
-"@types/react@npm:^19.1.2":
- version: 19.1.2
- resolution: "@types/react@npm:19.1.2"
+"@types/react@npm:^19.1.3":
+ version: 19.1.3
+ resolution: "@types/react@npm:19.1.3"
dependencies:
csstype: "npm:^3.0.2"
- checksum: 10c0/76ffe71395c713d4adc3c759465012d3c956db00af35ab7c6d0d91bd07b274b7ce69caa0478c0760311587bd1e38c78ffc9688ebc629f2b266682a19d8750947
+ checksum: 10c0/f158f88871b8df1eeed637942d3e6142abcf505b617e4921ef3763b6d4f22241b9a883d864878dd2b6a2bdc8f4e7f871f24ef88f633d144a63257f4764b9478d
languageName: node
linkType: hard
@@ -1467,115 +1696,115 @@ __metadata:
languageName: node
linkType: hard
-"@typescript-eslint/eslint-plugin@npm:8.31.0":
- version: 8.31.0
- resolution: "@typescript-eslint/eslint-plugin@npm:8.31.0"
+"@typescript-eslint/eslint-plugin@npm:8.32.0":
+ version: 8.32.0
+ resolution: "@typescript-eslint/eslint-plugin@npm:8.32.0"
dependencies:
"@eslint-community/regexpp": "npm:^4.10.0"
- "@typescript-eslint/scope-manager": "npm:8.31.0"
- "@typescript-eslint/type-utils": "npm:8.31.0"
- "@typescript-eslint/utils": "npm:8.31.0"
- "@typescript-eslint/visitor-keys": "npm:8.31.0"
+ "@typescript-eslint/scope-manager": "npm:8.32.0"
+ "@typescript-eslint/type-utils": "npm:8.32.0"
+ "@typescript-eslint/utils": "npm:8.32.0"
+ "@typescript-eslint/visitor-keys": "npm:8.32.0"
graphemer: "npm:^1.4.0"
ignore: "npm:^5.3.1"
natural-compare: "npm:^1.4.0"
- ts-api-utils: "npm:^2.0.1"
+ ts-api-utils: "npm:^2.1.0"
peerDependencies:
"@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0
eslint: ^8.57.0 || ^9.0.0
typescript: ">=4.8.4 <5.9.0"
- checksum: 10c0/7d78e0cdcc967742752d49d2d38986ee38d0b7ca64af247e5fe0816cea9ae5f1bfa5c126154acc0846af515c4fb1c52c96926ee25c73b4c3f7e6fd73cb6d2b0e
+ checksum: 10c0/db3d151386d7f086a2289ff21c12bff6d2c9e1e1fab7e20be627927604621618cfcfbe3289a1acf7ed7c0e465b64a696f02f3a95eac0aaafd1fe9d5431efe7b5
languageName: node
linkType: hard
-"@typescript-eslint/parser@npm:8.31.0":
- version: 8.31.0
- resolution: "@typescript-eslint/parser@npm:8.31.0"
+"@typescript-eslint/parser@npm:8.32.0":
+ version: 8.32.0
+ resolution: "@typescript-eslint/parser@npm:8.32.0"
dependencies:
- "@typescript-eslint/scope-manager": "npm:8.31.0"
- "@typescript-eslint/types": "npm:8.31.0"
- "@typescript-eslint/typescript-estree": "npm:8.31.0"
- "@typescript-eslint/visitor-keys": "npm:8.31.0"
+ "@typescript-eslint/scope-manager": "npm:8.32.0"
+ "@typescript-eslint/types": "npm:8.32.0"
+ "@typescript-eslint/typescript-estree": "npm:8.32.0"
+ "@typescript-eslint/visitor-keys": "npm:8.32.0"
debug: "npm:^4.3.4"
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: ">=4.8.4 <5.9.0"
- checksum: 10c0/9bd903b3ea4e24bfeb444d7a5c2ed82e591ef5cffc0874c609de854c05d34935cd85543e66678ecdb8e0e3eae2cda2df5c1ba66eb72010632cb9f8779031d56d
+ checksum: 10c0/357a30a853102b1d09a064451f0e66610d41b86f0f4f7bf8b3ce96180e8c58acb0ed24b9f5bba970f7d8d5e94e98c583f2a821135002e3037b0dbce249563926
languageName: node
linkType: hard
-"@typescript-eslint/scope-manager@npm:8.31.0":
- version: 8.31.0
- resolution: "@typescript-eslint/scope-manager@npm:8.31.0"
+"@typescript-eslint/scope-manager@npm:8.32.0":
+ version: 8.32.0
+ resolution: "@typescript-eslint/scope-manager@npm:8.32.0"
dependencies:
- "@typescript-eslint/types": "npm:8.31.0"
- "@typescript-eslint/visitor-keys": "npm:8.31.0"
- checksum: 10c0/eae758a24cc578fa351b8bf0c30c50de384292c0b05a58762f9b632d65a009bd5d902d806eccb6b678cc0b09686289fb4f1fd67da7f12d59ad43ff033b35cc4f
+ "@typescript-eslint/types": "npm:8.32.0"
+ "@typescript-eslint/visitor-keys": "npm:8.32.0"
+ checksum: 10c0/9149d4eebfc7f096a3401a4865e0e552231c91cee362fe3a59c31cf2f0b6b325619f534aed41688c3702867cf86b12454e00055d09e7f229c92083e28e97baac
languageName: node
linkType: hard
-"@typescript-eslint/type-utils@npm:8.31.0":
- version: 8.31.0
- resolution: "@typescript-eslint/type-utils@npm:8.31.0"
+"@typescript-eslint/type-utils@npm:8.32.0":
+ version: 8.32.0
+ resolution: "@typescript-eslint/type-utils@npm:8.32.0"
dependencies:
- "@typescript-eslint/typescript-estree": "npm:8.31.0"
- "@typescript-eslint/utils": "npm:8.31.0"
+ "@typescript-eslint/typescript-estree": "npm:8.32.0"
+ "@typescript-eslint/utils": "npm:8.32.0"
debug: "npm:^4.3.4"
- ts-api-utils: "npm:^2.0.1"
+ ts-api-utils: "npm:^2.1.0"
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: ">=4.8.4 <5.9.0"
- checksum: 10c0/f6938413a583430468b259f6823bb2ab1b5cd77cd6d4e21e1803df70e329046b9579aed5bdc9bdcf4046c8091615a911ac3990859db78d00210bb867915ba37f
+ checksum: 10c0/3aec7fbe77d8dae698f75d55d6bed537e7dfa3ed069fbcae456dcf5580c16746ef3e7020522223ca560a75842183fbb8e7ff309e872035d14bf98eb8fae454b4
languageName: node
linkType: hard
-"@typescript-eslint/types@npm:8.31.0":
- version: 8.31.0
- resolution: "@typescript-eslint/types@npm:8.31.0"
- checksum: 10c0/04130a30aac477d36d6a155399b27773457aeb9b485ef8fb56fee05725b6e36768c9fac7e4d1f073fd16988de0eb7dffc743c3f834ae907cf918cabb075e5cd8
+"@typescript-eslint/types@npm:8.32.0":
+ version: 8.32.0
+ resolution: "@typescript-eslint/types@npm:8.32.0"
+ checksum: 10c0/86cc1e365bc12b8baf539e8e2d280b068a7d4a4220f5834fe4de182827a971200408a1ad20f9679af4c4bcdafea03dd66319fe7f1d060ce4b5abbf2962ea3062
languageName: node
linkType: hard
-"@typescript-eslint/typescript-estree@npm:8.31.0":
- version: 8.31.0
- resolution: "@typescript-eslint/typescript-estree@npm:8.31.0"
+"@typescript-eslint/typescript-estree@npm:8.32.0":
+ version: 8.32.0
+ resolution: "@typescript-eslint/typescript-estree@npm:8.32.0"
dependencies:
- "@typescript-eslint/types": "npm:8.31.0"
- "@typescript-eslint/visitor-keys": "npm:8.31.0"
+ "@typescript-eslint/types": "npm:8.32.0"
+ "@typescript-eslint/visitor-keys": "npm:8.32.0"
debug: "npm:^4.3.4"
fast-glob: "npm:^3.3.2"
is-glob: "npm:^4.0.3"
minimatch: "npm:^9.0.4"
semver: "npm:^7.6.0"
- ts-api-utils: "npm:^2.0.1"
+ ts-api-utils: "npm:^2.1.0"
peerDependencies:
typescript: ">=4.8.4 <5.9.0"
- checksum: 10c0/0ec074b2b9c49f80fafea716aa0cc4b05085e65730a3ef7c7d2d39db1657a40b38abe83f22bbe15ac4f6fdf576692f47d2d057347242e6cef5be81d070f55064
+ checksum: 10c0/c366a457b544c52cb26ffe3e07ed9d3c6eea9fa8a181c2fdba9a0d2076e5d3198dedfb8510038b0791bd338773d8c8d2af048b7c69999d3fd8540ef790dbc720
languageName: node
linkType: hard
-"@typescript-eslint/utils@npm:8.31.0":
- version: 8.31.0
- resolution: "@typescript-eslint/utils@npm:8.31.0"
+"@typescript-eslint/utils@npm:8.32.0":
+ version: 8.32.0
+ resolution: "@typescript-eslint/utils@npm:8.32.0"
dependencies:
- "@eslint-community/eslint-utils": "npm:^4.4.0"
- "@typescript-eslint/scope-manager": "npm:8.31.0"
- "@typescript-eslint/types": "npm:8.31.0"
- "@typescript-eslint/typescript-estree": "npm:8.31.0"
+ "@eslint-community/eslint-utils": "npm:^4.7.0"
+ "@typescript-eslint/scope-manager": "npm:8.32.0"
+ "@typescript-eslint/types": "npm:8.32.0"
+ "@typescript-eslint/typescript-estree": "npm:8.32.0"
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: ">=4.8.4 <5.9.0"
- checksum: 10c0/1fd4f62e16a44a5be2de501f70ba4b2d64479e014370bde7bbc6de6897cf1699766a8b7be4deb9b0328e74c2b4171839336ede4e3c60fec6ac8378b623a75275
+ checksum: 10c0/b5b65555b98c8fc92ec016ce2329f644b4d09def28c36422ce77aad9eda1b4dae009bf97b684357e97dd15de66dddba7d8d86e426e11123dae80f7ca2b4f9bd4
languageName: node
linkType: hard
-"@typescript-eslint/visitor-keys@npm:8.31.0":
- version: 8.31.0
- resolution: "@typescript-eslint/visitor-keys@npm:8.31.0"
+"@typescript-eslint/visitor-keys@npm:8.32.0":
+ version: 8.32.0
+ resolution: "@typescript-eslint/visitor-keys@npm:8.32.0"
dependencies:
- "@typescript-eslint/types": "npm:8.31.0"
+ "@typescript-eslint/types": "npm:8.32.0"
eslint-visitor-keys: "npm:^4.2.0"
- checksum: 10c0/e41e2a9e287d11232cda6126377d1df4de69c6e9dc2a14058819cff15280ec654a3877886a6806728196f299766cfbb0b299eb021c2ce168eb15dff5eb07b51b
+ checksum: 10c0/f2e5254d9b1d00cd6360e27240ad72fbab7bcbaed46944943ff077e12fe4883790571f3734f8cb12c3e278bfd7bc4f8f7192ed899f341c282269a9dd16f0cba0
languageName: node
linkType: hard
@@ -1584,40 +1813,41 @@ __metadata:
resolution: "EMS-ESP@workspace:."
dependencies:
"@alova/adapter-xhr": "npm:2.1.1"
- "@babel/core": "npm:^7.26.10"
+ "@babel/core": "npm:^7.27.1"
"@emotion/react": "npm:^11.14.0"
"@emotion/styled": "npm:^11.14.0"
- "@eslint/js": "npm:^9.25.1"
- "@mui/icons-material": "npm:^7.0.2"
- "@mui/material": "npm:^7.0.2"
+ "@eslint/js": "npm:^9.26.0"
+ "@mui/icons-material": "npm:^7.1.0"
+ "@mui/material": "npm:^7.1.0"
"@preact/compat": "npm:^18.3.1"
"@preact/preset-vite": "npm:^2.10.1"
"@table-library/react-table-library": "npm:4.1.15"
"@trivago/prettier-plugin-sort-imports": "npm:^5.2.2"
- "@types/node": "npm:^22.15.2"
- "@types/react": "npm:^19.1.2"
- "@types/react-dom": "npm:^19.1.2"
+ "@types/node": "npm:^22.15.17"
+ "@types/react": "npm:^19.1.3"
+ "@types/react-dom": "npm:^19.1.3"
alova: "npm:3.2.10"
async-validator: "npm:^4.2.5"
concurrently: "npm:^9.1.2"
- eslint: "npm:^9.25.1"
- eslint-config-prettier: "npm:^10.1.2"
+ eslint: "npm:^9.26.0"
+ eslint-config-prettier: "npm:^10.1.5"
+ formidable: "npm:^3.5.4"
jwt-decode: "npm:^4.0.0"
magic-string: "npm:^0.30.17"
mime-types: "npm:^3.0.1"
- preact: "npm:^10.26.5"
+ preact: "npm:^10.26.6"
prettier: "npm:^3.5.3"
react: "npm:^19.1.0"
react-dom: "npm:^19.1.0"
react-icons: "npm:^5.5.0"
- react-router: "npm:^7.5.2"
+ react-router: "npm:^7.6.0"
react-toastify: "npm:^11.0.5"
rollup-plugin-visualizer: "npm:^5.14.0"
terser: "npm:^5.39.0"
typesafe-i18n: "npm:^5.26.2"
typescript: "npm:^5.8.3"
- typescript-eslint: "npm:8.31.0"
- vite: "npm:^6.3.3"
+ typescript-eslint: "npm:8.32.0"
+ vite: "npm:^6.3.5"
vite-plugin-imagemin: "npm:^0.6.1"
vite-tsconfig-paths: "npm:^5.1.4"
languageName: unknown
@@ -1630,6 +1860,16 @@ __metadata:
languageName: node
linkType: hard
+"accepts@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "accepts@npm:2.0.0"
+ dependencies:
+ mime-types: "npm:^3.0.0"
+ negotiator: "npm:^1.0.0"
+ checksum: 10c0/98374742097e140891546076215f90c32644feacf652db48412329de4c2a529178a81aa500fbb13dd3e6cbf6e68d829037b123ac037fc9a08bcec4b87b358eef
+ languageName: node
+ linkType: hard
+
"acorn-jsx@npm:^5.3.2":
version: 5.3.2
resolution: "acorn-jsx@npm:5.3.2"
@@ -1758,6 +1998,13 @@ __metadata:
languageName: node
linkType: hard
+"asap@npm:^2.0.0":
+ version: 2.0.6
+ resolution: "asap@npm:2.0.6"
+ checksum: 10c0/c6d5e39fe1f15e4b87677460bd66b66050cd14c772269cee6688824c1410a08ab20254bb6784f9afb75af9144a9f9a7692d49547f4d19d715aeb7c0318f3136d
+ languageName: node
+ linkType: hard
+
"async-validator@npm:^4.2.5":
version: 4.2.5
resolution: "async-validator@npm:4.2.5"
@@ -1867,6 +2114,23 @@ __metadata:
languageName: node
linkType: hard
+"body-parser@npm:^2.2.0":
+ version: 2.2.0
+ resolution: "body-parser@npm:2.2.0"
+ dependencies:
+ bytes: "npm:^3.1.2"
+ content-type: "npm:^1.0.5"
+ debug: "npm:^4.4.0"
+ http-errors: "npm:^2.0.0"
+ iconv-lite: "npm:^0.6.3"
+ on-finished: "npm:^2.4.1"
+ qs: "npm:^6.14.0"
+ raw-body: "npm:^3.0.0"
+ type-is: "npm:^2.0.0"
+ checksum: 10c0/a9ded39e71ac9668e2211afa72e82ff86cc5ef94de1250b7d1ba9cc299e4150408aaa5f1e8b03dd4578472a3ce6d1caa2a23b27a6c18e526e48b4595174c116c
+ languageName: node
+ linkType: hard
+
"boolbase@npm:^1.0.0":
version: 1.0.0
resolution: "boolbase@npm:1.0.0"
@@ -1964,6 +2228,13 @@ __metadata:
languageName: node
linkType: hard
+"bytes@npm:3.1.2, bytes@npm:^3.1.2":
+ version: 3.1.2
+ resolution: "bytes@npm:3.1.2"
+ checksum: 10c0/76d1c43cbd602794ad8ad2ae94095cddeb1de78c5dddaa7005c51af10b0176c69971a6d88e805a90c2b6550d76636e43c40d8427a808b8645ede885de4a0358e
+ languageName: node
+ linkType: hard
+
"cacache@npm:^19.0.1":
version: 19.0.1
resolution: "cacache@npm:19.0.1"
@@ -1999,6 +2270,26 @@ __metadata:
languageName: node
linkType: hard
+"call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2":
+ version: 1.0.2
+ resolution: "call-bind-apply-helpers@npm:1.0.2"
+ dependencies:
+ es-errors: "npm:^1.3.0"
+ function-bind: "npm:^1.1.2"
+ checksum: 10c0/47bd9901d57b857590431243fea704ff18078b16890a6b3e021e12d279bbf211d039155e27d7566b374d49ee1f8189344bac9833dec7a20cdec370506361c938
+ languageName: node
+ linkType: hard
+
+"call-bound@npm:^1.0.2":
+ version: 1.0.4
+ resolution: "call-bound@npm:1.0.4"
+ dependencies:
+ call-bind-apply-helpers: "npm:^1.0.2"
+ get-intrinsic: "npm:^1.3.0"
+ checksum: 10c0/f4796a6a0941e71c766aea672f63b72bc61234c4f4964dc6d7606e3664c307e7d77845328a8f3359ce39ddb377fed67318f9ee203dea1d47e46165dcf2917644
+ languageName: node
+ linkType: hard
+
"callsites@npm:^3.0.0":
version: 3.1.0
resolution: "callsites@npm:3.1.0"
@@ -2187,6 +2478,22 @@ __metadata:
languageName: node
linkType: hard
+"content-disposition@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "content-disposition@npm:1.0.0"
+ dependencies:
+ safe-buffer: "npm:5.2.1"
+ checksum: 10c0/c7b1ba0cea2829da0352ebc1b7f14787c73884bc707c8bc2271d9e3bf447b372270d09f5d3980dc5037c749ceef56b9a13fccd0b0001c87c3f12579967e4dd27
+ languageName: node
+ linkType: hard
+
+"content-type@npm:^1.0.5":
+ version: 1.0.5
+ resolution: "content-type@npm:1.0.5"
+ checksum: 10c0/b76ebed15c000aee4678c3707e0860cb6abd4e680a598c0a26e17f0bfae723ec9cc2802f0ff1bc6e4d80603719010431d2231018373d4dde10f9ccff9dadf5af
+ languageName: node
+ linkType: hard
+
"convert-source-map@npm:^1.5.0":
version: 1.9.0
resolution: "convert-source-map@npm:1.9.0"
@@ -2201,6 +2508,20 @@ __metadata:
languageName: node
linkType: hard
+"cookie-signature@npm:^1.2.1":
+ version: 1.2.2
+ resolution: "cookie-signature@npm:1.2.2"
+ checksum: 10c0/54e05df1a293b3ce81589b27dddc445f462f6fa6812147c033350cd3561a42bc14481674e05ed14c7bd0ce1e8bb3dc0e40851bad75415733711294ddce0b7bc6
+ languageName: node
+ linkType: hard
+
+"cookie@npm:^0.7.1":
+ version: 0.7.2
+ resolution: "cookie@npm:0.7.2"
+ checksum: 10c0/9596e8ccdbf1a3a88ae02cf5ee80c1c50959423e1022e4e60b91dd87c622af1da309253d8abdb258fb5e3eacb4f08e579dc58b4897b8087574eee0fd35dfa5d2
+ languageName: node
+ linkType: hard
+
"cookie@npm:^1.0.1":
version: 1.0.2
resolution: "cookie@npm:1.0.2"
@@ -2215,6 +2536,16 @@ __metadata:
languageName: node
linkType: hard
+"cors@npm:^2.8.5":
+ version: 2.8.5
+ resolution: "cors@npm:2.8.5"
+ dependencies:
+ object-assign: "npm:^4"
+ vary: "npm:^1"
+ checksum: 10c0/373702b7999409922da80de4a61938aabba6929aea5b6fd9096fefb9e8342f626c0ebd7507b0e8b0b311380744cc985f27edebc0a26e0ddb784b54e1085de761
+ languageName: node
+ linkType: hard
+
"cosmiconfig@npm:^7.0.0":
version: 7.1.0
resolution: "cosmiconfig@npm:7.1.0"
@@ -2343,7 +2674,7 @@ __metadata:
languageName: node
linkType: hard
-"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4":
+"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:^4.4.0":
version: 4.4.0
resolution: "debug@npm:4.4.0"
dependencies:
@@ -2455,6 +2786,23 @@ __metadata:
languageName: node
linkType: hard
+"depd@npm:2.0.0, depd@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "depd@npm:2.0.0"
+ checksum: 10c0/58bd06ec20e19529b06f7ad07ddab60e504d9e0faca4bd23079fac2d279c3594334d736508dc350e06e510aba5e22e4594483b3a6562ce7c17dd797f4cc4ad2c
+ languageName: node
+ linkType: hard
+
+"dezalgo@npm:^1.0.4":
+ version: 1.0.4
+ resolution: "dezalgo@npm:1.0.4"
+ dependencies:
+ asap: "npm:^2.0.0"
+ wrappy: "npm:1"
+ checksum: 10c0/8a870ed42eade9a397e6141fe5c025148a59ed52f1f28b1db5de216b4d57f0af7a257070c3af7ce3d5508c1ce9dd5009028a76f4b2cc9370dc56551d2355fad8
+ languageName: node
+ linkType: hard
+
"dir-glob@npm:^3.0.1":
version: 3.0.1
resolution: "dir-glob@npm:3.0.1"
@@ -2582,6 +2930,17 @@ __metadata:
languageName: node
linkType: hard
+"dunder-proto@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "dunder-proto@npm:1.0.1"
+ dependencies:
+ call-bind-apply-helpers: "npm:^1.0.1"
+ es-errors: "npm:^1.3.0"
+ gopd: "npm:^1.2.0"
+ checksum: 10c0/199f2a0c1c16593ca0a145dbf76a962f8033ce3129f01284d48c45ed4e14fea9bbacd7b3610b6cdc33486cef20385ac054948fefc6272fcce645c09468f93031
+ languageName: node
+ linkType: hard
+
"duplexer3@npm:^0.1.4":
version: 0.1.5
resolution: "duplexer3@npm:0.1.5"
@@ -2596,6 +2955,13 @@ __metadata:
languageName: node
linkType: hard
+"ee-first@npm:1.1.1":
+ version: 1.1.1
+ resolution: "ee-first@npm:1.1.1"
+ checksum: 10c0/b5bb125ee93161bc16bfe6e56c6b04de5ad2aa44234d8f644813cc95d861a6910903132b05093706de2b706599367c4130eb6d170f6b46895686b95f87d017b7
+ languageName: node
+ linkType: hard
+
"electron-to-chromium@npm:^1.5.73":
version: 1.5.142
resolution: "electron-to-chromium@npm:1.5.142"
@@ -2617,6 +2983,13 @@ __metadata:
languageName: node
linkType: hard
+"encodeurl@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "encodeurl@npm:2.0.0"
+ checksum: 10c0/5d317306acb13e6590e28e27924c754163946a2480de11865c991a3a7eed4315cd3fba378b543ca145829569eefe9b899f3d84bb09870f675ae60bc924b01ceb
+ languageName: node
+ linkType: hard
+
"encoding@npm:^0.1.13":
version: 0.1.13
resolution: "encoding@npm:0.1.13"
@@ -2672,6 +3045,29 @@ __metadata:
languageName: node
linkType: hard
+"es-define-property@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "es-define-property@npm:1.0.1"
+ checksum: 10c0/3f54eb49c16c18707949ff25a1456728c883e81259f045003499efba399c08bad00deebf65cccde8c0e07908c1a225c9d472b7107e558f2a48e28d530e34527c
+ languageName: node
+ linkType: hard
+
+"es-errors@npm:^1.3.0":
+ version: 1.3.0
+ resolution: "es-errors@npm:1.3.0"
+ checksum: 10c0/0a61325670072f98d8ae3b914edab3559b6caa980f08054a3b872052640d91da01d38df55df797fcc916389d77fc92b8d5906cf028f4db46d7e3003abecbca85
+ languageName: node
+ linkType: hard
+
+"es-object-atoms@npm:^1.0.0, es-object-atoms@npm:^1.1.1":
+ version: 1.1.1
+ resolution: "es-object-atoms@npm:1.1.1"
+ dependencies:
+ es-errors: "npm:^1.3.0"
+ checksum: 10c0/65364812ca4daf48eb76e2a3b7a89b3f6a2e62a1c420766ce9f692665a29d94fe41fe88b65f24106f449859549711e4b40d9fb8002d862dfd7eb1c512d10be0c
+ languageName: node
+ linkType: hard
+
"esbuild-android-64@npm:0.14.54":
version: 0.14.54
resolution: "esbuild-android-64@npm:0.14.54"
@@ -2979,6 +3375,13 @@ __metadata:
languageName: node
linkType: hard
+"escape-html@npm:^1.0.3":
+ version: 1.0.3
+ resolution: "escape-html@npm:1.0.3"
+ checksum: 10c0/524c739d776b36c3d29fa08a22e03e8824e3b2fd57500e5e44ecf3cc4707c34c60f9ca0781c0e33d191f2991161504c295e98f68c78fe7baa6e57081ec6ac0a3
+ languageName: node
+ linkType: hard
+
"escape-string-regexp@npm:^1.0.2, escape-string-regexp@npm:^1.0.5":
version: 1.0.5
resolution: "escape-string-regexp@npm:1.0.5"
@@ -2993,14 +3396,14 @@ __metadata:
languageName: node
linkType: hard
-"eslint-config-prettier@npm:^10.1.2":
- version: 10.1.2
- resolution: "eslint-config-prettier@npm:10.1.2"
+"eslint-config-prettier@npm:^10.1.5":
+ version: 10.1.5
+ resolution: "eslint-config-prettier@npm:10.1.5"
peerDependencies:
eslint: ">=7.0.0"
bin:
eslint-config-prettier: bin/cli.js
- checksum: 10c0/c22c8e29193cc8fd70becf1c2dd072513f2b3004a175c2a49404c79d1745ba4dc0edc2afd00d16b0e26d24f95813a0469e7445a25104aec218f6d84cdb1697e9
+ checksum: 10c0/5486255428e4577e8064b40f27db299faf7312b8e43d7b4bc913a6426e6c0f5950cd519cad81ae24e9aecb4002c502bc665c02e3b52efde57af2debcf27dd6e0
languageName: node
linkType: hard
@@ -3028,9 +3431,9 @@ __metadata:
languageName: node
linkType: hard
-"eslint@npm:^9.25.1":
- version: 9.25.1
- resolution: "eslint@npm:9.25.1"
+"eslint@npm:^9.26.0":
+ version: 9.26.0
+ resolution: "eslint@npm:9.26.0"
dependencies:
"@eslint-community/eslint-utils": "npm:^4.2.0"
"@eslint-community/regexpp": "npm:^4.12.1"
@@ -3038,11 +3441,12 @@ __metadata:
"@eslint/config-helpers": "npm:^0.2.1"
"@eslint/core": "npm:^0.13.0"
"@eslint/eslintrc": "npm:^3.3.1"
- "@eslint/js": "npm:9.25.1"
+ "@eslint/js": "npm:9.26.0"
"@eslint/plugin-kit": "npm:^0.2.8"
"@humanfs/node": "npm:^0.16.6"
"@humanwhocodes/module-importer": "npm:^1.0.1"
"@humanwhocodes/retry": "npm:^0.4.2"
+ "@modelcontextprotocol/sdk": "npm:^1.8.0"
"@types/estree": "npm:^1.0.6"
"@types/json-schema": "npm:^7.0.15"
ajv: "npm:^6.12.4"
@@ -3067,6 +3471,7 @@ __metadata:
minimatch: "npm:^3.1.2"
natural-compare: "npm:^1.4.0"
optionator: "npm:^0.9.3"
+ zod: "npm:^3.24.2"
peerDependencies:
jiti: "*"
peerDependenciesMeta:
@@ -3074,7 +3479,7 @@ __metadata:
optional: true
bin:
eslint: bin/eslint.js
- checksum: 10c0/3bb1997ae994253d441e56aba2fc64a71b3b8dce32756de3dedae5e85416ba33eb07e19ede94a6fa8ce7ef3a0a3b0dd8b6836f41be46a3ab52e5345ad59a553f
+ checksum: 10c0/fb5ba6ce2b85a6c26c89bc1ca9b34f0ffa2166ba85d3d007a06bb2350151fb665e9a5f99d7f24051a00dc713203b50ece6e724a29fed7b297e432cdc79482fec
languageName: node
linkType: hard
@@ -3128,6 +3533,29 @@ __metadata:
languageName: node
linkType: hard
+"etag@npm:^1.8.1":
+ version: 1.8.1
+ resolution: "etag@npm:1.8.1"
+ checksum: 10c0/12be11ef62fb9817314d790089a0a49fae4e1b50594135dcb8076312b7d7e470884b5100d249b28c18581b7fd52f8b485689ffae22a11ed9ec17377a33a08f84
+ languageName: node
+ linkType: hard
+
+"eventsource-parser@npm:^3.0.1":
+ version: 3.0.1
+ resolution: "eventsource-parser@npm:3.0.1"
+ checksum: 10c0/146ce5ae8325d07645a49bbc54d7ac3aef42f5138bfbbe83d5cf96293b50eab2219926d6cf41eed0a0f90132578089652ba9286a19297662900133a9da6c2fd0
+ languageName: node
+ linkType: hard
+
+"eventsource@npm:^3.0.2":
+ version: 3.0.6
+ resolution: "eventsource@npm:3.0.6"
+ dependencies:
+ eventsource-parser: "npm:^3.0.1"
+ checksum: 10c0/074d865ea1c7e29e3243f85a13306e89fca2d775b982dca03fa6bfa75c56827fa89cf1ab9e730db24bd6b104cbdcae074f2b37ba498874e9dd9710fbff4979bb
+ languageName: node
+ linkType: hard
+
"exec-buffer@npm:^3.0.0":
version: 3.2.0
resolution: "exec-buffer@npm:3.2.0"
@@ -3221,6 +3649,50 @@ __metadata:
languageName: node
linkType: hard
+"express-rate-limit@npm:^7.5.0":
+ version: 7.5.0
+ resolution: "express-rate-limit@npm:7.5.0"
+ peerDependencies:
+ express: ^4.11 || 5 || ^5.0.0-beta.1
+ checksum: 10c0/3e96afa05b4f577395688ede37e0cb19901f20c350b32575fb076f3d25176209fb88d3648151755c232aaf304147c58531f070757978f376e2f08326449299fd
+ languageName: node
+ linkType: hard
+
+"express@npm:^5.0.1":
+ version: 5.1.0
+ resolution: "express@npm:5.1.0"
+ dependencies:
+ accepts: "npm:^2.0.0"
+ body-parser: "npm:^2.2.0"
+ content-disposition: "npm:^1.0.0"
+ content-type: "npm:^1.0.5"
+ cookie: "npm:^0.7.1"
+ cookie-signature: "npm:^1.2.1"
+ debug: "npm:^4.4.0"
+ encodeurl: "npm:^2.0.0"
+ escape-html: "npm:^1.0.3"
+ etag: "npm:^1.8.1"
+ finalhandler: "npm:^2.1.0"
+ fresh: "npm:^2.0.0"
+ http-errors: "npm:^2.0.0"
+ merge-descriptors: "npm:^2.0.0"
+ mime-types: "npm:^3.0.0"
+ on-finished: "npm:^2.4.1"
+ once: "npm:^1.4.0"
+ parseurl: "npm:^1.3.3"
+ proxy-addr: "npm:^2.0.7"
+ qs: "npm:^6.14.0"
+ range-parser: "npm:^1.2.1"
+ router: "npm:^2.2.0"
+ send: "npm:^1.1.0"
+ serve-static: "npm:^2.2.0"
+ statuses: "npm:^2.0.1"
+ type-is: "npm:^2.0.1"
+ vary: "npm:^1.1.2"
+ checksum: 10c0/80ce7c53c5f56887d759b94c3f2283e2e51066c98d4b72a4cc1338e832b77f1e54f30d0239cc10815a0f849bdb753e6a284d2fa48d4ab56faf9c501f55d751d6
+ languageName: node
+ linkType: hard
+
"ext-list@npm:^2.0.0":
version: 2.2.2
resolution: "ext-list@npm:2.2.2"
@@ -3410,6 +3882,20 @@ __metadata:
languageName: node
linkType: hard
+"finalhandler@npm:^2.1.0":
+ version: 2.1.0
+ resolution: "finalhandler@npm:2.1.0"
+ dependencies:
+ debug: "npm:^4.4.0"
+ encodeurl: "npm:^2.0.0"
+ escape-html: "npm:^1.0.3"
+ on-finished: "npm:^2.4.1"
+ parseurl: "npm:^1.3.3"
+ statuses: "npm:^2.0.1"
+ checksum: 10c0/da0bbca6d03873472ee890564eb2183f4ed377f25f3628a0fc9d16dac40bed7b150a0d82ebb77356e4c6d97d2796ad2dba22948b951dddee2c8768b0d1b9fb1f
+ languageName: node
+ linkType: hard
+
"find-root@npm:^1.1.0":
version: 1.1.0
resolution: "find-root@npm:1.1.0"
@@ -3473,6 +3959,31 @@ __metadata:
languageName: node
linkType: hard
+"formidable@npm:^3.5.4":
+ version: 3.5.4
+ resolution: "formidable@npm:3.5.4"
+ dependencies:
+ "@paralleldrive/cuid2": "npm:^2.2.2"
+ dezalgo: "npm:^1.0.4"
+ once: "npm:^1.4.0"
+ checksum: 10c0/3a311ce57617eb8f532368e91c0f2bbfb299a0f1a35090e085bd6ca772298f196fbb0b66f0d4b5549d7bf3c5e1844439338d4402b7b6d1fedbe206ad44a931f8
+ languageName: node
+ linkType: hard
+
+"forwarded@npm:0.2.0":
+ version: 0.2.0
+ resolution: "forwarded@npm:0.2.0"
+ checksum: 10c0/9b67c3fac86acdbc9ae47ba1ddd5f2f81526fa4c8226863ede5600a3f7c7416ef451f6f1e240a3cc32d0fd79fcfe6beb08fd0da454f360032bde70bf80afbb33
+ languageName: node
+ linkType: hard
+
+"fresh@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "fresh@npm:2.0.0"
+ checksum: 10c0/0557548194cb9a809a435bf92bcfbc20c89e8b5eb38861b73ced36750437251e39a111fc3a18b98531be9dd91fe1411e4969f229dc579ec0251ce6c5d4900bbc
+ languageName: node
+ linkType: hard
+
"from2@npm:^2.1.1":
version: 2.3.0
resolution: "from2@npm:2.3.0"
@@ -3557,6 +4068,34 @@ __metadata:
languageName: node
linkType: hard
+"get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.3.0":
+ version: 1.3.0
+ resolution: "get-intrinsic@npm:1.3.0"
+ dependencies:
+ call-bind-apply-helpers: "npm:^1.0.2"
+ es-define-property: "npm:^1.0.1"
+ es-errors: "npm:^1.3.0"
+ es-object-atoms: "npm:^1.1.1"
+ function-bind: "npm:^1.1.2"
+ get-proto: "npm:^1.0.1"
+ gopd: "npm:^1.2.0"
+ has-symbols: "npm:^1.1.0"
+ hasown: "npm:^2.0.2"
+ math-intrinsics: "npm:^1.1.0"
+ checksum: 10c0/52c81808af9a8130f581e6a6a83e1ba4a9f703359e7a438d1369a5267a25412322f03dcbd7c549edaef0b6214a0630a28511d7df0130c93cfd380f4fa0b5b66a
+ languageName: node
+ linkType: hard
+
+"get-proto@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "get-proto@npm:1.0.1"
+ dependencies:
+ dunder-proto: "npm:^1.0.1"
+ es-object-atoms: "npm:^1.0.0"
+ checksum: 10c0/9224acb44603c5526955e83510b9da41baf6ae73f7398875fba50edc5e944223a89c4a72b070fcd78beb5f7bdda58ecb6294adc28f7acfc0da05f76a2399643c
+ languageName: node
+ linkType: hard
+
"get-proxy@npm:^2.0.0":
version: 2.1.0
resolution: "get-proxy@npm:2.1.0"
@@ -3727,6 +4266,13 @@ __metadata:
languageName: node
linkType: hard
+"gopd@npm:^1.2.0":
+ version: 1.2.0
+ resolution: "gopd@npm:1.2.0"
+ checksum: 10c0/50fff1e04ba2b7737c097358534eacadad1e68d24cccee3272e04e007bed008e68d2614f3987788428fd192a5ae3889d08fb2331417e4fc4a9ab366b2043cead
+ languageName: node
+ linkType: hard
+
"got@npm:^7.0.0":
version: 7.1.0
resolution: "got@npm:7.1.0"
@@ -3811,6 +4357,13 @@ __metadata:
languageName: node
linkType: hard
+"has-symbols@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "has-symbols@npm:1.1.0"
+ checksum: 10c0/dde0a734b17ae51e84b10986e651c664379018d10b91b6b0e9b293eddb32f0f069688c841fb40f19e9611546130153e0a2a48fd7f512891fb000ddfa36f5a20e
+ languageName: node
+ linkType: hard
+
"has-to-string-tag-x@npm:^1.2.0":
version: 1.4.1
resolution: "has-to-string-tag-x@npm:1.4.1"
@@ -3868,6 +4421,19 @@ __metadata:
languageName: node
linkType: hard
+"http-errors@npm:2.0.0, http-errors@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "http-errors@npm:2.0.0"
+ dependencies:
+ depd: "npm:2.0.0"
+ inherits: "npm:2.0.4"
+ setprototypeof: "npm:1.2.0"
+ statuses: "npm:2.0.1"
+ toidentifier: "npm:1.0.1"
+ checksum: 10c0/fc6f2715fe188d091274b5ffc8b3657bd85c63e969daa68ccb77afb05b071a4b62841acb7a21e417b5539014dff2ebf9550f0b14a9ff126f2734a7c1387f8e19
+ languageName: node
+ linkType: hard
+
"http-proxy-agent@npm:^7.0.0":
version: 7.0.2
resolution: "http-proxy-agent@npm:7.0.2"
@@ -3902,7 +4468,7 @@ __metadata:
languageName: node
linkType: hard
-"iconv-lite@npm:^0.6.2":
+"iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.2, iconv-lite@npm:^0.6.3":
version: 0.6.3
resolution: "iconv-lite@npm:0.6.3"
dependencies:
@@ -4061,7 +4627,7 @@ __metadata:
languageName: node
linkType: hard
-"inherits@npm:2, inherits@npm:^2.0.1, inherits@npm:~2.0.3":
+"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:~2.0.3":
version: 2.0.4
resolution: "inherits@npm:2.0.4"
checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2
@@ -4095,6 +4661,13 @@ __metadata:
languageName: node
linkType: hard
+"ipaddr.js@npm:1.9.1":
+ version: 1.9.1
+ resolution: "ipaddr.js@npm:1.9.1"
+ checksum: 10c0/0486e775047971d3fdb5fb4f063829bac45af299ae0b82dcf3afa2145338e08290563a2a70f34b732d795ecc8311902e541a8530eeb30d75860a78ff4e94ce2a
+ languageName: node
+ linkType: hard
+
"is-arrayish@npm:^0.2.1":
version: 0.2.1
resolution: "is-arrayish@npm:0.2.1"
@@ -4210,6 +4783,13 @@ __metadata:
languageName: node
linkType: hard
+"is-promise@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "is-promise@npm:4.0.0"
+ checksum: 10c0/ebd5c672d73db781ab33ccb155fb9969d6028e37414d609b115cc534654c91ccd061821d5b987eefaa97cf4c62f0b909bb2f04db88306de26e91bfe8ddc01503
+ languageName: node
+ linkType: hard
+
"is-retry-allowed@npm:^1.0.0, is-retry-allowed@npm:^1.1.0":
version: 1.2.0
resolution: "is-retry-allowed@npm:1.2.0"
@@ -4660,6 +5240,13 @@ __metadata:
languageName: node
linkType: hard
+"math-intrinsics@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "math-intrinsics@npm:1.1.0"
+ checksum: 10c0/7579ff94e899e2f76ab64491d76cf606274c874d8f2af4a442c016bd85688927fcfca157ba6bf74b08e9439dc010b248ce05b96cc7c126a354c3bae7fcb48b7f
+ languageName: node
+ linkType: hard
+
"mdn-data@npm:2.0.14":
version: 2.0.14
resolution: "mdn-data@npm:2.0.14"
@@ -4667,6 +5254,13 @@ __metadata:
languageName: node
linkType: hard
+"media-typer@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "media-typer@npm:1.1.0"
+ checksum: 10c0/7b4baa40b25964bb90e2121ee489ec38642127e48d0cc2b6baa442688d3fde6262bfdca86d6bbf6ba708784afcac168c06840c71facac70e390f5f759ac121b9
+ languageName: node
+ linkType: hard
+
"memoize-one@npm:>=3.1.1 <6":
version: 5.2.1
resolution: "memoize-one@npm:5.2.1"
@@ -4692,6 +5286,13 @@ __metadata:
languageName: node
linkType: hard
+"merge-descriptors@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "merge-descriptors@npm:2.0.0"
+ checksum: 10c0/95389b7ced3f9b36fbdcf32eb946dc3dd1774c2fdf164609e55b18d03aa499b12bd3aae3a76c1c7185b96279e9803525550d3eb292b5224866060a288f335cb3
+ languageName: node
+ linkType: hard
+
"merge-stream@npm:^2.0.0":
version: 2.0.0
resolution: "merge-stream@npm:2.0.0"
@@ -4723,7 +5324,7 @@ __metadata:
languageName: node
linkType: hard
-"mime-types@npm:^3.0.1":
+"mime-types@npm:^3.0.0, mime-types@npm:^3.0.1":
version: 3.0.1
resolution: "mime-types@npm:3.0.1"
dependencies:
@@ -5013,13 +5614,29 @@ __metadata:
languageName: node
linkType: hard
-"object-assign@npm:^4.0.1, object-assign@npm:^4.1.0, object-assign@npm:^4.1.1":
+"object-assign@npm:^4, object-assign@npm:^4.0.1, object-assign@npm:^4.1.0, object-assign@npm:^4.1.1":
version: 4.1.1
resolution: "object-assign@npm:4.1.1"
checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414
languageName: node
linkType: hard
+"object-inspect@npm:^1.13.3":
+ version: 1.13.4
+ resolution: "object-inspect@npm:1.13.4"
+ checksum: 10c0/d7f8711e803b96ea3191c745d6f8056ce1f2496e530e6a19a0e92d89b0fa3c76d910c31f0aa270432db6bd3b2f85500a376a83aaba849a8d518c8845b3211692
+ languageName: node
+ linkType: hard
+
+"on-finished@npm:^2.4.1":
+ version: 2.4.1
+ resolution: "on-finished@npm:2.4.1"
+ dependencies:
+ ee-first: "npm:1.1.1"
+ checksum: 10c0/46fb11b9063782f2d9968863d9cbba33d77aa13c17f895f56129c274318b86500b22af3a160fe9995aa41317efcd22941b6eba747f718ced08d9a73afdb087b4
+ languageName: node
+ linkType: hard
+
"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0":
version: 1.4.0
resolution: "once@npm:1.4.0"
@@ -5242,6 +5859,13 @@ __metadata:
languageName: node
linkType: hard
+"parseurl@npm:^1.3.3":
+ version: 1.3.3
+ resolution: "parseurl@npm:1.3.3"
+ checksum: 10c0/90dd4760d6f6174adb9f20cf0965ae12e23879b5f5464f38e92fce8073354341e4b3b76fa3d878351efe7d01e617121955284cfd002ab087fba1a0726ec0b4f5
+ languageName: node
+ linkType: hard
+
"path-exists@npm:^2.0.0":
version: 2.1.0
resolution: "path-exists@npm:2.1.0"
@@ -5296,6 +5920,13 @@ __metadata:
languageName: node
linkType: hard
+"path-to-regexp@npm:^8.0.0":
+ version: 8.2.0
+ resolution: "path-to-regexp@npm:8.2.0"
+ checksum: 10c0/ef7d0a887b603c0a142fad16ccebdcdc42910f0b14830517c724466ad676107476bba2fe9fffd28fd4c141391ccd42ea426f32bb44c2c82ecaefe10c37b90f5a
+ languageName: node
+ linkType: hard
+
"path-type@npm:^1.0.0":
version: 1.1.0
resolution: "path-type@npm:1.1.0"
@@ -5386,6 +6017,13 @@ __metadata:
languageName: node
linkType: hard
+"pkce-challenge@npm:^5.0.0":
+ version: 5.0.0
+ resolution: "pkce-challenge@npm:5.0.0"
+ checksum: 10c0/c6706d627fdbb6f22bf8cc5d60d96d6b6a7bb481399b336a3d3f4e9bfba3e167a2c32f8ec0b5e74be686a0ba3bcc9894865d4c2dd1b91cea4c05dba1f28602c3
+ languageName: node
+ linkType: hard
+
"pngquant-bin@npm:^6.0.0":
version: 6.0.1
resolution: "pngquant-bin@npm:6.0.1"
@@ -5410,10 +6048,10 @@ __metadata:
languageName: node
linkType: hard
-"preact@npm:^10.26.5":
- version: 10.26.5
- resolution: "preact@npm:10.26.5"
- checksum: 10c0/542a924009489c21b24e9588a5580dac03239a60951d10e6ad1207db66c8e719e1d46a38af6577c8f324b238fbe2aa92e0ffc04d3a71dbe182f56426c8abe632
+"preact@npm:^10.26.6":
+ version: 10.26.6
+ resolution: "preact@npm:10.26.6"
+ checksum: 10c0/af07817a24b76c48f0eb49895d2ab49d6e43097355b6f75271a4cab5c2886999968e9eab9331a48f0b7e3477bc16153b08cd1d6a24ebf1acea4016b7054daf29
languageName: node
linkType: hard
@@ -5489,6 +6127,16 @@ __metadata:
languageName: node
linkType: hard
+"proxy-addr@npm:^2.0.7":
+ version: 2.0.7
+ resolution: "proxy-addr@npm:2.0.7"
+ dependencies:
+ forwarded: "npm:0.2.0"
+ ipaddr.js: "npm:1.9.1"
+ checksum: 10c0/c3eed999781a35f7fd935f398b6d8920b6fb00bbc14287bc6de78128ccc1a02c89b95b56742bf7cf0362cc333c61d138532049c7dedc7a328ef13343eff81210
+ languageName: node
+ linkType: hard
+
"pseudomap@npm:^1.0.2":
version: 1.0.2
resolution: "pseudomap@npm:1.0.2"
@@ -5513,6 +6161,15 @@ __metadata:
languageName: node
linkType: hard
+"qs@npm:^6.14.0":
+ version: 6.14.0
+ resolution: "qs@npm:6.14.0"
+ dependencies:
+ side-channel: "npm:^1.1.0"
+ checksum: 10c0/8ea5d91bf34f440598ee389d4a7d95820e3b837d3fd9f433871f7924801becaa0cd3b3b4628d49a7784d06a8aea9bc4554d2b6d8d584e2d221dc06238a42909c
+ languageName: node
+ linkType: hard
+
"query-string@npm:^5.0.1":
version: 5.1.1
resolution: "query-string@npm:5.1.1"
@@ -5531,6 +6188,13 @@ __metadata:
languageName: node
linkType: hard
+"range-parser@npm:^1.2.1":
+ version: 1.2.1
+ resolution: "range-parser@npm:1.2.1"
+ checksum: 10c0/96c032ac2475c8027b7a4e9fe22dc0dfe0f6d90b85e496e0f016fbdb99d6d066de0112e680805075bd989905e2123b3b3d002765149294dce0c1f7f01fcc2ea0
+ languageName: node
+ linkType: hard
+
"rate-limiter-flexible@npm:^5.0.3":
version: 5.0.5
resolution: "rate-limiter-flexible@npm:5.0.5"
@@ -5538,6 +6202,18 @@ __metadata:
languageName: node
linkType: hard
+"raw-body@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "raw-body@npm:3.0.0"
+ dependencies:
+ bytes: "npm:3.1.2"
+ http-errors: "npm:2.0.0"
+ iconv-lite: "npm:0.6.3"
+ unpipe: "npm:1.0.0"
+ checksum: 10c0/f8daf4b724064a4811d118745a781ca0fb4676298b8adadfd6591155549cfea0a067523cf7dd3baeb1265fecc9ce5dfb2fc788c12c66b85202a336593ece0f87
+ languageName: node
+ linkType: hard
+
"react-dom@npm:^19.1.0":
version: 19.1.0
resolution: "react-dom@npm:19.1.0"
@@ -5572,20 +6248,19 @@ __metadata:
languageName: node
linkType: hard
-"react-router@npm:^7.5.2":
- version: 7.5.2
- resolution: "react-router@npm:7.5.2"
+"react-router@npm:^7.6.0":
+ version: 7.6.0
+ resolution: "react-router@npm:7.6.0"
dependencies:
cookie: "npm:^1.0.1"
set-cookie-parser: "npm:^2.6.0"
- turbo-stream: "npm:2.4.0"
peerDependencies:
react: ">=18"
react-dom: ">=18"
peerDependenciesMeta:
react-dom:
optional: true
- checksum: 10c0/5972ecb783e0ac0512c500b84bd4ff475665ba49c67b69e13b79dc24c7ee0496d523858058bb43c70147367688e0cc0d6d6d0f51cabfdebfbc5556d559bff457
+ checksum: 10c0/abc4d37c01804a3137b1cfd12cf7e55bff092a67c835404ab9da1411ec9e170fe72773b9846d2db084cc0272179237e59d88dbf46cef9db031892feebcb48640
languageName: node
linkType: hard
@@ -5886,6 +6561,19 @@ __metadata:
languageName: node
linkType: hard
+"router@npm:^2.2.0":
+ version: 2.2.0
+ resolution: "router@npm:2.2.0"
+ dependencies:
+ debug: "npm:^4.4.0"
+ depd: "npm:^2.0.0"
+ is-promise: "npm:^4.0.0"
+ parseurl: "npm:^1.3.3"
+ path-to-regexp: "npm:^8.0.0"
+ checksum: 10c0/3279de7450c8eae2f6e095e9edacbdeec0abb5cb7249c6e719faa0db2dba43574b4fff5892d9220631c9abaff52dd3cad648cfea2aaace845e1a071915ac8867
+ languageName: node
+ linkType: hard
+
"run-parallel@npm:^1.1.9":
version: 1.2.0
resolution: "run-parallel@npm:1.2.0"
@@ -5987,6 +6675,37 @@ __metadata:
languageName: node
linkType: hard
+"send@npm:^1.1.0, send@npm:^1.2.0":
+ version: 1.2.0
+ resolution: "send@npm:1.2.0"
+ dependencies:
+ debug: "npm:^4.3.5"
+ encodeurl: "npm:^2.0.0"
+ escape-html: "npm:^1.0.3"
+ etag: "npm:^1.8.1"
+ fresh: "npm:^2.0.0"
+ http-errors: "npm:^2.0.0"
+ mime-types: "npm:^3.0.1"
+ ms: "npm:^2.1.3"
+ on-finished: "npm:^2.4.1"
+ range-parser: "npm:^1.2.1"
+ statuses: "npm:^2.0.1"
+ checksum: 10c0/531bcfb5616948d3468d95a1fd0adaeb0c20818ba4a500f439b800ca2117971489e02074ce32796fd64a6772ea3e7235fe0583d8241dbd37a053dc3378eff9a5
+ languageName: node
+ linkType: hard
+
+"serve-static@npm:^2.2.0":
+ version: 2.2.0
+ resolution: "serve-static@npm:2.2.0"
+ dependencies:
+ encodeurl: "npm:^2.0.0"
+ escape-html: "npm:^1.0.3"
+ parseurl: "npm:^1.3.3"
+ send: "npm:^1.2.0"
+ checksum: 10c0/30e2ed1dbff1984836cfd0c65abf5d3f3f83bcd696c99d2d3c97edbd4e2a3ff4d3f87108a7d713640d290a7b6fe6c15ddcbc61165ab2eaad48ea8d3b52c7f913
+ languageName: node
+ linkType: hard
+
"set-cookie-parser@npm:^2.6.0":
version: 2.7.1
resolution: "set-cookie-parser@npm:2.7.1"
@@ -5994,6 +6713,13 @@ __metadata:
languageName: node
linkType: hard
+"setprototypeof@npm:1.2.0":
+ version: 1.2.0
+ resolution: "setprototypeof@npm:1.2.0"
+ checksum: 10c0/68733173026766fa0d9ecaeb07f0483f4c2dc70ca376b3b7c40b7cda909f94b0918f6c5ad5ce27a9160bdfb475efaa9d5e705a11d8eaae18f9835d20976028bc
+ languageName: node
+ linkType: hard
+
"shebang-command@npm:^1.2.0":
version: 1.2.0
resolution: "shebang-command@npm:1.2.0"
@@ -6033,6 +6759,54 @@ __metadata:
languageName: node
linkType: hard
+"side-channel-list@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "side-channel-list@npm:1.0.0"
+ dependencies:
+ es-errors: "npm:^1.3.0"
+ object-inspect: "npm:^1.13.3"
+ checksum: 10c0/644f4ac893456c9490ff388bf78aea9d333d5e5bfc64cfb84be8f04bf31ddc111a8d4b83b85d7e7e8a7b845bc185a9ad02c052d20e086983cf59f0be517d9b3d
+ languageName: node
+ linkType: hard
+
+"side-channel-map@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "side-channel-map@npm:1.0.1"
+ dependencies:
+ call-bound: "npm:^1.0.2"
+ es-errors: "npm:^1.3.0"
+ get-intrinsic: "npm:^1.2.5"
+ object-inspect: "npm:^1.13.3"
+ checksum: 10c0/010584e6444dd8a20b85bc926d934424bd809e1a3af941cace229f7fdcb751aada0fb7164f60c2e22292b7fa3c0ff0bce237081fd4cdbc80de1dc68e95430672
+ languageName: node
+ linkType: hard
+
+"side-channel-weakmap@npm:^1.0.2":
+ version: 1.0.2
+ resolution: "side-channel-weakmap@npm:1.0.2"
+ dependencies:
+ call-bound: "npm:^1.0.2"
+ es-errors: "npm:^1.3.0"
+ get-intrinsic: "npm:^1.2.5"
+ object-inspect: "npm:^1.13.3"
+ side-channel-map: "npm:^1.0.1"
+ checksum: 10c0/71362709ac233e08807ccd980101c3e2d7efe849edc51455030327b059f6c4d292c237f94dc0685031dd11c07dd17a68afde235d6cf2102d949567f98ab58185
+ languageName: node
+ linkType: hard
+
+"side-channel@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "side-channel@npm:1.1.0"
+ dependencies:
+ es-errors: "npm:^1.3.0"
+ object-inspect: "npm:^1.13.3"
+ side-channel-list: "npm:^1.0.0"
+ side-channel-map: "npm:^1.0.1"
+ side-channel-weakmap: "npm:^1.0.2"
+ checksum: 10c0/cb20dad41eb032e6c24c0982e1e5a24963a28aa6122b4f05b3f3d6bf8ae7fd5474ef382c8f54a6a3ab86e0cac4d41a23bd64ede3970e5bfb50326ba02a7996e6
+ languageName: node
+ linkType: hard
+
"signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3":
version: 3.0.7
resolution: "signal-exit@npm:3.0.7"
@@ -6231,6 +7005,13 @@ __metadata:
languageName: node
linkType: hard
+"statuses@npm:2.0.1, statuses@npm:^2.0.1":
+ version: 2.0.1
+ resolution: "statuses@npm:2.0.1"
+ checksum: 10c0/34378b207a1620a24804ce8b5d230fea0c279f00b18a7209646d5d47e419d1cc23e7cbf33a25a1e51ac38973dc2ac2e1e9c647a8e481ef365f77668d72becfd0
+ languageName: node
+ linkType: hard
+
"strict-uri-encode@npm:^1.0.0":
version: 1.1.0
resolution: "strict-uri-encode@npm:1.1.0"
@@ -6518,6 +7299,13 @@ __metadata:
languageName: node
linkType: hard
+"toidentifier@npm:1.0.1":
+ version: 1.0.1
+ resolution: "toidentifier@npm:1.0.1"
+ checksum: 10c0/93937279934bd66cc3270016dd8d0afec14fb7c94a05c72dc57321f8bd1fa97e5bea6d1f7c89e728d077ca31ea125b78320a616a6c6cd0e6b9cb94cb864381c1
+ languageName: node
+ linkType: hard
+
"tree-kill@npm:^1.2.2":
version: 1.2.2
resolution: "tree-kill@npm:1.2.2"
@@ -6543,7 +7331,7 @@ __metadata:
languageName: node
linkType: hard
-"ts-api-utils@npm:^2.0.1":
+"ts-api-utils@npm:^2.1.0":
version: 2.1.0
resolution: "ts-api-utils@npm:2.1.0"
peerDependencies:
@@ -6582,13 +7370,6 @@ __metadata:
languageName: node
linkType: hard
-"turbo-stream@npm:2.4.0":
- version: 2.4.0
- resolution: "turbo-stream@npm:2.4.0"
- checksum: 10c0/e68b2569f1f16e6e9633d090c6024b2ae9f0e97bfeacb572451ca3732e120ebbb546f3bc4afc717c46cb57b5aea6104e04ef497f9912eef6a7641e809518e98a
- languageName: node
- linkType: hard
-
"type-check@npm:^0.4.0, type-check@npm:~0.4.0":
version: 0.4.0
resolution: "type-check@npm:0.4.0"
@@ -6605,6 +7386,17 @@ __metadata:
languageName: node
linkType: hard
+"type-is@npm:^2.0.0, type-is@npm:^2.0.1":
+ version: 2.0.1
+ resolution: "type-is@npm:2.0.1"
+ dependencies:
+ content-type: "npm:^1.0.5"
+ media-typer: "npm:^1.1.0"
+ mime-types: "npm:^3.0.0"
+ checksum: 10c0/7f7ec0a060b16880bdad36824ab37c26019454b67d73e8a465ed5a3587440fbe158bc765f0da68344498235c877e7dbbb1600beccc94628ed05599d667951b99
+ languageName: node
+ linkType: hard
+
"typesafe-i18n@npm:^5.26.2":
version: 5.26.2
resolution: "typesafe-i18n@npm:5.26.2"
@@ -6616,17 +7408,17 @@ __metadata:
languageName: node
linkType: hard
-"typescript-eslint@npm:8.31.0":
- version: 8.31.0
- resolution: "typescript-eslint@npm:8.31.0"
+"typescript-eslint@npm:8.32.0":
+ version: 8.32.0
+ resolution: "typescript-eslint@npm:8.32.0"
dependencies:
- "@typescript-eslint/eslint-plugin": "npm:8.31.0"
- "@typescript-eslint/parser": "npm:8.31.0"
- "@typescript-eslint/utils": "npm:8.31.0"
+ "@typescript-eslint/eslint-plugin": "npm:8.32.0"
+ "@typescript-eslint/parser": "npm:8.32.0"
+ "@typescript-eslint/utils": "npm:8.32.0"
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: ">=4.8.4 <5.9.0"
- checksum: 10c0/8545887f70c4f40c4aee51d224326368f67ef5f770ba5ae9e67bfd36f4d9ab5f3414569ffaaec311893a312539934ea367a68135c6f2b0a3e175c3de59507338
+ checksum: 10c0/f74c2a3defec95f5f6d0887a9c57ad4f38d62fabe4e4a5a83bf6e198832efb6d706d08c89002f7765c3438e41f4c71d4a4694918056aa3a50b7b786569298fe4
languageName: node
linkType: hard
@@ -6692,6 +7484,13 @@ __metadata:
languageName: node
linkType: hard
+"unpipe@npm:1.0.0":
+ version: 1.0.0
+ resolution: "unpipe@npm:1.0.0"
+ checksum: 10c0/193400255bd48968e5c5383730344fbb4fa114cdedfab26e329e50dd2d81b134244bb8a72c6ac1b10ab0281a58b363d06405632c9d49ca9dfd5e90cbd7d0f32c
+ languageName: node
+ linkType: hard
+
"update-browserslist-db@npm:^1.1.1":
version: 1.1.3
resolution: "update-browserslist-db@npm:1.1.3"
@@ -6766,6 +7565,13 @@ __metadata:
languageName: node
linkType: hard
+"vary@npm:^1, vary@npm:^1.1.2":
+ version: 1.1.2
+ resolution: "vary@npm:1.1.2"
+ checksum: 10c0/f15d588d79f3675135ba783c91a4083dcd290a2a5be9fcb6514220a1634e23df116847b1cc51f66bfb0644cf9353b2abb7815ae499bab06e46dd33c1a6bf1f4f
+ languageName: node
+ linkType: hard
+
"vite-plugin-imagemin@npm:^0.6.1":
version: 0.6.1
resolution: "vite-plugin-imagemin@npm:0.6.1"
@@ -6831,9 +7637,9 @@ __metadata:
languageName: node
linkType: hard
-"vite@npm:^6.3.3":
- version: 6.3.3
- resolution: "vite@npm:6.3.3"
+"vite@npm:^6.3.5":
+ version: 6.3.5
+ resolution: "vite@npm:6.3.5"
dependencies:
esbuild: "npm:^0.25.0"
fdir: "npm:^6.4.4"
@@ -6882,7 +7688,7 @@ __metadata:
optional: true
bin:
vite: bin/vite.js
- checksum: 10c0/7ea27d2c80a9e0b7ccf6cbd6c251455501286568160e8b632984e5332440f21a6d05f9236408212ba7653f7d2d4790f848956d8a620bbf4dd2ecb792a2fe1ab1
+ checksum: 10c0/df70201659085133abffc6b88dcdb8a57ef35f742a01311fc56a4cfcda6a404202860729cc65a2c401a724f6e25f9ab40ce4339ed4946f550541531ced6fe41c
languageName: node
linkType: hard
@@ -7042,3 +7848,19 @@ __metadata:
checksum: 10c0/dceb44c28578b31641e13695d200d34ec4ab3966a5729814d5445b194933c096b7ced71494ce53a0e8820685d1d010df8b2422e5bf2cdea7e469d97ffbea306f
languageName: node
linkType: hard
+
+"zod-to-json-schema@npm:^3.24.1":
+ version: 3.24.5
+ resolution: "zod-to-json-schema@npm:3.24.5"
+ peerDependencies:
+ zod: ^3.24.1
+ checksum: 10c0/0745b94ba53e652d39f262641cdeb2f75d24339fb6076a38ce55bcf53d82dfaea63adf524ebc5f658681005401687f8e9551c4feca7c4c882e123e66091dfb90
+ languageName: node
+ linkType: hard
+
+"zod@npm:^3.23.8, zod@npm:^3.24.2":
+ version: 3.24.4
+ resolution: "zod@npm:3.24.4"
+ checksum: 10c0/ab3112f017562180a41a0f83d870b333677f7d6b77f106696c56894567051b91154714a088149d8387a4f50806a2520efcb666f108cd384a35c236a191186d91
+ languageName: node
+ linkType: hard
diff --git a/lib_standalone/ESP32React.h b/lib_standalone/ESP32React.h
index 115a42aae..5b1d1a384 100644
--- a/lib_standalone/ESP32React.h
+++ b/lib_standalone/ESP32React.h
@@ -36,6 +36,7 @@ class DummySettings {
String discovery_prefix = "homeassistant";
uint8_t discovery_type = 0; // HA
bool ha_enabled = true;
+ bool ha_optimistic = false;
String base = "ems-esp";
bool publish_single = false;
bool publish_single2cmd = false;
diff --git a/mock-api/rest_server.ts b/mock-api/rest_server.ts
index 8a873c385..08714dc99 100644
--- a/mock-api/rest_server.ts
+++ b/mock-api/rest_server.ts
@@ -567,6 +567,7 @@ let mqtt_settings = {
rootCA: '',
mqtt_retain: false,
ha_enabled: true,
+ ha_optimistic: false,
nested_format: 1,
discovery_type: 0,
discovery_prefix: 'homeassistant',
diff --git a/src/ESP32React/MqttSettingsService.cpp b/src/ESP32React/MqttSettingsService.cpp
index f6fb78872..55d5a5881 100644
--- a/src/ESP32React/MqttSettingsService.cpp
+++ b/src/ESP32React/MqttSettingsService.cpp
@@ -244,6 +244,7 @@ void MqttSettings::read(MqttSettings & settings, JsonObject root) {
root["mqtt_qos"] = settings.mqtt_qos;
root["mqtt_retain"] = settings.mqtt_retain;
root["ha_enabled"] = settings.ha_enabled;
+ root["ha_optimistic"] = settings.ha_optimistic;
root["nested_format"] = settings.nested_format;
root["discovery_prefix"] = settings.discovery_prefix;
root["discovery_type"] = settings.discovery_type;
@@ -284,6 +285,7 @@ StateUpdateResult MqttSettings::update(JsonObject root, MqttSettings & settings)
newSettings.publish_time_heartbeat = static_cast(root["publish_time_heartbeat"] | EMSESP_DEFAULT_PUBLISH_HEARTBEAT);
newSettings.ha_enabled = root["ha_enabled"] | EMSESP_DEFAULT_HA_ENABLED;
+ newSettings.ha_optimistic = root["ha_optimistic"] | EMSESP_DEFAULT_HA_OPTIMISTIC;
newSettings.nested_format = static_cast(root["nested_format"] | EMSESP_DEFAULT_NESTED_FORMAT);
newSettings.discovery_prefix = root["discovery_prefix"] | EMSESP_DEFAULT_DISCOVERY_PREFIX;
newSettings.discovery_type = static_cast(root["discovery_type"] | EMSESP_DEFAULT_DISCOVERY_TYPE);
@@ -345,6 +347,14 @@ StateUpdateResult MqttSettings::update(JsonObject root, MqttSettings & settings)
changed = true;
}
+ if (newSettings.discovery_type != 0) {
+ newSettings.ha_optimistic = false;
+ }
+ if (newSettings.ha_optimistic != settings.ha_optimistic) {
+ emsesp::EMSESP::mqtt_.ha_optimistic(newSettings.ha_optimistic);
+ changed = true;
+ }
+
if (newSettings.mqtt_retain != settings.mqtt_retain) {
emsesp::EMSESP::mqtt_.set_retain(newSettings.mqtt_retain);
changed = true;
diff --git a/src/ESP32React/MqttSettingsService.h b/src/ESP32React/MqttSettingsService.h
index ef448af0d..760507ef2 100644
--- a/src/ESP32React/MqttSettingsService.h
+++ b/src/ESP32React/MqttSettingsService.h
@@ -76,6 +76,7 @@ class MqttSettings {
uint8_t mqtt_qos;
bool mqtt_retain;
bool ha_enabled;
+ bool ha_optimistic;
uint8_t nested_format;
String discovery_prefix;
uint8_t discovery_type;
diff --git a/src/core/analogsensor.cpp b/src/core/analogsensor.cpp
index ff3d7baf8..0ca1084fe 100644
--- a/src/core/analogsensor.cpp
+++ b/src/core/analogsensor.cpp
@@ -682,6 +682,9 @@ void AnalogSensor::publish_values(const bool force) {
Mqtt::add_ha_sections_to_doc("analog", stat_t, config, !is_ha_device_created, val_cond);
+ if (Mqtt::ha_optimistic() && config["cmd_t"].is()) {
+ config["optimistic"] = true;
+ }
sensor.ha_registered = Mqtt::queue_ha(topic, config.as());
}
}
diff --git a/src/core/default_settings.h b/src/core/default_settings.h
index 3a0e7a269..5a32df6af 100644
--- a/src/core/default_settings.h
+++ b/src/core/default_settings.h
@@ -185,6 +185,10 @@
#define EMSESP_DEFAULT_HA_ENABLED false
#endif
+#ifndef EMSESP_DEFAULT_HA_OPTIMISTIC
+#define EMSESP_DEFAULT_HA_OPTIMISTIC false
+#endif
+
#ifndef EMSESP_DEFAULT_PUBLISH_TIME
#define EMSESP_DEFAULT_PUBLISH_TIME 10
#endif
diff --git a/src/core/device_library.h b/src/core/device_library.h
index 43a0f24ce..0e7818df6 100644
--- a/src/core/device_library.h
+++ b/src/core/device_library.h
@@ -24,7 +24,7 @@
*/
// Boilers - 0x08
-{ 8, DeviceType::BOILER, "CS*800i, Logatherm WLW*", DeviceFlags::EMS_DEVICE_FLAG_HEATPUMP},
+{ 8, DeviceType::BOILER, "CS5800i, CS6800i, WLW176i, WLW186i", DeviceFlags::EMS_DEVICE_FLAG_CS6800},
{ 12, DeviceType::BOILER, "C1200W", DeviceFlags::EMS_DEVICE_FLAG_NONE},
{ 64, DeviceType::BOILER, "BK13/BK15, Smartline, GB1*2", DeviceFlags::EMS_DEVICE_FLAG_NONE},
{ 72, DeviceType::BOILER, "Logano GB1*5, Logamatic MC10", DeviceFlags::EMS_DEVICE_FLAG_EMS},
diff --git a/src/core/emsdevice.h b/src/core/emsdevice.h
index 36bdecf23..bfe3560e8 100644
--- a/src/core/emsdevice.h
+++ b/src/core/emsdevice.h
@@ -197,6 +197,19 @@ class EMSdevice {
}
}
+ void has_enumupdate(std::shared_ptr telegram,
+ uint8_t & value,
+ const uint8_t index,
+ const std::vector & maskIn,
+ const std::vector & maskOut) {
+ uint8_t val = value < maskIn.size() ? maskIn[value] : EMS_VALUE_UINT8_NOTSET;
+ if (telegram->read_value(val, index)) {
+ value = val < maskOut.size() ? maskOut[val] : EMS_VALUE_UINT8_NOTSET;
+ has_update_ = true;
+ publish_value((void *)&value);
+ }
+ }
+
template
void has_update(std::shared_ptr telegram, Value & value, const uint8_t index, uint8_t s = 0) {
if (telegram->read_value(value, index, s)) {
@@ -434,9 +447,10 @@ class EMSdevice {
static constexpr uint8_t EMS_DEVICE_FLAG_EMS = 1;
static constexpr uint8_t EMS_DEVICE_FLAG_EMSPLUS = 2;
static constexpr uint8_t EMS_DEVICE_FLAG_HT3 = 3;
- static constexpr uint8_t EMS_DEVICE_FLAG_HEATPUMP = 4;
- static constexpr uint8_t EMS_DEVICE_FLAG_HYBRID = 5;
- static constexpr uint8_t EMS_DEVICE_FLAG_HIU = 6;
+ static constexpr uint8_t EMS_DEVICE_FLAG_HYBRID = 4;
+ static constexpr uint8_t EMS_DEVICE_FLAG_HIU = 5;
+ static constexpr uint8_t EMS_DEVICE_FLAG_HEATPUMP = 8; // use bit for subtypes
+ static constexpr uint8_t EMS_DEVICE_FLAG_CS6800 = 9; // subtype of heatpump
// Solar Module
static constexpr uint8_t EMS_DEVICE_FLAG_SM10 = 1;
diff --git a/src/core/helpers.cpp b/src/core/helpers.cpp
index 95b2b366e..685181bce 100644
--- a/src/core/helpers.cpp
+++ b/src/core/helpers.cpp
@@ -627,10 +627,18 @@ bool Helpers::value2enum(const char * value, uint8_t & value_ui, const char * co
}
}
value_ui = 0;
-
return false;
}
+bool Helpers::value2enum(const char * value, uint8_t & value_ui, const char * const ** strs, const std::vector & mask) {
+ uint8_t v = value_ui;
+ if (!value2enum(value, v, strs) || v >= mask.size()) {
+ return false;
+ }
+ value_ui = mask[v];
+ return true;
+}
+
// finds the string (value) of a list vector (strs)
// returns true if found, and sets the value_ui to the index, else false
// also allow true/false for on/off
@@ -658,6 +666,15 @@ bool Helpers::value2enum(const char * value, uint8_t & value_ui, const char * co
return false;
}
+bool Helpers::value2enum(const char * value, uint8_t & value_ui, const char * const * strs, const std::vector & mask) {
+ uint8_t v = value_ui;
+ if (!value2enum(value, v, strs) || v >= mask.size()) {
+ return false;
+ }
+ value_ui = mask[v];
+ return true;
+}
+
// https://stackoverflow.com/questions/313970/how-to-convert-stdstring-to-lower-case
std::string Helpers::toLower(std::string const & s) {
std::string lc = s;
diff --git a/src/core/helpers.h b/src/core/helpers.h
index 144653018..7a9dc92dd 100644
--- a/src/core/helpers.h
+++ b/src/core/helpers.h
@@ -72,7 +72,9 @@ class Helpers {
static bool value2bool(const char * value, bool & value_b);
static bool value2string(const char * value, std::string & value_s);
static bool value2enum(const char * value, uint8_t & value_ui, const char * const ** strs);
+ static bool value2enum(const char * value, uint8_t & value_ui, const char * const ** strs, const std::vector & mask);
static bool value2enum(const char * value, uint8_t & value_ui, const char * const * strs);
+ static bool value2enum(const char * value, uint8_t & value_ui, const char * const * strs, const std::vector & mask);
static bool value2temperature(const char * value, float & value_f, bool relative = false);
static bool value2temperature(const char * value, int & value_i, const bool relative = false, const int min = -2147483648, const int max = 2147483647);
diff --git a/src/core/locale_common.h b/src/core/locale_common.h
index 2718db83f..fd06c6a61 100644
--- a/src/core/locale_common.h
+++ b/src/core/locale_common.h
@@ -298,6 +298,8 @@ MAKE_ENUM(enum_comfort2, FL_(eco), FL_(high_comfort))
MAKE_ENUM(enum_flow, FL_(off), FL_(flow), FL_(bufferedflow), FL_(buffer), FL_(layeredbuffer))
MAKE_ENUM(enum_reset, FL_(dash), FL_(maintenance), FL_(error), FL_(history), FL_(message))
MAKE_ENUM(enum_maxHeat, FL_(0kW), FL_(2kW), FL_(3kW), FL_(4kW), FL_(6kW), FL_(9kW))
+MAKE_ENUM(enum_maxHeat1, FL_(0kW), FL_(3kW), FL_(6kW), FL_(9kW))
+MAKE_ENUM(enum_maxHeat2, FL_(3kW), FL_(6kW), FL_(9kW))
MAKE_ENUM(enum_pumpMode, FL_(proportional), FL_(deltaP1), FL_(deltaP2), FL_(deltaP3), FL_(deltaP4))
MAKE_ENUM(enum_pumpCharacter, FL_(proportional), FL_(pressure1), FL_(pressure2), FL_(pressure3), FL_(pressure4), FL_(pressure5), FL_(pressure6))
MAKE_ENUM(enum_hpPumpMode, FL_(auto), FL_(continuous))
diff --git a/src/core/locale_translations.h b/src/core/locale_translations.h
index 0c4d896ea..b0388940d 100644
--- a/src/core/locale_translations.h
+++ b/src/core/locale_translations.h
@@ -636,6 +636,7 @@ MAKE_TRANSLATION(wwStorageTemp2, "storagetemp2", "storage extern temperature", "
MAKE_TRANSLATION(wwActivated, "activated", "activated", "aktiviert", "geactiveerd", "Aktiverad", "system przygotowywania c.w.u.", "aktivert", "activé", "devreye girdi", "attivato", "aktivovaný", "aktivováno")
MAKE_TRANSLATION(wwDisinfecting, "disinfecting", "disinfecting", "Desinfizieren", "Desinfectie", "Desinficerar", "dezynfekcja termiczna", "desinfiserer", "désinfection", "dezenfekte ediliyor", "disinfezione", "dezinfekcia", "dezinfekce")
MAKE_TRANSLATION(wwDisinfectionTemp, "disinfectiontemp", "disinfection temperature", "Desinfektionstemperatur", "Desinfectietemperatuur", "Desinfektionstemperatur", "temperatura dezynfekcji termicznej", "desinfeksjonstemperatur", "température désinfection", "dezenfeksiyon sıcaklığı", "temperatura disinfezione", "teplota dezinfekcie", "dezinfekční teplota")
+MAKE_TRANSLATION(wwChargePump, "chargepump", "charge pump", "Ladepumpe", "", "", "", "", "", "", "", "", "") // TODO Translate
MAKE_TRANSLATION(wwCharging, "charging", "charging", "Laden", "Laden", "Värmer", "grzanie", "varmer", "chargement", "dolduruluyor", "caricamento", "nabíjanie", "nabíjení")
MAKE_TRANSLATION(wwChargeOptimization, "chargeoptimization", "charge optimization", "Ladungsoptimierung", "laadoptimalisatie", "Laddningsoptimering", "optymalizacja grzania", "oppvarmingsoptimalisering", "optimisation charge", "dolum optimizasyonu", "ottimizzazione carica", "optimalizácia poplatkov", "optimalizace nabíjení")
MAKE_TRANSLATION(wwRecharging, "recharging", "recharging", "Nachladen", "herladen", "Laddar om", "ponowne grzanie", "varm på nytt", "en recharge", "tekrar dolduruluyor", "in ricarica", "nabíjanie", "dobíjení")
diff --git a/src/core/mqtt.cpp b/src/core/mqtt.cpp
index 42bbfc59a..3eff811e8 100644
--- a/src/core/mqtt.cpp
+++ b/src/core/mqtt.cpp
@@ -40,6 +40,7 @@ uint32_t Mqtt::publish_time_heartbeat_;
bool Mqtt::mqtt_enabled_;
uint8_t Mqtt::entity_format_;
bool Mqtt::ha_enabled_;
+bool Mqtt::ha_optimistic_;
uint8_t Mqtt::nested_format_;
std::string Mqtt::discovery_prefix_;
uint8_t Mqtt::discovery_type_;
@@ -340,6 +341,7 @@ void Mqtt::load_settings() {
mqtt_retain_ = mqttSettings.mqtt_retain;
mqtt_enabled_ = mqttSettings.enabled;
ha_enabled_ = mqttSettings.ha_enabled;
+ ha_optimistic_ = mqttSettings.ha_optimistic;
nested_format_ = mqttSettings.nested_format;
publish_single_ = mqttSettings.publish_single;
publish_single2cmd_ = mqttSettings.publish_single2cmd;
@@ -1114,6 +1116,9 @@ bool Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdev
doc["dev"] = dev_json;
+ if (ha_optimistic_ && has_cmd) {
+ doc["optimistic"] = true;
+ }
return queue_ha(topic, doc.as());
}
@@ -1343,6 +1348,9 @@ bool Mqtt::publish_ha_climate_config(const int8_t tag, const bool has_roomtemp,
// device name must be different to the entity name, take the ids value we just created
add_ha_sections_to_doc("thermostat", topic_t, doc, false, seltemp_cond, has_roomtemp ? currtemp_cond : nullptr, hc_mode_cond);
+ if (ha_optimistic_) {
+ doc["optimistic"] = true;
+ }
return queue_ha(topic, doc.as()); // publish the config payload with retain flag
}
@@ -1398,7 +1406,7 @@ void Mqtt::add_ha_sections_to_doc(const char * name,
// make local copy of state, as the pointer will get derefenced
char state[50];
- strcpy(state, state_t);
+ strlcpy(state, state_t, sizeof(state));
// skip conditional Jinja2 templates if not home assistant
if (discovery_type() == discoveryType::HOMEASSISTANT) {
diff --git a/src/core/mqtt.h b/src/core/mqtt.h
index 2a7fadf0f..89d572b96 100644
--- a/src/core/mqtt.h
+++ b/src/core/mqtt.h
@@ -206,6 +206,14 @@ class Mqtt {
ha_enabled_ = ha_enabled;
}
+ static bool ha_optimistic() {
+ return ha_optimistic_;
+ }
+
+ static void ha_optimistic(bool ha_optimistic) {
+ ha_optimistic_ = ha_optimistic;
+ }
+
static bool ha_climate_reset() {
return ha_climate_reset_;
}
@@ -309,6 +317,7 @@ class Mqtt {
static uint32_t publish_time_heartbeat_;
static bool mqtt_enabled_;
static bool ha_enabled_;
+ static bool ha_optimistic_;
static uint8_t nested_format_;
static uint8_t entity_format_;
static std::string discovery_prefix_;
diff --git a/src/core/system.cpp b/src/core/system.cpp
index 22f5c03be..253700003 100644
--- a/src/core/system.cpp
+++ b/src/core/system.cpp
@@ -2001,8 +2001,12 @@ std::string System::reset_reason(uint8_t cpu) const {
// set NTP status
void System::ntp_connected(bool b) {
- if (b != ntp_connected_ && !b) {
- LOG_WARNING("NTP disconnected"); // if turned off report it
+ if (b != ntp_connected_) {
+ if (b) {
+ LOG_INFO("NTP connected");
+ } else {
+ LOG_WARNING("NTP disconnected"); // if turned off report it
+ }
}
ntp_connected_ = b;
diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp
index f79f6e919..dc61a9b08 100644
--- a/src/devices/boiler.cpp
+++ b/src/devices/boiler.cpp
@@ -68,7 +68,7 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const
register_telegram_type(0x28, "WeatherComp", true, MAKE_PF_CB(process_WeatherComp));
}
- if (model() == EMSdevice::EMS_DEVICE_FLAG_HEATPUMP) {
+ if (isHeatPump()) {
register_telegram_type(0x494, "UBAEnergySupplied", false, MAKE_PF_CB(process_UBAEnergySupplied));
register_telegram_type(0x495, "UBAInformation", false, MAKE_PF_CB(process_UBAInformation));
register_telegram_type(0x48D, "HpPower", true, MAKE_PF_CB(process_HpPower));
@@ -96,7 +96,7 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const
}
// some gas boilers, see #1701
- if (model() != EMSdevice::EMS_DEVICE_FLAG_HEATPUMP) {
+ if (!isHeatPump()) {
register_telegram_type(0x2E, "Meters", false, MAKE_PF_CB(process_Meters));
register_telegram_type(0x3B, "Energy", false, MAKE_PF_CB(process_Energy));
}
@@ -187,7 +187,7 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const
DeviceValueUOM::DEGREES);
// exclude burner related entities from heatpump and HIU
- if (model() != EMSdevice::EMS_DEVICE_FLAG_HEATPUMP && model() != EMSdevice::EMS_DEVICE_FLAG_HIU) {
+ if (!isHeatPump() && model() != EMSdevice::EMS_DEVICE_FLAG_HIU) {
register_device_value(DeviceValueTAG::TAG_DEVICE_DATA,
&exhaustTemp_,
DeviceValueType::UINT16,
@@ -411,7 +411,7 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const
99);
}
*/
- if (model() != EMSdevice::EMS_DEVICE_FLAG_HEATPUMP) {
+ if (!isHeatPump()) {
register_device_value(DeviceValueTAG::TAG_DEVICE_DATA,
&meterHeat_,
DeviceValueType::UINT24,
@@ -436,7 +436,7 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const
}
// heatpump info
- if (model() == EMSdevice::EMS_DEVICE_FLAG_HEATPUMP) {
+ if (isHeatPump()) {
register_device_value(DeviceValueTAG::TAG_DEVICE_DATA,
&nrgTotal_,
DeviceValueType::UINT24,
@@ -655,27 +655,51 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const
FL_(hpIn4Opt),
DeviceValueUOM::NONE,
MAKE_CF_CB(set_HpIn4Logic));
- register_device_value(DeviceValueTAG::TAG_DEVICE_DATA,
- &maxHeatComp_,
- DeviceValueType::ENUM,
- FL_(enum_maxHeat),
- FL_(maxHeatComp),
- DeviceValueUOM::NONE,
- MAKE_CF_CB(set_maxHeatComp));
- register_device_value(DeviceValueTAG::TAG_DEVICE_DATA,
- &maxHeatHeat_,
- DeviceValueType::ENUM,
- FL_(enum_maxHeat),
- FL_(maxHeatHeat),
- DeviceValueUOM::NONE,
- MAKE_CF_CB(set_maxHeatHeat));
- register_device_value(DeviceValueTAG::TAG_DHW1,
- &maxHeatDhw_,
- DeviceValueType::ENUM,
- FL_(enum_maxHeat),
- FL_(maxHeatDhw),
- DeviceValueUOM::NONE,
- MAKE_CF_CB(set_maxHeatDhw));
+ if (model() == EMSdevice::EMS_DEVICE_FLAG_CS6800) {
+ register_device_value(DeviceValueTAG::TAG_DEVICE_DATA,
+ &maxHeatComp_,
+ DeviceValueType::ENUM,
+ FL_(enum_maxHeat1),
+ FL_(maxHeatComp),
+ DeviceValueUOM::NONE,
+ MAKE_CF_CB(set_maxHeatComp));
+ register_device_value(DeviceValueTAG::TAG_DEVICE_DATA,
+ &maxHeatHeat_,
+ DeviceValueType::ENUM,
+ FL_(enum_maxHeat2),
+ FL_(maxHeatHeat),
+ DeviceValueUOM::NONE,
+ MAKE_CF_CB(set_maxHeatHeat));
+ register_device_value(DeviceValueTAG::TAG_DHW1,
+ &maxHeatDhw_,
+ DeviceValueType::ENUM,
+ FL_(enum_maxHeat2),
+ FL_(maxHeatDhw),
+ DeviceValueUOM::NONE,
+ MAKE_CF_CB(set_maxHeatDhw));
+ } else {
+ register_device_value(DeviceValueTAG::TAG_DEVICE_DATA,
+ &maxHeatComp_,
+ DeviceValueType::ENUM,
+ FL_(enum_maxHeat),
+ FL_(maxHeatComp),
+ DeviceValueUOM::NONE,
+ MAKE_CF_CB(set_maxHeatComp));
+ register_device_value(DeviceValueTAG::TAG_DEVICE_DATA,
+ &maxHeatHeat_,
+ DeviceValueType::ENUM,
+ FL_(enum_maxHeat),
+ FL_(maxHeatHeat),
+ DeviceValueUOM::NONE,
+ MAKE_CF_CB(set_maxHeatHeat));
+ register_device_value(DeviceValueTAG::TAG_DHW1,
+ &maxHeatDhw_,
+ DeviceValueType::ENUM,
+ FL_(enum_maxHeat),
+ FL_(maxHeatDhw),
+ DeviceValueUOM::NONE,
+ MAKE_CF_CB(set_maxHeatDhw));
+ }
register_device_value(DeviceValueTAG::TAG_DEVICE_DATA,
&auxHeaterSource_,
DeviceValueType::ENUM,
@@ -1043,6 +1067,7 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const
register_device_value(DeviceValueTAG::TAG_DHW1, &wwTempOK_, DeviceValueType::BOOL, FL_(wwTempOK), DeviceValueUOM::NONE);
register_device_value(DeviceValueTAG::TAG_DHW1, &wwActive_, DeviceValueType::BOOL, FL_(wwActive), DeviceValueUOM::NONE);
register_device_value(DeviceValueTAG::TAG_DHW1, &ww3wayValve_, DeviceValueType::BOOL, FL_(ww3wayValve), DeviceValueUOM::NONE);
+ register_device_value(DeviceValueTAG::TAG_DHW1, &wwChargePump_, DeviceValueType::BOOL, FL_(wwChargePump), DeviceValueUOM::NONE);
register_device_value(DeviceValueTAG::TAG_DHW1,
&wwMixerTemp_,
DeviceValueType::UINT16,
@@ -1067,7 +1092,7 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const
EMSESP::send_read_request(0xC6, device_id, 0, 21); // read last errorcode on start (not broadcasted)
- if (model() != EMSdevice::EMS_DEVICE_FLAG_HEATPUMP && model() != EMSdevice::EMS_DEVICE_FLAG_HIU) {
+ if (!isHeatPump() && model() != EMSdevice::EMS_DEVICE_FLAG_HIU) {
register_telegram_type(0x04, "UBAFactory", true, MAKE_PF_CB(process_UBAFactory));
register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nomPower_, DeviceValueType::UINT8, FL_(nomPower), DeviceValueUOM::KW, MAKE_CF_CB(set_nomPower));
register_device_value(DeviceValueTAG::TAG_DEVICE_DATA,
@@ -1188,7 +1213,7 @@ void Boiler::check_active() {
}
// calculate energy for boiler 0x08 from stored modulation an time in units of 0.01 Wh
- if (model() != EMSdevice::EMS_DEVICE_FLAG_HEATPUMP && model() != EMSdevice::EMS_DEVICE_FLAG_HIU) {
+ if (!isHeatPump() && model() != EMSdevice::EMS_DEVICE_FLAG_HIU) {
// remember values from last call
static uint32_t powLastReadTime_ = uuid::get_uptime();
static uint8_t heatBurnPow = 0;
@@ -1297,6 +1322,7 @@ void Boiler::process_UBAMonitorFast(std::shared_ptr telegram) {
has_update(curBurnPow_, curBurnPow);
check_active(); // do a quick check to see if the hot water or heating is active
+ has_bitupdate(telegram, wwChargePump_, 23, 0);
}
}
@@ -1348,11 +1374,11 @@ void Boiler::process_UBAParameterWW(std::shared_ptr telegram) {
// has_bitupdate(telegram, wwEquipt_,0,3); // 8=boiler has ww
has_update(telegram, wwActivated_, 1); // 0xFF means on
has_update(telegram, wwSelTemp_, 2);
- has_update(telegram, wwHystOn_, 3); // Hyst on (default -5)
- has_update(telegram, wwHystOff_, 4); // Hyst off (default -1)
- has_update(telegram, wwFlowTempOffset_, 5); // default 40
- has_update(telegram, wwCircPump_, 6); // 0xFF means on
- has_update(telegram, wwCircMode_, 7); // 0=off, 1=1x3min 6=6x3min 7=continuous
+ has_update(telegram, wwHystOn_, 3); // Hyst on (default -5)
+ has_update(telegram, wwChargeOptimization_, 4); // bool
+ has_update(telegram, wwFlowTempOffset_, 5); // default 40
+ has_update(telegram, wwCircPump_, 6); // 0xFF means on
+ has_update(telegram, wwCircMode_, 7); // 0=off, 1=1x3min 6=6x3min 7=continuous
has_update(telegram, wwDisinfectionTemp_, 8);
has_bitupdate(telegram, wwChargeType_, 10, 0); // 0 = charge pump, 0xff = 3-way valve
@@ -1451,7 +1477,7 @@ void Boiler::process_UBAMonitorFastPlus(std::shared_ptr telegram
// at this point do a quick check to see if the hot water or heating is active
uint8_t state = EMS_VALUE_UINT8_NOTSET;
- if (telegram->read_value(state, 11) && model() != EMSdevice::EMS_DEVICE_FLAG_HIU && model() != EMSdevice::EMS_DEVICE_FLAG_HEATPUMP) {
+ if (telegram->read_value(state, 11) && model() != EMSdevice::EMS_DEVICE_FLAG_HIU && !isHeatPump()) {
boilerState_ = state & 0x01 ? 0x08 : 0; // burnGas
boilerState_ |= state & 0x02 ? 0x01 : 0; // heatingPump
boilerState_ |= state & 0x04 ? 0x02 : 0; // 3-way-valve
@@ -1778,6 +1804,12 @@ void Boiler::process_HpCooling(std::shared_ptr telegram) {
// Boiler(0x08) -W-> Me(0x0B), HpHeaterConfig(0x0492), data: 03 00 00 04 00
void Boiler::process_HpHeaterConfig(std::shared_ptr telegram) {
+ if (model() == EMSdevice::EMS_DEVICE_FLAG_CS6800) {
+ has_enumupdate(telegram, maxHeatComp_, 2, {0, 2, 4, 5}, {0, 0, 1, 0, 2, 3});
+ has_enumupdate(telegram, maxHeatHeat_, 3, {2, 4, 5}, {0, 0, 0, 0, 1, 2});
+ has_enumupdate(telegram, maxHeatDhw_, 4, {2, 4, 5}, {0, 0, 0, 0, 1, 2});
+ return;
+ }
has_update(telegram, maxHeatComp_, 2);
has_update(telegram, maxHeatHeat_, 3);
has_update(telegram, maxHeatDhw_, 4);
@@ -2078,7 +2110,7 @@ void Boiler::process_HpPump2(std::shared_ptr telegram) {
// Boiler(0x08) -> All(0x00), ?(0x0491), data: 03 01 00 00 00 02 64 00 00 14 01 2C 00 0A 00 1E 00 1E 00 00 1E 0A 1E 05 05
void Boiler::process_HpAdditionalHeater(std::shared_ptr telegram) {
has_update(telegram, auxHeaterSource_, 0); // https://github.com/emsesp/EMS-ESP32/discussions/2489
- has_update(telegram, auxHeaterOnly_, 1);
+ has_update(telegram, auxHeaterOnly_, model() == EMSdevice::EMS_DEVICE_FLAG_CS6800 ? 3 : 1);
has_update(telegram, auxHeaterOff_, 2);
has_update(telegram, auxHeatMode_, 4); // eco/comfort
has_update(telegram, tempParMode_, 5);
@@ -2532,6 +2564,8 @@ bool Boiler::set_ww_chargeOptimization(const char * value, const int8_t id) {
if (is_received(EMS_TYPE_UBAParameterWWPlus)) {
write_command(EMS_TYPE_UBAParameterWWPlus, 25, v ? 1 : 0, EMS_TYPE_UBAParameterWWPlus);
+ } else {
+ write_command(EMS_TYPE_UBAParameterWW, 4, v ? 0xFF : 0, EMS_TYPE_UBAParameterWW);
}
return true;
@@ -3059,8 +3093,20 @@ bool Boiler::set_HpInLogic(const char * value, const int8_t id) {
bool Boiler::set_maxHeat(const char * value, const int8_t id) {
uint8_t v;
- if (!Helpers::value2enum(value, v, FL_(enum_maxHeat))) {
- return false;
+ if (model() == EMSdevice::EMS_DEVICE_FLAG_CS6800) {
+ if (id == 0) {
+ if (!Helpers::value2enum(value, v, FL_(enum_maxHeat1), {0, 2, 4, 5})) {
+ return false;
+ }
+ } else {
+ if (!Helpers::value2enum(value, v, FL_(enum_maxHeat2), {2, 4, 5})) {
+ return false;
+ }
+ }
+ } else {
+ if (!Helpers::value2enum(value, v, FL_(enum_maxHeat))) {
+ return false;
+ }
}
write_command(0x492, id, v, 0x492);
return true;
@@ -3105,7 +3151,7 @@ bool Boiler::set_minTempSilent(const char * value, const int8_t id) {
bool Boiler::set_additionalHeaterOnly(const char * value, const int8_t id) {
bool v;
if (Helpers::value2bool(value, v)) {
- write_command(0x491, 1, v ? 1 : 0, 0x491);
+ write_command(0x491, model() == EMSdevice::EMS_DEVICE_FLAG_CS6800 ? 3 : 1, v ? 1 : 0, 0x491);
return true;
}
return false;
diff --git a/src/devices/boiler.h b/src/devices/boiler.h
index aa66281b7..48061d255 100644
--- a/src/devices/boiler.h
+++ b/src/devices/boiler.h
@@ -34,6 +34,9 @@ class Boiler : public EMSdevice {
inline uint8_t model() const {
return (flags() & 0x0F);
}
+ inline bool isHeatPump() const {
+ return flags() & 0x08;
+ }
void check_active();
void store_energy();
@@ -45,6 +48,7 @@ class Boiler : public EMSdevice {
static constexpr uint8_t EMS_TYPE_UBAFunctionTest = 0x1D;
static constexpr uint8_t EMS_TYPE_UBAFlags = 0x35;
static constexpr uint8_t EMS_TYPE_UBASetPoints = 0x1A;
+ static constexpr uint16_t EMS_TYPE_UBASetPoints2 = 0x2E0;
static constexpr uint8_t EMS_TYPE_UBAParameters = 0x16;
static constexpr uint8_t EMS_TYPE_UBAParametersPlus = 0xE6;
static constexpr uint8_t EMS_TYPE_UBAParameterWWPlus = 0xEA;
@@ -81,12 +85,13 @@ class Boiler : public EMSdevice {
uint8_t wwTempOK_; // DHW temperature ok on/off
uint8_t wwActive_; //
uint8_t ww3wayValve_; // 3-way valve on WW
- uint8_t wwFlowTempOffset_; // Boiler offset for ww heating
- uint8_t wwMaxPower_; // DHW maximum power
- uint8_t wwMaxTemp_; // DHW maximum temperature
- uint32_t wwStarts_; // DHW starts
- uint32_t wwStartsHp_; // DHW starts Heatpump
- uint32_t wwWorkM_; // DHW minutes
+ uint8_t wwChargePump_;
+ uint8_t wwFlowTempOffset_; // Boiler offset for ww heating
+ uint8_t wwMaxPower_; // DHW maximum power
+ uint8_t wwMaxTemp_; // DHW maximum temperature
+ uint32_t wwStarts_; // DHW starts
+ uint32_t wwStartsHp_; // DHW starts Heatpump
+ uint32_t wwWorkM_; // DHW minutes
int8_t wwHystOn_;
int8_t wwHystOff_;
uint16_t wwMixerTemp_; // mixing temperature
diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp
index 3ef575291..edb028a10 100644
--- a/src/devices/thermostat.cpp
+++ b/src/devices/thermostat.cpp
@@ -1275,30 +1275,14 @@ void Thermostat::process_RC300WWmode(std::shared_ptr telegram) {
has_update(telegram, dhw->wwCircPump_, 1); // FF=off, 0=on ?
if (model() == EMSdevice::EMS_DEVICE_FLAG_BC400 || model() == EMSdevice::EMS_DEVICE_FLAG_HMC310) {
- const uint8_t modes[] = {0, 5, 1, 2, 4}; // off, eco+, eco, comfort, auto
- uint8_t wwmode = dhw->wwMode_ < sizeof(modes) ? modes[dhw->wwMode_] : EMS_VALUE_UINT8_NOTSET;
- telegram->read_value(wwmode, 2);
- const uint8_t modes1[] = {0, 2, 3, 0, 4, 1};
- has_update(dhw->wwMode_, wwmode < sizeof(modes1) ? modes1[wwmode] : EMS_VALUE_UINT8_NOTSET);
+ has_enumupdate(telegram, dhw->wwMode_, 2, {0, 5, 1, 2, 4}, {0, 2, 3, 0, 4, 1});
} else if (model() == EMSdevice::EMS_DEVICE_FLAG_R3000) {
// https://github.com/emsesp/EMS-ESP32/pull/1722#discussion_r1582823521
- const uint8_t modes[] = {1, 2, 5}; // normal, comfort, eco+
- uint8_t wwmode = dhw->wwMode_ < sizeof(modes) ? modes[dhw->wwMode_] : EMS_VALUE_UINT8_NOTSET;
- telegram->read_value(wwmode, 2);
- const uint8_t modes1[] = {0, 0, 1, 0, 0, 2}; // 0=normal (1), 1=comfort(2), 2=eco+(5)
- has_update(dhw->wwMode_, wwmode < sizeof(modes1) ? modes1[wwmode] : EMS_VALUE_UINT8_NOTSET);
+ has_enumupdate(telegram, dhw->wwMode_, 2, {1, 2, 5}, {0, 0, 1, 0, 0, 2}); // normal, comfort, eco+
} else if (model() == EMSdevice::EMS_DEVICE_FLAG_CR120) {
- const uint8_t modes[] = {1, 2, 4}; //// 0=normal (1), 1=comfort(2), 2=auto(4)
- uint8_t wwmode = dhw->wwMode_ < sizeof(modes) ? modes[dhw->wwMode_] : EMS_VALUE_UINT8_NOTSET;
- telegram->read_value(wwmode, 2);
- const uint8_t modes1[] = {0, 0, 1, 0, 2, 0};
- has_update(dhw->wwMode_, wwmode < sizeof(modes1) ? modes1[wwmode] : EMS_VALUE_UINT8_NOTSET);
+ has_enumupdate(telegram, dhw->wwMode_, 2, {1, 2, 4}, {0, 0, 1, 0, 2, 0}); // normal, comfort, auto
} else if (model() == EMSdevice::EMS_DEVICE_FLAG_RC100) {
- const uint8_t modes[] = {0, 2, 3}; //// 0=off(0), 1=on(2), 2=auto(3)
- uint8_t wwmode = dhw->wwMode_ < sizeof(modes) ? modes[dhw->wwMode_] : EMS_VALUE_UINT8_NOTSET;
- telegram->read_value(wwmode, 2);
- const uint8_t modes1[] = {0, 0, 1, 2, 0, 0};
- has_update(dhw->wwMode_, wwmode < sizeof(modes1) ? modes1[wwmode] : EMS_VALUE_UINT8_NOTSET);
+ has_enumupdate(telegram, dhw->wwMode_, 2, {0, 2, 3}, {0, 0, 1, 2, 0, 0}); // normal, on, auto
} else {
has_update(telegram, dhw->wwMode_, 2); // 0=off, 1=low, 2=high, 3=auto, 4=own prog
}
@@ -2294,29 +2278,25 @@ bool Thermostat::set_wwmode(const char * value, const int8_t id) {
}
write_command(0xB0, 2, set, 0xB0);
} else if (model() == EMSdevice::EMS_DEVICE_FLAG_BC400 || model() == EMSdevice::EMS_DEVICE_FLAG_HMC310) {
- if (!Helpers::value2enum(value, set, FL_(enum_wwMode4))) { // off, eco+, eco, comfort, auto
+ if (!Helpers::value2enum(value, set, FL_(enum_wwMode4), {0, 5, 1, 2, 4})) { // off, eco+, eco, comfort, auto
return false;
}
- const uint8_t modes[] = {0, 5, 1, 2, 4};
- write_command(0x02F5 + dhw->offset(), 2, modes[set], 0x02F5 + dhw->offset());
+ write_command(0x02F5 + dhw->offset(), 2, set, 0x02F5 + dhw->offset());
} else if (model() == EMSdevice::EMS_DEVICE_FLAG_CR120) {
- if (!Helpers::value2enum(value, set, FL_(enum_wwMode6))) { // normal, comfort, auto
+ if (!Helpers::value2enum(value, set, FL_(enum_wwMode6), {0, 2, 4})) { // normal, comfort, auto
return false;
}
- const uint8_t modes[] = {0, 2, 4};
- write_command(0x02F5 + dhw->offset(), 2, modes[set], 0x02F5 + dhw->offset());
+ write_command(0x02F5 + dhw->offset(), 2, set, 0x02F5 + dhw->offset());
} else if (model() == EMSdevice::EMS_DEVICE_FLAG_RC100) {
- if (!Helpers::value2enum(value, set, FL_(enum_wwMode2))) { // off, on, auto
+ if (!Helpers::value2enum(value, set, FL_(enum_wwMode2), {0, 2, 3})) { // off, on, auto
return false;
}
- const uint8_t modes[] = {0, 2, 3};
- write_command(0x02F5 + dhw->offset(), 2, modes[set], 0x02F5 + dhw->offset());
+ write_command(0x02F5 + dhw->offset(), 2, set, 0x02F5 + dhw->offset());
} else if (model() == EMSdevice::EMS_DEVICE_FLAG_R3000) { // Rego3000 - https://github.com/emsesp/EMS-ESP32/issues/1692
- if (!Helpers::value2enum(value, set, FL_(enum_wwMode5))) {
+ if (!Helpers::value2enum(value, set, FL_(enum_wwMode5), {1, 2, 5})) {
return false;
}
- const uint8_t modes[] = {1, 2, 5};
- write_command(0x02F5 + dhw->offset(), 2, modes[set], 0x02F5 + dhw->offset());
+ write_command(0x02F5 + dhw->offset(), 2, set, 0x02F5 + dhw->offset());
} else if (model() == EMSdevice::EMS_DEVICE_FLAG_RC300) {
if (!Helpers::value2enum(value, set, FL_(enum_wwMode))) {
return false;
diff --git a/src/emsesp_version.h b/src/emsesp_version.h
index ca6316e7b..3fdcb5c15 100644
--- a/src/emsesp_version.h
+++ b/src/emsesp_version.h
@@ -1 +1 @@
-#define EMSESP_APP_VERSION "3.7.3-dev.10"
+#define EMSESP_APP_VERSION "3.7.3-dev.11"
diff --git a/src/web/WebCustomEntityService.cpp b/src/web/WebCustomEntityService.cpp
index 19e0f6fe0..a96755cb2 100644
--- a/src/web/WebCustomEntityService.cpp
+++ b/src/web/WebCustomEntityService.cpp
@@ -59,6 +59,7 @@ void WebCustomEntity::read(WebCustomEntity & webEntity, JsonObject root) {
ei["uom"] = entityItem.value_type == DeviceValueType::BOOL ? 0 : entityItem.uom;
ei["value_type"] = entityItem.value_type;
ei["writeable"] = entityItem.writeable;
+ ei["hide"] = entityItem.hide;
EMSESP::webCustomEntityService.render_value(ei, entityItem, true, true);
}
}
@@ -94,6 +95,7 @@ StateUpdateResult WebCustomEntity::update(JsonObject root, WebCustomEntity & web
entityItem.uom = ei["uom"];
entityItem.value_type = ei["value_type"];
entityItem.writeable = ei["writeable"];
+ entityItem.hide = ei["hide"] | false;
entityItem.data = ei["value"].as();
if (entityItem.ram == 1) {
entityItem.device_id = 0;
@@ -295,7 +297,9 @@ bool WebCustomEntityService::get_value_info(JsonObject output, const char * cmd)
if (!strlen(cmd) || !strcmp(cmd, F_(values)) || !strcmp(cmd, F_(info))) {
// list all names
for (CustomEntityItem & entity : *customEntityItems_) {
- render_value(output, entity);
+ if (!entity.hide) {
+ render_value(output, entity);
+ }
}
return true;
}
@@ -346,7 +350,7 @@ void WebCustomEntityService::get_value_json(JsonObject output, CustomEntityItem
// publish single value
void WebCustomEntityService::publish_single(CustomEntityItem & entity) {
- if (!Mqtt::enabled() || !Mqtt::publish_single()) {
+ if (!Mqtt::enabled() || !Mqtt::publish_single() || entity.hide) {
return;
}
@@ -387,6 +391,9 @@ void WebCustomEntityService::publish(const bool force) {
bool ha_created = ha_registered_;
for (CustomEntityItem & entityItem : *customEntityItems_) {
+ if (entityItem.hide) {
+ continue;
+ }
render_value(output, entityItem);
// create HA config
if (Mqtt::ha_enabled() && !ha_registered_) {
@@ -445,6 +452,9 @@ void WebCustomEntityService::publish(const bool force) {
Mqtt::add_ha_sections_to_doc(F_(custom), stat_t, config, !ha_created, val_cond);
+ if (Mqtt::ha_optimistic() && (entityItem.writeable || entityItem.ram > 0)) {
+ config["optimistic"] = true;
+ }
ha_created |= Mqtt::queue_ha(topic, config.as());
}
}
@@ -470,7 +480,7 @@ uint8_t WebCustomEntityService::count_entities() {
for (CustomEntityItem & entity : *customEntityItems_) {
render_value(output, entity);
- if (output[entity.name].is() || entity.writeable) {
+ if (!entity.hide && (output[entity.name].is() || entity.writeable)) {
count++;
}
}
@@ -484,6 +494,9 @@ void WebCustomEntityService::generate_value_web(JsonObject output, const bool is
uint8_t index = 0;
for (const CustomEntityItem & entity : *customEntityItems_) {
+ if (entity.hide) {
+ continue;
+ }
bool include = false;
JsonObject root_obj = nodes.add(); // create the object, we know there is a value
diff --git a/src/web/WebCustomEntityService.h b/src/web/WebCustomEntityService.h
index 1aa4faf30..4a298c547 100644
--- a/src/web/WebCustomEntityService.h
+++ b/src/web/WebCustomEntityService.h
@@ -40,6 +40,7 @@ class CustomEntityItem {
std::string data;
uint8_t ram;
uint8_t * raw;
+ bool hide;
};
class WebCustomEntity {
diff --git a/src/web/WebSchedulerService.cpp b/src/web/WebSchedulerService.cpp
index 599672659..e8fc309d8 100644
--- a/src/web/WebSchedulerService.cpp
+++ b/src/web/WebSchedulerService.cpp
@@ -154,8 +154,6 @@ bool WebSchedulerService::get_value_info(JsonObject output, const char * cmd) {
return true;
}
- const char * attribute_s = Command::get_attribute(cmd);
-
if (!strcmp(cmd, F_(entities))) {
uint8_t i = 0;
char name[30];
@@ -166,6 +164,7 @@ bool WebSchedulerService::get_value_info(JsonObject output, const char * cmd) {
return true;
}
+ const char * attribute_s = Command::get_attribute(cmd);
for (const ScheduleItem & scheduleItem : *scheduleItems_) {
if (Helpers::toLower(scheduleItem.name) == cmd) {
get_value_json(output, scheduleItem);
@@ -291,6 +290,9 @@ void WebSchedulerService::publish(const bool force) {
Mqtt::add_ha_bool(config);
Mqtt::add_ha_sections_to_doc(F_(scheduler), stat_t, config, !ha_created, val_cond);
+ if (Mqtt::ha_optimistic()) {
+ config["optimistic"] = true;
+ }
ha_created |= Mqtt::queue_ha(topic, config.as());
}
}