From 37a94f8e0f8c577f5f19bec384cf6ff5c6316318 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 10 May 2026 13:21:28 +0200 Subject: [PATCH 01/24] auto-formatting --- src/devices/connect.cpp | 8 ++++---- src/uart/emsuart_esp32.cpp | 2 +- src/web/WebSchedulerService.cpp | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/devices/connect.cpp b/src/devices/connect.cpp index 068a91342..1b87a695e 100644 --- a/src/devices/connect.cpp +++ b/src/devices/connect.cpp @@ -39,11 +39,11 @@ Connect::Connect(uint8_t device_type, uint8_t device_id, uint8_t product_id, con DeviceValueUOM::DEGREES); // Roomthermostats for (uint8_t i = 0; i < 16; i++) { - register_telegram_type(0x0BDD + i, "Room", false, MAKE_PF_CB(process_roomThermostat)); // broadcasted - register_telegram_type(0x0B3D + i, "Roomname", false, MAKE_PF_CB(process_roomThermostatName), 100); // fetch for active circuits + register_telegram_type(0x0BDD + i, "Room", false, MAKE_PF_CB(process_roomThermostat)); // broadcasted + register_telegram_type(0x0B3D + i, "Roomname", false, MAKE_PF_CB(process_roomThermostatName), 100); // fetch for active circuits register_telegram_type(0x0BB5 + i, "Roomsettings", false, MAKE_PF_CB(process_roomThermostatSettings), 8); // fetch for active circuits - register_telegram_type(0x1230 + i, "Roomparams", false, MAKE_PF_CB(process_roomThermostatParam)); // fetch for active circuits - register_telegram_type(0x1244 + i, "Roomdata", false, MAKE_PF_CB(process_roomThermostatData)); // broadcasted + register_telegram_type(0x1230 + i, "Roomparams", false, MAKE_PF_CB(process_roomThermostatParam)); // fetch for active circuits + register_telegram_type(0x1244 + i, "Roomdata", false, MAKE_PF_CB(process_roomThermostatData)); // broadcasted } register_telegram_type(0xDB65, "Roomschedule", true, MAKE_PF_CB(process_roomSchedule)); // 0x2040, broadcast 36 bytes: diff --git a/src/uart/emsuart_esp32.cpp b/src/uart/emsuart_esp32.cpp index 73da13640..8c22f8919 100644 --- a/src/uart/emsuart_esp32.cpp +++ b/src/uart/emsuart_esp32.cpp @@ -149,7 +149,7 @@ uint8_t EMSuart::transmit(const uint8_t * buf, const uint8_t len) { return EMS_TX_STATUS_OK; } - auto tx_mode = tx_mode_ != EMS_TXMODE_AUTO ? tx_mode_ : EMSbus::is_ht3() ? EMS_TXMODE_HT3 : EMSbus::is_ems2() ? EMS_TXMODE_EMSPLUS : EMS_TXMODE_EMS; + auto tx_mode = tx_mode_ != EMS_TXMODE_AUTO ? tx_mode_ : EMSbus::is_ht3() ? EMS_TXMODE_HT3 : EMSbus::is_ems2() ? EMS_TXMODE_EMSPLUS : EMS_TXMODE_EMS; // TXMODE is EMS+ with long delay if (tx_mode == EMS_TXMODE_EMSPLUS) { diff --git a/src/web/WebSchedulerService.cpp b/src/web/WebSchedulerService.cpp index e9a8f5351..3ab7900ee 100644 --- a/src/web/WebSchedulerService.cpp +++ b/src/web/WebSchedulerService.cpp @@ -352,8 +352,8 @@ bool WebSchedulerService::command(const char * name, const std::string & command // parse json JsonDocument doc; if (deserializeJson(doc, cmd) == DeserializationError::Ok) { - HTTPClient * http = new HTTPClient; - std::string url = doc["url"] | ""; + HTTPClient * http = new HTTPClient; + std::string url = doc["url"] | ""; // for a GET with parameters replace commands with values // don't search the complete url, it may contain a devicename in path auto q = url.find_first_of('?'); From b988c67c8ee1f71cfb0af81bfd28b3055292ebfa Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 10 May 2026 13:21:37 +0200 Subject: [PATCH 02/24] update example --- data/pre_load.json | 47 ++++++++++++++-------------------------------- 1 file changed, 14 insertions(+), 33 deletions(-) diff --git a/data/pre_load.json b/data/pre_load.json index cd5fdd2c7..45e8742d3 100644 --- a/data/pre_load.json +++ b/data/pre_load.json @@ -1,7 +1,6 @@ { "type": "systembackup", "version": "3.8.2", - "date": "2026-03-29T13:28:15", "systembackup": [ { "type": "settings", @@ -19,7 +18,7 @@ "tx_power": 0 }, "AP": { - "provision_mode": 2, + "provision_mode": 1, "ssid": "ems-esp", "password": "ems-esp-neo", "channel": 1, @@ -62,7 +61,7 @@ "send_response": false }, "NTP": { - "enabled": true, + "enabled": false, "server": "time.google.com", "tz_label": "Europe/Amsterdam", "tz_format": "CET-1CEST,M3.5.0,M10.5.0/3" @@ -83,12 +82,12 @@ ] }, "Settings": { - "version": "3.8.2", + "version": "3.8.2-dev.22", "board_profile": "E32V2_2", "platform": "ESP32", "locale": "en", - "tx_mode": 1, - "ems_bus_id": 11, + "tx_mode": 5, + "ems_bus_id": 73, "syslog_enabled": false, "syslog_level": 3, "trace_raw": false, @@ -132,17 +131,7 @@ "modbus_port": 502, "modbus_max_clients": 10, "modbus_timeout": 300, - "developer_mode": true, - "email_enabled": false, - "email_ssl": false, - "email_starttls": true, - "email_server": "smtp.example.net", - "email_port": 587, - "email_login": "", - "email_pass": "", - "email_sender": "ems-esp@example.net", - "email_recp": "", - "email_subject": "ems-esp notification" + "developer_mode": false } }, { @@ -207,22 +196,14 @@ } }, { - "type": "customSupport", - "Support": { - "html": [ - "This product is installed and managed by:", - "", - "Bosch Installer Example", - "", - "Nefit Road 12", - "1234 AB Amsterdam", - "Phone: +31 123 456 789", - "email: support@boschinstaller.nl", - "", - "For help and questions please contact your installer." - ], - "img_url": "https://emsesp.org/media/images/designer.png" - } + "type": "nvs", + "nvs": [ + { + "type": 1, + "key": "fresh_firmware", + "value": 0 + } + ] } ] } \ No newline at end of file From d1d046f3fd8ddb6bc1c849074052169abff9fd6b Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 10 May 2026 13:21:47 +0200 Subject: [PATCH 03/24] package update --- interface/package.json | 6 +-- interface/pnpm-lock.yaml | 108 +++++++++++++++++++-------------------- mock-api/package.json | 2 +- mock-api/pnpm-lock.yaml | 14 ++--- 4 files changed, 65 insertions(+), 65 deletions(-) diff --git a/interface/package.json b/interface/package.json index 10917ffaf..ae3955baa 100644 --- a/interface/package.json +++ b/interface/package.json @@ -52,7 +52,7 @@ "@preact/compat": "^18.3.2", "@preact/preset-vite": "^2.10.5", "@trivago/prettier-plugin-sort-imports": "^6.0.2", - "@types/node": "^25.6.0", + "@types/node": "^25.6.2", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", "axe-core": "^4.11.4", @@ -61,11 +61,11 @@ "eslint-config-prettier": "^10.1.8", "prettier": "^3.8.3", "rollup-plugin-visualizer": "^7.0.1", - "terser": "^5.47.0", + "terser": "^5.47.1", "typescript-eslint": "^8.59.2", "vite": "^8.0.11", "vite-plugin-imagemin": "^0.6.1", "vite-tsconfig-paths": "^6.1.1" }, - "packageManager": "pnpm@10.33.4" + "packageManager": "pnpm@10.33.4+sha512.1c67b3b359b2d408119ba1ed289f34b8fc3c6873412bec6fd264fbdc82489e510fcbecb9ce9d22dae7f3b76269d8441046014bdca53b9979cd7a561ad631b800" } diff --git a/interface/pnpm-lock.yaml b/interface/pnpm-lock.yaml index 261281351..bf0a2bce5 100644 --- a/interface/pnpm-lock.yaml +++ b/interface/pnpm-lock.yaml @@ -83,13 +83,13 @@ importers: version: 10.0.1(eslint@10.3.0) '@preact/preset-vite': specifier: ^2.10.5 - version: 2.10.5(@babel/core@7.29.0)(preact@10.29.1)(rollup@4.59.0)(vite@8.0.11(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.47.0)) + version: 2.10.5(@babel/core@7.29.0)(preact@10.29.1)(rollup@4.59.0)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1)) '@trivago/prettier-plugin-sort-imports': specifier: ^6.0.2 version: 6.0.2(prettier@3.8.3) '@types/node': - specifier: ^25.6.0 - version: 25.6.0 + specifier: ^25.6.2 + version: 25.6.2 '@types/react': specifier: ^19.2.14 version: 19.2.14 @@ -115,20 +115,20 @@ importers: specifier: ^7.0.1 version: 7.0.1(rolldown@1.0.0-rc.18)(rollup@4.59.0) terser: - specifier: ^5.47.0 - version: 5.47.0 + specifier: ^5.47.1 + version: 5.47.1 typescript-eslint: specifier: ^8.59.2 version: 8.59.2(eslint@10.3.0)(typescript@6.0.3) vite: specifier: ^8.0.11 - version: 8.0.11(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.47.0) + version: 8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1) vite-plugin-imagemin: specifier: ^0.6.1 - version: 0.6.1(vite@8.0.11(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.47.0)) + version: 0.6.1(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1)) vite-tsconfig-paths: specifier: ^6.1.1 - version: 6.1.1(typescript@6.0.3)(vite@8.0.11(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.47.0)) + version: 6.1.1(typescript@6.0.3)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1)) packages: @@ -1015,8 +1015,8 @@ packages: resolution: {integrity: sha512-zmPitbQ8+6zNutpwgcQuLcsEpn/Cj54Kbn7L5pX0Os5kdWplB7xPgEh/g+SWOB/qmows2gpuCaPyduq8ZZRnxA==} deprecated: This is a stub types definition. minimatch provides its own type definitions, so you do not need this installed. - '@types/node@25.6.0': - resolution: {integrity: sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==} + '@types/node@25.6.2': + resolution: {integrity: sha512-sokuT28dxf9JT5Kady1fsXOvI4HVpjZa95NKT5y9PNTIrs2AsobR4GFAA90ZG8M+nxVRLysCXsVj6eGC7Vbrlw==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -1191,8 +1191,8 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.10.27: - resolution: {integrity: sha512-zEs/ufmZoUd7WftKpKyXaT6RFxpQ5Qm9xytKRHvJfxFV9DFJkZph9RvJ1LcOUi0Z1ZVijMte65JbILeV+8QQEA==} + baseline-browser-mapping@2.10.29: + resolution: {integrity: sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==} engines: {node: '>=6.0.0'} hasBin: true @@ -1228,8 +1228,8 @@ packages: brace-expansion@2.1.0: resolution: {integrity: sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==} - brace-expansion@5.0.5: - resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} + brace-expansion@5.0.6: + resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} engines: {node: 18 || 20 || >=22} braces@3.0.3: @@ -1526,8 +1526,8 @@ packages: duplexer3@0.1.5: resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} - electron-to-chromium@1.5.352: - resolution: {integrity: sha512-9wHk8x6dyuimoe18EdiDPWKExNdxYqo4fn4FwOVVper6RxT3cmpBwBkWWfSOCYJjQdIco/nPhJhNLmn4Ufg1Yg==} + electron-to-chromium@1.5.353: + resolution: {integrity: sha512-kOrWphBi8TOZyiJZqsgqIle0lw+tzmnQK83pV9dZUd01Nm2POECSyFQMAuarzZdYqQW7FH9RaYOuaRo3h+bQ3w==} emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -1928,8 +1928,8 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-east-asian-width@1.5.0: - resolution: {integrity: sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==} + get-east-asian-width@1.6.0: + resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} engines: {node: '>=18'} get-intrinsic@1.3.0: @@ -2950,8 +2950,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.7.4: - resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + semver@7.8.0: + resolution: {integrity: sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==} engines: {node: '>=10'} hasBin: true @@ -3137,8 +3137,8 @@ packages: resolution: {integrity: sha512-ZOn6nJUgvgC09+doCEF3oB+r3ag7kUvlsXEGX069QRD60p+P3uP7XG9N2/at+EyIRGSN//ZY3LyEotA1YpmjuA==} engines: {node: '>=4'} - terser@5.47.0: - resolution: {integrity: sha512-TV+JFkQFtljk12ffyYAA4+zVF4Hs+qaROsT+Qo9o2/z39x+IUn+pvsmomiCPlp5YigfR1OdbGHOvc0L+Ca1X7g==} + terser@5.47.1: + resolution: {integrity: sha512-tPbLXTI6ohPASb/1YViL428oEHu6/qv1OxqYnfaonVCFHqx4+wCd95pHrQWsL5X4pl90CTyW9piSAsS2L0VoMw==} engines: {node: '>=10'} hasBin: true @@ -3915,19 +3915,19 @@ snapshots: dependencies: preact: 10.29.1 - '@preact/preset-vite@2.10.5(@babel/core@7.29.0)(preact@10.29.1)(rollup@4.59.0)(vite@8.0.11(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.47.0))': + '@preact/preset-vite@2.10.5(@babel/core@7.29.0)(preact@10.29.1)(rollup@4.59.0)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.29.0) '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.29.0) - '@prefresh/vite': 2.4.12(preact@10.29.1)(vite@8.0.11(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.47.0)) + '@prefresh/vite': 2.4.12(preact@10.29.1)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1)) '@rollup/pluginutils': 5.3.0(rollup@4.59.0) babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.29.0) debug: 4.4.3 magic-string: 0.30.21 picocolors: 1.1.1 - vite: 8.0.11(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.47.0) - vite-prerender-plugin: 0.5.13(vite@8.0.11(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.47.0)) + vite: 8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1) + vite-prerender-plugin: 0.5.13(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1)) zimmerframe: 1.1.4 transitivePeerDependencies: - preact @@ -3942,7 +3942,7 @@ snapshots: '@prefresh/utils@1.2.1': {} - '@prefresh/vite@2.4.12(preact@10.29.1)(vite@8.0.11(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.47.0))': + '@prefresh/vite@2.4.12(preact@10.29.1)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1))': dependencies: '@babel/core': 7.29.0 '@prefresh/babel-plugin': 0.5.3 @@ -3950,7 +3950,7 @@ snapshots: '@prefresh/utils': 1.2.1 '@rollup/pluginutils': 4.2.1 preact: 10.29.1 - vite: 8.0.11(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.47.0) + vite: 8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1) transitivePeerDependencies: - supports-color @@ -4133,7 +4133,7 @@ snapshots: '@types/glob@7.2.0': dependencies: '@types/minimatch': 6.0.0 - '@types/node': 25.6.0 + '@types/node': 25.6.2 '@types/imagemin-gifsicle@7.0.4': dependencies: @@ -4162,19 +4162,19 @@ snapshots: '@types/imagemin@7.0.1': dependencies: - '@types/node': 25.6.0 + '@types/node': 25.6.2 '@types/json-schema@7.0.15': {} '@types/keyv@3.1.4': dependencies: - '@types/node': 25.6.0 + '@types/node': 25.6.2 '@types/minimatch@6.0.0': dependencies: minimatch: 10.2.5 - '@types/node@25.6.0': + '@types/node@25.6.2': dependencies: undici-types: 7.19.2 @@ -4196,11 +4196,11 @@ snapshots: '@types/responselike@1.0.3': dependencies: - '@types/node': 25.6.0 + '@types/node': 25.6.2 '@types/svgo@2.6.4': dependencies: - '@types/node': 25.6.0 + '@types/node': 25.6.2 '@typescript-eslint/eslint-plugin@8.59.2(@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3))(eslint@10.3.0)(typescript@6.0.3)': dependencies: @@ -4270,7 +4270,7 @@ snapshots: '@typescript-eslint/visitor-keys': 8.59.2 debug: 4.4.3 minimatch: 10.2.5 - semver: 7.7.4 + semver: 7.8.0 tinyglobby: 0.2.16 ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 @@ -4361,7 +4361,7 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.10.27: {} + baseline-browser-mapping@2.10.29: {} bin-build@3.0.0: dependencies: @@ -4412,7 +4412,7 @@ snapshots: dependencies: balanced-match: 1.0.2 - brace-expansion@5.0.5: + brace-expansion@5.0.6: dependencies: balanced-match: 4.0.4 @@ -4422,9 +4422,9 @@ snapshots: browserslist@4.28.2: dependencies: - baseline-browser-mapping: 2.10.27 + baseline-browser-mapping: 2.10.29 caniuse-lite: 1.0.30001792 - electron-to-chromium: 1.5.352 + electron-to-chromium: 1.5.353 node-releases: 2.0.38 update-browserslist-db: 1.2.3(browserslist@4.28.2) @@ -4788,7 +4788,7 @@ snapshots: duplexer3@0.1.5: {} - electron-to-chromium@1.5.352: {} + electron-to-chromium@1.5.353: {} emoji-regex@10.6.0: {} @@ -5193,7 +5193,7 @@ snapshots: get-caller-file@2.0.5: {} - get-east-asian-width@1.5.0: {} + get-east-asian-width@1.6.0: {} get-intrinsic@1.3.0: dependencies: @@ -5730,7 +5730,7 @@ snapshots: minimatch@10.2.5: dependencies: - brace-expansion: 5.0.5 + brace-expansion: 5.0.6 minimatch@3.1.5: dependencies: @@ -6191,7 +6191,7 @@ snapshots: semver@6.3.1: {} - semver@7.7.4: {} + semver@7.8.0: {} set-cookie-parser@2.7.2: {} @@ -6286,7 +6286,7 @@ snapshots: string-width@7.2.0: dependencies: emoji-regex: 10.6.0 - get-east-asian-width: 1.5.0 + get-east-asian-width: 1.6.0 strip-ansi: 7.2.0 string_decoder@1.1.1: @@ -6368,7 +6368,7 @@ snapshots: temp-dir: 1.0.0 uuid: 3.4.0 - terser@5.47.0: + terser@5.47.1: dependencies: '@jridgewell/source-map': 0.3.11 acorn: 8.16.0 @@ -6483,7 +6483,7 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - vite-plugin-imagemin@0.6.1(vite@8.0.11(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.47.0)): + vite-plugin-imagemin@0.6.1(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1)): dependencies: '@types/imagemin': 7.0.1 '@types/imagemin-gifsicle': 7.0.4 @@ -6508,11 +6508,11 @@ snapshots: imagemin-webp: 6.1.0 jpegtran-bin: 6.0.1 pathe: 0.2.0 - vite: 8.0.11(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.47.0) + vite: 8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1) transitivePeerDependencies: - supports-color - vite-prerender-plugin@0.5.13(vite@8.0.11(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.47.0)): + vite-prerender-plugin@0.5.13(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1)): dependencies: kolorist: 1.8.0 magic-string: 0.30.21 @@ -6520,19 +6520,19 @@ snapshots: simple-code-frame: 1.3.0 source-map: 0.7.6 stack-trace: 1.0.0 - vite: 8.0.11(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.47.0) + vite: 8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1) - vite-tsconfig-paths@6.1.1(typescript@6.0.3)(vite@8.0.11(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.47.0)): + vite-tsconfig-paths@6.1.1(typescript@6.0.3)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.6(typescript@6.0.3) - vite: 8.0.11(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.47.0) + vite: 8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1) transitivePeerDependencies: - supports-color - typescript - vite@8.0.11(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.47.0): + vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -6540,10 +6540,10 @@ snapshots: rolldown: 1.0.0-rc.18 tinyglobby: 0.2.16 optionalDependencies: - '@types/node': 25.6.0 + '@types/node': 25.6.2 esbuild: 0.27.4 fsevents: 2.3.3 - terser: 5.47.0 + terser: 5.47.1 which-typed-array@1.1.20: dependencies: diff --git a/mock-api/package.json b/mock-api/package.json index dea8d1846..2c65bf4e7 100644 --- a/mock-api/package.json +++ b/mock-api/package.json @@ -15,5 +15,5 @@ "itty-router": "^5.0.23", "prettier": "^3.8.3" }, - "packageManager": "pnpm@10.33.1+sha512.05ba3c1d5d1c18f68df06470d74055e62d41fc110a0c660db1b2dfb2785327f04cf0f68345d4609bc52089e7fa0343c31593b2f9594e2c5d5da426230acc9820" + "packageManager": "pnpm@10.33.4+sha512.1c67b3b359b2d408119ba1ed289f34b8fc3c6873412bec6fd264fbdc82489e510fcbecb9ce9d22dae7f3b76269d8441046014bdca53b9979cd7a561ad631b800" } diff --git a/mock-api/pnpm-lock.yaml b/mock-api/pnpm-lock.yaml index d1f155ffa..1ddedb1b1 100644 --- a/mock-api/pnpm-lock.yaml +++ b/mock-api/pnpm-lock.yaml @@ -46,8 +46,8 @@ packages: resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - '@babel/parser@7.29.2': - resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} + '@babel/parser@7.29.3': + resolution: {integrity: sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==} engines: {node: '>=6.0.0'} hasBin: true @@ -185,7 +185,7 @@ snapshots: '@babel/generator@7.29.1': dependencies: - '@babel/parser': 7.29.2 + '@babel/parser': 7.29.3 '@babel/types': 7.29.0 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 @@ -197,14 +197,14 @@ snapshots: '@babel/helper-validator-identifier@7.28.5': {} - '@babel/parser@7.29.2': + '@babel/parser@7.29.3': dependencies: '@babel/types': 7.29.0 '@babel/template@7.28.6': dependencies: '@babel/code-frame': 7.29.0 - '@babel/parser': 7.29.2 + '@babel/parser': 7.29.3 '@babel/types': 7.29.0 '@babel/traverse@7.29.0': @@ -212,7 +212,7 @@ snapshots: '@babel/code-frame': 7.29.0 '@babel/generator': 7.29.1 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.29.2 + '@babel/parser': 7.29.3 '@babel/template': 7.28.6 '@babel/types': 7.29.0 debug: 4.4.3 @@ -249,7 +249,7 @@ snapshots: '@trivago/prettier-plugin-sort-imports@6.0.2(prettier@3.8.3)': dependencies: '@babel/generator': 7.29.1 - '@babel/parser': 7.29.2 + '@babel/parser': 7.29.3 '@babel/traverse': 7.29.0 '@babel/types': 7.29.0 javascript-natural-sort: 0.7.1 From 7854349dbe539361bacd9ab7fe58f36abfd9483f Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 10 May 2026 13:22:00 +0200 Subject: [PATCH 04/24] support filesystem ota --- src/ESP32React/UploadFileService.cpp | 91 ++++++++++++++++++++-------- src/ESP32React/UploadFileService.h | 3 +- src/core/emsesp.cpp | 10 +++ src/core/system.cpp | 39 +++++++++++- src/core/system.h | 2 + src/core/telegram.h | 3 +- src/test/test.cpp | 41 +------------ src/test/test.h | 1 - 8 files changed, 120 insertions(+), 70 deletions(-) diff --git a/src/ESP32React/UploadFileService.cpp b/src/ESP32React/UploadFileService.cpp index 3d4e99152..4d0209d1f 100644 --- a/src/ESP32React/UploadFileService.cpp +++ b/src/ESP32React/UploadFileService.cpp @@ -4,6 +4,7 @@ #include #include +// #include static String getFilenameExtension(const String & filename) { const auto pos = filename.lastIndexOf('.'); @@ -16,8 +17,8 @@ static String getFilenameExtension(const String & filename) { UploadFileService::UploadFileService(AsyncWebServer * server, SecurityManager * securityManager) : _securityManager(securityManager) , _is_firmware(false) + , _is_filesystem(false) , _md5() { - // upload a file via a form server->on( UPLOAD_FILE_PATH, HTTP_POST, @@ -41,8 +42,14 @@ void UploadFileService::handleUpload(AsyncWebServerRequest * request, const Stri const String extension = getFilenameExtension(filename); const std::size_t filesize = request->contentLength(); - _is_firmware = false; - if ((extension == "bin") && (filesize > 1000000)) { + _is_firmware = false; + _is_filesystem = false; + + if (extension == "bin" && filename.endsWith("littlefs.bin")) { + // LittleFS filesystem image + _is_filesystem = true; + _md5[0] = '\0'; // clear any stale md5 so Update.end() doesn't compare against it + } else if ((extension == "bin") && (filesize > 2000000)) { _is_firmware = true; } else if (extension == "json") { _md5[0] = '\0'; // clear md5 @@ -88,6 +95,7 @@ void UploadFileService::handleUpload(AsyncWebServerRequest * request, const Stri #endif // it's firmware - initialize the ArduinoOTA updater emsesp::EMSESP::logger().info("Uploading firmware file %s (size: %d KB). Please wait...", filename.c_str(), filesize / 1024); + // turn off UART to prevent interference with the upload emsesp::EMSuart::stop(); @@ -96,28 +104,55 @@ void UploadFileService::handleUpload(AsyncWebServerRequest * request, const Stri Update.setMD5(_md5.data()); _md5.front() = '\0'; } - request->onDisconnect([this] { handleEarlyDisconnect(); }); // success, let's make sure we end the update if the client hangs up + request->onDisconnect([this] { handleDisconnect(); }); // success, let's make sure we end the update if the client hangs up } else { handleError(request, 507); // failed to begin, send an error response Insufficient Storage return; } + } else if (_is_filesystem) { + // LittleFS filesystem image - flash directly to the spiffs/littlefs partition + emsesp::EMSESP::logger().info("Uploading filesystem image %s (size: %u KB). Please wait...", filename.c_str(), static_cast(filesize / 1024)); + emsesp::EMSuart::stop(); + LittleFS.end(); // unmount LittleFS before we overwrite the partition under it + + // request->contentLength() is the multipart HTTP body size, not the file size, + // so it can exceed the partition by a few hundred bytes. Use UPDATE_SIZE_UNKNOWN + // and let the Update library size against the whole partition. + if (Update.begin(UPDATE_SIZE_UNKNOWN, U_SPIFFS)) { + // emsesp::EMSESP::logger().info("Update.begin(U_SPIFFS) ok, partition size %u bytes", static_cast(Update.size())); + request->onDisconnect([this] { handleDisconnect(); }); + } else { + emsesp::EMSESP::logger().err("Update.begin(U_SPIFFS) failed: %s", Update.errorString()); + handleError(request, 507); + return; + } } else { // its a normal file, open a new temp file to write the contents too request->_tempFile = LittleFS.open(TEMP_FILENAME_PATH, "w"); } } - if (!_is_firmware) { - if (len && len != request->_tempFile.write(data, len)) { // stream the incoming chunk to the opened file - handleError(request, 507); // 507-Insufficient Storage - } - } else if (!request->_tempObject) { // if we haven't delt with an error, continue with the firmware update - if (Update.write(data, len) != len) { - handleError(request, 500); // internal error, failed - return; - } - if (final && !Update.end(true)) { - handleError(request, 500); // internal error, failed + if (_is_firmware || _is_filesystem) { + if (!request->_tempObject) { // if we haven't delt with an error, continue with the OTA update + if (Update.write(data, len) != len) { + emsesp::EMSESP::logger().err("Update.write failed at offset %u (chunk %u): %s", + static_cast(Update.progress()), + static_cast(len), + Update.errorString()); + handleError(request, 500); // internal error, failed + return; + } + if (final) { + if (!Update.end(true)) { + emsesp::EMSESP::logger().err("Update.end failed: %s", Update.errorString()); + handleError(request, 500); + return; + } + } + } else { + if (len && len != request->_tempFile.write(data, len)) { // stream the incoming chunk to the opened file + handleError(request, 507); // 507-Insufficient Storage + } } } } @@ -135,11 +170,13 @@ void UploadFileService::uploadComplete(AsyncWebServerRequest * request) { return; } - // check if it was a firmware upgrade - // if no error, send the success response as a JSON - if (_is_firmware && !request->_tempObject) { - // set NVS to tell EMS-ESP this is a new fresh firmware on next restart - emsesp::EMSESP::nvs_.putBool(emsesp::EMSESP_NVS_BOOT_NEW_FIRMWARE, true); + // check if it was a firmware or filesystem image upgrade + // if no error, send the success response and request a restart + if ((_is_firmware || _is_filesystem) && !request->_tempObject) { + if (_is_firmware) { + // set NVS to tell EMS-ESP this is a new fresh firmware on next restart + emsesp::EMSESP::nvs_.putBool(emsesp::EMSESP_NVS_BOOT_NEW_FIRMWARE, true); + } AsyncWebServerResponse * response = request->beginResponse(200); request->send(response); @@ -178,15 +215,21 @@ void UploadFileService::handleError(AsyncWebServerRequest * request, int code) { // that is caught by the web code. Unfortunately the http error code is not sent to the client on fast network connections if (code == 406) { request->client()->close(); - _is_firmware = false; + _is_firmware = false; + _is_filesystem = false; Update.abort(); } + + // if we aborted a filesystem upload, remount LittleFS so the device keeps working + if (_is_filesystem) { + LittleFS.begin(); + } } -void UploadFileService::handleEarlyDisconnect() { +void UploadFileService::handleDisconnect() { emsesp::EMSESP::logger().info("Upload finished"); emsesp::EMSESP::system_.uart_init(); // re-enable UART - _is_firmware = false; - Update.abort(); + _is_firmware = false; + _is_filesystem = false; } diff --git a/src/ESP32React/UploadFileService.h b/src/ESP32React/UploadFileService.h index 352342148..4c8a20dbb 100644 --- a/src/ESP32React/UploadFileService.h +++ b/src/ESP32React/UploadFileService.h @@ -22,13 +22,14 @@ class UploadFileService { private: SecurityManager * _securityManager; bool _is_firmware; + bool _is_filesystem; std::array _md5; void handleUpload(AsyncWebServerRequest * request, const String & filename, size_t index, uint8_t * data, size_t len, bool final); void uploadComplete(AsyncWebServerRequest * request); void handleError(AsyncWebServerRequest * request, int code); - void handleEarlyDisconnect(); + void handleDisconnect(); }; #endif \ No newline at end of file diff --git a/src/core/emsesp.cpp b/src/core/emsesp.cpp index 9d583e427..dbbc79b2f 100644 --- a/src/core/emsesp.cpp +++ b/src/core/emsesp.cpp @@ -1710,6 +1710,11 @@ void EMSESP::start() { bool factory_settings = false; #endif +#if defined(EMSESP_DEBUG) + // LOG_DEBUG("Listing root directory before:"); + // system_.listDir("/", 3); // show the contents of the root directory +#endif + // start NVS storage if (!nvs_.begin("ems-esp", false, "nvs1")) { // try bigger nvs partition on 16M flash first nvs_.begin("ems-esp", false, "nvs"); // fallback to small nvs @@ -1724,6 +1729,11 @@ void EMSESP::start() { // loads core system services settings (network, mqtt, ap, ntp etc) esp32React.begin(); +#if defined(EMSESP_DEBUG) + // LOG_DEBUG("Listing root directory before:"); + // system_.listDir("/", 3); // show the contents of the root directory +#endif + #ifndef EMSESP_STANDALONE if (factory_settings) { LOG_WARNING("No settings found on filesystem. Using factory settings."); diff --git a/src/core/system.cpp b/src/core/system.cpp index 3a04d1028..f27ba427a 100644 --- a/src/core/system.cpp +++ b/src/core/system.cpp @@ -642,11 +642,9 @@ void System::start() { void System::button_OnClick(PButton & b) { LOG_NOTICE("Button pressed - single click"); -#if defined(EMSESP_TEST) #ifndef EMSESP_STANDALONE // show filesystem - Test::listDir(LittleFS, "/", 3); -#endif + listDir("/", 3); #endif } @@ -3435,4 +3433,39 @@ void System::restore_snapshot_gpios(std::vector & u_gpios, std::vector Date: Tue, 12 May 2026 19:56:17 +0200 Subject: [PATCH 05/24] fix json OTA upload --- src/ESP32React/UploadFileService.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/ESP32React/UploadFileService.cpp b/src/ESP32React/UploadFileService.cpp index 4d0209d1f..d600569b6 100644 --- a/src/ESP32React/UploadFileService.cpp +++ b/src/ESP32React/UploadFileService.cpp @@ -4,7 +4,6 @@ #include #include -// #include static String getFilenameExtension(const String & filename) { const auto pos = filename.lastIndexOf('.'); @@ -133,9 +132,10 @@ void UploadFileService::handleUpload(AsyncWebServerRequest * request, const Stri } if (_is_firmware || _is_filesystem) { - if (!request->_tempObject) { // if we haven't delt with an error, continue with the OTA update + if (!request->_tempObject) { + //continue with the OTA update if (Update.write(data, len) != len) { - emsesp::EMSESP::logger().err("Update.write failed at offset %u (chunk %u): %s", + emsesp::EMSESP::logger().err("OTA update failed at offset %u (chunk %u): %s", static_cast(Update.progress()), static_cast(len), Update.errorString()); @@ -144,15 +144,16 @@ void UploadFileService::handleUpload(AsyncWebServerRequest * request, const Stri } if (final) { if (!Update.end(true)) { - emsesp::EMSESP::logger().err("Update.end failed: %s", Update.errorString()); - handleError(request, 500); + emsesp::EMSESP::logger().err("OTA update failed: %s", Update.errorString()); + handleError(request, 500); // internal error, failed return; } } - } else { - if (len && len != request->_tempFile.write(data, len)) { // stream the incoming chunk to the opened file - handleError(request, 507); // 507-Insufficient Storage - } + } + } else { + // stream the incoming chunk to the opened file + if (len && len != request->_tempFile.write(data, len)) { + handleError(request, 507); // 507-Insufficient Storage } } } From 27f2cb0693e9a641c551c7274c9f6b069745a90f Mon Sep 17 00:00:00 2001 From: proddy Date: Tue, 12 May 2026 19:56:22 +0200 Subject: [PATCH 06/24] package update --- interface/package.json | 6 +- interface/pnpm-lock.yaml | 364 +++++++++++++++++++-------------------- 2 files changed, 185 insertions(+), 185 deletions(-) diff --git a/interface/package.json b/interface/package.json index ae3955baa..876fa545a 100644 --- a/interface/package.json +++ b/interface/package.json @@ -52,7 +52,7 @@ "@preact/compat": "^18.3.2", "@preact/preset-vite": "^2.10.5", "@trivago/prettier-plugin-sort-imports": "^6.0.2", - "@types/node": "^25.6.2", + "@types/node": "^25.7.0", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", "axe-core": "^4.11.4", @@ -62,8 +62,8 @@ "prettier": "^3.8.3", "rollup-plugin-visualizer": "^7.0.1", "terser": "^5.47.1", - "typescript-eslint": "^8.59.2", - "vite": "^8.0.11", + "typescript-eslint": "^8.59.3", + "vite": "^8.0.12", "vite-plugin-imagemin": "^0.6.1", "vite-tsconfig-paths": "^6.1.1" }, diff --git a/interface/pnpm-lock.yaml b/interface/pnpm-lock.yaml index bf0a2bce5..1125acdd2 100644 --- a/interface/pnpm-lock.yaml +++ b/interface/pnpm-lock.yaml @@ -83,13 +83,13 @@ importers: version: 10.0.1(eslint@10.3.0) '@preact/preset-vite': specifier: ^2.10.5 - version: 2.10.5(@babel/core@7.29.0)(preact@10.29.1)(rollup@4.59.0)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1)) + version: 2.10.5(@babel/core@7.29.0)(preact@10.29.1)(rollup@4.59.0)(vite@8.0.12(@types/node@25.7.0)(esbuild@0.27.4)(terser@5.47.1)) '@trivago/prettier-plugin-sort-imports': specifier: ^6.0.2 version: 6.0.2(prettier@3.8.3) '@types/node': - specifier: ^25.6.2 - version: 25.6.2 + specifier: ^25.7.0 + version: 25.7.0 '@types/react': specifier: ^19.2.14 version: 19.2.14 @@ -113,22 +113,22 @@ importers: version: 3.8.3 rollup-plugin-visualizer: specifier: ^7.0.1 - version: 7.0.1(rolldown@1.0.0-rc.18)(rollup@4.59.0) + version: 7.0.1(rolldown@1.0.0)(rollup@4.59.0) terser: specifier: ^5.47.1 version: 5.47.1 typescript-eslint: - specifier: ^8.59.2 - version: 8.59.2(eslint@10.3.0)(typescript@6.0.3) + specifier: ^8.59.3 + version: 8.59.3(eslint@10.3.0)(typescript@6.0.3) vite: - specifier: ^8.0.11 - version: 8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1) + specifier: ^8.0.12 + version: 8.0.12(@types/node@25.7.0)(esbuild@0.27.4)(terser@5.47.1) vite-plugin-imagemin: specifier: ^0.6.1 - version: 0.6.1(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1)) + version: 0.6.1(vite@8.0.12(@types/node@25.7.0)(esbuild@0.27.4)(terser@5.47.1)) vite-tsconfig-paths: specifier: ^6.1.1 - version: 6.1.1(typescript@6.0.3)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1)) + version: 6.1.1(typescript@6.0.3)(vite@8.0.12(@types/node@25.7.0)(esbuild@0.27.4)(terser@5.47.1)) packages: @@ -653,8 +653,8 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@oxc-project/types@0.128.0': - resolution: {integrity: sha512-huv1Y/LzBJkBVHt3OlC7u0zHBW9qXf1FdD7sGmc1rXc2P1mTwHssYv7jyGx5KAACSCH+9B3Bhn6Z9luHRvf7pQ==} + '@oxc-project/types@0.129.0': + resolution: {integrity: sha512-3oz8m3FGdr2nDXVqmFUw7jolKliC4MoyXYIG2c7gpjBnzUWQpUGIYcXYKxTdTi+N2jusvt610ckTMkxdwHkYEg==} '@paralleldrive/cuid2@2.3.1': resolution: {integrity: sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==} @@ -676,8 +676,8 @@ packages: '@prefresh/babel-plugin@0.5.3': resolution: {integrity: sha512-57LX2SHs4BX2s1IwCjNzTE2OJeEepRCNf1VTEpbNcUyHfMO68eeOWGDIt4ob9aYlW6PEWZ1SuwNikuoIXANDtQ==} - '@prefresh/core@1.5.9': - resolution: {integrity: sha512-IKBKCPaz34OFVC+adiQ2qaTF5qdztO2/4ZPf4KsRTgjKosWqxVXmEbxCiUydYZRY8GVie+DQlKzQr9gt6HQ+EQ==} + '@prefresh/core@1.5.10': + resolution: {integrity: sha512-7yPTFbG56sutaFu8krp3B4a200KOFUvrtlllKWRuLjsYXo9UUucHOZRcer+gtgMkFTpv6ob8TGcTwA32bSwa1w==} peerDependencies: preact: ^10.0.0 || ^11.0.0-0 @@ -690,103 +690,103 @@ packages: preact: ^10.4.0 || ^11.0.0-0 vite: '>=2.0.0' - '@rolldown/binding-android-arm64@1.0.0-rc.18': - resolution: {integrity: sha512-lIDyUAfD7U3+BWKzdxMbJcsYHuqXqmGz40aeRqvuAm3y5TkJSYTBW2RDrn65DJFPQqVjUAUqq5uz8urzQ8aBdQ==} + '@rolldown/binding-android-arm64@1.0.0': + resolution: {integrity: sha512-TWMZnRLMe63C2Lhyicviu7ZHaU4kxa6PS3rofvc9GmcvptzNN11BcfQ4Sl7MwTOsisQoa2keB/EBdNCAnUo8vA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.0-rc.18': - resolution: {integrity: sha512-apJq2ktnGp27nSInMR5Vcj8kY6xJzDAvfdIFlpDcAK/w4cDO58qVoi1YQsES/SKiFNge/6e4CUzgjfHduYqWpQ==} + '@rolldown/binding-darwin-arm64@1.0.0': + resolution: {integrity: sha512-6XcD+8k0gPVItNagEw78/qqcBDwKcwDYS8V2hRmVsfUSIrd8cWe/CBvRDI5toqFyPfj+FJr6t8U6Xj2P2prEew==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-rc.18': - resolution: {integrity: sha512-5Ofot8xbs+pxRHJqm9/9N/4sTQOvdrwEsmPE9pdLEEoAbdZtG6F2LMDfO1sp6ZAtXJuJV/21ew2srq3W8NXB5g==} + '@rolldown/binding-darwin-x64@1.0.0': + resolution: {integrity: sha512-iN/tWVXRQDWvmZlKdceP1Dwug9GDpEymhb9p4xnEe6zvCg5lFmzVljl+1qR1NVx3yfGpr2Na+CuLmv5IU8uzfQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-rc.18': - resolution: {integrity: sha512-7h8eeOTT1eyqJyx64BFCnWZpNm486hGWt2sqeLLgDxA0xI1oGZ9H7gK1S85uNGmBhkdPwa/6reTxfFFKvIsebw==} + '@rolldown/binding-freebsd-x64@1.0.0': + resolution: {integrity: sha512-jjQMDvvwSOuhOwMszD/klSOjyWMM3zI64hWTj9KT5x4MxRbZAf+7vLQ6qouRhtsLVFHr3f0ILaJAfgENPiQdAQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.18': - resolution: {integrity: sha512-eRcm/HVt9U/JFu5RKAEKwGQYtDCKWLiaH6wOnsSEp6NMBb/3Os8LgHZlNyzMpFVNmiiMFlfb2zEnebfzJrHFmg==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0': + resolution: {integrity: sha512-d//Dtg2x6/m3mbV64yUGNnDGNZaDGRpDLLNGerHQUVObuNaIQaaDp25yUiqGXtHEXX+NP2d0wAlmKgpYgIAJ2A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.18': - resolution: {integrity: sha512-SOrT/cT4ukTmgnrEz/Hg3m7LBnuCLW9psDeMKrimRWY4I8DmnO7Lco8W2vtqPmMkbVu8iJ+g4GFLVLLOVjJ9DQ==} + '@rolldown/binding-linux-arm64-gnu@1.0.0': + resolution: {integrity: sha512-n7Ofp0mx+aB2cC+Sdy5YtMnXtY9lchnHbY+3Yt0uq9JsWQExf4f5Whu0tK0R8Jdc9S6RchTHjIFY7uc92puOVQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.18': - resolution: {integrity: sha512-QWjdxN1HJCpBTAcZ5N5F7wju3gVPzRzSpmGzx7na0c/1qpN9CFil+xt+l9lV/1M6/gqHSNXCiqPfwhVJPeLnug==} + '@rolldown/binding-linux-arm64-musl@1.0.0': + resolution: {integrity: sha512-EIVjy2cgd7uuMMo94FVkBp7F6DhcZAUwNURkSG3RwUmvAXR6s0ISxM81U+IydcZByPG0pZIHsf1b6kTxoFDgJA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.18': - resolution: {integrity: sha512-ugCOyj7a4d9h3q9B+wXmf6g3a68UsjGh6dob5DHevHGMwDUbhsYNbSPxJsENcIttJZ9jv7qGM2UesLw5jqIhdg==} + '@rolldown/binding-linux-ppc64-gnu@1.0.0': + resolution: {integrity: sha512-JEwwOPcwTLAcpDQlqSmjEmfs63xJnSiUNIGvLcDLUHCWK4XowpS/7c7tUsUH6uT/ct6bMUTdXKfI8967FYj6mg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.18': - resolution: {integrity: sha512-kKWRhbsotpXkGbcd5dllUWg5gEXcDAa8u5YnP9AV5DYNbvJHGzzuwv7dpmhc8NqKMJldl0a+x76IHbspEpEmdA==} + '@rolldown/binding-linux-s390x-gnu@1.0.0': + resolution: {integrity: sha512-0wjCFhLrihtAubnT9iA0N++0pSV0z5Hg7tNGdNJ4RFaINceHadoF+kiFGyY1qSSNVIAZtLotG8Ju1bgDPkjnFA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.18': - resolution: {integrity: sha512-uCo8ElcCIAMyYAZyuIZ81oFkhTSIllNvUCHCAlbhlN4ji3uC28h7IIdlXyIvGO7HsuqnV9p3rD/bpH7XhIyhRw==} + '@rolldown/binding-linux-x64-gnu@1.0.0': + resolution: {integrity: sha512-Dfn7iak9BcMMePxcoJfpSbWqnEyrp/dRF63/8qW/eHBdOZov6x5aShLLEYGYdIeSJ6vMLK/XCVB+lGIxm41bQA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.0.0-rc.18': - resolution: {integrity: sha512-XNOQZtuE6yUIvx4rwGemwh8kpL1xvU41FXy/s9K7T/3JVcqGzo3NfKM2HrbrGgfPYGFW42f07Wk++aOC6B9NWA==} + '@rolldown/binding-linux-x64-musl@1.0.0': + resolution: {integrity: sha512-5/utzzDmD/pD/bmuaUcbTf/sZYy0aztwIVlfpoW1fTjCZ0BaPOMVWGZL1zvgxyi7ZIVYWlxKONHmSbHuiOh8Jw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.0.0-rc.18': - resolution: {integrity: sha512-tSn/kzrfa7tNOXr7sEacDBN4YsIqTyLqh45IO0nHDwtpKIDNDJr+VFojt+4klSpChxB29JLyduSsE0MKEwa65A==} + '@rolldown/binding-openharmony-arm64@1.0.0': + resolution: {integrity: sha512-ouJs8VcUomfLfpbUECqFMRqdV4x6aeAK3MA4m6vTrJJjKyWTV5KnxZx7Jd9G+GlDaQQxubcba00x16OyJ1meig==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.0-rc.18': - resolution: {integrity: sha512-+J9YGmc+czgqlhYmwun3S3O0FIZhsH8ep2456xwjAdIOmuJxM7xz4P4PtrxU+Bz17a/5bqPA8o3HAAoX0teUdg==} + '@rolldown/binding-wasm32-wasi@1.0.0': + resolution: {integrity: sha512-E+oHKGiDA+lsKMmFtffDDw91EryDT7uJocrIuCHqhm6bCTM6xFK+3gaCkYOHfPwQr0cCNarSM2xaELoQDz9jJg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.18': - resolution: {integrity: sha512-zsu47DgU0FQzSwi6sU9dZoEdUv7pc1AptSEz/Z8HBg54sV0Pbs3N0+CrIbTsgiu6EyoaNN9CHboqbLaz9lhOyQ==} + '@rolldown/binding-win32-arm64-msvc@1.0.0': + resolution: {integrity: sha512-yYK02n8Rngo+gbm1y6G0+7jk1sJ/2Wt7K0me0Y7k/ErBpyf+LJ2gFpqWVTcRV1rUepBlQRmpgWkTQCiiwrK0Ow==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.18': - resolution: {integrity: sha512-7H+3yqGgmnlDTRRhw/xpYY9J1kf4GC681nVc4GqKhExZTDrVVrV2tsOR9kso0fvgBdcTCcQShx4SLLoHgaLwhg==} + '@rolldown/binding-win32-x64-msvc@1.0.0': + resolution: {integrity: sha512-14bpChMahXRRXiTwahSl+zzHPW6qQTXtkMuJBFlbo+pqSAews2d4BdCSHfrJ/MBsCZtpmTafsY+1QhBzitcmdg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@rolldown/pluginutils@1.0.0-rc.18': - resolution: {integrity: sha512-CUY5Mnhe64xQBGZEEXQ5WyZwsc1JU3vAZLIxtrsBt3LO6UOb+C8GunVKqe9sT8NeWb4lqSaoJtp2xo6GxT1MNw==} + '@rolldown/pluginutils@1.0.0': + resolution: {integrity: sha512-aKs/3GSWyV0mrhNmt/96/Z3yczC3yvrzYATCiCXQebBsGyYzjNdUphRVLeJQ67ySKVXRfMxt2lm12pmXvbPFQQ==} '@rollup/pluginutils@4.2.1': resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} @@ -1015,8 +1015,8 @@ packages: resolution: {integrity: sha512-zmPitbQ8+6zNutpwgcQuLcsEpn/Cj54Kbn7L5pX0Os5kdWplB7xPgEh/g+SWOB/qmows2gpuCaPyduq8ZZRnxA==} deprecated: This is a stub types definition. minimatch provides its own type definitions, so you do not need this installed. - '@types/node@25.6.2': - resolution: {integrity: sha512-sokuT28dxf9JT5Kady1fsXOvI4HVpjZa95NKT5y9PNTIrs2AsobR4GFAA90ZG8M+nxVRLysCXsVj6eGC7Vbrlw==} + '@types/node@25.7.0': + resolution: {integrity: sha512-z+pdZyxE+RTQE9AcboAZCb4otwcrvgHD+GlBpPgn0emDVt0ohrTMhAwlr2Wd9nZ+nihhYFxO2pThz3C5qSu2Eg==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -1043,63 +1043,63 @@ packages: '@types/svgo@2.6.4': resolution: {integrity: sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==} - '@typescript-eslint/eslint-plugin@8.59.2': - resolution: {integrity: sha512-j/bwmkBvHUtPNxzuWe5z6BEk3q54YRyGlBXkSsmfoih7zNrBvl5A9A98anlp/7JbyZcWIJ8KXo/3Tq/DjFLtuQ==} + '@typescript-eslint/eslint-plugin@8.59.3': + resolution: {integrity: sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.59.2 + '@typescript-eslint/parser': ^8.59.3 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.59.2': - resolution: {integrity: sha512-plR3pp6D+SSUn1HM7xvSkx12/DhoHInI2YF35KAcVFNZvlC0gtrWqx7Qq1oH2Ssgi0vlFRCTbP+DZc7B9+TtsQ==} + '@typescript-eslint/parser@8.59.3': + resolution: {integrity: sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.59.2': - resolution: {integrity: sha512-+2hqvEkeyf/0FBor67duF0Ll7Ot8jyKzDQOSrxazF/danillRq2DwR9dLptsXpoZQqxE1UisSmoZewrlPas9Vw==} + '@typescript-eslint/project-service@8.59.3': + resolution: {integrity: sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.59.2': - resolution: {integrity: sha512-JzfyEpEtOU89CcFSwyNS3mu4MLvLSXqnmX05+aKBDM+TdR5jzcGOEBwxwGNxrEQ7p/z6kK2WyioCGBf2zZBnvg==} + '@typescript-eslint/scope-manager@8.59.3': + resolution: {integrity: sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.59.2': - resolution: {integrity: sha512-BKK4alN7oi4C/zv4VqHQ+uRU+lTa6JGIZ7s1juw7b3RHo9OfKB+bKX3u0iVZetdsUCBBkSbdWbarJbmN0fTeSw==} + '@typescript-eslint/tsconfig-utils@8.59.3': + resolution: {integrity: sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.59.2': - resolution: {integrity: sha512-nhqaj1nmTdVVl/BP5omXNRGO38jn5iosis2vbdmupF2txCf8ylWT8lx+JlvMYYVqzGVKtjojUFoQ3JRWK+mfzQ==} + '@typescript-eslint/type-utils@8.59.3': + resolution: {integrity: sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.59.2': - resolution: {integrity: sha512-e82GVOE8Ps3E++Egvb6Y3Dw0S10u8NkQ9KXmtRhCWJJ8kDhOJTvtMAWnFL16kB1583goCWXsr0NieKCZMs2/0Q==} + '@typescript-eslint/types@8.59.3': + resolution: {integrity: sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.59.2': - resolution: {integrity: sha512-o0XPGNwcWw+FIwStOWn+BwBuEmL6QXP0rsvAFg7ET1dey1Nr6Wb1ac8p5HEsK0ygO/6mUxlk+YWQD9xcb/nnXg==} + '@typescript-eslint/typescript-estree@8.59.3': + resolution: {integrity: sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.59.2': - resolution: {integrity: sha512-Juw3EinkXqjaffxz6roowvV7GZT/kET5vSKKZT6upl5TXdWkLkYmNPXwDDL2Vkt2DPn0nODIS4egC/0AGxKo/Q==} + '@typescript-eslint/utils@8.59.3': + resolution: {integrity: sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.59.2': - resolution: {integrity: sha512-NwjLUnGy8/Zfx23fl50tRC8rYaYnM52xNRYFAXvmiil9yh1+K6aRVQMnzW6gQB/1DLgWt977lYQn7C+wtgXZiA==} + '@typescript-eslint/visitor-keys@8.59.3': + resolution: {integrity: sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} acorn-jsx@5.3.2: @@ -2520,8 +2520,8 @@ packages: node-html-parser@6.1.13: resolution: {integrity: sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==} - node-releases@2.0.38: - resolution: {integrity: sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==} + node-releases@2.0.44: + resolution: {integrity: sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ==} normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} @@ -2884,8 +2884,8 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rolldown@1.0.0-rc.18: - resolution: {integrity: sha512-phmyKBpuBdRYDf4hgyynGAYn/rDDe+iZXKVJ7WX5b1zQzpLkP5oJRPGsfJuHdzPMlyyEO/4sPW6yfSx2gf7lVg==} + rolldown@1.0.0: + resolution: {integrity: sha512-yD986aXDESFGS95spT1LAv0jssywP4npMEjmMHyN2/5+eE8qQJUype2AaKkRiLgBgyD0LFlubwAht7VmY8rGoA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -3213,8 +3213,8 @@ packages: peerDependencies: typescript: '>=3.5.1' - typescript-eslint@8.59.2: - resolution: {integrity: sha512-pJw051uomb3ZeCzGTpRb8RbEqB5Y4WWet8gl/GcTlU35BSx0PVdZ86/bqkQCyKKuraVQEK7r6kBHQXF+fBhkoQ==} + typescript-eslint@8.59.3: + resolution: {integrity: sha512-KgusgyDgG4LI8Ih/sWaCtZ06tckLAS5CvT5A4D1Q7bYVoAAyzwiZvE4BmwDHkhRVkvhRBepKeASoFzQetha7Fg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -3228,8 +3228,8 @@ packages: unbzip2-stream@1.4.3: resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} - undici-types@7.19.2: - resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==} + undici-types@7.21.0: + resolution: {integrity: sha512-w9IMgQrz4O0YN1LtB7K5P63vhlIOvC7opSmouCJ+ZywlPAlO9gIkJ+otk6LvGpAs2wg4econaCz3TvQ9xPoyuQ==} universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} @@ -3282,8 +3282,8 @@ packages: peerDependencies: vite: '*' - vite@8.0.11: - resolution: {integrity: sha512-Jz1mxtUBR5xTT65VOdJZUUeoyLtqljmFkiUXhPTLZka3RDc9vpi/xXkyrnsdRcm2lIi3l3GPMnAidTsEGIj3Ow==} + vite@8.0.12: + resolution: {integrity: sha512-w2dDofOWv2QB09ZITZBsvKTVAlYvPR4IAmrY/v0ir9KvLs0xybR7i48wxhM1/oyBWO34wPns+bPGw5ZrZqDpZg==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -3903,7 +3903,7 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 - '@oxc-project/types@0.128.0': {} + '@oxc-project/types@0.129.0': {} '@paralleldrive/cuid2@2.3.1': dependencies: @@ -3915,19 +3915,19 @@ snapshots: dependencies: preact: 10.29.1 - '@preact/preset-vite@2.10.5(@babel/core@7.29.0)(preact@10.29.1)(rollup@4.59.0)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1))': + '@preact/preset-vite@2.10.5(@babel/core@7.29.0)(preact@10.29.1)(rollup@4.59.0)(vite@8.0.12(@types/node@25.7.0)(esbuild@0.27.4)(terser@5.47.1))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.29.0) '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.29.0) - '@prefresh/vite': 2.4.12(preact@10.29.1)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1)) + '@prefresh/vite': 2.4.12(preact@10.29.1)(vite@8.0.12(@types/node@25.7.0)(esbuild@0.27.4)(terser@5.47.1)) '@rollup/pluginutils': 5.3.0(rollup@4.59.0) babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.29.0) debug: 4.4.3 magic-string: 0.30.21 picocolors: 1.1.1 - vite: 8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1) - vite-prerender-plugin: 0.5.13(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1)) + vite: 8.0.12(@types/node@25.7.0)(esbuild@0.27.4)(terser@5.47.1) + vite-prerender-plugin: 0.5.13(vite@8.0.12(@types/node@25.7.0)(esbuild@0.27.4)(terser@5.47.1)) zimmerframe: 1.1.4 transitivePeerDependencies: - preact @@ -3936,74 +3936,74 @@ snapshots: '@prefresh/babel-plugin@0.5.3': {} - '@prefresh/core@1.5.9(preact@10.29.1)': + '@prefresh/core@1.5.10(preact@10.29.1)': dependencies: preact: 10.29.1 '@prefresh/utils@1.2.1': {} - '@prefresh/vite@2.4.12(preact@10.29.1)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1))': + '@prefresh/vite@2.4.12(preact@10.29.1)(vite@8.0.12(@types/node@25.7.0)(esbuild@0.27.4)(terser@5.47.1))': dependencies: '@babel/core': 7.29.0 '@prefresh/babel-plugin': 0.5.3 - '@prefresh/core': 1.5.9(preact@10.29.1) + '@prefresh/core': 1.5.10(preact@10.29.1) '@prefresh/utils': 1.2.1 '@rollup/pluginutils': 4.2.1 preact: 10.29.1 - vite: 8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1) + vite: 8.0.12(@types/node@25.7.0)(esbuild@0.27.4)(terser@5.47.1) transitivePeerDependencies: - supports-color - '@rolldown/binding-android-arm64@1.0.0-rc.18': + '@rolldown/binding-android-arm64@1.0.0': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-rc.18': + '@rolldown/binding-darwin-arm64@1.0.0': optional: true - '@rolldown/binding-darwin-x64@1.0.0-rc.18': + '@rolldown/binding-darwin-x64@1.0.0': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-rc.18': + '@rolldown/binding-freebsd-x64@1.0.0': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.18': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.18': + '@rolldown/binding-linux-arm64-gnu@1.0.0': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.18': + '@rolldown/binding-linux-arm64-musl@1.0.0': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.18': + '@rolldown/binding-linux-ppc64-gnu@1.0.0': optional: true - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.18': + '@rolldown/binding-linux-s390x-gnu@1.0.0': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.18': + '@rolldown/binding-linux-x64-gnu@1.0.0': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-rc.18': + '@rolldown/binding-linux-x64-musl@1.0.0': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-rc.18': + '@rolldown/binding-openharmony-arm64@1.0.0': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-rc.18': + '@rolldown/binding-wasm32-wasi@1.0.0': dependencies: '@emnapi/core': 1.10.0 '@emnapi/runtime': 1.10.0 '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.18': + '@rolldown/binding-win32-arm64-msvc@1.0.0': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.18': + '@rolldown/binding-win32-x64-msvc@1.0.0': optional: true - '@rolldown/pluginutils@1.0.0-rc.18': {} + '@rolldown/pluginutils@1.0.0': {} '@rollup/pluginutils@4.2.1': dependencies: @@ -4133,7 +4133,7 @@ snapshots: '@types/glob@7.2.0': dependencies: '@types/minimatch': 6.0.0 - '@types/node': 25.6.2 + '@types/node': 25.7.0 '@types/imagemin-gifsicle@7.0.4': dependencies: @@ -4162,21 +4162,21 @@ snapshots: '@types/imagemin@7.0.1': dependencies: - '@types/node': 25.6.2 + '@types/node': 25.7.0 '@types/json-schema@7.0.15': {} '@types/keyv@3.1.4': dependencies: - '@types/node': 25.6.2 + '@types/node': 25.7.0 '@types/minimatch@6.0.0': dependencies: minimatch: 10.2.5 - '@types/node@25.6.2': + '@types/node@25.7.0': dependencies: - undici-types: 7.19.2 + undici-types: 7.21.0 '@types/parse-json@4.0.2': {} @@ -4196,20 +4196,20 @@ snapshots: '@types/responselike@1.0.3': dependencies: - '@types/node': 25.6.2 + '@types/node': 25.7.0 '@types/svgo@2.6.4': dependencies: - '@types/node': 25.6.2 + '@types/node': 25.7.0 - '@typescript-eslint/eslint-plugin@8.59.2(@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3))(eslint@10.3.0)(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.59.3(@typescript-eslint/parser@8.59.3(eslint@10.3.0)(typescript@6.0.3))(eslint@10.3.0)(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.59.2(eslint@10.3.0)(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.59.2 - '@typescript-eslint/type-utils': 8.59.2(eslint@10.3.0)(typescript@6.0.3) - '@typescript-eslint/utils': 8.59.2(eslint@10.3.0)(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.59.2 + '@typescript-eslint/parser': 8.59.3(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.59.3 + '@typescript-eslint/type-utils': 8.59.3(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.3(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.3 eslint: 10.3.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -4218,41 +4218,41 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3)': + '@typescript-eslint/parser@8.59.3(eslint@10.3.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/scope-manager': 8.59.2 - '@typescript-eslint/types': 8.59.2 - '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.59.2 + '@typescript-eslint/scope-manager': 8.59.3 + '@typescript-eslint/types': 8.59.3 + '@typescript-eslint/typescript-estree': 8.59.3(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.3 debug: 4.4.3 eslint: 10.3.0 typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.59.2(typescript@6.0.3)': + '@typescript-eslint/project-service@8.59.3(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.59.2(typescript@6.0.3) - '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/tsconfig-utils': 8.59.3(typescript@6.0.3) + '@typescript-eslint/types': 8.59.3 debug: 4.4.3 typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.59.2': + '@typescript-eslint/scope-manager@8.59.3': dependencies: - '@typescript-eslint/types': 8.59.2 - '@typescript-eslint/visitor-keys': 8.59.2 + '@typescript-eslint/types': 8.59.3 + '@typescript-eslint/visitor-keys': 8.59.3 - '@typescript-eslint/tsconfig-utils@8.59.2(typescript@6.0.3)': + '@typescript-eslint/tsconfig-utils@8.59.3(typescript@6.0.3)': dependencies: typescript: 6.0.3 - '@typescript-eslint/type-utils@8.59.2(eslint@10.3.0)(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.59.3(eslint@10.3.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.59.2 - '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) - '@typescript-eslint/utils': 8.59.2(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/types': 8.59.3 + '@typescript-eslint/typescript-estree': 8.59.3(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.3(eslint@10.3.0)(typescript@6.0.3) debug: 4.4.3 eslint: 10.3.0 ts-api-utils: 2.5.0(typescript@6.0.3) @@ -4260,14 +4260,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.59.2': {} + '@typescript-eslint/types@8.59.3': {} - '@typescript-eslint/typescript-estree@8.59.2(typescript@6.0.3)': + '@typescript-eslint/typescript-estree@8.59.3(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.59.2(typescript@6.0.3) - '@typescript-eslint/tsconfig-utils': 8.59.2(typescript@6.0.3) - '@typescript-eslint/types': 8.59.2 - '@typescript-eslint/visitor-keys': 8.59.2 + '@typescript-eslint/project-service': 8.59.3(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.59.3(typescript@6.0.3) + '@typescript-eslint/types': 8.59.3 + '@typescript-eslint/visitor-keys': 8.59.3 debug: 4.4.3 minimatch: 10.2.5 semver: 7.8.0 @@ -4277,20 +4277,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.59.2(eslint@10.3.0)(typescript@6.0.3)': + '@typescript-eslint/utils@8.59.3(eslint@10.3.0)(typescript@6.0.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0) - '@typescript-eslint/scope-manager': 8.59.2 - '@typescript-eslint/types': 8.59.2 - '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.59.3 + '@typescript-eslint/types': 8.59.3 + '@typescript-eslint/typescript-estree': 8.59.3(typescript@6.0.3) eslint: 10.3.0 typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.59.2': + '@typescript-eslint/visitor-keys@8.59.3': dependencies: - '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/types': 8.59.3 eslint-visitor-keys: 5.0.1 acorn-jsx@5.3.2(acorn@8.16.0): @@ -4425,7 +4425,7 @@ snapshots: baseline-browser-mapping: 2.10.29 caniuse-lite: 1.0.30001792 electron-to-chromium: 1.5.353 - node-releases: 2.0.38 + node-releases: 2.0.44 update-browserslist-db: 1.2.3(browserslist@4.28.2) buffer-alloc-unsafe@1.1.0: {} @@ -5760,7 +5760,7 @@ snapshots: css-select: 5.2.2 he: 1.2.0 - node-releases@2.0.38: {} + node-releases@2.0.44: {} normalize-package-data@2.5.0: dependencies: @@ -6096,35 +6096,35 @@ snapshots: dependencies: glob: 7.2.3 - rolldown@1.0.0-rc.18: + rolldown@1.0.0: dependencies: - '@oxc-project/types': 0.128.0 - '@rolldown/pluginutils': 1.0.0-rc.18 + '@oxc-project/types': 0.129.0 + '@rolldown/pluginutils': 1.0.0 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-rc.18 - '@rolldown/binding-darwin-arm64': 1.0.0-rc.18 - '@rolldown/binding-darwin-x64': 1.0.0-rc.18 - '@rolldown/binding-freebsd-x64': 1.0.0-rc.18 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.18 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.18 - '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.18 - '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.18 - '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.18 - '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.18 - '@rolldown/binding-linux-x64-musl': 1.0.0-rc.18 - '@rolldown/binding-openharmony-arm64': 1.0.0-rc.18 - '@rolldown/binding-wasm32-wasi': 1.0.0-rc.18 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.18 - '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.18 + '@rolldown/binding-android-arm64': 1.0.0 + '@rolldown/binding-darwin-arm64': 1.0.0 + '@rolldown/binding-darwin-x64': 1.0.0 + '@rolldown/binding-freebsd-x64': 1.0.0 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0 + '@rolldown/binding-linux-arm64-gnu': 1.0.0 + '@rolldown/binding-linux-arm64-musl': 1.0.0 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0 + '@rolldown/binding-linux-s390x-gnu': 1.0.0 + '@rolldown/binding-linux-x64-gnu': 1.0.0 + '@rolldown/binding-linux-x64-musl': 1.0.0 + '@rolldown/binding-openharmony-arm64': 1.0.0 + '@rolldown/binding-wasm32-wasi': 1.0.0 + '@rolldown/binding-win32-arm64-msvc': 1.0.0 + '@rolldown/binding-win32-x64-msvc': 1.0.0 - rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-rc.18)(rollup@4.59.0): + rollup-plugin-visualizer@7.0.1(rolldown@1.0.0)(rollup@4.59.0): dependencies: open: 11.0.0 picomatch: 4.0.4 source-map: 0.7.6 yargs: 18.0.0 optionalDependencies: - rolldown: 1.0.0-rc.18 + rolldown: 1.0.0 rollup: 4.59.0 rollup@4.59.0: @@ -6432,12 +6432,12 @@ snapshots: dependencies: typescript: 6.0.3 - typescript-eslint@8.59.2(eslint@10.3.0)(typescript@6.0.3): + typescript-eslint@8.59.3(eslint@10.3.0)(typescript@6.0.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.59.2(@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3))(eslint@10.3.0)(typescript@6.0.3) - '@typescript-eslint/parser': 8.59.2(eslint@10.3.0)(typescript@6.0.3) - '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) - '@typescript-eslint/utils': 8.59.2(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/eslint-plugin': 8.59.3(@typescript-eslint/parser@8.59.3(eslint@10.3.0)(typescript@6.0.3))(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/parser': 8.59.3(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.59.3(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.3(eslint@10.3.0)(typescript@6.0.3) eslint: 10.3.0 typescript: 6.0.3 transitivePeerDependencies: @@ -6450,7 +6450,7 @@ snapshots: buffer: 5.7.1 through: 2.3.8 - undici-types@7.19.2: {} + undici-types@7.21.0: {} universalify@2.0.1: {} @@ -6483,7 +6483,7 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - vite-plugin-imagemin@0.6.1(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1)): + vite-plugin-imagemin@0.6.1(vite@8.0.12(@types/node@25.7.0)(esbuild@0.27.4)(terser@5.47.1)): dependencies: '@types/imagemin': 7.0.1 '@types/imagemin-gifsicle': 7.0.4 @@ -6508,11 +6508,11 @@ snapshots: imagemin-webp: 6.1.0 jpegtran-bin: 6.0.1 pathe: 0.2.0 - vite: 8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1) + vite: 8.0.12(@types/node@25.7.0)(esbuild@0.27.4)(terser@5.47.1) transitivePeerDependencies: - supports-color - vite-prerender-plugin@0.5.13(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1)): + vite-prerender-plugin@0.5.13(vite@8.0.12(@types/node@25.7.0)(esbuild@0.27.4)(terser@5.47.1)): dependencies: kolorist: 1.8.0 magic-string: 0.30.21 @@ -6520,27 +6520,27 @@ snapshots: simple-code-frame: 1.3.0 source-map: 0.7.6 stack-trace: 1.0.0 - vite: 8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1) + vite: 8.0.12(@types/node@25.7.0)(esbuild@0.27.4)(terser@5.47.1) - vite-tsconfig-paths@6.1.1(typescript@6.0.3)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1)): + vite-tsconfig-paths@6.1.1(typescript@6.0.3)(vite@8.0.12(@types/node@25.7.0)(esbuild@0.27.4)(terser@5.47.1)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.6(typescript@6.0.3) - vite: 8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1) + vite: 8.0.12(@types/node@25.7.0)(esbuild@0.27.4)(terser@5.47.1) transitivePeerDependencies: - supports-color - typescript - vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1): + vite@8.0.12(@types/node@25.7.0)(esbuild@0.27.4)(terser@5.47.1): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 postcss: 8.5.14 - rolldown: 1.0.0-rc.18 + rolldown: 1.0.0 tinyglobby: 0.2.16 optionalDependencies: - '@types/node': 25.6.2 + '@types/node': 25.7.0 esbuild: 0.27.4 fsevents: 2.3.3 terser: 5.47.1 From 76a68629d1adc9f95e09d27273cc811e47548db7 Mon Sep 17 00:00:00 2001 From: proddy Date: Tue, 12 May 2026 21:28:42 +0200 Subject: [PATCH 07/24] 3.8.3 --- CHANGELOG.md | 38 ++++++++++++++++++++++++++++++++++++++ CHANGELOG_LATEST.md | 32 +------------------------------- src/emsesp_version.h | 2 +- 3 files changed, 40 insertions(+), 32 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 156bffd65..30f474e75 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,44 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [3.8.2] 12 May 2026 + +## Added + +- comfortpoint for BC400 [#2935](https://github.com/emsesp/EMS-ESP32/issues/2935) +- customize device brand [#2784](https://github.com/emsesp/EMS-ESP32/issues/2784) +- set model for ems-esp devices temperature, analog, etc. [#2958](https://github.com/emsesp/EMS-ESP32/discussions/2958) +- prometheus metrics for temperature/analog/scheduler/custom [#2962](https://github.com/emsesp/EMS-ESP32/issues/2962) +- boiler pumpkick [#2965](https://github.com/emsesp/EMS-ESP32/discussions/2965) +- heatpump reset [#2933](https://github.com/emsesp/EMS-ESP32/issues/2933) +- 2.nd freshwater module (dhw4, dhw5) [#2991](https://github.com/emsesp/EMS-ESP32/issues/2991) +- full system backup and restore +- auto-logic to set ht3/ems+ tx-mode +- polariity for digital_in sensors [#3070](https://github.com/emsesp/EMS-ESP32/discussions/3070) + +## Fixed + +- SRC climate creation [#2936](https://github.com/emsesp/EMS-ESP32/issues/2936) and [#2960](https://github.com/emsesp/EMS-ESP32/issues/2960) +- missing translations [#3015](https://github.com/emsesp/EMS-ESP32/issues/3015) +- custom entities check fetch length +- modbus initialization [#3064](https://github.com/emsesp/EMS-ESP32/issues/3064) + +## Changed + +- weblogbuffer up to 1000 messages with PSRAM, mentioned in [#2933](https://github.com/emsesp/EMS-ESP32/issues/2933) +- validate custom entity writes, [#2931](https://github.com/emsesp/EMS-ESP32/issues/2931) +- remove wrong burnMinPower [#2918](https://github.com/emsesp/EMS-ESP32/issues/2918) +- store scheduler active state to nvs [#2946](https://github.com/emsesp/EMS-ESP32/discussions/2946) +- translated modes `heat` and `eco` for HA-climate mode-str-tpl +- support `minflowtemp` and `baseflowtemp` [#2969](https://github.com/emsesp/EMS-ESP32/discussions/2969) +- update version if it is 00.00 in first read [#2981](https://github.com/emsesp/EMS-ESP32/issues/2981) +- device class for % values [#2980](https://github.com/emsesp/EMS-ESP32/issues/2980) +- fetch telegrams: set length to fetch [#3017](https://github.com/emsesp/EMS-ESP32/issues/3017) +- move http client from stack to heap +- heap optimizations [#3021](https://github.com/emsesp/EMS-ESP32/discussions/3021) +- check and read 0x470 as summer2_typeids[0] only if received [#2686](https://github.com/emsesp/EMS-ESP32/issues/2686), [#3055](https://github.com/emsesp/EMS-ESP32/issues/3055) +- default bus-id: gateway1(0x49), tx-mode: auto + ## [3.8.1] 11 January 2026 ## Added diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index 60c16392b..4486f38ca 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -2,40 +2,10 @@ For more details go to [emsesp.org](https://emsesp.org/). -## [3.8.2] +## [3.8.3] ## Added -- comfortpoint for BC400 [#2935](https://github.com/emsesp/EMS-ESP32/issues/2935) -- customize device brand [#2784](https://github.com/emsesp/EMS-ESP32/issues/2784) -- set model for ems-esp devices temperature, analog, etc. [#2958](https://github.com/emsesp/EMS-ESP32/discussions/2958) -- prometheus metrics for temperature/analog/scheduler/custom [#2962](https://github.com/emsesp/EMS-ESP32/issues/2962) -- boiler pumpkick [#2965](https://github.com/emsesp/EMS-ESP32/discussions/2965) -- heatpump reset [#2933](https://github.com/emsesp/EMS-ESP32/issues/2933) -- 2.nd freshwater module (dhw4, dhw5) [#2991](https://github.com/emsesp/EMS-ESP32/issues/2991) -- full system backup and restore -- auto-logic to set ht3/ems+ tx-mode -- polariity for digital_in sensors [#3070](https://github.com/emsesp/EMS-ESP32/discussions/3070) - ## Fixed -- SRC climate creation [#2936](https://github.com/emsesp/EMS-ESP32/issues/2936) and [#2960](https://github.com/emsesp/EMS-ESP32/issues/2960) -- missing translations [#3015](https://github.com/emsesp/EMS-ESP32/issues/3015) -- custom entities check fetch length -- modbus initialization [#3064](https://github.com/emsesp/EMS-ESP32/issues/3064) - ## Changed - -- weblogbuffer up to 1000 messages with PSRAM, mentioned in [#2933](https://github.com/emsesp/EMS-ESP32/issues/2933) -- validate custom entity writes, [#2931](https://github.com/emsesp/EMS-ESP32/issues/2931) -- remove wrong burnMinPower [#2918](https://github.com/emsesp/EMS-ESP32/issues/2918) -- store scheduler active state to nvs [#2946](https://github.com/emsesp/EMS-ESP32/discussions/2946) -- translated modes `heat` and `eco` for HA-climate mode-str-tpl -- support `minflowtemp` and `baseflowtemp` [#2969](https://github.com/emsesp/EMS-ESP32/discussions/2969) -- update version if it is 00.00 in first read [#2981](https://github.com/emsesp/EMS-ESP32/issues/2981) -- device class for % values [#2980](https://github.com/emsesp/EMS-ESP32/issues/2980) -- fetch telegrams: set length to fetch [#3017](https://github.com/emsesp/EMS-ESP32/issues/3017) -- move http client from stack to heap -- heap optimizations [#3021](https://github.com/emsesp/EMS-ESP32/discussions/3021) -- check and read 0x470 as summer2_typeids[0] only if received [#2686](https://github.com/emsesp/EMS-ESP32/issues/2686), [#3055](https://github.com/emsesp/EMS-ESP32/issues/3055) -- default bus-id: gateway1(0x49), tx-mode: auto diff --git a/src/emsesp_version.h b/src/emsesp_version.h index 3972166a4..e5e620e8d 100644 --- a/src/emsesp_version.h +++ b/src/emsesp_version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.8.2-dev.23" +#define EMSESP_APP_VERSION "3.8.3-dev.0" From 07a9bd5f331db035667292a386cdc4e909a9f687 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Wed, 13 May 2026 11:19:02 +0200 Subject: [PATCH 08/24] fix solar influence, #3077 --- src/devices/thermostat.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index 824897496..ce9ae6e83 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -5037,8 +5037,8 @@ void Thermostat::register_device_values_hc(std::shared_ptrsolarInfl, DeviceValueType::UINT8, FL_(solarinfl), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_solarinfl), -5, -1); - register_device_value(tag, &hc->currSolarInfl, DeviceValueType::UINT8, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(currsolarinfl), DeviceValueUOM::DEGREES); + register_device_value(tag, &hc->solarInfl, DeviceValueType::INT8, FL_(solarinfl), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_solarinfl), -5, -1); + register_device_value(tag, &hc->currSolarInfl, DeviceValueType::INT8, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(currsolarinfl), DeviceValueUOM::DEGREES); register_device_value(tag, &hc->heatingpid, DeviceValueType::ENUM, FL_(enum_PID), FL_(heatingPID), DeviceValueUOM::NONE, MAKE_CF_CB(set_heatingpid)); register_device_value(tag, &hc->pumpopt, DeviceValueType::BOOL, FL_(pumpopt), DeviceValueUOM::NONE, MAKE_CF_CB(set_pumpopt)); register_device_value(tag, From 5f6d156f63a3fd26a40cbff6628bedc9cfa3875e Mon Sep 17 00:00:00 2001 From: MichaelDvP <59284019+MichaelDvP@users.noreply.github.com> Date: Wed, 13 May 2026 09:32:00 +0000 Subject: [PATCH 09/24] chore: update generated files for v3.8.3-dev.0 --- docs/Modbus-Entity-Registers.md | 30 +++++++++++++++--------------- docs/dump_entities.csv | 20 ++++++++++---------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/docs/Modbus-Entity-Registers.md b/docs/Modbus-Entity-Registers.md index 739350265..8c2583221 100644 --- a/docs/Modbus-Entity-Registers.md +++ b/docs/Modbus-Entity-Registers.md @@ -5376,9 +5376,9 @@ uint8 | hc1.switchprogmode | switch program mode | enum | | true | HC | 55 | 1 | 1 | int8 | hc1.redthreshold | reduction threshold | int8 (>=12<=22) | C | true | HC | 56 | 1 | 1/2 | -uint8 -| hc1.solarinfl | solar influence | uint8 (>=-5<=4294967295) | C | true | HC | 57 | 1 | 1 | -| hc1.currsolarinfl | current solar influence | uint8 | C | false | HC | 58 | 1 | 1/10 | +int8 +| hc1.solarinfl | solar influence | int8 (>=-5<=4294967295) | C | true | HC | 57 | 1 | 1 | +| hc1.currsolarinfl | current solar influence | int8 | C | false | HC | 58 | 1 | 1/10 | | hc1.heatingpid | heating PID | enum | | true | HC | 59 | 1 | 1 | | hc1.pumpopt | pump optimization | boolean | | true | HC | 60 | 1 | 1 | uint8 @@ -5985,9 +5985,9 @@ uint8 | hc1.switchprogmode | switch program mode | enum | | true | HC | 55 | 1 | 1 | int8 | hc1.redthreshold | reduction threshold | int8 (>=12<=22) | C | true | HC | 56 | 1 | 1/2 | -uint8 -| hc1.solarinfl | solar influence | uint8 (>=-5<=4294967295) | C | true | HC | 57 | 1 | 1 | -| hc1.currsolarinfl | current solar influence | uint8 | C | false | HC | 58 | 1 | 1/10 | +int8 +| hc1.solarinfl | solar influence | int8 (>=-5<=4294967295) | C | true | HC | 57 | 1 | 1 | +| hc1.currsolarinfl | current solar influence | int8 | C | false | HC | 58 | 1 | 1/10 | | hc1.heatingpid | heating PID | enum | | true | HC | 59 | 1 | 1 | | hc1.pumpopt | pump optimization | boolean | | true | HC | 60 | 1 | 1 | uint8 @@ -6137,9 +6137,9 @@ uint8 | hc1.switchprogmode | switch program mode | enum | | true | HC | 55 | 1 | 1 | int8 | hc1.redthreshold | reduction threshold | int8 (>=12<=22) | C | true | HC | 56 | 1 | 1/2 | -uint8 -| hc1.solarinfl | solar influence | uint8 (>=-5<=4294967295) | C | true | HC | 57 | 1 | 1 | -| hc1.currsolarinfl | current solar influence | uint8 | C | false | HC | 58 | 1 | 1/10 | +int8 +| hc1.solarinfl | solar influence | int8 (>=-5<=4294967295) | C | true | HC | 57 | 1 | 1 | +| hc1.currsolarinfl | current solar influence | int8 | C | false | HC | 58 | 1 | 1/10 | | hc1.heatingpid | heating PID | enum | | true | HC | 59 | 1 | 1 | | hc1.pumpopt | pump optimization | boolean | | true | HC | 60 | 1 | 1 | uint8 @@ -6304,9 +6304,9 @@ uint8 | hc1.switchprogmode | switch program mode | enum | | true | HC | 55 | 1 | 1 | int8 | hc1.redthreshold | reduction threshold | int8 (>=12<=22) | C | true | HC | 56 | 1 | 1/2 | -uint8 -| hc1.solarinfl | solar influence | uint8 (>=-5<=4294967295) | C | true | HC | 57 | 1 | 1 | -| hc1.currsolarinfl | current solar influence | uint8 | C | false | HC | 58 | 1 | 1/10 | +int8 +| hc1.solarinfl | solar influence | int8 (>=-5<=4294967295) | C | true | HC | 57 | 1 | 1 | +| hc1.currsolarinfl | current solar influence | int8 | C | false | HC | 58 | 1 | 1/10 | | hc1.heatingpid | heating PID | enum | | true | HC | 59 | 1 | 1 | | hc1.pumpopt | pump optimization | boolean | | true | HC | 60 | 1 | 1 | uint8 @@ -6498,9 +6498,9 @@ uint8 | hc1.switchprogmode | switch program mode | enum | | true | HC | 55 | 1 | 1 | int8 | hc1.redthreshold | reduction threshold | int8 (>=12<=22) | C | true | HC | 56 | 1 | 1/2 | -uint8 -| hc1.solarinfl | solar influence | uint8 (>=-5<=4294967295) | C | true | HC | 57 | 1 | 1 | -| hc1.currsolarinfl | current solar influence | uint8 | C | false | HC | 58 | 1 | 1/10 | +int8 +| hc1.solarinfl | solar influence | int8 (>=-5<=4294967295) | C | true | HC | 57 | 1 | 1 | +| hc1.currsolarinfl | current solar influence | int8 | C | false | HC | 58 | 1 | 1/10 | | hc1.heatingpid | heating PID | enum | | true | HC | 59 | 1 | 1 | | hc1.pumpopt | pump optimization | boolean | | true | HC | 60 | 1 | 1 | uint8 diff --git a/docs/dump_entities.csv b/docs/dump_entities.csv index 0bd4e604b..a83d1c3a2 100644 --- a/docs/dump_entities.csv +++ b/docs/dump_entities.csv @@ -4057,8 +4057,8 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/ "UI800, BC400",thermostat,4,hc1.cooloffdelay,cooling off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_off_delay,number.thermostat_hc1_cooloffdelay,6,1,1,54,1 "UI800, BC400",thermostat,4,hc1.switchprogmode,switch program mode,enum [level\|absolute] (>=0<=0), ,true,select.thermostat_hc1_switch_program_mode,select.thermostat_hc1_switchprogmode,6,1,1,55,1 "UI800, BC400",thermostat,4,hc1.redthreshold,reduction threshold,int8 (>=12<=22),C,true,number.thermostat_hc1_reduction_threshold,number.thermostat_hc1_redthreshold,6,1,1/2,56,1 -"UI800, BC400",thermostat,4,hc1.solarinfl,solar influence,uint8 (>=-5<=4294967295),C,true,number.thermostat_hc1_solar_influence,number.thermostat_hc1_solarinfl,6,1,1,57,1 -"UI800, BC400",thermostat,4,hc1.currsolarinfl,current solar influence,uint8,C,false,sensor.thermostat_hc1_current_solar_influence,sensor.thermostat_hc1_currsolarinfl,6,1,1/10,58,1 +"UI800, BC400",thermostat,4,hc1.solarinfl,solar influence,int8 (>=-5<=4294967295),C,true,number.thermostat_hc1_solar_influence,number.thermostat_hc1_solarinfl,6,1,1,57,1 +"UI800, BC400",thermostat,4,hc1.currsolarinfl,current solar influence,int8,C,false,sensor.thermostat_hc1_current_solar_influence,sensor.thermostat_hc1_currsolarinfl,6,1,1/10,58,1 "UI800, BC400",thermostat,4,hc1.heatingpid,heating PID,enum [fast\|medium\|slow] (>=0<=0), ,true,select.thermostat_hc1_heating_PID,select.thermostat_hc1_heatingpid,6,1,1,59,1 "UI800, BC400",thermostat,4,hc1.pumpopt,pump optimization,boolean (>=0<=0), ,true,switch.thermostat_hc1_pump_optimization,switch.thermostat_hc1_pumpopt,6,1,1,60,1 "UI800, BC400",thermostat,4,hc1.inttimefloor,integral time floor,uint8 (>=160<=320),minutes,true,number.thermostat_hc1_integral_time_floor,number.thermostat_hc1_inttimefloor,6,1,10,61,1 @@ -4447,8 +4447,8 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/ "RC200, CW100, CR120, CR50",thermostat,157,hc1.cooloffdelay,cooling off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_off_delay,number.thermostat_hc1_cooloffdelay,6,1,1,54,1 "RC200, CW100, CR120, CR50",thermostat,157,hc1.switchprogmode,switch program mode,enum [level\|absolute] (>=0<=0), ,true,select.thermostat_hc1_switch_program_mode,select.thermostat_hc1_switchprogmode,6,1,1,55,1 "RC200, CW100, CR120, CR50",thermostat,157,hc1.redthreshold,reduction threshold,int8 (>=12<=22),C,true,number.thermostat_hc1_reduction_threshold,number.thermostat_hc1_redthreshold,6,1,1/2,56,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.solarinfl,solar influence,uint8 (>=-5<=4294967295),C,true,number.thermostat_hc1_solar_influence,number.thermostat_hc1_solarinfl,6,1,1,57,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.currsolarinfl,current solar influence,uint8,C,false,sensor.thermostat_hc1_current_solar_influence,sensor.thermostat_hc1_currsolarinfl,6,1,1/10,58,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.solarinfl,solar influence,int8 (>=-5<=4294967295),C,true,number.thermostat_hc1_solar_influence,number.thermostat_hc1_solarinfl,6,1,1,57,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.currsolarinfl,current solar influence,int8,C,false,sensor.thermostat_hc1_current_solar_influence,sensor.thermostat_hc1_currsolarinfl,6,1,1/10,58,1 "RC200, CW100, CR120, CR50",thermostat,157,hc1.heatingpid,heating PID,enum [fast\|medium\|slow] (>=0<=0), ,true,select.thermostat_hc1_heating_PID,select.thermostat_hc1_heatingpid,6,1,1,59,1 "RC200, CW100, CR120, CR50",thermostat,157,hc1.pumpopt,pump optimization,boolean (>=0<=0), ,true,switch.thermostat_hc1_pump_optimization,switch.thermostat_hc1_pumpopt,6,1,1,60,1 "RC200, CW100, CR120, CR50",thermostat,157,hc1.inttimefloor,integral time floor,uint8 (>=160<=320),minutes,true,number.thermostat_hc1_integral_time_floor,number.thermostat_hc1_inttimefloor,6,1,10,61,1 @@ -4545,8 +4545,8 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/ "RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.cooloffdelay,cooling off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_off_delay,number.thermostat_hc1_cooloffdelay,6,1,1,54,1 "RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.switchprogmode,switch program mode,enum [level\|absolute] (>=0<=0), ,true,select.thermostat_hc1_switch_program_mode,select.thermostat_hc1_switchprogmode,6,1,1,55,1 "RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.redthreshold,reduction threshold,int8 (>=12<=22),C,true,number.thermostat_hc1_reduction_threshold,number.thermostat_hc1_redthreshold,6,1,1/2,56,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.solarinfl,solar influence,uint8 (>=-5<=4294967295),C,true,number.thermostat_hc1_solar_influence,number.thermostat_hc1_solarinfl,6,1,1,57,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.currsolarinfl,current solar influence,uint8,C,false,sensor.thermostat_hc1_current_solar_influence,sensor.thermostat_hc1_currsolarinfl,6,1,1/10,58,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.solarinfl,solar influence,int8 (>=-5<=4294967295),C,true,number.thermostat_hc1_solar_influence,number.thermostat_hc1_solarinfl,6,1,1,57,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.currsolarinfl,current solar influence,int8,C,false,sensor.thermostat_hc1_current_solar_influence,sensor.thermostat_hc1_currsolarinfl,6,1,1/10,58,1 "RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.heatingpid,heating PID,enum [fast\|medium\|slow] (>=0<=0), ,true,select.thermostat_hc1_heating_PID,select.thermostat_hc1_heatingpid,6,1,1,59,1 "RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.pumpopt,pump optimization,boolean (>=0<=0), ,true,switch.thermostat_hc1_pump_optimization,switch.thermostat_hc1_pumpopt,6,1,1,60,1 "RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.inttimefloor,integral time floor,uint8 (>=160<=320),minutes,true,number.thermostat_hc1_integral_time_floor,number.thermostat_hc1_inttimefloor,6,1,10,61,1 @@ -4652,8 +4652,8 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/ "Rego 2000/3000",thermostat,172,hc1.cooloffdelay,cooling off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_off_delay,number.thermostat_hc1_cooloffdelay,6,1,1,54,1 "Rego 2000/3000",thermostat,172,hc1.switchprogmode,switch program mode,enum [level\|absolute] (>=0<=0), ,true,select.thermostat_hc1_switch_program_mode,select.thermostat_hc1_switchprogmode,6,1,1,55,1 "Rego 2000/3000",thermostat,172,hc1.redthreshold,reduction threshold,int8 (>=12<=22),C,true,number.thermostat_hc1_reduction_threshold,number.thermostat_hc1_redthreshold,6,1,1/2,56,1 -"Rego 2000/3000",thermostat,172,hc1.solarinfl,solar influence,uint8 (>=-5<=4294967295),C,true,number.thermostat_hc1_solar_influence,number.thermostat_hc1_solarinfl,6,1,1,57,1 -"Rego 2000/3000",thermostat,172,hc1.currsolarinfl,current solar influence,uint8,C,false,sensor.thermostat_hc1_current_solar_influence,sensor.thermostat_hc1_currsolarinfl,6,1,1/10,58,1 +"Rego 2000/3000",thermostat,172,hc1.solarinfl,solar influence,int8 (>=-5<=4294967295),C,true,number.thermostat_hc1_solar_influence,number.thermostat_hc1_solarinfl,6,1,1,57,1 +"Rego 2000/3000",thermostat,172,hc1.currsolarinfl,current solar influence,int8,C,false,sensor.thermostat_hc1_current_solar_influence,sensor.thermostat_hc1_currsolarinfl,6,1,1/10,58,1 "Rego 2000/3000",thermostat,172,hc1.heatingpid,heating PID,enum [fast\|medium\|slow] (>=0<=0), ,true,select.thermostat_hc1_heating_PID,select.thermostat_hc1_heatingpid,6,1,1,59,1 "Rego 2000/3000",thermostat,172,hc1.pumpopt,pump optimization,boolean (>=0<=0), ,true,switch.thermostat_hc1_pump_optimization,switch.thermostat_hc1_pumpopt,6,1,1,60,1 "Rego 2000/3000",thermostat,172,hc1.inttimefloor,integral time floor,uint8 (>=160<=320),minutes,true,number.thermostat_hc1_integral_time_floor,number.thermostat_hc1_inttimefloor,6,1,10,61,1 @@ -4777,8 +4777,8 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/ "Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.cooloffdelay,cooling off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_off_delay,number.thermostat_hc1_cooloffdelay,6,1,1,54,1 "Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.switchprogmode,switch program mode,enum [level\|absolute] (>=0<=0), ,true,select.thermostat_hc1_switch_program_mode,select.thermostat_hc1_switchprogmode,6,1,1,55,1 "Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.redthreshold,reduction threshold,int8 (>=12<=22),C,true,number.thermostat_hc1_reduction_threshold,number.thermostat_hc1_redthreshold,6,1,1/2,56,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.solarinfl,solar influence,uint8 (>=-5<=4294967295),C,true,number.thermostat_hc1_solar_influence,number.thermostat_hc1_solarinfl,6,1,1,57,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.currsolarinfl,current solar influence,uint8,C,false,sensor.thermostat_hc1_current_solar_influence,sensor.thermostat_hc1_currsolarinfl,6,1,1/10,58,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.solarinfl,solar influence,int8 (>=-5<=4294967295),C,true,number.thermostat_hc1_solar_influence,number.thermostat_hc1_solarinfl,6,1,1,57,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.currsolarinfl,current solar influence,int8,C,false,sensor.thermostat_hc1_current_solar_influence,sensor.thermostat_hc1_currsolarinfl,6,1,1/10,58,1 "Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.heatingpid,heating PID,enum [fast\|medium\|slow] (>=0<=0), ,true,select.thermostat_hc1_heating_PID,select.thermostat_hc1_heatingpid,6,1,1,59,1 "Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.pumpopt,pump optimization,boolean (>=0<=0), ,true,switch.thermostat_hc1_pump_optimization,switch.thermostat_hc1_pumpopt,6,1,1,60,1 "Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.inttimefloor,integral time floor,uint8 (>=160<=320),minutes,true,number.thermostat_hc1_integral_time_floor,number.thermostat_hc1_inttimefloor,6,1,10,61,1 From 59eba07a333e7a4cfc675027ea2b059ce182d233 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Wed, 13 May 2026 16:17:01 +0200 Subject: [PATCH 10/24] dev.1, changelog, translation --- CHANGELOG_LATEST.md | 2 ++ src/core/locale_translations.h | 6 +++--- src/emsesp_version.h | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index 4486f38ca..72ee17c05 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -8,4 +8,6 @@ For more details go to [emsesp.org](https://emsesp.org/). ## Fixed +- signed value for solarInfuence [#3077](https://github.com/emsesp/EMS-ESP32/issues/3077) + ## Changed diff --git a/src/core/locale_translations.h b/src/core/locale_translations.h index 110238bfc..e59e4ae2f 100644 --- a/src/core/locale_translations.h +++ b/src/core/locale_translations.h @@ -292,7 +292,7 @@ MAKE_WORD_TRANSLATION(curve, "heatingcurve", "Heizkurve", "stookkromme", "värme MAKE_WORD_TRANSLATION(radiator, "radiator", "Heizkörper", "radiator", "Radiator", "grzejniki", "radiator", "radiateur", "radyatör", "radiatore", "radiátor", "radiátor") MAKE_WORD_TRANSLATION(convector, "convector", "Konvektor", "convector", "Konvektor", "konwektory", "konvektor", "convecteur", "convector", "convettore", "konvektor", "konvektor") MAKE_WORD_TRANSLATION(floor, "floor", "Fussboden", "vloer", "Golv", "podłoga", "gulv", "sol", "yer", "pavimento", "podlaha", "podlaha") -MAKE_WORD_TRANSLATION(roomflow, "roomflow", "Raum Fluß", "kamer doorstroming", "Rumsflöde", "przepływ w pomieszczeniu", "romstrøm", "flux de la pièce", "oda akışı", "flusso della stanza", "prúdenie miestnosti", "průtok mistnosti") +MAKE_WORD_TRANSLATION(roomflow, "roomflow", "Raum Fluss", "kamer doorstroming", "Rumsflöde", "przepływ w pomieszczeniu", "romstrøm", "flux de la pièce", "oda akışı", "flusso della stanza", "prúdenie miestnosti", "průtok mistnosti") MAKE_WORD_TRANSLATION(roomload, "roomload", "Raum Bedarf", "kamer behoefte", "Rumsbehov", "zapotrzebowanie pomieszczenia", "rombelastning", "charge de la pièce", "oda yükü", "carico della stanza", "izbová zaťaž", "zatížení místnosti") MAKE_WORD_TRANSLATION(summer, "summer", "Sommer", "zomer", "Sommar", "lato", "sommer", "été", "yaz", "estate", "leto", "léto") MAKE_WORD_TRANSLATION(winter, "winter", "Winter", "winter", "Vinter", "zima", "vinter", "hiver", "kış", "inverno", "zima", "zima") @@ -826,8 +826,8 @@ MAKE_TRANSLATION(vacations7, "vacations7", "vacation dates 7", "Urlaubstage 7", MAKE_TRANSLATION(vacations8, "vacations8", "vacation dates 8", "Urlaubstage 8", "Vakantiedagen 8", "Semesterdatum 8", "urlop 8", "feriedager 8", "dates vacances 8", "izin günleri 8", "date vacanze 8", "termíny dovolenky 8", "data prázdnin 8") MAKE_TRANSLATION(absent, "absent", "absent", "Abwesend", "", "Frånvarande", "", "", "", "", "", "chýbajúci", "chybějící") MAKE_TRANSLATION(redthreshold, "redthreshold", "reduction threshold", "Absenkschwelle", "", "Tröskel för sänkning", "", "", "", "", "", "zníženie tresholdu", "práh snížení") -MAKE_TRANSLATION(solarinfl, "solarinfl", "solar influence", "Solareinfluß", "", "", "", "", "", "", "", "slnečný vplyv", "sluneční vliv") -MAKE_TRANSLATION(currsolarinfl, "currsolarinfl", "current solar influence", "akt. Solareinfluß", "", "", "", "", "", "", "", "aktuálny slnečný vplyv", "aktuální sluneční vliv") +MAKE_TRANSLATION(solarinfl, "solarinfl", "solar influence", "Solareinfluss", "", "", "", "", "", "", "", "slnečný vplyv", "sluneční vliv") +MAKE_TRANSLATION(currsolarinfl, "currsolarinfl", "current solar influence", "akt. Solareinfluss", "", "", "", "", "", "", "", "aktuálny slnečný vplyv", "aktuální sluneční vliv") MAKE_TRANSLATION(hpmode, "hpmode", "HP Mode", "WP-Modus", "Modus warmtepomp", "Värmepumpsläge", "tryb pracy pompy ciepła", "", "", "yüksek güç modu", "Modalità Termopompa", "Režim TČ", "režim tepelného čerpadla") MAKE_TRANSLATION(dewoffset, "dewoffset", "dew point offset", "Taupunktdifferenz", "Offset dauwpunt", "Daggpunktsförskjutning", "przesunięcie punktu rosy", "", "", "çiğ noktası göreli", "differenza del punto di rugiada", "posun rosného bodu", "offset rosného bodu") MAKE_TRANSLATION(roomtempdiff, "roomtempdiff", "room temp difference", "Raumtemperaturdifferenz", "Verschiltemperatuur kamertemp", "Rumstemperaturskillnad", "różnica temp. pomieszczenia", "", "", "oda sıcaklığı farkı", "differenza temperatura ambiente", "rozdiel izbovej teploty", "rozdíl teploty místnosti") diff --git a/src/emsesp_version.h b/src/emsesp_version.h index e5e620e8d..62ba7a40a 100644 --- a/src/emsesp_version.h +++ b/src/emsesp_version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.8.3-dev.0" +#define EMSESP_APP_VERSION "3.8.3-dev.1" From 6e0530c84c7167ad0b343a2a8efff583a6fc8463 Mon Sep 17 00:00:00 2001 From: MichaelDvP <59284019+MichaelDvP@users.noreply.github.com> Date: Thu, 14 May 2026 10:46:32 +0200 Subject: [PATCH 11/24] max limit is uint32 --- src/devices/thermostat.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index ce9ae6e83..7446acb2b 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -5037,7 +5037,7 @@ void Thermostat::register_device_values_hc(std::shared_ptrsolarInfl, DeviceValueType::INT8, FL_(solarinfl), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_solarinfl), -5, -1); + register_device_value(tag, &hc->solarInfl, DeviceValueType::INT8, FL_(solarinfl), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_solarinfl), -5, 0); register_device_value(tag, &hc->currSolarInfl, DeviceValueType::INT8, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(currsolarinfl), DeviceValueUOM::DEGREES); register_device_value(tag, &hc->heatingpid, DeviceValueType::ENUM, FL_(enum_PID), FL_(heatingPID), DeviceValueUOM::NONE, MAKE_CF_CB(set_heatingpid)); register_device_value(tag, &hc->pumpopt, DeviceValueType::BOOL, FL_(pumpopt), DeviceValueUOM::NONE, MAKE_CF_CB(set_pumpopt)); From 690cb9df968ac9b55ccc93552f8f1455be103c01 Mon Sep 17 00:00:00 2001 From: proddy <1230712+proddy@users.noreply.github.com> Date: Thu, 14 May 2026 10:25:26 +0000 Subject: [PATCH 12/24] chore: update generated files for v3.8.3-dev.1 --- docs/Modbus-Entity-Registers.md | 10 +++++----- docs/dump_entities.csv | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/Modbus-Entity-Registers.md b/docs/Modbus-Entity-Registers.md index 8c2583221..bdb04eb14 100644 --- a/docs/Modbus-Entity-Registers.md +++ b/docs/Modbus-Entity-Registers.md @@ -5377,7 +5377,7 @@ uint8 int8 | hc1.redthreshold | reduction threshold | int8 (>=12<=22) | C | true | HC | 56 | 1 | 1/2 | int8 -| hc1.solarinfl | solar influence | int8 (>=-5<=4294967295) | C | true | HC | 57 | 1 | 1 | +| hc1.solarinfl | solar influence | int8 (>=-5<=0) | C | true | HC | 57 | 1 | 1 | | hc1.currsolarinfl | current solar influence | int8 | C | false | HC | 58 | 1 | 1/10 | | hc1.heatingpid | heating PID | enum | | true | HC | 59 | 1 | 1 | | hc1.pumpopt | pump optimization | boolean | | true | HC | 60 | 1 | 1 | @@ -5986,7 +5986,7 @@ uint8 int8 | hc1.redthreshold | reduction threshold | int8 (>=12<=22) | C | true | HC | 56 | 1 | 1/2 | int8 -| hc1.solarinfl | solar influence | int8 (>=-5<=4294967295) | C | true | HC | 57 | 1 | 1 | +| hc1.solarinfl | solar influence | int8 (>=-5<=0) | C | true | HC | 57 | 1 | 1 | | hc1.currsolarinfl | current solar influence | int8 | C | false | HC | 58 | 1 | 1/10 | | hc1.heatingpid | heating PID | enum | | true | HC | 59 | 1 | 1 | | hc1.pumpopt | pump optimization | boolean | | true | HC | 60 | 1 | 1 | @@ -6138,7 +6138,7 @@ uint8 int8 | hc1.redthreshold | reduction threshold | int8 (>=12<=22) | C | true | HC | 56 | 1 | 1/2 | int8 -| hc1.solarinfl | solar influence | int8 (>=-5<=4294967295) | C | true | HC | 57 | 1 | 1 | +| hc1.solarinfl | solar influence | int8 (>=-5<=0) | C | true | HC | 57 | 1 | 1 | | hc1.currsolarinfl | current solar influence | int8 | C | false | HC | 58 | 1 | 1/10 | | hc1.heatingpid | heating PID | enum | | true | HC | 59 | 1 | 1 | | hc1.pumpopt | pump optimization | boolean | | true | HC | 60 | 1 | 1 | @@ -6305,7 +6305,7 @@ uint8 int8 | hc1.redthreshold | reduction threshold | int8 (>=12<=22) | C | true | HC | 56 | 1 | 1/2 | int8 -| hc1.solarinfl | solar influence | int8 (>=-5<=4294967295) | C | true | HC | 57 | 1 | 1 | +| hc1.solarinfl | solar influence | int8 (>=-5<=0) | C | true | HC | 57 | 1 | 1 | | hc1.currsolarinfl | current solar influence | int8 | C | false | HC | 58 | 1 | 1/10 | | hc1.heatingpid | heating PID | enum | | true | HC | 59 | 1 | 1 | | hc1.pumpopt | pump optimization | boolean | | true | HC | 60 | 1 | 1 | @@ -6499,7 +6499,7 @@ uint8 int8 | hc1.redthreshold | reduction threshold | int8 (>=12<=22) | C | true | HC | 56 | 1 | 1/2 | int8 -| hc1.solarinfl | solar influence | int8 (>=-5<=4294967295) | C | true | HC | 57 | 1 | 1 | +| hc1.solarinfl | solar influence | int8 (>=-5<=0) | C | true | HC | 57 | 1 | 1 | | hc1.currsolarinfl | current solar influence | int8 | C | false | HC | 58 | 1 | 1/10 | | hc1.heatingpid | heating PID | enum | | true | HC | 59 | 1 | 1 | | hc1.pumpopt | pump optimization | boolean | | true | HC | 60 | 1 | 1 | diff --git a/docs/dump_entities.csv b/docs/dump_entities.csv index a83d1c3a2..7760b34d5 100644 --- a/docs/dump_entities.csv +++ b/docs/dump_entities.csv @@ -4057,7 +4057,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/ "UI800, BC400",thermostat,4,hc1.cooloffdelay,cooling off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_off_delay,number.thermostat_hc1_cooloffdelay,6,1,1,54,1 "UI800, BC400",thermostat,4,hc1.switchprogmode,switch program mode,enum [level\|absolute] (>=0<=0), ,true,select.thermostat_hc1_switch_program_mode,select.thermostat_hc1_switchprogmode,6,1,1,55,1 "UI800, BC400",thermostat,4,hc1.redthreshold,reduction threshold,int8 (>=12<=22),C,true,number.thermostat_hc1_reduction_threshold,number.thermostat_hc1_redthreshold,6,1,1/2,56,1 -"UI800, BC400",thermostat,4,hc1.solarinfl,solar influence,int8 (>=-5<=4294967295),C,true,number.thermostat_hc1_solar_influence,number.thermostat_hc1_solarinfl,6,1,1,57,1 +"UI800, BC400",thermostat,4,hc1.solarinfl,solar influence,int8 (>=-5<=0),C,true,number.thermostat_hc1_solar_influence,number.thermostat_hc1_solarinfl,6,1,1,57,1 "UI800, BC400",thermostat,4,hc1.currsolarinfl,current solar influence,int8,C,false,sensor.thermostat_hc1_current_solar_influence,sensor.thermostat_hc1_currsolarinfl,6,1,1/10,58,1 "UI800, BC400",thermostat,4,hc1.heatingpid,heating PID,enum [fast\|medium\|slow] (>=0<=0), ,true,select.thermostat_hc1_heating_PID,select.thermostat_hc1_heatingpid,6,1,1,59,1 "UI800, BC400",thermostat,4,hc1.pumpopt,pump optimization,boolean (>=0<=0), ,true,switch.thermostat_hc1_pump_optimization,switch.thermostat_hc1_pumpopt,6,1,1,60,1 @@ -4447,7 +4447,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/ "RC200, CW100, CR120, CR50",thermostat,157,hc1.cooloffdelay,cooling off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_off_delay,number.thermostat_hc1_cooloffdelay,6,1,1,54,1 "RC200, CW100, CR120, CR50",thermostat,157,hc1.switchprogmode,switch program mode,enum [level\|absolute] (>=0<=0), ,true,select.thermostat_hc1_switch_program_mode,select.thermostat_hc1_switchprogmode,6,1,1,55,1 "RC200, CW100, CR120, CR50",thermostat,157,hc1.redthreshold,reduction threshold,int8 (>=12<=22),C,true,number.thermostat_hc1_reduction_threshold,number.thermostat_hc1_redthreshold,6,1,1/2,56,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.solarinfl,solar influence,int8 (>=-5<=4294967295),C,true,number.thermostat_hc1_solar_influence,number.thermostat_hc1_solarinfl,6,1,1,57,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.solarinfl,solar influence,int8 (>=-5<=0),C,true,number.thermostat_hc1_solar_influence,number.thermostat_hc1_solarinfl,6,1,1,57,1 "RC200, CW100, CR120, CR50",thermostat,157,hc1.currsolarinfl,current solar influence,int8,C,false,sensor.thermostat_hc1_current_solar_influence,sensor.thermostat_hc1_currsolarinfl,6,1,1/10,58,1 "RC200, CW100, CR120, CR50",thermostat,157,hc1.heatingpid,heating PID,enum [fast\|medium\|slow] (>=0<=0), ,true,select.thermostat_hc1_heating_PID,select.thermostat_hc1_heatingpid,6,1,1,59,1 "RC200, CW100, CR120, CR50",thermostat,157,hc1.pumpopt,pump optimization,boolean (>=0<=0), ,true,switch.thermostat_hc1_pump_optimization,switch.thermostat_hc1_pumpopt,6,1,1,60,1 @@ -4545,7 +4545,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/ "RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.cooloffdelay,cooling off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_off_delay,number.thermostat_hc1_cooloffdelay,6,1,1,54,1 "RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.switchprogmode,switch program mode,enum [level\|absolute] (>=0<=0), ,true,select.thermostat_hc1_switch_program_mode,select.thermostat_hc1_switchprogmode,6,1,1,55,1 "RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.redthreshold,reduction threshold,int8 (>=12<=22),C,true,number.thermostat_hc1_reduction_threshold,number.thermostat_hc1_redthreshold,6,1,1/2,56,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.solarinfl,solar influence,int8 (>=-5<=4294967295),C,true,number.thermostat_hc1_solar_influence,number.thermostat_hc1_solarinfl,6,1,1,57,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.solarinfl,solar influence,int8 (>=-5<=0),C,true,number.thermostat_hc1_solar_influence,number.thermostat_hc1_solarinfl,6,1,1,57,1 "RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.currsolarinfl,current solar influence,int8,C,false,sensor.thermostat_hc1_current_solar_influence,sensor.thermostat_hc1_currsolarinfl,6,1,1/10,58,1 "RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.heatingpid,heating PID,enum [fast\|medium\|slow] (>=0<=0), ,true,select.thermostat_hc1_heating_PID,select.thermostat_hc1_heatingpid,6,1,1,59,1 "RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.pumpopt,pump optimization,boolean (>=0<=0), ,true,switch.thermostat_hc1_pump_optimization,switch.thermostat_hc1_pumpopt,6,1,1,60,1 @@ -4652,7 +4652,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/ "Rego 2000/3000",thermostat,172,hc1.cooloffdelay,cooling off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_off_delay,number.thermostat_hc1_cooloffdelay,6,1,1,54,1 "Rego 2000/3000",thermostat,172,hc1.switchprogmode,switch program mode,enum [level\|absolute] (>=0<=0), ,true,select.thermostat_hc1_switch_program_mode,select.thermostat_hc1_switchprogmode,6,1,1,55,1 "Rego 2000/3000",thermostat,172,hc1.redthreshold,reduction threshold,int8 (>=12<=22),C,true,number.thermostat_hc1_reduction_threshold,number.thermostat_hc1_redthreshold,6,1,1/2,56,1 -"Rego 2000/3000",thermostat,172,hc1.solarinfl,solar influence,int8 (>=-5<=4294967295),C,true,number.thermostat_hc1_solar_influence,number.thermostat_hc1_solarinfl,6,1,1,57,1 +"Rego 2000/3000",thermostat,172,hc1.solarinfl,solar influence,int8 (>=-5<=0),C,true,number.thermostat_hc1_solar_influence,number.thermostat_hc1_solarinfl,6,1,1,57,1 "Rego 2000/3000",thermostat,172,hc1.currsolarinfl,current solar influence,int8,C,false,sensor.thermostat_hc1_current_solar_influence,sensor.thermostat_hc1_currsolarinfl,6,1,1/10,58,1 "Rego 2000/3000",thermostat,172,hc1.heatingpid,heating PID,enum [fast\|medium\|slow] (>=0<=0), ,true,select.thermostat_hc1_heating_PID,select.thermostat_hc1_heatingpid,6,1,1,59,1 "Rego 2000/3000",thermostat,172,hc1.pumpopt,pump optimization,boolean (>=0<=0), ,true,switch.thermostat_hc1_pump_optimization,switch.thermostat_hc1_pumpopt,6,1,1,60,1 @@ -4777,7 +4777,7 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/ "Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.cooloffdelay,cooling off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_off_delay,number.thermostat_hc1_cooloffdelay,6,1,1,54,1 "Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.switchprogmode,switch program mode,enum [level\|absolute] (>=0<=0), ,true,select.thermostat_hc1_switch_program_mode,select.thermostat_hc1_switchprogmode,6,1,1,55,1 "Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.redthreshold,reduction threshold,int8 (>=12<=22),C,true,number.thermostat_hc1_reduction_threshold,number.thermostat_hc1_redthreshold,6,1,1/2,56,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.solarinfl,solar influence,int8 (>=-5<=4294967295),C,true,number.thermostat_hc1_solar_influence,number.thermostat_hc1_solarinfl,6,1,1,57,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.solarinfl,solar influence,int8 (>=-5<=0),C,true,number.thermostat_hc1_solar_influence,number.thermostat_hc1_solarinfl,6,1,1,57,1 "Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.currsolarinfl,current solar influence,int8,C,false,sensor.thermostat_hc1_current_solar_influence,sensor.thermostat_hc1_currsolarinfl,6,1,1/10,58,1 "Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.heatingpid,heating PID,enum [fast\|medium\|slow] (>=0<=0), ,true,select.thermostat_hc1_heating_PID,select.thermostat_hc1_heatingpid,6,1,1,59,1 "Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.pumpopt,pump optimization,boolean (>=0<=0), ,true,switch.thermostat_hc1_pump_optimization,switch.thermostat_hc1_pumpopt,6,1,1,60,1 From 0892738cd9c4f91efee382e0e7225a8e90889efb Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 18 May 2026 07:55:07 +0200 Subject: [PATCH 13/24] add KM300 #3084 --- CHANGELOG_LATEST.md | 2 ++ src/core/device_library.h | 5 +++-- src/emsesp_version.h | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index 72ee17c05..434fa21d7 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -6,6 +6,8 @@ For more details go to [emsesp.org](https://emsesp.org/). ## Added +- KM300 at address 0x4A [#3084](https://github.com/emsesp/EMS-ESP32/issues/3084) + ## Fixed - signed value for solarInfuence [#3077](https://github.com/emsesp/EMS-ESP32/issues/3077) diff --git a/src/core/device_library.h b/src/core/device_library.h index 2c291488c..4d5fee12c 100644 --- a/src/core/device_library.h +++ b/src/core/device_library.h @@ -187,8 +187,9 @@ { 74, DeviceType::ALERT, "EM10", DeviceFlags::EMS_DEVICE_FLAG_NONE}, // Gateways - 0x48 -{17, DeviceType::GATEWAY, "MX400", DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x48 and 0x4B -{189, DeviceType::GATEWAY, "KM200, MB LAN 2", DeviceFlags::EMS_DEVICE_FLAG_NONE}, +{17, DeviceType::GATEWAY, "MX400", DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x48, 0x4B, or 0x50 as wireless base +{189, DeviceType::GATEWAY, "KM200, MB LAN 2", DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x48 +{222, DeviceType::GATEWAY, "KM300,", DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x4A {252, DeviceType::GATEWAY, "K30RF, MX300", DeviceFlags::EMS_DEVICE_FLAG_NONE}, // Generic - 0x40 or other with no product-id and no version diff --git a/src/emsesp_version.h b/src/emsesp_version.h index 62ba7a40a..626543ebd 100644 --- a/src/emsesp_version.h +++ b/src/emsesp_version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.8.3-dev.1" +#define EMSESP_APP_VERSION "3.8.3-dev.2" From 0dacd2c71f5051744fd31e44cb520c1cb53e1b6e Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 18 May 2026 20:55:57 +0200 Subject: [PATCH 14/24] don't allocate ariable size on stack --- src/core/telegram.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/core/telegram.cpp b/src/core/telegram.cpp index 9317882c9..a52e858e4 100644 --- a/src/core/telegram.cpp +++ b/src/core/telegram.cpp @@ -572,12 +572,11 @@ bool TxService::send_raw(const char * telegram_data) { return false; } - // since the telegram data is a const, make a copy. add 1 to grab the \0 EOS - char telegram[strlen(telegram_data) + 1]; - strlcpy(telegram, telegram_data, sizeof(telegram)); + // since the telegram data is a const, make a copy + char * telegram = strdup(telegram_data); uint8_t count = 0; - uint8_t data[2 + strlen(telegram) / 3]; + uint8_t data[256]; // max raw telegram length // get values char * p = strtok(telegram, " ,"); // delimiter @@ -585,7 +584,7 @@ bool TxService::send_raw(const char * telegram_data) { data[count++] = (uint8_t)strtol(p, 0, 16); p = strtok(nullptr, " ,"); } - + free(telegram); // check valid length if (count < 4) { return false; From d1192e707d71de2db553e261818e3f1c5db8494b Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Tue, 19 May 2026 22:13:14 +0200 Subject: [PATCH 15/24] set upload file limit to 1M again --- src/ESP32React/UploadFileService.cpp | 2 +- src/emsesp_version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ESP32React/UploadFileService.cpp b/src/ESP32React/UploadFileService.cpp index d600569b6..88786b739 100644 --- a/src/ESP32React/UploadFileService.cpp +++ b/src/ESP32React/UploadFileService.cpp @@ -48,7 +48,7 @@ void UploadFileService::handleUpload(AsyncWebServerRequest * request, const Stri // LittleFS filesystem image _is_filesystem = true; _md5[0] = '\0'; // clear any stale md5 so Update.end() doesn't compare against it - } else if ((extension == "bin") && (filesize > 2000000)) { + } else if ((extension == "bin") && (filesize > 1000000)) { _is_firmware = true; } else if (extension == "json") { _md5[0] = '\0'; // clear md5 diff --git a/src/emsesp_version.h b/src/emsesp_version.h index 626543ebd..99a25d00d 100644 --- a/src/emsesp_version.h +++ b/src/emsesp_version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.8.3-dev.2" +#define EMSESP_APP_VERSION "3.8.3-dev.3" From d5c96f6d48b8140610573793a9155a0484f928ef Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Tue, 19 May 2026 22:13:30 +0200 Subject: [PATCH 16/24] changelog --- CHANGELOG_LATEST.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index 434fa21d7..9168f2211 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -11,5 +11,6 @@ For more details go to [emsesp.org](https://emsesp.org/). ## Fixed - signed value for solarInfuence [#3077](https://github.com/emsesp/EMS-ESP32/issues/3077) +- set bin file upload limit to 1M again [3086](https://github.com/emsesp/EMS-ESP32/issues/3086) ## Changed From 3d335dad271f233abfad915fb6017c7068251f17 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 25 May 2026 09:00:58 +0200 Subject: [PATCH 17/24] remove trailing comma --- src/core/device_library.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/device_library.h b/src/core/device_library.h index 4d5fee12c..a225998e1 100644 --- a/src/core/device_library.h +++ b/src/core/device_library.h @@ -189,7 +189,7 @@ // Gateways - 0x48 {17, DeviceType::GATEWAY, "MX400", DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x48, 0x4B, or 0x50 as wireless base {189, DeviceType::GATEWAY, "KM200, MB LAN 2", DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x48 -{222, DeviceType::GATEWAY, "KM300,", DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x4A +{222, DeviceType::GATEWAY, "KM300", DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x4A {252, DeviceType::GATEWAY, "K30RF, MX300", DeviceFlags::EMS_DEVICE_FLAG_NONE}, // Generic - 0x40 or other with no product-id and no version From c206f069c62bbe0d36e25e7d45718e008d28b723 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 25 May 2026 11:11:05 +0200 Subject: [PATCH 18/24] heating/cooling delays, #3096 --- src/core/emsdevicevalue.h | 1 + src/devices/thermostat.cpp | 32 ++++++++++++++++---------------- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/core/emsdevicevalue.h b/src/core/emsdevicevalue.h index efa9935f8..83763d947 100644 --- a/src/core/emsdevicevalue.h +++ b/src/core/emsdevicevalue.h @@ -158,6 +158,7 @@ class DeviceValue { enum DeviceValueNumOp : int8_t { DV_NUMOP_NONE = 0, // default DV_NUMOP_DIV2 = 2, + DV_NUMOP_DIV4 = 4, DV_NUMOP_DIV10 = 10, DV_NUMOP_DIV60 = 60, DV_NUMOP_DIV100 = 100, diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index 7446acb2b..e67c10266 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -2595,11 +2595,11 @@ bool Thermostat::set_coolondelay(const char * value, const int8_t id) { return false; } - int v; - if (!Helpers::value2number(value, v)) { + float f; + if (!Helpers::value2float(value, f)) { return false; } - write_command(summer2_typeids[hc->hc()], 6, v, summer2_typeids[hc->hc()]); + write_command(summer2_typeids[hc->hc()], 6, (uint8_t)(f * 4), summer2_typeids[hc->hc()]); return true; } @@ -2609,11 +2609,11 @@ bool Thermostat::set_cooloffdelay(const char * value, const int8_t id) { return false; } - int v; - if (!Helpers::value2number(value, v)) { + float f; + if (!Helpers::value2float(value, f)) { return false; } - write_command(summer2_typeids[hc->hc()], 7, v, summer2_typeids[hc->hc()]); + write_command(summer2_typeids[hc->hc()], 7, (uint8_t)(f * 4), summer2_typeids[hc->hc()]); return true; } @@ -3491,11 +3491,11 @@ bool Thermostat::set_heatondelay(const char * value, const int8_t id) { if (hc == nullptr) { return false; } - int v; - if (!Helpers::value2number(value, v)) { + float f; + if (!Helpers::value2float(value, f)) { return false; } - write_command(summer2_typeids[hc->hc()], 2, (uint8_t)v, summer2_typeids[hc->hc()]); + write_command(summer2_typeids[hc->hc()], 2, (uint8_t)(f * 4), summer2_typeids[hc->hc()]); return true; } @@ -3504,11 +3504,11 @@ bool Thermostat::set_heatoffdelay(const char * value, const int8_t id) { if (hc == nullptr) { return false; } - int v; - if (!Helpers::value2number(value, v)) { + float f; + if (!Helpers::value2float(value, f)) { return false; } - write_command(summer2_typeids[hc->hc()], 3, (uint8_t)v, summer2_typeids[hc->hc()]); + write_command(summer2_typeids[hc->hc()], 3, (uint8_t)(f * 4), summer2_typeids[hc->hc()]); return true; } @@ -5012,14 +5012,14 @@ void Thermostat::register_device_values_hc(std::shared_ptrremotehum, DeviceValueType::CMD, FL_(remotehum), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_remotehum), -1, 101); } - register_device_value(tag, &hc->heatondelay, DeviceValueType::UINT8, FL_(heatondelay), DeviceValueUOM::HOURS, MAKE_CF_CB(set_heatondelay), 1, 48); - register_device_value(tag, &hc->heatoffdelay, DeviceValueType::UINT8, FL_(heatoffdelay), DeviceValueUOM::HOURS, MAKE_CF_CB(set_heatoffdelay), 1, 48); + register_device_value(tag, &hc->heatondelay, DeviceValueType::UINT8, DeviceValueNumOp::DV_NUMOP_DIV4, FL_(heatondelay), DeviceValueUOM::HOURS, MAKE_CF_CB(set_heatondelay), 1, 48); + register_device_value(tag, &hc->heatoffdelay, DeviceValueType::UINT8, DeviceValueNumOp::DV_NUMOP_DIV4, FL_(heatoffdelay), DeviceValueUOM::HOURS, MAKE_CF_CB(set_heatoffdelay), 1, 48); register_device_value(tag, &hc->instantstart, DeviceValueType::UINT8, FL_(instantstart), DeviceValueUOM::K, MAKE_CF_CB(set_instantstart), 1, 10); register_device_value(tag, &hc->boost, DeviceValueType::BOOL, FL_(boost), DeviceValueUOM::NONE, MAKE_CF_CB(set_boost)); register_device_value(tag, &hc->boosttime, DeviceValueType::UINT8, FL_(boosttime), DeviceValueUOM::HOURS, MAKE_CF_CB(set_boosttime)); register_device_value(tag, &hc->coolstart, DeviceValueType::UINT8, FL_(coolstart), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_coolstart), 20, 35); - register_device_value(tag, &hc->coolondelay, DeviceValueType::UINT8, FL_(coolondelay), DeviceValueUOM::HOURS, MAKE_CF_CB(set_coolondelay), 1, 48); - register_device_value(tag, &hc->cooloffdelay, DeviceValueType::UINT8, FL_(cooloffdelay), DeviceValueUOM::HOURS, MAKE_CF_CB(set_cooloffdelay), 1, 48); + register_device_value(tag, &hc->coolondelay, DeviceValueType::UINT8, DeviceValueNumOp::DV_NUMOP_DIV4,FL_(coolondelay), DeviceValueUOM::HOURS, MAKE_CF_CB(set_coolondelay), 1, 48); + register_device_value(tag, &hc->cooloffdelay, DeviceValueType::UINT8, DeviceValueNumOp::DV_NUMOP_DIV4, FL_(cooloffdelay), DeviceValueUOM::HOURS, MAKE_CF_CB(set_cooloffdelay), 1, 48); register_device_value(tag, &hc->switchProgMode, DeviceValueType::ENUM, From f5bc3e82bbc9d280c6089ac78ba8a0416b5a998e Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 25 May 2026 11:11:30 +0200 Subject: [PATCH 19/24] formatting --- src/devices/thermostat.cpp | 40 ++++++++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index e67c10266..4a7cf74cc 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -5012,14 +5012,46 @@ void Thermostat::register_device_values_hc(std::shared_ptrremotehum, DeviceValueType::CMD, FL_(remotehum), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_remotehum), -1, 101); } - register_device_value(tag, &hc->heatondelay, DeviceValueType::UINT8, DeviceValueNumOp::DV_NUMOP_DIV4, FL_(heatondelay), DeviceValueUOM::HOURS, MAKE_CF_CB(set_heatondelay), 1, 48); - register_device_value(tag, &hc->heatoffdelay, DeviceValueType::UINT8, DeviceValueNumOp::DV_NUMOP_DIV4, FL_(heatoffdelay), DeviceValueUOM::HOURS, MAKE_CF_CB(set_heatoffdelay), 1, 48); + register_device_value(tag, + &hc->heatondelay, + DeviceValueType::UINT8, + DeviceValueNumOp::DV_NUMOP_DIV4, + FL_(heatondelay), + DeviceValueUOM::HOURS, + MAKE_CF_CB(set_heatondelay), + 1, + 48); + register_device_value(tag, + &hc->heatoffdelay, + DeviceValueType::UINT8, + DeviceValueNumOp::DV_NUMOP_DIV4, + FL_(heatoffdelay), + DeviceValueUOM::HOURS, + MAKE_CF_CB(set_heatoffdelay), + 1, + 48); register_device_value(tag, &hc->instantstart, DeviceValueType::UINT8, FL_(instantstart), DeviceValueUOM::K, MAKE_CF_CB(set_instantstart), 1, 10); register_device_value(tag, &hc->boost, DeviceValueType::BOOL, FL_(boost), DeviceValueUOM::NONE, MAKE_CF_CB(set_boost)); register_device_value(tag, &hc->boosttime, DeviceValueType::UINT8, FL_(boosttime), DeviceValueUOM::HOURS, MAKE_CF_CB(set_boosttime)); register_device_value(tag, &hc->coolstart, DeviceValueType::UINT8, FL_(coolstart), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_coolstart), 20, 35); - register_device_value(tag, &hc->coolondelay, DeviceValueType::UINT8, DeviceValueNumOp::DV_NUMOP_DIV4,FL_(coolondelay), DeviceValueUOM::HOURS, MAKE_CF_CB(set_coolondelay), 1, 48); - register_device_value(tag, &hc->cooloffdelay, DeviceValueType::UINT8, DeviceValueNumOp::DV_NUMOP_DIV4, FL_(cooloffdelay), DeviceValueUOM::HOURS, MAKE_CF_CB(set_cooloffdelay), 1, 48); + register_device_value(tag, + &hc->coolondelay, + DeviceValueType::UINT8, + DeviceValueNumOp::DV_NUMOP_DIV4, + FL_(coolondelay), + DeviceValueUOM::HOURS, + MAKE_CF_CB(set_coolondelay), + 1, + 48); + register_device_value(tag, + &hc->cooloffdelay, + DeviceValueType::UINT8, + DeviceValueNumOp::DV_NUMOP_DIV4, + FL_(cooloffdelay), + DeviceValueUOM::HOURS, + MAKE_CF_CB(set_cooloffdelay), + 1, + 48); register_device_value(tag, &hc->switchProgMode, DeviceValueType::ENUM, From 88f75038e03c230e805dd3cba19d2eac34fb63fe Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 25 May 2026 11:12:07 +0200 Subject: [PATCH 20/24] allow txmode 0, show expected crc --- interface/src/app/settings/ApplicationSettings.tsx | 1 + src/core/telegram.cpp | 4 ++-- src/emsesp_version.h | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/interface/src/app/settings/ApplicationSettings.tsx b/interface/src/app/settings/ApplicationSettings.tsx index 8e8e90ab7..875247885 100644 --- a/interface/src/app/settings/ApplicationSettings.tsx +++ b/interface/src/app/settings/ApplicationSettings.tsx @@ -673,6 +673,7 @@ const ApplicationSettings = () => { sx={{ width: '15ch' }} select > + {LL.OFF()} EMS EMS+ HT3 diff --git a/src/core/telegram.cpp b/src/core/telegram.cpp index a52e858e4..c16b2c5cb 100644 --- a/src/core/telegram.cpp +++ b/src/core/telegram.cpp @@ -161,9 +161,9 @@ void RxService::add(uint8_t * data, uint8_t length) { } if (data[0] != EMSuart::last_tx_src()) { // do not count echos as errors telegram_error_count_++; - LOG_WARNING("Incomplete Rx: %s", Helpers::data_to_hex(data, length).c_str()); // include CRC + LOG_WARNING("Incomplete Rx: %s (crc: %02X)", Helpers::data_to_hex(data, length).c_str(), crc); // include CRC } else { - LOG_TRACE("Incomplete Rx: %s", Helpers::data_to_hex(data, length).c_str()); // include CRC + LOG_TRACE("Incomplete Rx: %s (crc: %02X)", Helpers::data_to_hex(data, length).c_str(), crc); // include CRC } return; } diff --git a/src/emsesp_version.h b/src/emsesp_version.h index 99a25d00d..0958eb06d 100644 --- a/src/emsesp_version.h +++ b/src/emsesp_version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.8.3-dev.3" +#define EMSESP_APP_VERSION "3.8.3-dev.4" From 6dc80721065c5403fd0f71fcacbfce3c3558e7ad Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 25 May 2026 16:46:01 +0200 Subject: [PATCH 21/24] FLAG UI800, no poll-ack on id 0x0D --- interface/pnpm-workspace.yaml | 25 ++++++++ src/core/device_library.h | 2 +- src/core/emsdevice.h | 1 + src/core/locale_common.h | 7 ++- src/core/telegram.cpp | 2 +- src/devices/thermostat.cpp | 108 ++++++++++++++++++++++++---------- src/devices/thermostat.h | 2 +- src/emsesp_version.h | 2 +- 8 files changed, 114 insertions(+), 35 deletions(-) diff --git a/interface/pnpm-workspace.yaml b/interface/pnpm-workspace.yaml index 1b81f607b..514f0380e 100644 --- a/interface/pnpm-workspace.yaml +++ b/interface/pnpm-workspace.yaml @@ -1,3 +1,28 @@ +allowBuilds: + cwebp-bin: set this to true or false + esbuild: set this to true or false + gifsicle: set this to true or false + jpegtran-bin: set this to true or false + mozjpeg: set this to true or false + optipng-bin: set this to true or false + pngquant-bin: set this to true or false +minimumReleaseAgeExclude: + - '@babel/code-frame@7.29.7' + - '@babel/compat-data@7.29.7' + - '@babel/core@7.29.7' + - '@babel/generator@7.29.7' + - '@babel/helper-compilation-targets@7.29.7' + - '@babel/helper-globals@7.29.7' + - '@babel/helper-module-imports@7.29.7' + - '@babel/helper-module-transforms@7.29.7' + - '@babel/helper-string-parser@7.29.7' + - '@babel/helper-validator-identifier@7.29.7' + - '@babel/helper-validator-option@7.29.7' + - '@babel/helpers@7.29.7' + - '@babel/parser@7.29.7' + - '@babel/template@7.29.7' + - '@babel/traverse@7.29.7' + - '@babel/types@7.29.7' onlyBuiltDependencies: - cwebp-bin - esbuild diff --git a/src/core/device_library.h b/src/core/device_library.h index a225998e1..0c28cddf2 100644 --- a/src/core/device_library.h +++ b/src/core/device_library.h @@ -105,7 +105,7 @@ {215, DeviceType::THERMOSTAT, "Comfort RF", DeviceFlags::EMS_DEVICE_FLAG_CRF | DeviceFlags::EMS_DEVICE_FLAG_NO_WRITE}, // 0x18 {216, DeviceType::THERMOSTAT, "CRF200S", DeviceFlags::EMS_DEVICE_FLAG_CRF | DeviceFlags::EMS_DEVICE_FLAG_NO_WRITE}, // 0x18 {246, DeviceType::THERMOSTAT, "Comfort+2RF", DeviceFlags::EMS_DEVICE_FLAG_CRF | DeviceFlags::EMS_DEVICE_FLAG_NO_WRITE}, // 0x18 -{253, DeviceType::THERMOSTAT, "Rego 3000, UI800, Logamatic BC400", DeviceFlags::EMS_DEVICE_FLAG_BC400}, // 0x10 +{253, DeviceType::THERMOSTAT, "Rego 3000, UI800, Logamatic BC400", DeviceFlags::EMS_DEVICE_FLAG_UI800}, // 0x10 // Thermostat - Sieger - 0x10 / 0x17 { 66, DeviceType::THERMOSTAT, "ES72, RC20", DeviceFlags::EMS_DEVICE_FLAG_RC20_N}, // 0x17 or remote diff --git a/src/core/emsdevice.h b/src/core/emsdevice.h index 793313f3d..7473113f0 100644 --- a/src/core/emsdevice.h +++ b/src/core/emsdevice.h @@ -513,6 +513,7 @@ class EMSdevice { static constexpr uint8_t EMS_DEVICE_FLAG_CR120 = 16; // mostly like RC300, but some changes static constexpr uint8_t EMS_DEVICE_FLAG_CR11 = 17; // CRF200 only monitor static constexpr uint8_t EMS_DEVICE_FLAG_HMC310 = 18; + static constexpr uint8_t EMS_DEVICE_FLAG_UI800 = 19; uint8_t count_entities(); uint8_t count_entities_fav(); diff --git a/src/core/locale_common.h b/src/core/locale_common.h index d5b88c789..4ab1beb5a 100644 --- a/src/core/locale_common.h +++ b/src/core/locale_common.h @@ -190,7 +190,11 @@ MAKE_NOTRANSLATION(rc100, "RC100") MAKE_NOTRANSLATION(rc100h, "RC100H") MAKE_NOTRANSLATION(tc100, "TC100") MAKE_NOTRANSLATION(rc120rf, "RC120RF") -MAKE_NOTRANSLATION(rc220, "RC220/RT800") +MAKE_NOTRANSLATION(rc220, "RC220") +MAKE_NOTRANSLATION(rt800, "RT800") +MAKE_NOTRANSLATION(cr10, "CR10") +MAKE_NOTRANSLATION(cr10h, "CR10H") +MAKE_NOTRANSLATION(cr20rf, "CR20RF") MAKE_NOTRANSLATION(single, "single") MAKE_NOTRANSLATION(dash, "-") MAKE_NOTRANSLATION(BLANK, "") @@ -370,6 +374,7 @@ MAKE_ENUM(enum_roomsensor, FL_(extern), FL_(intern), FL_(auto)) MAKE_ENUM(enum_roominfluence, FL_(off), FL_(intern), FL_(extern), FL_(auto)) MAKE_ENUM(enum_control1, FL_(rc310), FL_(rc200), FL_(rc100), FL_(rc100h), FL_(tc100)) MAKE_ENUM(enum_control2, FL_(off), FL_(dash), FL_(rc100), FL_(rc100h), FL_(dash), FL_(rc120rf), FL_(rc220), FL_(single)) // BC400 +MAKE_ENUM(enum_control3, FL_(off), FL_(dash), FL_(cr10), FL_(cr10h), FL_(dash), FL_(cr20rf), FL_(rt800), FL_(single)) // UI800 MAKE_ENUM(enum_switchmode, FL_(off), FL_(eco), FL_(comfort), FL_(heat)) MAKE_ENUM(enum_switchProgMode, FL_(level), FL_(absolute)) diff --git a/src/core/telegram.cpp b/src/core/telegram.cpp index c16b2c5cb..cdf3564a9 100644 --- a/src/core/telegram.cpp +++ b/src/core/telegram.cpp @@ -276,7 +276,7 @@ void TxService::start() { // sends a 1 byte poll which is our own deviceID void TxService::send_poll() const { // LOG_DEBUG("Ack %02X",ems_bus_id() ^ ems_mask()); - if (tx_mode() != EMS_TXMODE_OFF) { + if (tx_mode() != EMS_TXMODE_OFF && ems_bus_id() != 0x0D) { EMSuart::send_poll(ems_bus_id() ^ ems_mask()); } } diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index 4a7cf74cc..43e048119 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -543,7 +543,7 @@ uint8_t Thermostat::HeatingCircuit::get_mode() const { } else { return HeatingCircuit::Mode::OFF; } - } else if (model == EMSdevice::EMS_DEVICE_FLAG_BC400 || model == EMSdevice::EMS_DEVICE_FLAG_CR120) { + } else if (model == EMSdevice::EMS_DEVICE_FLAG_BC400 || model == EMSdevice::EMS_DEVICE_FLAG_UI800 || model == EMSdevice::EMS_DEVICE_FLAG_CR120) { if (mode_new == 0) { return HeatingCircuit::Mode::OFF; } else if (mode_new == 1) { @@ -607,7 +607,7 @@ uint8_t Thermostat::HeatingCircuit::get_mode_type() const { return HeatingCircuit::Mode::ON; } } else if (model == EMSdevice::EMS_DEVICE_FLAG_RC300 || model == EMSdevice::EMS_DEVICE_FLAG_R3000 || model == EMSdevice::EMS_DEVICE_FLAG_BC400 - || model == EMSdevice::EMS_DEVICE_FLAG_HMC310) { + || model == EMSdevice::EMS_DEVICE_FLAG_UI800 || model == EMSdevice::EMS_DEVICE_FLAG_HMC310) { if (modetype == 0) { return HeatingCircuit::Mode::ECO; } else if (modetype == 1) { @@ -1334,7 +1334,7 @@ void Thermostat::process_RC300WWmode(std::shared_ptr telegram) { // circulation pump see: https://github.com/Th3M3/buderus_ems-wiki/blob/master/Einstellungen%20der%20Bedieneinheit%20RC310.md has_update(telegram, dhw->wwCircPump_, 1); // FF=off, 0=on ? - if (model() == EMSdevice::EMS_DEVICE_FLAG_BC400 || model() == EMSdevice::EMS_DEVICE_FLAG_HMC310) { + if (model() == EMSdevice::EMS_DEVICE_FLAG_BC400 || model() == EMSdevice::EMS_DEVICE_FLAG_UI800 || model() == EMSdevice::EMS_DEVICE_FLAG_HMC310) { has_enumupdate(telegram, dhw->wwMode_, 2, {0, 5, 1, 2, 4}); } else if (model() == EMSdevice::EMS_DEVICE_FLAG_R3000) { // https://github.com/emsesp/EMS-ESP32/pull/1722#discussion_r1582823521 @@ -2355,7 +2355,7 @@ bool Thermostat::set_control(const char * value, const int8_t id) { } // BC400 // 1-RC100, 2-RC100H, 3-RC200 - } else if (model() == EMSdevice::EMS_DEVICE_FLAG_BC400) { + } else if (model() == EMSdevice::EMS_DEVICE_FLAG_BC400 || model() == EMSdevice::EMS_DEVICE_FLAG_UI800) { if (Helpers::value2enum(value, ctrl, FL_(enum_control2))) { write_command(hpmode_typeids[hc->hc()], 3, ctrl); hc->control = ctrl; // set in advance, dont wait for verify @@ -2435,7 +2435,7 @@ bool Thermostat::set_wwmode(const char * value, const int8_t id) { return false; } write_command(0xB0, 2, set, 0xB0); - } else if (model() == EMSdevice::EMS_DEVICE_FLAG_BC400 || model() == EMSdevice::EMS_DEVICE_FLAG_HMC310) { + } else if (model() == EMSdevice::EMS_DEVICE_FLAG_BC400 || model() == EMSdevice::EMS_DEVICE_FLAG_UI800 || model() == EMSdevice::EMS_DEVICE_FLAG_HMC310) { if (!Helpers::value2enum(value, set, FL_(enum_wwMode4), {0, 5, 1, 2, 4})) { // off, eco+, eco, comfort, auto return false; } @@ -2599,7 +2599,11 @@ bool Thermostat::set_coolondelay(const char * value, const int8_t id) { if (!Helpers::value2float(value, f)) { return false; } - write_command(summer2_typeids[hc->hc()], 6, (uint8_t)(f * 4), summer2_typeids[hc->hc()]); + if (model() == EMSdevice::EMS_DEVICE_FLAG_UI800) { + write_command(summer2_typeids[hc->hc()], 6, (uint8_t)(f * 4), summer2_typeids[hc->hc()]); + } else { + write_command(summer2_typeids[hc->hc()], 6, (uint8_t)f, summer2_typeids[hc->hc()]); + } return true; } @@ -2613,7 +2617,11 @@ bool Thermostat::set_cooloffdelay(const char * value, const int8_t id) { if (!Helpers::value2float(value, f)) { return false; } - write_command(summer2_typeids[hc->hc()], 7, (uint8_t)(f * 4), summer2_typeids[hc->hc()]); + if (model() == EMSdevice::EMS_DEVICE_FLAG_UI800) { + write_command(summer2_typeids[hc->hc()], 7, (uint8_t)(f * 4), summer2_typeids[hc->hc()]); + } else { + write_command(summer2_typeids[hc->hc()], 7, (uint8_t)f, summer2_typeids[hc->hc()]); + } return true; } @@ -3142,6 +3150,7 @@ bool Thermostat::set_mode(const char * value, const int8_t id) { mode_list = FL_(enum_mode3); break; case EMSdevice::EMS_DEVICE_FLAG_BC400: + case EMSdevice::EMS_DEVICE_FLAG_UI800: case EMSdevice::EMS_DEVICE_FLAG_CR120: mode_list = FL_(enum_mode2); break; @@ -3279,6 +3288,7 @@ bool Thermostat::set_mode_n(const uint8_t mode, const int8_t id) { offset = EMS_OFFSET_RC35Set_mode; break; case EMSdevice::EMS_DEVICE_FLAG_BC400: + case EMSdevice::EMS_DEVICE_FLAG_UI800: case EMSdevice::EMS_DEVICE_FLAG_CR120: offset = EMS_OFFSET_RCPLUSSet_mode_new; break; @@ -3318,7 +3328,7 @@ bool Thermostat::set_mode_n(const uint8_t mode, const int8_t id) { // set hc->mode temporary until validate is received if (model_ == EMSdevice::EMS_DEVICE_FLAG_RC10) { hc->mode = set_mode_value >> 1; - } else if (model_ == EMSdevice::EMS_DEVICE_FLAG_BC400 || model_ == EMSdevice::EMS_DEVICE_FLAG_CR120) { + } else if (model_ == EMSdevice::EMS_DEVICE_FLAG_BC400 || model_ == EMSdevice::EMS_DEVICE_FLAG_UI800 || model_ == EMSdevice::EMS_DEVICE_FLAG_CR120) { hc->mode_new = set_mode_value; } else if (model_ == EMSdevice::EMS_DEVICE_FLAG_RC300 || model_ == EMSdevice::EMS_DEVICE_FLAG_R3000 || model_ == EMSdevice::EMS_DEVICE_FLAG_HMC310 || model_ == EMSdevice::EMS_DEVICE_FLAG_RC100) { @@ -3495,7 +3505,11 @@ bool Thermostat::set_heatondelay(const char * value, const int8_t id) { if (!Helpers::value2float(value, f)) { return false; } - write_command(summer2_typeids[hc->hc()], 2, (uint8_t)(f * 4), summer2_typeids[hc->hc()]); + if (model() == EMSdevice::EMS_DEVICE_FLAG_UI800) { + write_command(summer2_typeids[hc->hc()], 2, (uint8_t)(f * 4), summer2_typeids[hc->hc()]); + } else { + write_command(summer2_typeids[hc->hc()], 2, (uint8_t)f, summer2_typeids[hc->hc()]); + } return true; } @@ -3508,7 +3522,11 @@ bool Thermostat::set_heatoffdelay(const char * value, const int8_t id) { if (!Helpers::value2float(value, f)) { return false; } - write_command(summer2_typeids[hc->hc()], 3, (uint8_t)(f * 4), summer2_typeids[hc->hc()]); + if (model() == EMSdevice::EMS_DEVICE_FLAG_UI800) { + write_command(summer2_typeids[hc->hc()], 3, (uint8_t)(f * 4), summer2_typeids[hc->hc()]); + } else { + write_command(summer2_typeids[hc->hc()], 3, (uint8_t)f, summer2_typeids[hc->hc()]); + } return true; } @@ -4443,6 +4461,7 @@ void Thermostat::register_device_values() { case EMSdevice::EMS_DEVICE_FLAG_RC300: case EMSdevice::EMS_DEVICE_FLAG_R3000: case EMSdevice::EMS_DEVICE_FLAG_BC400: + case EMSdevice::EMS_DEVICE_FLAG_UI800: case EMSdevice::EMS_DEVICE_FLAG_CR120: case EMSdevice::EMS_DEVICE_FLAG_HMC310: register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, @@ -4902,9 +4921,10 @@ void Thermostat::register_device_values_hc(std::shared_ptrmode_new, DeviceValueType::ENUM, FL_(enum_mode2), FL_(mode), DeviceValueUOM::NONE, MAKE_CF_CB(set_mode)); } else { register_device_value(tag, &hc->mode, DeviceValueType::ENUM, FL_(enum_mode), FL_(mode), DeviceValueUOM::NONE, MAKE_CF_CB(set_mode)); @@ -4997,6 +5017,8 @@ void Thermostat::register_device_values_hc(std::shared_ptrhpminflowtemp, DeviceValueType::UINT8, FL_(hpminflowtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_hpminflowtemp)); if (model == EMSdevice::EMS_DEVICE_FLAG_BC400) { register_device_value(tag, &hc->control, DeviceValueType::ENUM, FL_(enum_control2), FL_(control), DeviceValueUOM::NONE, MAKE_CF_CB(set_control)); + } else if (model == EMSdevice::EMS_DEVICE_FLAG_UI800) { + register_device_value(tag, &hc->control, DeviceValueType::ENUM, FL_(enum_control3), FL_(control), DeviceValueUOM::NONE, MAKE_CF_CB(set_control)); } else { register_device_value(tag, &hc->control, DeviceValueType::ENUM, FL_(enum_control1), FL_(control), DeviceValueUOM::NONE, MAKE_CF_CB(set_control)); } @@ -5012,24 +5034,49 @@ void Thermostat::register_device_values_hc(std::shared_ptrremotehum, DeviceValueType::CMD, FL_(remotehum), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_remotehum), -1, 101); } - register_device_value(tag, - &hc->heatondelay, - DeviceValueType::UINT8, - DeviceValueNumOp::DV_NUMOP_DIV4, - FL_(heatondelay), - DeviceValueUOM::HOURS, - MAKE_CF_CB(set_heatondelay), - 1, - 48); - register_device_value(tag, - &hc->heatoffdelay, - DeviceValueType::UINT8, - DeviceValueNumOp::DV_NUMOP_DIV4, - FL_(heatoffdelay), - DeviceValueUOM::HOURS, - MAKE_CF_CB(set_heatoffdelay), - 1, - 48); + if (model == EMSdevice::EMS_DEVICE_FLAG_UI800) { + register_device_value(tag, + &hc->heatondelay, + DeviceValueType::UINT8, + DeviceValueNumOp::DV_NUMOP_DIV4, + FL_(heatondelay), + DeviceValueUOM::HOURS, + MAKE_CF_CB(set_heatondelay), + 1, + 48); + register_device_value(tag, + &hc->heatoffdelay, + DeviceValueType::UINT8, + DeviceValueNumOp::DV_NUMOP_DIV4, + FL_(heatoffdelay), + DeviceValueUOM::HOURS, + MAKE_CF_CB(set_heatoffdelay), + 1, + 48); + register_device_value(tag, + &hc->coolondelay, + DeviceValueType::UINT8, + DeviceValueNumOp::DV_NUMOP_DIV4, + FL_(coolondelay), + DeviceValueUOM::HOURS, + MAKE_CF_CB(set_coolondelay), + 1, + 48); + register_device_value(tag, + &hc->cooloffdelay, + DeviceValueType::UINT8, + DeviceValueNumOp::DV_NUMOP_DIV4, + FL_(cooloffdelay), + DeviceValueUOM::HOURS, + MAKE_CF_CB(set_cooloffdelay), + 1, + 48); + } else { + register_device_value(tag, &hc->heatondelay, DeviceValueType::UINT8, FL_(heatondelay), DeviceValueUOM::HOURS, MAKE_CF_CB(set_heatondelay), 1, 48); + register_device_value(tag, &hc->heatoffdelay, DeviceValueType::UINT8, FL_(heatoffdelay), DeviceValueUOM::HOURS, MAKE_CF_CB(set_heatoffdelay), 1, 48); + register_device_value(tag, &hc->coolondelay, DeviceValueType::UINT8, FL_(coolondelay), DeviceValueUOM::HOURS, MAKE_CF_CB(set_coolondelay), 1, 48); + register_device_value(tag, &hc->cooloffdelay, DeviceValueType::UINT8, FL_(cooloffdelay), DeviceValueUOM::HOURS, MAKE_CF_CB(set_cooloffdelay), 1, 48); + } register_device_value(tag, &hc->instantstart, DeviceValueType::UINT8, FL_(instantstart), DeviceValueUOM::K, MAKE_CF_CB(set_instantstart), 1, 10); register_device_value(tag, &hc->boost, DeviceValueType::BOOL, FL_(boost), DeviceValueUOM::NONE, MAKE_CF_CB(set_boost)); register_device_value(tag, &hc->boosttime, DeviceValueType::UINT8, FL_(boosttime), DeviceValueUOM::HOURS, MAKE_CF_CB(set_boosttime)); @@ -5391,9 +5438,10 @@ void Thermostat::register_device_values_dhw(std::shared_ptrwwMode_, DeviceValueType::ENUM, FL_(enum_wwMode4), FL_(wwMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwmode)); } else if (model() == EMSdevice::EMS_DEVICE_FLAG_R3000) { register_device_value(tag, &dhw->wwMode_, DeviceValueType::ENUM, FL_(enum_wwMode5), FL_(wwMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwmode)); diff --git a/src/devices/thermostat.h b/src/devices/thermostat.h index 4c33b78b9..0bd39bd42 100644 --- a/src/devices/thermostat.h +++ b/src/devices/thermostat.h @@ -241,7 +241,7 @@ class Thermostat : public EMSdevice { // check to see if the thermostat is a hybrid of the R300 inline bool isRC300() const { return (model() == EMSdevice::EMS_DEVICE_FLAG_RC300 || model() == EMSdevice::EMS_DEVICE_FLAG_R3000 || model() == EMSdevice::EMS_DEVICE_FLAG_BC400 - || model() == EMSdevice::EMS_DEVICE_FLAG_CR120 || model() == EMSdevice::EMS_DEVICE_FLAG_HMC310); + || model() == EMSdevice::EMS_DEVICE_FLAG_CR120 || model() == EMSdevice::EMS_DEVICE_FLAG_HMC310 || model() == EMSdevice::EMS_DEVICE_FLAG_UI800); } inline uint8_t id2dhw(const int8_t id) const { // returns telegram offset for TAG(id) diff --git a/src/emsesp_version.h b/src/emsesp_version.h index 0958eb06d..41a5ebd5c 100644 --- a/src/emsesp_version.h +++ b/src/emsesp_version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.8.3-dev.4" +#define EMSESP_APP_VERSION "3.8.3-dev.4a" From 1d608b770589bf3adc420b03047b959a97cef29e Mon Sep 17 00:00:00 2001 From: MichaelDvP <59284019+MichaelDvP@users.noreply.github.com> Date: Mon, 25 May 2026 15:11:10 +0000 Subject: [PATCH 22/24] chore: update generated files for v3.8.3-dev.4a --- docs/Modbus-Entity-Registers.md | 84 +++++++++++++++++---------- docs/dump_entities.csv | 78 ++++++++++++++----------- src/core/modbus_entity_parameters.hpp | 12 ++-- 3 files changed, 102 insertions(+), 72 deletions(-) diff --git a/docs/Modbus-Entity-Registers.md b/docs/Modbus-Entity-Registers.md index bdb04eb14..9321b4b16 100644 --- a/docs/Modbus-Entity-Registers.md +++ b/docs/Modbus-Entity-Registers.md @@ -5363,16 +5363,20 @@ uint8 uint8 | hc1.heatoffdelay | heat-off delay | uint8 (>=1<=48) | hours | true | HC | 48 | 1 | 1 | uint8 -| hc1.instantstart | instant start | uint8 (>=1<=10) | K | true | HC | 49 | 1 | 1 | -| hc1.boost | boost mode | boolean | | true | HC | 50 | 1 | 1 | +| hc1.coolondelay | cooling on delay | uint8 (>=1<=48) | hours | true | HC | 49 | 1 | 1 | uint8 -| hc1.boosttime | boost time | uint8 (>=0<=0) | hours | true | HC | 51 | 1 | 1 | +| hc1.cooloffdelay | cooling off delay | uint8 (>=1<=48) | hours | true | HC | 50 | 1 | 1 | uint8 -| hc1.coolstart | cooling starttemp | uint8 (>=20<=35) | C | true | HC | 52 | 1 | 1 | +| hc1.instantstart | instant start | uint8 (>=1<=10) | K | true | HC | 51 | 1 | 1 | +| hc1.boost | boost mode | boolean | | true | HC | 52 | 1 | 1 | uint8 -| hc1.coolondelay | cooling on delay | uint8 (>=1<=48) | hours | true | HC | 53 | 1 | 1 | +| hc1.boosttime | boost time | uint8 (>=0<=0) | hours | true | HC | 53 | 1 | 1 | uint8 -| hc1.cooloffdelay | cooling off delay | uint8 (>=1<=48) | hours | true | HC | 54 | 1 | 1 | +| hc1.coolstart | cooling starttemp | uint8 (>=20<=35) | C | true | HC | 54 | 1 | 1 | +uint8 +| hc1.coolondelay | cooling on delay | uint8 (>=1<=48) | hours | true | HC | 49 | 1 | 1/4 | +uint8 +| hc1.cooloffdelay | cooling off delay | uint8 (>=1<=48) | hours | true | HC | 50 | 1 | 1/4 | | hc1.switchprogmode | switch program mode | enum | | true | HC | 55 | 1 | 1 | int8 | hc1.redthreshold | reduction threshold | int8 (>=12<=22) | C | true | HC | 56 | 1 | 1/2 | @@ -5972,16 +5976,20 @@ uint8 uint8 | hc1.heatoffdelay | heat-off delay | uint8 (>=1<=48) | hours | true | HC | 48 | 1 | 1 | uint8 -| hc1.instantstart | instant start | uint8 (>=1<=10) | K | true | HC | 49 | 1 | 1 | -| hc1.boost | boost mode | boolean | | true | HC | 50 | 1 | 1 | +| hc1.coolondelay | cooling on delay | uint8 (>=1<=48) | hours | true | HC | 49 | 1 | 1 | uint8 -| hc1.boosttime | boost time | uint8 (>=0<=0) | hours | true | HC | 51 | 1 | 1 | +| hc1.cooloffdelay | cooling off delay | uint8 (>=1<=48) | hours | true | HC | 50 | 1 | 1 | uint8 -| hc1.coolstart | cooling starttemp | uint8 (>=20<=35) | C | true | HC | 52 | 1 | 1 | +| hc1.instantstart | instant start | uint8 (>=1<=10) | K | true | HC | 51 | 1 | 1 | +| hc1.boost | boost mode | boolean | | true | HC | 52 | 1 | 1 | uint8 -| hc1.coolondelay | cooling on delay | uint8 (>=1<=48) | hours | true | HC | 53 | 1 | 1 | +| hc1.boosttime | boost time | uint8 (>=0<=0) | hours | true | HC | 53 | 1 | 1 | uint8 -| hc1.cooloffdelay | cooling off delay | uint8 (>=1<=48) | hours | true | HC | 54 | 1 | 1 | +| hc1.coolstart | cooling starttemp | uint8 (>=20<=35) | C | true | HC | 54 | 1 | 1 | +uint8 +| hc1.coolondelay | cooling on delay | uint8 (>=1<=48) | hours | true | HC | 49 | 1 | 1/4 | +uint8 +| hc1.cooloffdelay | cooling off delay | uint8 (>=1<=48) | hours | true | HC | 50 | 1 | 1/4 | | hc1.switchprogmode | switch program mode | enum | | true | HC | 55 | 1 | 1 | int8 | hc1.redthreshold | reduction threshold | int8 (>=12<=22) | C | true | HC | 56 | 1 | 1/2 | @@ -6124,16 +6132,20 @@ uint8 uint8 | hc1.heatoffdelay | heat-off delay | uint8 (>=1<=48) | hours | true | HC | 48 | 1 | 1 | uint8 -| hc1.instantstart | instant start | uint8 (>=1<=10) | K | true | HC | 49 | 1 | 1 | -| hc1.boost | boost mode | boolean | | true | HC | 50 | 1 | 1 | +| hc1.coolondelay | cooling on delay | uint8 (>=1<=48) | hours | true | HC | 49 | 1 | 1 | uint8 -| hc1.boosttime | boost time | uint8 (>=0<=0) | hours | true | HC | 51 | 1 | 1 | +| hc1.cooloffdelay | cooling off delay | uint8 (>=1<=48) | hours | true | HC | 50 | 1 | 1 | uint8 -| hc1.coolstart | cooling starttemp | uint8 (>=20<=35) | C | true | HC | 52 | 1 | 1 | +| hc1.instantstart | instant start | uint8 (>=1<=10) | K | true | HC | 51 | 1 | 1 | +| hc1.boost | boost mode | boolean | | true | HC | 52 | 1 | 1 | uint8 -| hc1.coolondelay | cooling on delay | uint8 (>=1<=48) | hours | true | HC | 53 | 1 | 1 | +| hc1.boosttime | boost time | uint8 (>=0<=0) | hours | true | HC | 53 | 1 | 1 | uint8 -| hc1.cooloffdelay | cooling off delay | uint8 (>=1<=48) | hours | true | HC | 54 | 1 | 1 | +| hc1.coolstart | cooling starttemp | uint8 (>=20<=35) | C | true | HC | 54 | 1 | 1 | +uint8 +| hc1.coolondelay | cooling on delay | uint8 (>=1<=48) | hours | true | HC | 49 | 1 | 1/4 | +uint8 +| hc1.cooloffdelay | cooling off delay | uint8 (>=1<=48) | hours | true | HC | 50 | 1 | 1/4 | | hc1.switchprogmode | switch program mode | enum | | true | HC | 55 | 1 | 1 | int8 | hc1.redthreshold | reduction threshold | int8 (>=12<=22) | C | true | HC | 56 | 1 | 1/2 | @@ -6291,16 +6303,20 @@ uint8 uint8 | hc1.heatoffdelay | heat-off delay | uint8 (>=1<=48) | hours | true | HC | 48 | 1 | 1 | uint8 -| hc1.instantstart | instant start | uint8 (>=1<=10) | K | true | HC | 49 | 1 | 1 | -| hc1.boost | boost mode | boolean | | true | HC | 50 | 1 | 1 | +| hc1.coolondelay | cooling on delay | uint8 (>=1<=48) | hours | true | HC | 49 | 1 | 1 | uint8 -| hc1.boosttime | boost time | uint8 (>=0<=0) | hours | true | HC | 51 | 1 | 1 | +| hc1.cooloffdelay | cooling off delay | uint8 (>=1<=48) | hours | true | HC | 50 | 1 | 1 | uint8 -| hc1.coolstart | cooling starttemp | uint8 (>=20<=35) | C | true | HC | 52 | 1 | 1 | +| hc1.instantstart | instant start | uint8 (>=1<=10) | K | true | HC | 51 | 1 | 1 | +| hc1.boost | boost mode | boolean | | true | HC | 52 | 1 | 1 | uint8 -| hc1.coolondelay | cooling on delay | uint8 (>=1<=48) | hours | true | HC | 53 | 1 | 1 | +| hc1.boosttime | boost time | uint8 (>=0<=0) | hours | true | HC | 53 | 1 | 1 | uint8 -| hc1.cooloffdelay | cooling off delay | uint8 (>=1<=48) | hours | true | HC | 54 | 1 | 1 | +| hc1.coolstart | cooling starttemp | uint8 (>=20<=35) | C | true | HC | 54 | 1 | 1 | +uint8 +| hc1.coolondelay | cooling on delay | uint8 (>=1<=48) | hours | true | HC | 49 | 1 | 1/4 | +uint8 +| hc1.cooloffdelay | cooling off delay | uint8 (>=1<=48) | hours | true | HC | 50 | 1 | 1/4 | | hc1.switchprogmode | switch program mode | enum | | true | HC | 55 | 1 | 1 | int8 | hc1.redthreshold | reduction threshold | int8 (>=12<=22) | C | true | HC | 56 | 1 | 1/2 | @@ -6481,20 +6497,24 @@ uint8 | hc1.remotetemp | room temperature from remote | cmd | C | true | HC | 45 | 1 | 1/10 | | hc1.remotehum | room humidity from remote | cmd | % | true | HC | 46 | 1 | 1 | uint8 -| hc1.heatondelay | heat-on delay | uint8 (>=1<=48) | hours | true | HC | 47 | 1 | 1 | +| hc1.heatondelay | heat-on delay | uint8 (>=1<=48) | hours | true | HC | 47 | 1 | 1/4 | uint8 -| hc1.heatoffdelay | heat-off delay | uint8 (>=1<=48) | hours | true | HC | 48 | 1 | 1 | +| hc1.heatoffdelay | heat-off delay | uint8 (>=1<=48) | hours | true | HC | 48 | 1 | 1/4 | uint8 -| hc1.instantstart | instant start | uint8 (>=1<=10) | K | true | HC | 49 | 1 | 1 | -| hc1.boost | boost mode | boolean | | true | HC | 50 | 1 | 1 | +| hc1.coolondelay | cooling on delay | uint8 (>=1<=48) | hours | true | HC | 49 | 1 | 1/4 | uint8 -| hc1.boosttime | boost time | uint8 (>=0<=0) | hours | true | HC | 51 | 1 | 1 | +| hc1.cooloffdelay | cooling off delay | uint8 (>=1<=48) | hours | true | HC | 50 | 1 | 1/4 | uint8 -| hc1.coolstart | cooling starttemp | uint8 (>=20<=35) | C | true | HC | 52 | 1 | 1 | +| hc1.instantstart | instant start | uint8 (>=1<=10) | K | true | HC | 51 | 1 | 1 | +| hc1.boost | boost mode | boolean | | true | HC | 52 | 1 | 1 | uint8 -| hc1.coolondelay | cooling on delay | uint8 (>=1<=48) | hours | true | HC | 53 | 1 | 1 | +| hc1.boosttime | boost time | uint8 (>=0<=0) | hours | true | HC | 53 | 1 | 1 | uint8 -| hc1.cooloffdelay | cooling off delay | uint8 (>=1<=48) | hours | true | HC | 54 | 1 | 1 | +| hc1.coolstart | cooling starttemp | uint8 (>=20<=35) | C | true | HC | 54 | 1 | 1 | +uint8 +| hc1.coolondelay | cooling on delay | uint8 (>=1<=48) | hours | true | HC | 49 | 1 | 1/4 | +uint8 +| hc1.cooloffdelay | cooling off delay | uint8 (>=1<=48) | hours | true | HC | 50 | 1 | 1/4 | | hc1.switchprogmode | switch program mode | enum | | true | HC | 55 | 1 | 1 | int8 | hc1.redthreshold | reduction threshold | int8 (>=12<=22) | C | true | HC | 56 | 1 | 1/2 | diff --git a/docs/dump_entities.csv b/docs/dump_entities.csv index 7760b34d5..a45f535a2 100644 --- a/docs/dump_entities.csv +++ b/docs/dump_entities.csv @@ -4044,17 +4044,19 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/ "UI800, BC400",thermostat,4,hc1.dewoffset,dew point offset,uint8 (>=2<=10),K,true,number.thermostat_hc1_dew_point_offset,number.thermostat_hc1_dewoffset,6,1,1,41,1 "UI800, BC400",thermostat,4,hc1.roomtempdiff,room temp difference,uint8 (>=0<=0),K,true,number.thermostat_hc1_room_temp_difference,number.thermostat_hc1_roomtempdiff,6,1,1,42,1 "UI800, BC400",thermostat,4,hc1.hpminflowtemp,HP min. flow temp.,uint8 (>=0<=0),C,true,number.thermostat_hc1_HP_min._flow_temp.,number.thermostat_hc1_hpminflowtemp,6,1,1,43,1 -"UI800, BC400",thermostat,4,hc1.control,control device,enum [off\|-\|RC100\|RC100H\|-\|RC120RF\|RC220/RT800\|single] (>=0<=0), ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,44,1 +"UI800, BC400",thermostat,4,hc1.control,control device,enum [off\|-\|RC100\|RC100H\|-\|RC120RF\|RC220\|single] (>=0<=0), ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,44,1 "UI800, BC400",thermostat,4,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,45,1 "UI800, BC400",thermostat,4,hc1.remotehum,room humidity from remote,cmd [] (>=-1<=101),%,true,sensor.thermostat_hc1_room_humidity_from_remote,sensor.thermostat_hc1_remotehum,6,1,1,46,1 "UI800, BC400",thermostat,4,hc1.heatondelay,heat-on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_heat-on_delay,number.thermostat_hc1_heatondelay,6,1,1,47,1 "UI800, BC400",thermostat,4,hc1.heatoffdelay,heat-off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_heat-off_delay,number.thermostat_hc1_heatoffdelay,6,1,1,48,1 -"UI800, BC400",thermostat,4,hc1.instantstart,instant start,uint8 (>=1<=10),K,true,number.thermostat_hc1_instant_start,number.thermostat_hc1_instantstart,6,1,1,49,1 -"UI800, BC400",thermostat,4,hc1.boost,boost mode,boolean (>=0<=0), ,true,switch.thermostat_hc1_boost_mode,switch.thermostat_hc1_boost,6,1,1,50,1 -"UI800, BC400",thermostat,4,hc1.boosttime,boost time,uint8 (>=0<=0),hours,true,number.thermostat_hc1_boost_time,number.thermostat_hc1_boosttime,6,1,1,51,1 -"UI800, BC400",thermostat,4,hc1.coolstart,cooling starttemp,uint8 (>=20<=35),C,true,number.thermostat_hc1_cooling_starttemp,number.thermostat_hc1_coolstart,6,1,1,52,1 -"UI800, BC400",thermostat,4,hc1.coolondelay,cooling on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_on_delay,number.thermostat_hc1_coolondelay,6,1,1,53,1 -"UI800, BC400",thermostat,4,hc1.cooloffdelay,cooling off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_off_delay,number.thermostat_hc1_cooloffdelay,6,1,1,54,1 +"UI800, BC400",thermostat,4,hc1.coolondelay,cooling on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_on_delay,number.thermostat_hc1_coolondelay,6,1,1,49,1 +"UI800, BC400",thermostat,4,hc1.cooloffdelay,cooling off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_off_delay,number.thermostat_hc1_cooloffdelay,6,1,1,50,1 +"UI800, BC400",thermostat,4,hc1.instantstart,instant start,uint8 (>=1<=10),K,true,number.thermostat_hc1_instant_start,number.thermostat_hc1_instantstart,6,1,1,51,1 +"UI800, BC400",thermostat,4,hc1.boost,boost mode,boolean (>=0<=0), ,true,switch.thermostat_hc1_boost_mode,switch.thermostat_hc1_boost,6,1,1,52,1 +"UI800, BC400",thermostat,4,hc1.boosttime,boost time,uint8 (>=0<=0),hours,true,number.thermostat_hc1_boost_time,number.thermostat_hc1_boosttime,6,1,1,53,1 +"UI800, BC400",thermostat,4,hc1.coolstart,cooling starttemp,uint8 (>=20<=35),C,true,number.thermostat_hc1_cooling_starttemp,number.thermostat_hc1_coolstart,6,1,1,54,1 +"UI800, BC400",thermostat,4,hc1.coolondelay,cooling on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_on_delay,number.thermostat_hc1_coolondelay,6,1,1/4,49,1 +"UI800, BC400",thermostat,4,hc1.cooloffdelay,cooling off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_off_delay,number.thermostat_hc1_cooloffdelay,6,1,1/4,50,1 "UI800, BC400",thermostat,4,hc1.switchprogmode,switch program mode,enum [level\|absolute] (>=0<=0), ,true,select.thermostat_hc1_switch_program_mode,select.thermostat_hc1_switchprogmode,6,1,1,55,1 "UI800, BC400",thermostat,4,hc1.redthreshold,reduction threshold,int8 (>=12<=22),C,true,number.thermostat_hc1_reduction_threshold,number.thermostat_hc1_redthreshold,6,1,1/2,56,1 "UI800, BC400",thermostat,4,hc1.solarinfl,solar influence,int8 (>=-5<=0),C,true,number.thermostat_hc1_solar_influence,number.thermostat_hc1_solarinfl,6,1,1,57,1 @@ -4439,12 +4441,14 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/ "RC200, CW100, CR120, CR50",thermostat,157,hc1.control,control device,enum [RC310\|RC200\|RC100\|RC100H\|TC100] (>=0<=0), ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,44,1 "RC200, CW100, CR120, CR50",thermostat,157,hc1.heatondelay,heat-on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_heat-on_delay,number.thermostat_hc1_heatondelay,6,1,1,47,1 "RC200, CW100, CR120, CR50",thermostat,157,hc1.heatoffdelay,heat-off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_heat-off_delay,number.thermostat_hc1_heatoffdelay,6,1,1,48,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.instantstart,instant start,uint8 (>=1<=10),K,true,number.thermostat_hc1_instant_start,number.thermostat_hc1_instantstart,6,1,1,49,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.boost,boost mode,boolean (>=0<=0), ,true,switch.thermostat_hc1_boost_mode,switch.thermostat_hc1_boost,6,1,1,50,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.boosttime,boost time,uint8 (>=0<=0),hours,true,number.thermostat_hc1_boost_time,number.thermostat_hc1_boosttime,6,1,1,51,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.coolstart,cooling starttemp,uint8 (>=20<=35),C,true,number.thermostat_hc1_cooling_starttemp,number.thermostat_hc1_coolstart,6,1,1,52,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.coolondelay,cooling on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_on_delay,number.thermostat_hc1_coolondelay,6,1,1,53,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.cooloffdelay,cooling off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_off_delay,number.thermostat_hc1_cooloffdelay,6,1,1,54,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.coolondelay,cooling on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_on_delay,number.thermostat_hc1_coolondelay,6,1,1,49,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.cooloffdelay,cooling off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_off_delay,number.thermostat_hc1_cooloffdelay,6,1,1,50,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.instantstart,instant start,uint8 (>=1<=10),K,true,number.thermostat_hc1_instant_start,number.thermostat_hc1_instantstart,6,1,1,51,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.boost,boost mode,boolean (>=0<=0), ,true,switch.thermostat_hc1_boost_mode,switch.thermostat_hc1_boost,6,1,1,52,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.boosttime,boost time,uint8 (>=0<=0),hours,true,number.thermostat_hc1_boost_time,number.thermostat_hc1_boosttime,6,1,1,53,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.coolstart,cooling starttemp,uint8 (>=20<=35),C,true,number.thermostat_hc1_cooling_starttemp,number.thermostat_hc1_coolstart,6,1,1,54,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.coolondelay,cooling on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_on_delay,number.thermostat_hc1_coolondelay,6,1,1/4,49,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.cooloffdelay,cooling off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_off_delay,number.thermostat_hc1_cooloffdelay,6,1,1/4,50,1 "RC200, CW100, CR120, CR50",thermostat,157,hc1.switchprogmode,switch program mode,enum [level\|absolute] (>=0<=0), ,true,select.thermostat_hc1_switch_program_mode,select.thermostat_hc1_switchprogmode,6,1,1,55,1 "RC200, CW100, CR120, CR50",thermostat,157,hc1.redthreshold,reduction threshold,int8 (>=12<=22),C,true,number.thermostat_hc1_reduction_threshold,number.thermostat_hc1_redthreshold,6,1,1/2,56,1 "RC200, CW100, CR120, CR50",thermostat,157,hc1.solarinfl,solar influence,int8 (>=-5<=0),C,true,number.thermostat_hc1_solar_influence,number.thermostat_hc1_solarinfl,6,1,1,57,1 @@ -4537,12 +4541,14 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/ "RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.remotehum,room humidity from remote,cmd [] (>=-1<=101),%,true,sensor.thermostat_hc1_room_humidity_from_remote,sensor.thermostat_hc1_remotehum,6,1,1,46,1 "RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.heatondelay,heat-on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_heat-on_delay,number.thermostat_hc1_heatondelay,6,1,1,47,1 "RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.heatoffdelay,heat-off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_heat-off_delay,number.thermostat_hc1_heatoffdelay,6,1,1,48,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.instantstart,instant start,uint8 (>=1<=10),K,true,number.thermostat_hc1_instant_start,number.thermostat_hc1_instantstart,6,1,1,49,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.boost,boost mode,boolean (>=0<=0), ,true,switch.thermostat_hc1_boost_mode,switch.thermostat_hc1_boost,6,1,1,50,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.boosttime,boost time,uint8 (>=0<=0),hours,true,number.thermostat_hc1_boost_time,number.thermostat_hc1_boosttime,6,1,1,51,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.coolstart,cooling starttemp,uint8 (>=20<=35),C,true,number.thermostat_hc1_cooling_starttemp,number.thermostat_hc1_coolstart,6,1,1,52,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.coolondelay,cooling on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_on_delay,number.thermostat_hc1_coolondelay,6,1,1,53,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.cooloffdelay,cooling off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_off_delay,number.thermostat_hc1_cooloffdelay,6,1,1,54,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.coolondelay,cooling on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_on_delay,number.thermostat_hc1_coolondelay,6,1,1,49,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.cooloffdelay,cooling off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_off_delay,number.thermostat_hc1_cooloffdelay,6,1,1,50,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.instantstart,instant start,uint8 (>=1<=10),K,true,number.thermostat_hc1_instant_start,number.thermostat_hc1_instantstart,6,1,1,51,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.boost,boost mode,boolean (>=0<=0), ,true,switch.thermostat_hc1_boost_mode,switch.thermostat_hc1_boost,6,1,1,52,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.boosttime,boost time,uint8 (>=0<=0),hours,true,number.thermostat_hc1_boost_time,number.thermostat_hc1_boosttime,6,1,1,53,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.coolstart,cooling starttemp,uint8 (>=20<=35),C,true,number.thermostat_hc1_cooling_starttemp,number.thermostat_hc1_coolstart,6,1,1,54,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.coolondelay,cooling on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_on_delay,number.thermostat_hc1_coolondelay,6,1,1/4,49,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.cooloffdelay,cooling off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_off_delay,number.thermostat_hc1_cooloffdelay,6,1,1/4,50,1 "RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.switchprogmode,switch program mode,enum [level\|absolute] (>=0<=0), ,true,select.thermostat_hc1_switch_program_mode,select.thermostat_hc1_switchprogmode,6,1,1,55,1 "RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.redthreshold,reduction threshold,int8 (>=12<=22),C,true,number.thermostat_hc1_reduction_threshold,number.thermostat_hc1_redthreshold,6,1,1/2,56,1 "RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.solarinfl,solar influence,int8 (>=-5<=0),C,true,number.thermostat_hc1_solar_influence,number.thermostat_hc1_solarinfl,6,1,1,57,1 @@ -4644,12 +4650,14 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/ "Rego 2000/3000",thermostat,172,hc1.remotehum,room humidity from remote,cmd [] (>=-1<=101),%,true,sensor.thermostat_hc1_room_humidity_from_remote,sensor.thermostat_hc1_remotehum,6,1,1,46,1 "Rego 2000/3000",thermostat,172,hc1.heatondelay,heat-on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_heat-on_delay,number.thermostat_hc1_heatondelay,6,1,1,47,1 "Rego 2000/3000",thermostat,172,hc1.heatoffdelay,heat-off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_heat-off_delay,number.thermostat_hc1_heatoffdelay,6,1,1,48,1 -"Rego 2000/3000",thermostat,172,hc1.instantstart,instant start,uint8 (>=1<=10),K,true,number.thermostat_hc1_instant_start,number.thermostat_hc1_instantstart,6,1,1,49,1 -"Rego 2000/3000",thermostat,172,hc1.boost,boost mode,boolean (>=0<=0), ,true,switch.thermostat_hc1_boost_mode,switch.thermostat_hc1_boost,6,1,1,50,1 -"Rego 2000/3000",thermostat,172,hc1.boosttime,boost time,uint8 (>=0<=0),hours,true,number.thermostat_hc1_boost_time,number.thermostat_hc1_boosttime,6,1,1,51,1 -"Rego 2000/3000",thermostat,172,hc1.coolstart,cooling starttemp,uint8 (>=20<=35),C,true,number.thermostat_hc1_cooling_starttemp,number.thermostat_hc1_coolstart,6,1,1,52,1 -"Rego 2000/3000",thermostat,172,hc1.coolondelay,cooling on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_on_delay,number.thermostat_hc1_coolondelay,6,1,1,53,1 -"Rego 2000/3000",thermostat,172,hc1.cooloffdelay,cooling off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_off_delay,number.thermostat_hc1_cooloffdelay,6,1,1,54,1 +"Rego 2000/3000",thermostat,172,hc1.coolondelay,cooling on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_on_delay,number.thermostat_hc1_coolondelay,6,1,1,49,1 +"Rego 2000/3000",thermostat,172,hc1.cooloffdelay,cooling off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_off_delay,number.thermostat_hc1_cooloffdelay,6,1,1,50,1 +"Rego 2000/3000",thermostat,172,hc1.instantstart,instant start,uint8 (>=1<=10),K,true,number.thermostat_hc1_instant_start,number.thermostat_hc1_instantstart,6,1,1,51,1 +"Rego 2000/3000",thermostat,172,hc1.boost,boost mode,boolean (>=0<=0), ,true,switch.thermostat_hc1_boost_mode,switch.thermostat_hc1_boost,6,1,1,52,1 +"Rego 2000/3000",thermostat,172,hc1.boosttime,boost time,uint8 (>=0<=0),hours,true,number.thermostat_hc1_boost_time,number.thermostat_hc1_boosttime,6,1,1,53,1 +"Rego 2000/3000",thermostat,172,hc1.coolstart,cooling starttemp,uint8 (>=20<=35),C,true,number.thermostat_hc1_cooling_starttemp,number.thermostat_hc1_coolstart,6,1,1,54,1 +"Rego 2000/3000",thermostat,172,hc1.coolondelay,cooling on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_on_delay,number.thermostat_hc1_coolondelay,6,1,1/4,49,1 +"Rego 2000/3000",thermostat,172,hc1.cooloffdelay,cooling off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_off_delay,number.thermostat_hc1_cooloffdelay,6,1,1/4,50,1 "Rego 2000/3000",thermostat,172,hc1.switchprogmode,switch program mode,enum [level\|absolute] (>=0<=0), ,true,select.thermostat_hc1_switch_program_mode,select.thermostat_hc1_switchprogmode,6,1,1,55,1 "Rego 2000/3000",thermostat,172,hc1.redthreshold,reduction threshold,int8 (>=12<=22),C,true,number.thermostat_hc1_reduction_threshold,number.thermostat_hc1_redthreshold,6,1,1/2,56,1 "Rego 2000/3000",thermostat,172,hc1.solarinfl,solar influence,int8 (>=-5<=0),C,true,number.thermostat_hc1_solar_influence,number.thermostat_hc1_solarinfl,6,1,1,57,1 @@ -4764,17 +4772,19 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/ "Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.dewoffset,dew point offset,uint8 (>=2<=10),K,true,number.thermostat_hc1_dew_point_offset,number.thermostat_hc1_dewoffset,6,1,1,41,1 "Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.roomtempdiff,room temp difference,uint8 (>=0<=0),K,true,number.thermostat_hc1_room_temp_difference,number.thermostat_hc1_roomtempdiff,6,1,1,42,1 "Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.hpminflowtemp,HP min. flow temp.,uint8 (>=0<=0),C,true,number.thermostat_hc1_HP_min._flow_temp.,number.thermostat_hc1_hpminflowtemp,6,1,1,43,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.control,control device,enum [off\|-\|RC100\|RC100H\|-\|RC120RF\|RC220/RT800\|single] (>=0<=0), ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,44,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.control,control device,enum [off\|-\|CR10\|CR10H\|-\|CR20RF\|RT800\|single] (>=0<=0), ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,44,1 "Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,45,1 "Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.remotehum,room humidity from remote,cmd [] (>=-1<=101),%,true,sensor.thermostat_hc1_room_humidity_from_remote,sensor.thermostat_hc1_remotehum,6,1,1,46,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.heatondelay,heat-on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_heat-on_delay,number.thermostat_hc1_heatondelay,6,1,1,47,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.heatoffdelay,heat-off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_heat-off_delay,number.thermostat_hc1_heatoffdelay,6,1,1,48,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.instantstart,instant start,uint8 (>=1<=10),K,true,number.thermostat_hc1_instant_start,number.thermostat_hc1_instantstart,6,1,1,49,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.boost,boost mode,boolean (>=0<=0), ,true,switch.thermostat_hc1_boost_mode,switch.thermostat_hc1_boost,6,1,1,50,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.boosttime,boost time,uint8 (>=0<=0),hours,true,number.thermostat_hc1_boost_time,number.thermostat_hc1_boosttime,6,1,1,51,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.coolstart,cooling starttemp,uint8 (>=20<=35),C,true,number.thermostat_hc1_cooling_starttemp,number.thermostat_hc1_coolstart,6,1,1,52,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.coolondelay,cooling on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_on_delay,number.thermostat_hc1_coolondelay,6,1,1,53,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.cooloffdelay,cooling off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_off_delay,number.thermostat_hc1_cooloffdelay,6,1,1,54,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.heatondelay,heat-on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_heat-on_delay,number.thermostat_hc1_heatondelay,6,1,1/4,47,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.heatoffdelay,heat-off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_heat-off_delay,number.thermostat_hc1_heatoffdelay,6,1,1/4,48,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.coolondelay,cooling on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_on_delay,number.thermostat_hc1_coolondelay,6,1,1/4,49,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.cooloffdelay,cooling off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_off_delay,number.thermostat_hc1_cooloffdelay,6,1,1/4,50,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.instantstart,instant start,uint8 (>=1<=10),K,true,number.thermostat_hc1_instant_start,number.thermostat_hc1_instantstart,6,1,1,51,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.boost,boost mode,boolean (>=0<=0), ,true,switch.thermostat_hc1_boost_mode,switch.thermostat_hc1_boost,6,1,1,52,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.boosttime,boost time,uint8 (>=0<=0),hours,true,number.thermostat_hc1_boost_time,number.thermostat_hc1_boosttime,6,1,1,53,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.coolstart,cooling starttemp,uint8 (>=20<=35),C,true,number.thermostat_hc1_cooling_starttemp,number.thermostat_hc1_coolstart,6,1,1,54,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.coolondelay,cooling on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_on_delay,number.thermostat_hc1_coolondelay,6,1,1/4,49,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.cooloffdelay,cooling off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_off_delay,number.thermostat_hc1_cooloffdelay,6,1,1/4,50,1 "Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.switchprogmode,switch program mode,enum [level\|absolute] (>=0<=0), ,true,select.thermostat_hc1_switch_program_mode,select.thermostat_hc1_switchprogmode,6,1,1,55,1 "Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.redthreshold,reduction threshold,int8 (>=12<=22),C,true,number.thermostat_hc1_reduction_threshold,number.thermostat_hc1_redthreshold,6,1,1/2,56,1 "Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.solarinfl,solar influence,int8 (>=-5<=0),C,true,number.thermostat_hc1_solar_influence,number.thermostat_hc1_solarinfl,6,1,1,57,1 diff --git a/src/core/modbus_entity_parameters.hpp b/src/core/modbus_entity_parameters.hpp index 63755c639..94938b90f 100644 --- a/src/core/modbus_entity_parameters.hpp +++ b/src/core/modbus_entity_parameters.hpp @@ -349,12 +349,12 @@ const std::initializer_list Modbus::modbus_register_ma REGISTER_MAPPING(dt::THERMOSTAT, TAG_TYPE_HC, FL_(remotehum), 46, 1), // remotehum REGISTER_MAPPING(dt::THERMOSTAT, TAG_TYPE_HC, FL_(heatondelay), 47, 1), // heatondelay REGISTER_MAPPING(dt::THERMOSTAT, TAG_TYPE_HC, FL_(heatoffdelay), 48, 1), // heatoffdelay - REGISTER_MAPPING(dt::THERMOSTAT, TAG_TYPE_HC, FL_(instantstart), 49, 1), // instantstart - REGISTER_MAPPING(dt::THERMOSTAT, TAG_TYPE_HC, FL_(boost), 50, 1), // boost - REGISTER_MAPPING(dt::THERMOSTAT, TAG_TYPE_HC, FL_(boosttime), 51, 1), // boosttime - REGISTER_MAPPING(dt::THERMOSTAT, TAG_TYPE_HC, FL_(coolstart), 52, 1), // coolstart - REGISTER_MAPPING(dt::THERMOSTAT, TAG_TYPE_HC, FL_(coolondelay), 53, 1), // coolondelay - REGISTER_MAPPING(dt::THERMOSTAT, TAG_TYPE_HC, FL_(cooloffdelay), 54, 1), // cooloffdelay + REGISTER_MAPPING(dt::THERMOSTAT, TAG_TYPE_HC, FL_(coolondelay), 49, 1), // coolondelay + REGISTER_MAPPING(dt::THERMOSTAT, TAG_TYPE_HC, FL_(cooloffdelay), 50, 1), // cooloffdelay + REGISTER_MAPPING(dt::THERMOSTAT, TAG_TYPE_HC, FL_(instantstart), 51, 1), // instantstart + REGISTER_MAPPING(dt::THERMOSTAT, TAG_TYPE_HC, FL_(boost), 52, 1), // boost + REGISTER_MAPPING(dt::THERMOSTAT, TAG_TYPE_HC, FL_(boosttime), 53, 1), // boosttime + REGISTER_MAPPING(dt::THERMOSTAT, TAG_TYPE_HC, FL_(coolstart), 54, 1), // coolstart REGISTER_MAPPING(dt::THERMOSTAT, TAG_TYPE_HC, FL_(switchProgMode), 55, 1), // switchprogmode REGISTER_MAPPING(dt::THERMOSTAT, TAG_TYPE_HC, FL_(redthreshold), 56, 1), // redthreshold REGISTER_MAPPING(dt::THERMOSTAT, TAG_TYPE_HC, FL_(solarinfl), 57, 1), // solarinfl From 66b1b1cb242c8a35a6030a9ab576393b0ca697c7 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Wed, 27 May 2026 10:49:29 +0200 Subject: [PATCH 23/24] revert settings for txmode off and 0x0d without ack --- interface/src/app/settings/ApplicationSettings.tsx | 1 - src/core/telegram.cpp | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/app/settings/ApplicationSettings.tsx b/interface/src/app/settings/ApplicationSettings.tsx index 875247885..8e8e90ab7 100644 --- a/interface/src/app/settings/ApplicationSettings.tsx +++ b/interface/src/app/settings/ApplicationSettings.tsx @@ -673,7 +673,6 @@ const ApplicationSettings = () => { sx={{ width: '15ch' }} select > - {LL.OFF()} EMS EMS+ HT3 diff --git a/src/core/telegram.cpp b/src/core/telegram.cpp index cdf3564a9..c107271c1 100644 --- a/src/core/telegram.cpp +++ b/src/core/telegram.cpp @@ -276,7 +276,8 @@ void TxService::start() { // sends a 1 byte poll which is our own deviceID void TxService::send_poll() const { // LOG_DEBUG("Ack %02X",ems_bus_id() ^ ems_mask()); - if (tx_mode() != EMS_TXMODE_OFF && ems_bus_id() != 0x0D) { + // if (tx_mode() != EMS_TXMODE_OFF && ems_bus_id() != 0x0D) { // use 0x0D for tests without poll-Ack + if (tx_mode() != EMS_TXMODE_OFF) { EMSuart::send_poll(ems_bus_id() ^ ems_mask()); } } From 0e6cb363ad0e6e181a97f30a9f799812b2d26016 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Wed, 27 May 2026 10:52:18 +0200 Subject: [PATCH 24/24] 0x470 telegram is not hc dependend --- src/devices/thermostat.cpp | 242 +++++++++++++++++++++---------------- src/devices/thermostat.h | 11 ++ src/emsesp_version.h | 2 +- 3 files changed, 151 insertions(+), 104 deletions(-) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index 43e048119..4bb002096 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -175,7 +175,9 @@ Thermostat::Thermostat(uint8_t device_type, uint8_t device_id, uint8_t product_i register_telegram_type(set_typeids[i], "RC300Set", false, MAKE_PF_CB(process_RC300Set), 29); register_telegram_type(summer_typeids[i], "RC300Summer", false, MAKE_PF_CB(process_RC300Summer), 14); register_telegram_type(curve_typeids[i], "RC300Curves", false, MAKE_PF_CB(process_RC300Curve), 9); - register_telegram_type(summer2_typeids[i], "RC300Summer2", false, MAKE_PF_CB(process_RC300Summer2), 8); + if (model != EMSdevice::EMS_DEVICE_FLAG_UI800) { + register_telegram_type(summer2_typeids[i], "RC300Sumr2", false, MAKE_PF_CB(process_RC300Summer2), 8); + } } const size_t set2_size = set2_typeids.size(); for (uint8_t i = 0; i < set2_size; i++) { @@ -207,7 +209,9 @@ Thermostat::Thermostat(uint8_t device_type, uint8_t device_id, uint8_t product_i register_telegram_type(0x16E, "Absent", true, MAKE_PF_CB(process_Absent), 1); register_telegram_type(0xBF, "ErrorMessage", false, MAKE_PF_CB(process_ErrorMessageBF)); register_telegram_type(0xC0, "RCErrorMessage", false, MAKE_PF_CB(process_RCErrorMessage2)); - register_telegram_type(0x470, "RC300Summer2", true, MAKE_PF_CB(process_RC300Summer2), 8); + if (model == EMSdevice::EMS_DEVICE_FLAG_UI800) { + register_telegram_type(0x470, "RC300Summer3", true, MAKE_PF_CB(process_RC300Summer3), 8); + } EMSESP::send_read_request(0xC0, device_id, 0, 20); // read last errorcode on start (only published on errors) // JUNKERS/HT3 @@ -1264,18 +1268,25 @@ void Thermostat::process_RC300Summer(std::shared_ptr telegram) { has_update(telegram, hc->comfortPointTemp, 12); } +// type 0x470, only BC400/UI800 +// (0x470), data: 01 0E 01 01 02 17 04 48 +void Thermostat::process_RC300Summer3(std::shared_ptr telegram) { + has_update(telegram, hpoperatingmode, 0); + has_update(telegram, summertemp, 1); + has_update(telegram, heatondelay, 2); + has_update(telegram, heatoffdelay, 3); + has_update(telegram, instantstart, 4); + has_update(telegram, coolstart, 5); + has_update(telegram, coolondelay, 6); + has_update(telegram, cooloffdelay, 7); +} + // types 0x471 ff summer2_typeids // (0x473), data: 00 11 04 01 01 1C 08 04 void Thermostat::process_RC300Summer2(std::shared_ptr telegram) { auto hc = heating_circuit(telegram); if (hc == nullptr) { - // telegram 0x470 see https://github.com/emsesp/EMS-ESP32/issues/2686 - if (telegram->type_id == 0x470 && telegram->message_length > 2) { - hc = heating_circuit(1); - summer2_typeids[0] = 0x470; - } else { - return; - } + return; } if (hc->statusbyte & 1) { has_update(telegram, hc->summersetmode, 0); @@ -2590,38 +2601,36 @@ bool Thermostat::set_cooling(const char * value, const int8_t id) { // set cooling delays bool Thermostat::set_coolondelay(const char * value, const int8_t id) { - auto hc = heating_circuit(id); - if (hc == nullptr) { - return false; - } - float f; if (!Helpers::value2float(value, f)) { return false; } if (model() == EMSdevice::EMS_DEVICE_FLAG_UI800) { - write_command(summer2_typeids[hc->hc()], 6, (uint8_t)(f * 4), summer2_typeids[hc->hc()]); - } else { - write_command(summer2_typeids[hc->hc()], 6, (uint8_t)f, summer2_typeids[hc->hc()]); + write_command(0x470, 6, (uint8_t)(f * 4), 0x470); + return true; } + auto hc = heating_circuit(id); + if (hc == nullptr) { + return false; + } + write_command(summer2_typeids[hc->hc()], 6, (uint8_t)f, summer2_typeids[hc->hc()]); return true; } bool Thermostat::set_cooloffdelay(const char * value, const int8_t id) { - auto hc = heating_circuit(id); - if (hc == nullptr) { - return false; - } - float f; if (!Helpers::value2float(value, f)) { return false; } if (model() == EMSdevice::EMS_DEVICE_FLAG_UI800) { - write_command(summer2_typeids[hc->hc()], 7, (uint8_t)(f * 4), summer2_typeids[hc->hc()]); - } else { - write_command(summer2_typeids[hc->hc()], 7, (uint8_t)f, summer2_typeids[hc->hc()]); + write_command(0x470, 7, (uint8_t)(f * 4), 0x470); + return true; } + auto hc = heating_circuit(id); + if (hc == nullptr) { + return false; + } + write_command(summer2_typeids[hc->hc()], 7, (uint8_t)f, summer2_typeids[hc->hc()]); return true; } @@ -3345,13 +3354,19 @@ bool Thermostat::set_mode_n(const uint8_t mode, const int8_t id) { // sets the thermostat summermode for RC300 bool Thermostat::set_summermode(const char * value, const int8_t id) { + uint8_t set; + if (model() == EMSdevice::EMS_DEVICE_FLAG_UI800) { + if (Helpers::value2enum(value, set, FL_(enum_hpoperatingmode))) { + write_command(0x470, 0, set, 0x470); + return true; + } + return false; + } auto hc = heating_circuit(id); if (hc == nullptr) { return false; } - uint8_t set; - if (is_received(summer2_typeids[hc->hc()])) { if ((hc->statusbyte & 1) && Helpers::value2enum(value, set, FL_(enum_summermode))) { write_command(summer2_typeids[hc->hc()], 0, set, summer2_typeids[hc->hc()]); @@ -3497,48 +3512,52 @@ bool Thermostat::set_boosttime(const char * value, const int8_t id) { } bool Thermostat::set_heatondelay(const char * value, const int8_t id) { - auto hc = heating_circuit(id); - if (hc == nullptr) { - return false; - } float f; if (!Helpers::value2float(value, f)) { return false; } if (model() == EMSdevice::EMS_DEVICE_FLAG_UI800) { - write_command(summer2_typeids[hc->hc()], 2, (uint8_t)(f * 4), summer2_typeids[hc->hc()]); - } else { - write_command(summer2_typeids[hc->hc()], 2, (uint8_t)f, summer2_typeids[hc->hc()]); + write_command(0x470, 2, (uint8_t)(f * 4), 0x470); + return true; } + auto hc = heating_circuit(id); + if (hc == nullptr) { + return false; + } + write_command(summer2_typeids[hc->hc()], 2, (uint8_t)f, summer2_typeids[hc->hc()]); return true; } bool Thermostat::set_heatoffdelay(const char * value, const int8_t id) { - auto hc = heating_circuit(id); - if (hc == nullptr) { - return false; - } float f; if (!Helpers::value2float(value, f)) { return false; } if (model() == EMSdevice::EMS_DEVICE_FLAG_UI800) { - write_command(summer2_typeids[hc->hc()], 3, (uint8_t)(f * 4), summer2_typeids[hc->hc()]); - } else { - write_command(summer2_typeids[hc->hc()], 3, (uint8_t)f, summer2_typeids[hc->hc()]); + write_command(0x470, 3, (uint8_t)(f * 4), 0x470); + return true; } - return true; -} - -bool Thermostat::set_instantstart(const char * value, const int8_t id) { auto hc = heating_circuit(id); if (hc == nullptr) { return false; } + write_command(summer2_typeids[hc->hc()], 3, (uint8_t)f, summer2_typeids[hc->hc()]); + return true; +} + +bool Thermostat::set_instantstart(const char * value, const int8_t id) { int v; if (!Helpers::value2number(value, v)) { return false; } + if (model() == EMSdevice::EMS_DEVICE_FLAG_UI800) { + write_command(0x470, 4, (uint8_t)v, 0x470); + return true; + } + auto hc = heating_circuit(id); + if (hc == nullptr) { + return false; + } write_command(summer2_typeids[hc->hc()], 4, (uint8_t)v, summer2_typeids[hc->hc()]); return true; } @@ -4063,6 +4082,10 @@ bool Thermostat::set_temperature(const float temperature, const uint8_t mode, co validate_typeid = set_typeids[hc->hc()]; switch (mode) { case HeatingCircuit::Mode::SUMMER: + if (model == EMSdevice::EMS_DEVICE_FLAG_UI800) { + write_command(0x470, 1, temperature, 0x470); + return true; + } if (is_received(summer2_typeids[hc->hc()])) { offset = 0x01; set_typeid = summer2_typeids[hc->hc()]; @@ -4074,6 +4097,10 @@ bool Thermostat::set_temperature(const float temperature, const uint8_t mode, co factor = 1; break; case HeatingCircuit::Mode::COOLSTART: + if (model == EMSdevice::EMS_DEVICE_FLAG_UI800) { + write_command(0x470, 5, temperature, 0x470); + return true; + } offset = 5; set_typeid = summer2_typeids[hc->hc()]; validate_typeid = set_typeid; @@ -4579,6 +4606,70 @@ void Thermostat::register_device_values() { register_device_value( DeviceValueTAG::TAG_DEVICE_DATA, &pvLowerCool_, DeviceValueType::INT8, FL_(pvLowerCool), DeviceValueUOM::K, MAKE_CF_CB(set_pvLowerCool), -5, 0); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &absent_, DeviceValueType::BOOL, FL_(absent), DeviceValueUOM::NONE, MAKE_CF_CB(set_absent)); + if (model() == EMSdevice::EMS_DEVICE_FLAG_UI800) { + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &hpoperatingmode, + DeviceValueType::ENUM, + FL_(enum_hpoperatingmode), + FL_(hpoperatingmode), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_summermode)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &summertemp, + DeviceValueType::UINT8, + FL_(summertemp), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_summertemp), + 10, + 30); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &instantstart, + DeviceValueType::UINT8, + FL_(instantstart), + DeviceValueUOM::K, + MAKE_CF_CB(set_instantstart), + 1, + 10); + register_device_value( + DeviceValueTAG::TAG_DEVICE_DATA, &coolstart, DeviceValueType::UINT8, FL_(coolstart), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_coolstart), 20, 35); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &heatondelay, + DeviceValueType::UINT8, + DeviceValueNumOp::DV_NUMOP_DIV4, + FL_(heatondelay), + DeviceValueUOM::HOURS, + MAKE_CF_CB(set_heatondelay), + 1, + 48); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &heatoffdelay, + DeviceValueType::UINT8, + DeviceValueNumOp::DV_NUMOP_DIV4, + FL_(heatoffdelay), + DeviceValueUOM::HOURS, + MAKE_CF_CB(set_heatoffdelay), + 1, + 48); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &coolondelay, + DeviceValueType::UINT8, + DeviceValueNumOp::DV_NUMOP_DIV4, + FL_(coolondelay), + DeviceValueUOM::HOURS, + MAKE_CF_CB(set_coolondelay), + 1, + 48); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &cooloffdelay, + DeviceValueType::UINT8, + DeviceValueNumOp::DV_NUMOP_DIV4, + FL_(cooloffdelay), + DeviceValueUOM::HOURS, + MAKE_CF_CB(set_cooloffdelay), + 1, + 48); + } + break; case EMSdevice::EMS_DEVICE_FLAG_RC10: register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, @@ -5034,71 +5125,16 @@ void Thermostat::register_device_values_hc(std::shared_ptrremotehum, DeviceValueType::CMD, FL_(remotehum), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_remotehum), -1, 101); } - if (model == EMSdevice::EMS_DEVICE_FLAG_UI800) { - register_device_value(tag, - &hc->heatondelay, - DeviceValueType::UINT8, - DeviceValueNumOp::DV_NUMOP_DIV4, - FL_(heatondelay), - DeviceValueUOM::HOURS, - MAKE_CF_CB(set_heatondelay), - 1, - 48); - register_device_value(tag, - &hc->heatoffdelay, - DeviceValueType::UINT8, - DeviceValueNumOp::DV_NUMOP_DIV4, - FL_(heatoffdelay), - DeviceValueUOM::HOURS, - MAKE_CF_CB(set_heatoffdelay), - 1, - 48); - register_device_value(tag, - &hc->coolondelay, - DeviceValueType::UINT8, - DeviceValueNumOp::DV_NUMOP_DIV4, - FL_(coolondelay), - DeviceValueUOM::HOURS, - MAKE_CF_CB(set_coolondelay), - 1, - 48); - register_device_value(tag, - &hc->cooloffdelay, - DeviceValueType::UINT8, - DeviceValueNumOp::DV_NUMOP_DIV4, - FL_(cooloffdelay), - DeviceValueUOM::HOURS, - MAKE_CF_CB(set_cooloffdelay), - 1, - 48); - } else { + if (model != EMSdevice::EMS_DEVICE_FLAG_UI800) { register_device_value(tag, &hc->heatondelay, DeviceValueType::UINT8, FL_(heatondelay), DeviceValueUOM::HOURS, MAKE_CF_CB(set_heatondelay), 1, 48); register_device_value(tag, &hc->heatoffdelay, DeviceValueType::UINT8, FL_(heatoffdelay), DeviceValueUOM::HOURS, MAKE_CF_CB(set_heatoffdelay), 1, 48); register_device_value(tag, &hc->coolondelay, DeviceValueType::UINT8, FL_(coolondelay), DeviceValueUOM::HOURS, MAKE_CF_CB(set_coolondelay), 1, 48); register_device_value(tag, &hc->cooloffdelay, DeviceValueType::UINT8, FL_(cooloffdelay), DeviceValueUOM::HOURS, MAKE_CF_CB(set_cooloffdelay), 1, 48); + register_device_value(tag, &hc->instantstart, DeviceValueType::UINT8, FL_(instantstart), DeviceValueUOM::K, MAKE_CF_CB(set_instantstart), 1, 10); + register_device_value(tag, &hc->coolstart, DeviceValueType::UINT8, FL_(coolstart), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_coolstart), 20, 35); } - register_device_value(tag, &hc->instantstart, DeviceValueType::UINT8, FL_(instantstart), DeviceValueUOM::K, MAKE_CF_CB(set_instantstart), 1, 10); register_device_value(tag, &hc->boost, DeviceValueType::BOOL, FL_(boost), DeviceValueUOM::NONE, MAKE_CF_CB(set_boost)); register_device_value(tag, &hc->boosttime, DeviceValueType::UINT8, FL_(boosttime), DeviceValueUOM::HOURS, MAKE_CF_CB(set_boosttime)); - register_device_value(tag, &hc->coolstart, DeviceValueType::UINT8, FL_(coolstart), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_coolstart), 20, 35); - register_device_value(tag, - &hc->coolondelay, - DeviceValueType::UINT8, - DeviceValueNumOp::DV_NUMOP_DIV4, - FL_(coolondelay), - DeviceValueUOM::HOURS, - MAKE_CF_CB(set_coolondelay), - 1, - 48); - register_device_value(tag, - &hc->cooloffdelay, - DeviceValueType::UINT8, - DeviceValueNumOp::DV_NUMOP_DIV4, - FL_(cooloffdelay), - DeviceValueUOM::HOURS, - MAKE_CF_CB(set_cooloffdelay), - 1, - 48); register_device_value(tag, &hc->switchProgMode, DeviceValueType::ENUM, diff --git a/src/devices/thermostat.h b/src/devices/thermostat.h index 0bd39bd42..e48f67a1a 100644 --- a/src/devices/thermostat.h +++ b/src/devices/thermostat.h @@ -296,6 +296,16 @@ class Thermostat : public EMSdevice { uint8_t absent_; uint8_t hasSolar_; + // BC400/UI800 telegram 0x470 + uint8_t hpoperatingmode; + uint8_t summertemp; + uint8_t heatondelay; + uint8_t heatoffdelay; + uint8_t instantstart; + uint8_t coolstart; + uint8_t coolondelay; + uint8_t cooloffdelay; + // HybridHP uint8_t hybridStrategy_; // co2 = 1, cost = 2, temperature = 3, mix = 4 int8_t switchOverTemp_; // degrees @@ -451,6 +461,7 @@ class Thermostat : public EMSdevice { void process_RC300Set2(std::shared_ptr telegram); void process_RC300Summer(std::shared_ptr telegram); void process_RC300Summer2(std::shared_ptr telegram); + void process_RC300Summer3(std::shared_ptr telegram); void process_RC300WWmode(std::shared_ptr telegram); void process_RC300WWmode2(std::shared_ptr telegram); void process_RC300WWtemp(std::shared_ptr telegram); diff --git a/src/emsesp_version.h b/src/emsesp_version.h index 41a5ebd5c..417585ea4 100644 --- a/src/emsesp_version.h +++ b/src/emsesp_version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.8.3-dev.4a" +#define EMSESP_APP_VERSION "3.8.3-dev.5"