From 65678ea73903dbe94a025d84bac79e1b7f427116 Mon Sep 17 00:00:00 2001 From: proddy Date: Mon, 24 Nov 2025 16:44:03 +0100 Subject: [PATCH 01/24] package update --- interface/package.json | 2 +- interface/pnpm-lock.yaml | 112 +++++++++++++++++++-------------------- 2 files changed, 57 insertions(+), 57 deletions(-) diff --git a/interface/package.json b/interface/package.json index fa9a90265..a298e056b 100644 --- a/interface/package.json +++ b/interface/package.json @@ -53,7 +53,7 @@ "@preact/preset-vite": "^2.10.2", "@trivago/prettier-plugin-sort-imports": "^6.0.0", "@types/node": "^24.10.1", - "@types/react": "^19.2.6", + "@types/react": "^19.2.7", "@types/react-dom": "^19.2.3", "axe-core": "^4.11.0", "concurrently": "^9.2.1", diff --git a/interface/pnpm-lock.yaml b/interface/pnpm-lock.yaml index 189e0b642..949b8853a 100644 --- a/interface/pnpm-lock.yaml +++ b/interface/pnpm-lock.yaml @@ -13,22 +13,22 @@ importers: version: 2.2.1(alova@3.3.4) '@emotion/react': specifier: ^11.14.0 - version: 11.14.0(@types/react@19.2.6)(react@19.2.0) + version: 11.14.0(@types/react@19.2.7)(react@19.2.0) '@emotion/styled': specifier: ^11.14.1 - version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.6)(react@19.2.0))(@types/react@19.2.6)(react@19.2.0) + version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.0))(@types/react@19.2.7)(react@19.2.0) '@mui/icons-material': specifier: ^7.3.5 - version: 7.3.5(@mui/material@7.3.5(@emotion/react@11.14.0(@types/react@19.2.6)(react@19.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.6)(react@19.2.0))(@types/react@19.2.6)(react@19.2.0))(@types/react@19.2.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@types/react@19.2.6)(react@19.2.0) + version: 7.3.5(@mui/material@7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.0))(@types/react@19.2.7)(react@19.2.0))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@types/react@19.2.7)(react@19.2.0) '@mui/material': specifier: ^7.3.5 - version: 7.3.5(@emotion/react@11.14.0(@types/react@19.2.6)(react@19.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.6)(react@19.2.0))(@types/react@19.2.6)(react@19.2.0))(@types/react@19.2.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.0))(@types/react@19.2.7)(react@19.2.0))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@preact/compat': specifier: ^18.3.1 version: 18.3.1(preact@10.27.2) '@table-library/react-table-library': specifier: 4.1.15 - version: 4.1.15(@emotion/react@11.14.0(@types/react@19.2.6)(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 4.1.15(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) alova: specifier: 3.3.4 version: 3.3.4 @@ -91,11 +91,11 @@ importers: specifier: ^24.10.1 version: 24.10.1 '@types/react': - specifier: ^19.2.6 - version: 19.2.6 + specifier: ^19.2.7 + version: 19.2.7 '@types/react-dom': specifier: ^19.2.3 - version: 19.2.3(@types/react@19.2.6) + version: 19.2.3(@types/react@19.2.7) axe-core: specifier: ^4.11.0 version: 4.11.0 @@ -879,8 +879,8 @@ packages: peerDependencies: '@types/react': '*' - '@types/react@19.2.6': - resolution: {integrity: sha512-p/jUvulfgU7oKtj6Xpk8cA2Y1xKTtICGpJYeJXz2YVO2UcvjQgeRMLDGfDeqeRW2Ta+0QNFwcc8X3GH8SxZz6w==} + '@types/react@19.2.7': + resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==} '@types/responselike@1.0.3': resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} @@ -1117,8 +1117,8 @@ packages: resolution: {integrity: sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==} engines: {node: '>=0.10.0'} - caniuse-lite@1.0.30001756: - resolution: {integrity: sha512-4HnCNKbMLkLdhJz3TToeVWHSnfJvPaq6vu/eRP0Ahub/07n484XHhBF5AJoSGHdVrS8tKFauUQz8Bp9P7LVx7A==} + caniuse-lite@1.0.30001757: + resolution: {integrity: sha512-r0nnL/I28Zi/yjk1el6ilj27tKcdjLsNqAOZr0yVjWPrSQyHgKI2INaEWw21bAQSv2LXRt1XuCS/GomNpWOxsQ==} caw@2.0.1: resolution: {integrity: sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==} @@ -3268,7 +3268,7 @@ snapshots: '@emotion/memoize@0.9.0': {} - '@emotion/react@11.14.0(@types/react@19.2.6)(react@19.2.0)': + '@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.0)': dependencies: '@babel/runtime': 7.28.4 '@emotion/babel-plugin': 11.13.5 @@ -3280,7 +3280,7 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 19.2.0 optionalDependencies: - '@types/react': 19.2.6 + '@types/react': 19.2.7 transitivePeerDependencies: - supports-color @@ -3294,18 +3294,18 @@ snapshots: '@emotion/sheet@1.4.0': {} - '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.6)(react@19.2.0))(@types/react@19.2.6)(react@19.2.0)': + '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.0))(@types/react@19.2.7)(react@19.2.0)': dependencies: '@babel/runtime': 7.28.4 '@emotion/babel-plugin': 11.13.5 '@emotion/is-prop-valid': 1.4.0 - '@emotion/react': 11.14.0(@types/react@19.2.6)(react@19.2.0) + '@emotion/react': 11.14.0(@types/react@19.2.7)(react@19.2.0) '@emotion/serialize': 1.3.3 '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.2.0) '@emotion/utils': 1.4.2 react: 19.2.0 optionalDependencies: - '@types/react': 19.2.6 + '@types/react': 19.2.7 transitivePeerDependencies: - supports-color @@ -3489,23 +3489,23 @@ snapshots: '@mui/core-downloads-tracker@7.3.5': {} - '@mui/icons-material@7.3.5(@mui/material@7.3.5(@emotion/react@11.14.0(@types/react@19.2.6)(react@19.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.6)(react@19.2.0))(@types/react@19.2.6)(react@19.2.0))(@types/react@19.2.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@types/react@19.2.6)(react@19.2.0)': + '@mui/icons-material@7.3.5(@mui/material@7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.0))(@types/react@19.2.7)(react@19.2.0))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@types/react@19.2.7)(react@19.2.0)': dependencies: '@babel/runtime': 7.28.4 - '@mui/material': 7.3.5(@emotion/react@11.14.0(@types/react@19.2.6)(react@19.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.6)(react@19.2.0))(@types/react@19.2.6)(react@19.2.0))(@types/react@19.2.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@mui/material': 7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.0))(@types/react@19.2.7)(react@19.2.0))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 optionalDependencies: - '@types/react': 19.2.6 + '@types/react': 19.2.7 - '@mui/material@7.3.5(@emotion/react@11.14.0(@types/react@19.2.6)(react@19.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.6)(react@19.2.0))(@types/react@19.2.6)(react@19.2.0))(@types/react@19.2.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@mui/material@7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.0))(@types/react@19.2.7)(react@19.2.0))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@babel/runtime': 7.28.4 '@mui/core-downloads-tracker': 7.3.5 - '@mui/system': 7.3.5(@emotion/react@11.14.0(@types/react@19.2.6)(react@19.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.6)(react@19.2.0))(@types/react@19.2.6)(react@19.2.0))(@types/react@19.2.6)(react@19.2.0) - '@mui/types': 7.4.8(@types/react@19.2.6) - '@mui/utils': 7.3.5(@types/react@19.2.6)(react@19.2.0) + '@mui/system': 7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.0))(@types/react@19.2.7)(react@19.2.0))(@types/react@19.2.7)(react@19.2.0) + '@mui/types': 7.4.8(@types/react@19.2.7) + '@mui/utils': 7.3.5(@types/react@19.2.7)(react@19.2.0) '@popperjs/core': 2.11.8 - '@types/react-transition-group': 4.4.12(@types/react@19.2.6) + '@types/react-transition-group': 4.4.12(@types/react@19.2.7) clsx: 2.1.1 csstype: 3.2.3 prop-types: 15.8.1 @@ -3514,20 +3514,20 @@ snapshots: react-is: 19.2.0 react-transition-group: 4.4.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0) optionalDependencies: - '@emotion/react': 11.14.0(@types/react@19.2.6)(react@19.2.0) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.6)(react@19.2.0))(@types/react@19.2.6)(react@19.2.0) - '@types/react': 19.2.6 + '@emotion/react': 11.14.0(@types/react@19.2.7)(react@19.2.0) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.0))(@types/react@19.2.7)(react@19.2.0) + '@types/react': 19.2.7 - '@mui/private-theming@7.3.5(@types/react@19.2.6)(react@19.2.0)': + '@mui/private-theming@7.3.5(@types/react@19.2.7)(react@19.2.0)': dependencies: '@babel/runtime': 7.28.4 - '@mui/utils': 7.3.5(@types/react@19.2.6)(react@19.2.0) + '@mui/utils': 7.3.5(@types/react@19.2.7)(react@19.2.0) prop-types: 15.8.1 react: 19.2.0 optionalDependencies: - '@types/react': 19.2.6 + '@types/react': 19.2.7 - '@mui/styled-engine@7.3.5(@emotion/react@11.14.0(@types/react@19.2.6)(react@19.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.6)(react@19.2.0))(@types/react@19.2.6)(react@19.2.0))(react@19.2.0)': + '@mui/styled-engine@7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.0))(@types/react@19.2.7)(react@19.2.0))(react@19.2.0)': dependencies: '@babel/runtime': 7.28.4 '@emotion/cache': 11.14.0 @@ -3537,42 +3537,42 @@ snapshots: prop-types: 15.8.1 react: 19.2.0 optionalDependencies: - '@emotion/react': 11.14.0(@types/react@19.2.6)(react@19.2.0) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.6)(react@19.2.0))(@types/react@19.2.6)(react@19.2.0) + '@emotion/react': 11.14.0(@types/react@19.2.7)(react@19.2.0) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.0))(@types/react@19.2.7)(react@19.2.0) - '@mui/system@7.3.5(@emotion/react@11.14.0(@types/react@19.2.6)(react@19.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.6)(react@19.2.0))(@types/react@19.2.6)(react@19.2.0))(@types/react@19.2.6)(react@19.2.0)': + '@mui/system@7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.0))(@types/react@19.2.7)(react@19.2.0))(@types/react@19.2.7)(react@19.2.0)': dependencies: '@babel/runtime': 7.28.4 - '@mui/private-theming': 7.3.5(@types/react@19.2.6)(react@19.2.0) - '@mui/styled-engine': 7.3.5(@emotion/react@11.14.0(@types/react@19.2.6)(react@19.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.6)(react@19.2.0))(@types/react@19.2.6)(react@19.2.0))(react@19.2.0) - '@mui/types': 7.4.8(@types/react@19.2.6) - '@mui/utils': 7.3.5(@types/react@19.2.6)(react@19.2.0) + '@mui/private-theming': 7.3.5(@types/react@19.2.7)(react@19.2.0) + '@mui/styled-engine': 7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.0))(@types/react@19.2.7)(react@19.2.0))(react@19.2.0) + '@mui/types': 7.4.8(@types/react@19.2.7) + '@mui/utils': 7.3.5(@types/react@19.2.7)(react@19.2.0) clsx: 2.1.1 csstype: 3.2.3 prop-types: 15.8.1 react: 19.2.0 optionalDependencies: - '@emotion/react': 11.14.0(@types/react@19.2.6)(react@19.2.0) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.6)(react@19.2.0))(@types/react@19.2.6)(react@19.2.0) - '@types/react': 19.2.6 + '@emotion/react': 11.14.0(@types/react@19.2.7)(react@19.2.0) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.0))(@types/react@19.2.7)(react@19.2.0) + '@types/react': 19.2.7 - '@mui/types@7.4.8(@types/react@19.2.6)': + '@mui/types@7.4.8(@types/react@19.2.7)': dependencies: '@babel/runtime': 7.28.4 optionalDependencies: - '@types/react': 19.2.6 + '@types/react': 19.2.7 - '@mui/utils@7.3.5(@types/react@19.2.6)(react@19.2.0)': + '@mui/utils@7.3.5(@types/react@19.2.7)(react@19.2.0)': dependencies: '@babel/runtime': 7.28.4 - '@mui/types': 7.4.8(@types/react@19.2.6) + '@mui/types': 7.4.8(@types/react@19.2.7) '@types/prop-types': 15.7.15 clsx: 2.1.1 prop-types: 15.8.1 react: 19.2.0 react-is: 19.2.0 optionalDependencies: - '@types/react': 19.2.6 + '@types/react': 19.2.7 '@noble/hashes@1.8.0': {} @@ -3707,9 +3707,9 @@ snapshots: '@sindresorhus/is@0.7.0': {} - '@table-library/react-table-library@4.1.15(@emotion/react@11.14.0(@types/react@19.2.6)(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@table-library/react-table-library@4.1.15(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@emotion/react': 11.14.0(@types/react@19.2.6)(react@19.2.0) + '@emotion/react': 11.14.0(@types/react@19.2.7)(react@19.2.0) clsx: 1.1.1 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) @@ -3786,15 +3786,15 @@ snapshots: '@types/prop-types@15.7.15': {} - '@types/react-dom@19.2.3(@types/react@19.2.6)': + '@types/react-dom@19.2.3(@types/react@19.2.7)': dependencies: - '@types/react': 19.2.6 + '@types/react': 19.2.7 - '@types/react-transition-group@4.4.12(@types/react@19.2.6)': + '@types/react-transition-group@4.4.12(@types/react@19.2.7)': dependencies: - '@types/react': 19.2.6 + '@types/react': 19.2.7 - '@types/react@19.2.6': + '@types/react@19.2.7': dependencies: csstype: 3.2.3 @@ -4021,7 +4021,7 @@ snapshots: browserslist@4.28.0: dependencies: baseline-browser-mapping: 2.8.31 - caniuse-lite: 1.0.30001756 + caniuse-lite: 1.0.30001757 electron-to-chromium: 1.5.259 node-releases: 2.0.27 update-browserslist-db: 1.1.4(browserslist@4.28.0) @@ -4080,7 +4080,7 @@ snapshots: camelcase@2.1.1: {} - caniuse-lite@1.0.30001756: {} + caniuse-lite@1.0.30001757: {} caw@2.0.1: dependencies: From 8b90036c110d353d2833ef6731c28641c75f5ae3 Mon Sep 17 00:00:00 2001 From: proddy Date: Mon, 24 Nov 2025 16:44:13 +0100 Subject: [PATCH 02/24] fixed uart0 for esp chips --- src/core/system.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/core/system.cpp b/src/core/system.cpp index d0d61fc31..c41a55082 100644 --- a/src/core/system.cpp +++ b/src/core/system.cpp @@ -2308,7 +2308,6 @@ std::vector System::string_range_to_vector(const std::string & range) { // initialize a list of valid GPIOs based on the ESP32 board // notes: // - we always allow 0, which is used to indicate Dallas or LED is disabled -// - GPIO 1 and 3 are disabled for Serial (UART0's TX0, RX0) // - we also allow input only pins are accepted (34-39) on some boards // - and allow pins 33-38 for octal SPI for 32M vchip version on some boards void System::set_valid_system_gpios() { @@ -2318,13 +2317,13 @@ void System::set_valid_system_gpios() { // get free gpios based on board/platform type #if CONFIG_IDF_TARGET_ESP32C3 // https://www.wemos.cc/en/latest/c3/c3_mini.html - valid_system_gpios_ = string_range_to_vector("0-10"); + valid_system_gpios_ = string_range_to_vector("0-10"); // UART0=20,21 #elif CONFIG_IDF_TARGET_ESP32S2 - valid_system_gpios_ = string_range_to_vector("0, 2, 4-14, 19, 20, 21, 33-38, 45, 46"); + valid_system_gpios_ = string_range_to_vector("0-14, 19, 20, 21, 33-38, 45, 46"); // UART0=43,44 #elif CONFIG_IDF_TARGET_ESP32S3 - valid_system_gpios_ = string_range_to_vector("0, 2, 4-14, 17, 18, 21, 33-38, 45, 46"); + valid_system_gpios_ = string_range_to_vector("0-14, 17, 18, 21, 33-38, 45, 46"); // UART0=43,44 #elif CONFIG_IDF_TARGET_ESP32 || defined(EMSESP_STANDALONE) - valid_system_gpios_ = string_range_to_vector("0, 2, 4, 5, 12-19, 23, 25-27, 32-39"); + valid_system_gpios_ = string_range_to_vector("0, 2, 4, 5, 12-19, 23, 25-27, 32-39"); // UART0=1,3 #else #endif From 58da0d97785918077caeaf3a6986b719bc7d196a Mon Sep 17 00:00:00 2001 From: proddy Date: Mon, 24 Nov 2025 16:57:55 +0100 Subject: [PATCH 03/24] update --- CHANGELOG_LATEST.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index 2d328cea4..a30b2351e 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -68,4 +68,5 @@ For more details go to [docs.emsesp.org](https://docs.emsesp.org/). - place system message command in side scheduler loop to reduce stack memory usage by 2KB - syslog mark interval set to 1 hour - handle process_telegram in oneloop -- improved GPIO validation in Analog Sensors and System settings +- improved GPIO validation for Analog Sensors and System GPIOs +- entities with no values are greyed out in the Web UI in the Customization page From c2ce54c2a7beee87d115c6d3abf85b44d920ec04 Mon Sep 17 00:00:00 2001 From: proddy Date: Mon, 24 Nov 2025 16:58:06 +0100 Subject: [PATCH 04/24] adjust gpio for ESP32 boards --- src/core/system.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/core/system.cpp b/src/core/system.cpp index c41a55082..472243dae 100644 --- a/src/core/system.cpp +++ b/src/core/system.cpp @@ -2306,10 +2306,7 @@ std::vector System::string_range_to_vector(const std::string & range) { } // initialize a list of valid GPIOs based on the ESP32 board -// notes: -// - we always allow 0, which is used to indicate Dallas or LED is disabled -// - we also allow input only pins are accepted (34-39) on some boards -// - and allow pins 33-38 for octal SPI for 32M vchip version on some boards +// note: we always allow 0, which is used to indicate Dallas or LED is disabled void System::set_valid_system_gpios() { valid_system_gpios_.clear(); // reset system list used_gpios_.clear(); // reset used list @@ -2319,11 +2316,19 @@ void System::set_valid_system_gpios() { // https://www.wemos.cc/en/latest/c3/c3_mini.html valid_system_gpios_ = string_range_to_vector("0-10"); // UART0=20,21 #elif CONFIG_IDF_TARGET_ESP32S2 - valid_system_gpios_ = string_range_to_vector("0-14, 19, 20, 21, 33-38, 45, 46"); // UART0=43,44 + // 43 and 44 are UART0 pins + // 38 and 39 are strapping pins, input only + valid_system_gpios_ = string_range_to_vector("0-14, 19, 20, 21, 33-37, 45, 46"); #elif CONFIG_IDF_TARGET_ESP32S3 - valid_system_gpios_ = string_range_to_vector("0-14, 17, 18, 21, 33-38, 45, 46"); // UART0=43,44 + // 43 and 44 are UART0 pins + // 33-37 for Octal SPI (SPIIO4 through SPIIO7 and SPIDQS) + // 38 and 39 are input only + // 45 and 36 are strapping pins, input only + valid_system_gpios_ = string_range_to_vector("0-14, 17, 18, 21, 33-39, 45, 46"); #elif CONFIG_IDF_TARGET_ESP32 || defined(EMSESP_STANDALONE) - valid_system_gpios_ = string_range_to_vector("0, 2, 4, 5, 12-19, 23, 25-27, 32-39"); // UART0=1,3 + // 1 and 3 are UART0 pins + // 32-39 is ADC1, input only + valid_system_gpios_ = string_range_to_vector("0, 2, 4, 5, 12-19, 23, 25-27, 32-39"); #else #endif From 658c613c4e8e6bc1696edc5459ef1d6d98976a92 Mon Sep 17 00:00:00 2001 From: proddy Date: Mon, 24 Nov 2025 22:12:24 +0100 Subject: [PATCH 05/24] init data with 0, no difference really --- src/web/WebSettingsService.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/web/WebSettingsService.cpp b/src/web/WebSettingsService.cpp index 35ff61b4e..89002c900 100644 --- a/src/web/WebSettingsService.cpp +++ b/src/web/WebSettingsService.cpp @@ -422,7 +422,7 @@ void WebSettings::set_board_profile(WebSettings & settings) { // load the board profile into the data vector // 0=led, 1=dallas, 2=rx, 3=tx, 4=button, 5=phy_type, 6=eth_power, 7=eth_phy_addr, 8=eth_clock_mode, 9=led_type - std::vector data(10, 255); // initialize with 255 for all values + std::vector data(10, 0); // initialize with 0 for all values if (settings.board_profile != "default") { if (!System::load_board_profile(data, settings.board_profile.c_str())) { #if defined(EMSESP_DEBUG) From 574cc8ad3314eb62eef07275fa7b6a1d32c986dd Mon Sep 17 00:00:00 2001 From: proddy Date: Mon, 24 Nov 2025 22:12:41 +0100 Subject: [PATCH 06/24] error message text change --- src/core/command.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/command.cpp b/src/core/command.cpp index aee649dd6..0f1b186d8 100644 --- a/src/core/command.cpp +++ b/src/core/command.cpp @@ -413,7 +413,7 @@ uint8_t Command::call(const uint8_t device_type, const char * command, const cha } } - std::string err = "no entity '" + std::string(cmd) + "' in " + dname; + std::string err = "no '" + std::string(cmd) + "' in " + dname; output["message"] = err; LOG_WARNING("Command failed: %s", err.c_str()); } From 5f67934f268057f78f9b9b0c98a017a26e930a4f Mon Sep 17 00:00:00 2001 From: proddy Date: Mon, 24 Nov 2025 22:12:46 +0100 Subject: [PATCH 07/24] updated --- test/test_api/test_api.h | 66 +++++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 34 deletions(-) diff --git a/test/test_api/test_api.h b/test/test_api/test_api.h index 69fd5099c..0d8b89fca 100644 --- a/test/test_api/test_api.h +++ b/test/test_api/test_api.h @@ -170,14 +170,14 @@ void test_21() { "\"cleanSession\":false,\"entityFormat\":1,\"base\":\"ems-esp\",\"discoveryPrefix\":\"homeassistant\",\"discoveryType\":0,\"nestedFormat\":1," "\"haEnabled\":true,\"mqttQos\":0,\"mqttRetain\":false,\"publishTimeHeartbeat\":60,\"publishTimeBoiler\":10,\"publishTimeThermostat\":10," "\"publishTimeSolar\":10,\"publishTimeMixer\":10,\"publishTimeWater\":0,\"publishTimeOther\":10,\"publishTimeSensor\":10,\"publishSingle\":false," - "\"publish2command\":false,\"sendResponse\":false},\"syslog\":{\"enabled\":false},\"sensor\":{\"temperatureSensors\":3,\"temperatureSensorReads\":0," - "\"temperatureSensorFails\":0,\"analogSensors\":5,\"analogSensorReads\":0,\"analogSensorFails\":0},\"api\":{\"APICalls\":0,\"APIFails\":0},\"bus\":{" - "\"busStatus\":\"connected\",\"busProtocol\":\"Buderus\",\"busTelegramsReceived\":8,\"busReads\":0,\"busWrites\":0,\"busIncompleteTelegrams\":0," - "\"busReadsFailed\":0,\"busWritesFailed\":0,\"busRxLineQuality\":100,\"busTxLineQuality\":100},\"settings\":{\"boardProfile\":\"default\",\"locale\":" - "\"en\",\"txMode\":8,\"emsBusID\":11,\"showerTimer\":false,\"showerMinDuration\":180,\"showerAlert\":false,\"hideLed\":false,\"noTokenApi\":false," - "\"readonlyMode\":false,\"fahrenheit\":false,\"dallasParasite\":false,\"boolFormat\":1,\"boolDashboard\":1,\"enumFormat\":1,\"analogEnabled\":true," - "\"telnetEnabled\":true,\"maxWebLogBuffer\":25,\"modbusEnabled\":false,\"forceHeatingOff\":false,\"developerMode\":false},\"devices\":[{\"type\":" - "\"boiler\",\"name\":\"My Custom " + "\"publish2command\":false,\"sendResponse\":false},\"syslog\":{\"enabled\":false},\"sensor\":{\"analogSensors\":5,\"analogSensorReads\":0," + "\"analogSensorFails\":0},\"api\":{\"APICalls\":0,\"APIFails\":0},\"bus\":{\"busStatus\":\"connected\",\"busProtocol\":\"Buderus\"," + "\"busTelegramsReceived\":8,\"busReads\":0,\"busWrites\":0,\"busIncompleteTelegrams\":0,\"busReadsFailed\":0,\"busWritesFailed\":0," + "\"busRxLineQuality\":100,\"busTxLineQuality\":100},\"settings\":{\"boardProfile\":\"default\",\"locale\":\"en\",\"txMode\":8,\"emsBusID\":11," + "\"showerTimer\":false,\"showerMinDuration\":180,\"showerAlert\":false,\"hideLed\":false,\"noTokenApi\":false,\"readonlyMode\":false,\"fahrenheit\":" + "false,\"dallasParasite\":false,\"boolFormat\":1,\"boolDashboard\":1,\"enumFormat\":1,\"analogEnabled\":true,\"telnetEnabled\":true," + "\"maxWebLogBuffer\":25,\"modbusEnabled\":false,\"forceHeatingOff\":false,\"developerMode\":false},\"devices\":[{\"type\":\"boiler\",\"name\":\"My " + "Custom " "Boiler\",\"deviceID\":\"0x08\",\"productID\":123,\"brand\":\"\",\"version\":\"01.00\",\"entities\":39,\"handlersReceived\":\"0x18\"," "\"handlersFetched\":\"0x14 0x33\",\"handlersPending\":\"0xBF 0x10 0x11 0xC2 0xC6 0x15 0x1C 0x19 0x1A 0x35 0x34 0x2A 0xD1 0xE3 0xE4 0xE5 0xE9 0x02E0 " "0x2E " @@ -198,14 +198,14 @@ void test_22() { "\"cleanSession\":false,\"entityFormat\":1,\"base\":\"ems-esp\",\"discoveryPrefix\":\"homeassistant\",\"discoveryType\":0,\"nestedFormat\":1," "\"haEnabled\":true,\"mqttQos\":0,\"mqttRetain\":false,\"publishTimeHeartbeat\":60,\"publishTimeBoiler\":10,\"publishTimeThermostat\":10," "\"publishTimeSolar\":10,\"publishTimeMixer\":10,\"publishTimeWater\":0,\"publishTimeOther\":10,\"publishTimeSensor\":10,\"publishSingle\":false," - "\"publish2command\":false,\"sendResponse\":false},\"syslog\":{\"enabled\":false},\"sensor\":{\"temperatureSensors\":3,\"temperatureSensorReads\":0," - "\"temperatureSensorFails\":0,\"analogSensors\":5,\"analogSensorReads\":0,\"analogSensorFails\":0},\"api\":{\"APICalls\":0,\"APIFails\":0},\"bus\":{" - "\"busStatus\":\"connected\",\"busProtocol\":\"Buderus\",\"busTelegramsReceived\":8,\"busReads\":0,\"busWrites\":0,\"busIncompleteTelegrams\":0," - "\"busReadsFailed\":0,\"busWritesFailed\":0,\"busRxLineQuality\":100,\"busTxLineQuality\":100},\"settings\":{\"boardProfile\":\"default\",\"locale\":" - "\"en\",\"txMode\":8,\"emsBusID\":11,\"showerTimer\":false,\"showerMinDuration\":180,\"showerAlert\":false,\"hideLed\":false,\"noTokenApi\":false," - "\"readonlyMode\":false,\"fahrenheit\":false,\"dallasParasite\":false,\"boolFormat\":1,\"boolDashboard\":1,\"enumFormat\":1,\"analogEnabled\":true," - "\"telnetEnabled\":true,\"maxWebLogBuffer\":25,\"modbusEnabled\":false,\"forceHeatingOff\":false,\"developerMode\":false},\"devices\":[{\"type\":" - "\"boiler\",\"name\":\"My Custom " + "\"publish2command\":false,\"sendResponse\":false},\"syslog\":{\"enabled\":false},\"sensor\":{\"analogSensors\":5,\"analogSensorReads\":0," + "\"analogSensorFails\":0},\"api\":{\"APICalls\":0,\"APIFails\":0},\"bus\":{\"busStatus\":\"connected\",\"busProtocol\":\"Buderus\"," + "\"busTelegramsReceived\":8,\"busReads\":0,\"busWrites\":0,\"busIncompleteTelegrams\":0,\"busReadsFailed\":0,\"busWritesFailed\":0," + "\"busRxLineQuality\":100,\"busTxLineQuality\":100},\"settings\":{\"boardProfile\":\"default\",\"locale\":\"en\",\"txMode\":8,\"emsBusID\":11," + "\"showerTimer\":false,\"showerMinDuration\":180,\"showerAlert\":false,\"hideLed\":false,\"noTokenApi\":false,\"readonlyMode\":false,\"fahrenheit\":" + "false,\"dallasParasite\":false,\"boolFormat\":1,\"boolDashboard\":1,\"enumFormat\":1,\"analogEnabled\":true,\"telnetEnabled\":true," + "\"maxWebLogBuffer\":25,\"modbusEnabled\":false,\"forceHeatingOff\":false,\"developerMode\":false},\"devices\":[{\"type\":\"boiler\",\"name\":\"My " + "Custom " "Boiler\",\"deviceID\":\"0x08\",\"productID\":123,\"brand\":\"\",\"version\":\"01.00\",\"entities\":39,\"handlersReceived\":\"0x18\"," "\"handlersFetched\":\"0x14 0x33\",\"handlersPending\":\"0xBF 0x10 0x11 0xC2 0xC6 0x15 0x1C 0x19 0x1A 0x35 0x34 0x2A 0xD1 0xE3 0xE4 0xE5 0xE9 0x02E0 " "0x2E " @@ -250,29 +250,27 @@ void test_28() { } void test_29() { - auto expected_response = "[{\"test_tempsensor1\":12.3,\"test_tempsensor2\":45.6,\"gateway_temperature\":28.1}]"; + auto expected_response = "[{\"message\":\"unknown device temperaturesensor\"}]"; TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/temperaturesensor")); } void test_30() { - auto expected_response = "[{\"test_tempsensor1\":12.3,\"test_tempsensor2\":45.6,\"gateway_temperature\":28.1}]"; + auto expected_response = "[{\"message\":\"unknown device temperaturesensor\"}]"; TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/temperaturesensor/info")); } void test_31() { - auto expected_response = "[{\"id\":\"0B_0C0D_0E0F_1011\",\"name\":\"test_tempsensor2\",\"fullname\":\"test_tempsensor2\",\"value\":45.6,\"type\":" - "\"number\",\"uom\":\"°C\",\"readable\":true,\"writeable\":false,\"visible\":true,\"is_system\":false}]"; + auto expected_response = "[{\"message\":\"unknown device temperaturesensor\"}]"; TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/temperaturesensor/test_tempsensor2")); } void test_32() { - auto expected_response = "[{\"id\":\"0B_0C0D_0E0F_1011\",\"name\":\"test_tempsensor2\",\"fullname\":\"test_tempsensor2\",\"value\":45.6,\"type\":" - "\"number\",\"uom\":\"°C\",\"readable\":true,\"writeable\":false,\"visible\":true,\"is_system\":false}]"; + auto expected_response = "[{\"message\":\"unknown device temperaturesensor\"}]"; TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/temperaturesensor/0B_0C0D_0E0F_1011")); } void test_33() { - auto expected_response = "[{\"api_data\":\"45.6\"}]"; + auto expected_response = "[{\"message\":\"unknown device temperaturesensor\"}]"; TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/temperaturesensor/test_tempsensor2/value")); } @@ -314,22 +312,22 @@ void test_40() { } void test_41() { - auto expected_response = "[{\"message\":\"no entity 'settings' in system\"}]"; + auto expected_response = "[{\"message\":\"no 'settings' in system\"}]"; TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/system/settings/locale2")); } void test_42() { - auto expected_response = "[{\"message\":\"no entity 'settings2' in system\"}]"; + auto expected_response = "[{\"message\":\"no 'settings2' in system\"}]"; TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/system/settings2")); } void test_43() { - auto expected_response = "[{\"message\":\"no entity 'settings2' in system\"}]"; + auto expected_response = "[{\"message\":\"no 'settings2' in system\"}]"; TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/system/settings2/locale2")); } void test_44() { - auto expected_response = "[{\"message\":\"no entity 'test_scheduler2' in scheduler\"}]"; + auto expected_response = "[{\"message\":\"no 'test_scheduler2' in scheduler\"}]"; TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/scheduler/test_scheduler2")); } @@ -339,12 +337,12 @@ void test_45() { } void test_46() { - auto expected_response = "[{\"message\":\"no entity 'test_scheduler2' in scheduler\"}]"; + auto expected_response = "[{\"message\":\"no 'test_scheduler2' in scheduler\"}]"; TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/scheduler/test_scheduler2/val2")); } void test_47() { - auto expected_response = "[{\"message\":\"no entity 'test_seltemp2' in custom\"}]"; + auto expected_response = "[{\"message\":\"no 'test_seltemp2' in custom\"}]"; TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/custom/test_seltemp2")); } @@ -354,17 +352,17 @@ void test_48() { } void test_49() { - auto expected_response = "[{\"message\":\"no entity 'test_sensor20' in temperaturesensor\"}]"; + auto expected_response = "[{\"message\":\"unknown device temperaturesensor\"}]"; TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/temperaturesensor/test_sensor20")); } void test_50() { - auto expected_response = "[{\"message\":\"no entity '0b_0c0d_0e0f_xxxx' in temperaturesensor\"}]"; + auto expected_response = "[{\"message\":\"unknown device temperaturesensor\"}]"; TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/temperaturesensor/0B_0C0D_0E0F_XXXX")); } void test_51() { - auto expected_response = "[{\"message\":\"no attribute 'bad' in test_tempsensor2\"}]"; + auto expected_response = "[{\"message\":\"unknown device temperaturesensor\"}]"; TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/temperaturesensor/test_tempsensor2/bad")); } @@ -374,12 +372,12 @@ void test_52() { } void test_53() { - auto expected_response = "[{\"message\":\"no entity 'test_analog10' in analogsensor\"}]"; + auto expected_response = "[{\"message\":\"no 'test_analog10' in analogsensor\"}]"; TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/analogsensor/test_analog10")); } void test_54() { - auto expected_response = "[{\"message\":\"no entity 'test_analog10' in analogsensor\"}]"; + auto expected_response = "[{\"message\":\"no 'test_analog10' in analogsensor\"}]"; TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/analogsensor/test_analog10/bad2")); } From 7018139289e119694d08719bde4efa9b923d2ce6 Mon Sep 17 00:00:00 2001 From: proddy Date: Mon, 24 Nov 2025 22:34:34 +0100 Subject: [PATCH 08/24] update version data --- mock-api/restServer.ts | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/mock-api/restServer.ts b/mock-api/restServer.ts index 13de857cf..b0157f7fe 100644 --- a/mock-api/restServer.ts +++ b/mock-api/restServer.ts @@ -116,8 +116,8 @@ let system_status = { let DEV_VERSION_IS_UPGRADEABLE: boolean; let STABLE_VERSION_IS_UPGRADEABLE: boolean; let THIS_VERSION: string; -let LATEST_STABLE_VERSION = '3.7.2'; -let LATEST_DEV_VERSION = '3.7.3-dev.6'; +let LATEST_STABLE_VERSION = '3.7.3'; +let LATEST_DEV_VERSION = '3.7.4-dev.2'; // scenarios for testing versioning let version_test = 0; // on latest stable, or switch to dev @@ -142,19 +142,19 @@ switch (version_test as number) { break; case 2: // upgrade an older stable to latest stable or switch to latest dev - THIS_VERSION = '3.6.5'; + THIS_VERSION = '3.7.2'; STABLE_VERSION_IS_UPGRADEABLE = true; DEV_VERSION_IS_UPGRADEABLE = true; break; case 3: // upgrade dev to latest, or switch to stable - THIS_VERSION = '3.7.3-dev.2'; + THIS_VERSION = '3.7.4-dev.3'; STABLE_VERSION_IS_UPGRADEABLE = false; DEV_VERSION_IS_UPGRADEABLE = true; break; case 4: // downgrade to an older dev, or switch back to stable - THIS_VERSION = '3.7.3-dev.9'; + THIS_VERSION = '3.7.3-dev.1'; STABLE_VERSION_IS_UPGRADEABLE = true; DEV_VERSION_IS_UPGRADEABLE = false; break; @@ -276,10 +276,10 @@ function updateMask(entity: any, de: any, dd: any) { const old_custom_name = dd.nodes[dd_objIndex].cn; console.log( 'comparing names, old (' + - old_custom_name + - ') with new (' + - new_custom_name + - ')' + old_custom_name + + ') with new (' + + new_custom_name + + ')' ); if (old_custom_name !== new_custom_name) { changed = true; @@ -375,15 +375,15 @@ function check_upgrade(version: string) { console.log( 'Upgrade this version (' + - THIS_VERSION + - ') to dev (' + - dev_version + - ') is ' + - (DEV_VERSION_IS_UPGRADEABLE ? 'YES' : 'NO') + - ' and to stable (' + - stable_version + - ') is ' + - (STABLE_VERSION_IS_UPGRADEABLE ? 'YES' : 'NO') + THIS_VERSION + + ') to dev (' + + dev_version + + ') is ' + + (DEV_VERSION_IS_UPGRADEABLE ? 'YES' : 'NO') + + ' and to stable (' + + stable_version + + ') is ' + + (STABLE_VERSION_IS_UPGRADEABLE ? 'YES' : 'NO') ); data = { emsesp_version: THIS_VERSION, From 2375633bca7cc62e0b76235a63bd39bbe50eb95c Mon Sep 17 00:00:00 2001 From: proddy Date: Mon, 24 Nov 2025 22:35:07 +0100 Subject: [PATCH 09/24] don't show confusing release type checkboxes --- interface/src/app/status/Version.tsx | 47 +++------------------------- 1 file changed, 5 insertions(+), 42 deletions(-) diff --git a/interface/src/app/status/Version.tsx b/interface/src/app/status/Version.tsx index 492ebce2c..ace627042 100644 --- a/interface/src/app/status/Version.tsx +++ b/interface/src/app/status/Version.tsx @@ -511,48 +511,11 @@ const Version = () => { {LL.RELEASE_TYPE()} - - - } - slotProps={{ - typography: { - color: 'grey' - } - }} - checked={!isDev} - label={LL.STABLE()} - sx={{ '& .MuiSvgIcon-root': { fontSize: 16 } }} - /> - - } - slotProps={{ - typography: { - color: 'grey' - } - }} - checked={isDev} - label={LL.DEVELOPMENT()} - sx={{ '& .MuiSvgIcon-root': { fontSize: 16 } }} - /> - + {isDev ? ( + {LL.DEVELOPMENT()} + ) : ( + {LL.STABLE()} + )} {internetLive ? ( From feed534be52dbf6b2bbeb6bc48924a02eaf36a1c Mon Sep 17 00:00:00 2001 From: proddy Date: Mon, 24 Nov 2025 22:37:23 +0100 Subject: [PATCH 10/24] package update --- interface/package.json | 2 +- interface/pnpm-lock.yaml | 131 +++++++++++++++++++-------------------- 2 files changed, 66 insertions(+), 67 deletions(-) diff --git a/interface/package.json b/interface/package.json index a298e056b..9741c12a2 100644 --- a/interface/package.json +++ b/interface/package.json @@ -62,7 +62,7 @@ "prettier": "^3.6.2", "rollup-plugin-visualizer": "^6.0.5", "terser": "^5.44.1", - "typescript-eslint": "^8.47.0", + "typescript-eslint": "^8.48.0", "vite": "^7.2.4", "vite-plugin-imagemin": "^0.6.1", "vite-tsconfig-paths": "^5.1.4" diff --git a/interface/pnpm-lock.yaml b/interface/pnpm-lock.yaml index 949b8853a..10807a9e4 100644 --- a/interface/pnpm-lock.yaml +++ b/interface/pnpm-lock.yaml @@ -118,8 +118,8 @@ importers: specifier: ^5.44.1 version: 5.44.1 typescript-eslint: - specifier: ^8.47.0 - version: 8.47.0(eslint@9.39.1)(typescript@5.9.3) + specifier: ^8.48.0 + version: 8.48.0(eslint@9.39.1)(typescript@5.9.3) vite: specifier: ^7.2.4 version: 7.2.4(@types/node@24.10.1)(terser@5.44.1) @@ -888,63 +888,63 @@ packages: '@types/svgo@2.6.4': resolution: {integrity: sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==} - '@typescript-eslint/eslint-plugin@8.47.0': - resolution: {integrity: sha512-fe0rz9WJQ5t2iaLfdbDc9T80GJy0AeO453q8C3YCilnGozvOyCG5t+EZtg7j7D88+c3FipfP/x+wzGnh1xp8ZA==} + '@typescript-eslint/eslint-plugin@8.48.0': + resolution: {integrity: sha512-XxXP5tL1txl13YFtrECECQYeZjBZad4fyd3cFV4a19LkAY/bIp9fev3US4S5fDVV2JaYFiKAZ/GRTOLer+mbyQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.47.0 + '@typescript-eslint/parser': ^8.48.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.47.0': - resolution: {integrity: sha512-lJi3PfxVmo0AkEY93ecfN+r8SofEqZNGByvHAI3GBLrvt1Cw6H5k1IM02nSzu0RfUafr2EvFSw0wAsZgubNplQ==} + '@typescript-eslint/parser@8.48.0': + resolution: {integrity: sha512-jCzKdm/QK0Kg4V4IK/oMlRZlY+QOcdjv89U2NgKHZk1CYTj82/RVSx1mV/0gqCVMJ/DA+Zf/S4NBWNF8GQ+eqQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.47.0': - resolution: {integrity: sha512-2X4BX8hUeB5JcA1TQJ7GjcgulXQ+5UkNb0DL8gHsHUHdFoiCTJoYLTpib3LtSDPZsRET5ygN4qqIWrHyYIKERA==} + '@typescript-eslint/project-service@8.48.0': + resolution: {integrity: sha512-Ne4CTZyRh1BecBf84siv42wv5vQvVmgtk8AuiEffKTUo3DrBaGYZueJSxxBZ8fjk/N3DrgChH4TOdIOwOwiqqw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.47.0': - resolution: {integrity: sha512-a0TTJk4HXMkfpFkL9/WaGTNuv7JWfFTQFJd6zS9dVAjKsojmv9HT55xzbEpnZoY+VUb+YXLMp+ihMLz/UlZfDg==} + '@typescript-eslint/scope-manager@8.48.0': + resolution: {integrity: sha512-uGSSsbrtJrLduti0Q1Q9+BF1/iFKaxGoQwjWOIVNJv0o6omrdyR8ct37m4xIl5Zzpkp69Kkmvom7QFTtue89YQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.47.0': - resolution: {integrity: sha512-ybUAvjy4ZCL11uryalkKxuT3w3sXJAuWhOoGS3T/Wu+iUu1tGJmk5ytSY8gbdACNARmcYEB0COksD2j6hfGK2g==} + '@typescript-eslint/tsconfig-utils@8.48.0': + resolution: {integrity: sha512-WNebjBdFdyu10sR1M4OXTt2OkMd5KWIL+LLfeH9KhgP+jzfDV/LI3eXzwJ1s9+Yc0Kzo2fQCdY/OpdusCMmh6w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.47.0': - resolution: {integrity: sha512-QC9RiCmZ2HmIdCEvhd1aJELBlD93ErziOXXlHEZyuBo3tBiAZieya0HLIxp+DoDWlsQqDawyKuNEhORyku+P8A==} + '@typescript-eslint/type-utils@8.48.0': + resolution: {integrity: sha512-zbeVaVqeXhhab6QNEKfK96Xyc7UQuoFWERhEnj3mLVnUWrQnv15cJNseUni7f3g557gm0e46LZ6IJ4NJVOgOpw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.47.0': - resolution: {integrity: sha512-nHAE6bMKsizhA2uuYZbEbmp5z2UpffNrPEqiKIeN7VsV6UY/roxanWfoRrf6x/k9+Obf+GQdkm0nPU+vnMXo9A==} + '@typescript-eslint/types@8.48.0': + resolution: {integrity: sha512-cQMcGQQH7kwKoVswD1xdOytxQR60MWKM1di26xSUtxehaDs/32Zpqsu5WJlXTtTTqyAVK8R7hvsUnIXRS+bjvA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.47.0': - resolution: {integrity: sha512-k6ti9UepJf5NpzCjH31hQNLHQWupTRPhZ+KFF8WtTuTpy7uHPfeg2NM7cP27aCGajoEplxJDFVCEm9TGPYyiVg==} + '@typescript-eslint/typescript-estree@8.48.0': + resolution: {integrity: sha512-ljHab1CSO4rGrQIAyizUS6UGHHCiAYhbfcIZ1zVJr5nMryxlXMVWS3duFPSKvSUbFPwkXMFk1k0EMIjub4sRRQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.47.0': - resolution: {integrity: sha512-g7XrNf25iL4TJOiPqatNuaChyqt49a/onq5YsJ9+hXeugK+41LVg7AxikMfM02PC6jbNtZLCJj6AUcQXJS/jGQ==} + '@typescript-eslint/utils@8.48.0': + resolution: {integrity: sha512-yTJO1XuGxCsSfIVt1+1UrLHtue8xz16V8apzPYI06W0HbEbEWHxHXgZaAgavIkoh+GeV6hKKd5jm0sS6OYxWXQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.47.0': - resolution: {integrity: sha512-SIV3/6eftCy1bNzCQoPmbWsRLujS8t5iDIZ4spZOBHqrM+yfX2ogg8Tt3PDTAVKw3sSCiUgg30uOAvK2r9zGjQ==} + '@typescript-eslint/visitor-keys@8.48.0': + resolution: {integrity: sha512-T0XJMaRPOH3+LBbAfzR2jalckP1MSG/L9eUtY0DEzUyVaXJ/t6zN0nR7co5kz0Jko/nkSYCBRkz1djvjajVTTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} acorn-jsx@5.3.2: @@ -2927,8 +2927,8 @@ packages: peerDependencies: typescript: '>=3.5.1' - typescript-eslint@8.47.0: - resolution: {integrity: sha512-Lwe8i2XQ3WoMjua/r1PHrCTpkubPYJCAfOurtn+mtTzqB6jNd+14n9UN1bJ4s3F49x9ixAm0FLflB/JzQ57M8Q==} + typescript-eslint@8.48.0: + resolution: {integrity: sha512-fcKOvQD9GUn3Xw63EgiDqhvWJ5jsyZUaekl3KVpGsDJnN46WJTe3jWxtQP9lMZm1LJNkFLlTaWAxK2vUQR+cqw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3806,14 +3806,14 @@ snapshots: dependencies: '@types/node': 24.10.1 - '@typescript-eslint/eslint-plugin@8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.47.0(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.47.0 - '@typescript-eslint/type-utils': 8.47.0(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/utils': 8.47.0(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.47.0 + '@typescript-eslint/parser': 8.48.0(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.48.0 + '@typescript-eslint/type-utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.48.0 eslint: 9.39.1 graphemer: 1.4.0 ignore: 7.0.5 @@ -3823,41 +3823,41 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3)': + '@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.47.0 - '@typescript-eslint/types': 8.47.0 - '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.47.0 + '@typescript-eslint/scope-manager': 8.48.0 + '@typescript-eslint/types': 8.48.0 + '@typescript-eslint/typescript-estree': 8.48.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.48.0 debug: 4.4.3 eslint: 9.39.1 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.47.0(typescript@5.9.3)': + '@typescript-eslint/project-service@8.48.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.47.0(typescript@5.9.3) - '@typescript-eslint/types': 8.47.0 + '@typescript-eslint/tsconfig-utils': 8.48.0(typescript@5.9.3) + '@typescript-eslint/types': 8.48.0 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.47.0': + '@typescript-eslint/scope-manager@8.48.0': dependencies: - '@typescript-eslint/types': 8.47.0 - '@typescript-eslint/visitor-keys': 8.47.0 + '@typescript-eslint/types': 8.48.0 + '@typescript-eslint/visitor-keys': 8.48.0 - '@typescript-eslint/tsconfig-utils@8.47.0(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.48.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.47.0(eslint@9.39.1)(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.48.0(eslint@9.39.1)(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.47.0 - '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.47.0(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/types': 8.48.0 + '@typescript-eslint/typescript-estree': 8.48.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) debug: 4.4.3 eslint: 9.39.1 ts-api-utils: 2.1.0(typescript@5.9.3) @@ -3865,38 +3865,37 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.47.0': {} + '@typescript-eslint/types@8.48.0': {} - '@typescript-eslint/typescript-estree@8.47.0(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.48.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.47.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.47.0(typescript@5.9.3) - '@typescript-eslint/types': 8.47.0 - '@typescript-eslint/visitor-keys': 8.47.0 + '@typescript-eslint/project-service': 8.48.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.48.0(typescript@5.9.3) + '@typescript-eslint/types': 8.48.0 + '@typescript-eslint/visitor-keys': 8.48.0 debug: 4.4.3 - fast-glob: 3.3.3 - is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.3 + tinyglobby: 0.2.15 ts-api-utils: 2.1.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.47.0(eslint@9.39.1)(typescript@5.9.3)': + '@typescript-eslint/utils@8.48.0(eslint@9.39.1)(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) - '@typescript-eslint/scope-manager': 8.47.0 - '@typescript-eslint/types': 8.47.0 - '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.48.0 + '@typescript-eslint/types': 8.48.0 + '@typescript-eslint/typescript-estree': 8.48.0(typescript@5.9.3) eslint: 9.39.1 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.47.0': + '@typescript-eslint/visitor-keys@8.48.0': dependencies: - '@typescript-eslint/types': 8.47.0 + '@typescript-eslint/types': 8.48.0 eslint-visitor-keys: 4.2.1 acorn-jsx@5.3.2(acorn@8.15.0): @@ -5919,12 +5918,12 @@ snapshots: dependencies: typescript: 5.9.3 - typescript-eslint@8.47.0(eslint@9.39.1)(typescript@5.9.3): + typescript-eslint@8.48.0(eslint@9.39.1)(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/parser': 8.47.0(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.47.0(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/parser': 8.48.0(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.48.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) eslint: 9.39.1 typescript: 5.9.3 transitivePeerDependencies: From a330110eef5085c733a275e3fdc9a2dbc7794cdb Mon Sep 17 00:00:00 2001 From: proddy Date: Mon, 24 Nov 2025 22:37:30 +0100 Subject: [PATCH 11/24] update --- project-words.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/project-words.txt b/project-words.txt index 1d14f2611..332acd06c 100644 --- a/project-words.txt +++ b/project-words.txt @@ -1443,4 +1443,6 @@ proplow chimneysweeper pumpopt intergral -vchip \ No newline at end of file +vchip +SPIIO +SPIDQS From 2a7a0ce3f65fbec157b4715bd0fd52e21f46b5b7 Mon Sep 17 00:00:00 2001 From: proddy Date: Mon, 24 Nov 2025 22:37:41 +0100 Subject: [PATCH 12/24] formatting --- mock-api/restServer.ts | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/mock-api/restServer.ts b/mock-api/restServer.ts index b0157f7fe..196ab665e 100644 --- a/mock-api/restServer.ts +++ b/mock-api/restServer.ts @@ -276,10 +276,10 @@ function updateMask(entity: any, de: any, dd: any) { const old_custom_name = dd.nodes[dd_objIndex].cn; console.log( 'comparing names, old (' + - old_custom_name + - ') with new (' + - new_custom_name + - ')' + old_custom_name + + ') with new (' + + new_custom_name + + ')' ); if (old_custom_name !== new_custom_name) { changed = true; @@ -375,15 +375,15 @@ function check_upgrade(version: string) { console.log( 'Upgrade this version (' + - THIS_VERSION + - ') to dev (' + - dev_version + - ') is ' + - (DEV_VERSION_IS_UPGRADEABLE ? 'YES' : 'NO') + - ' and to stable (' + - stable_version + - ') is ' + - (STABLE_VERSION_IS_UPGRADEABLE ? 'YES' : 'NO') + THIS_VERSION + + ') to dev (' + + dev_version + + ') is ' + + (DEV_VERSION_IS_UPGRADEABLE ? 'YES' : 'NO') + + ' and to stable (' + + stable_version + + ') is ' + + (STABLE_VERSION_IS_UPGRADEABLE ? 'YES' : 'NO') ); data = { emsesp_version: THIS_VERSION, From eb058b688d91ae2d2899fd5fb3973b56872ef0a7 Mon Sep 17 00:00:00 2001 From: proddy Date: Mon, 24 Nov 2025 22:37:51 +0100 Subject: [PATCH 13/24] lint warnings --- interface/src/app/status/Version.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/interface/src/app/status/Version.tsx b/interface/src/app/status/Version.tsx index ace627042..f033224e4 100644 --- a/interface/src/app/status/Version.tsx +++ b/interface/src/app/status/Version.tsx @@ -18,12 +18,10 @@ import WarningIcon from '@mui/icons-material/Warning'; import { Box, Button, - Checkbox, Dialog, DialogActions, DialogContent, DialogTitle, - FormControlLabel, Grid, IconButton, Link, From 026c2caea0880010cb0baec49df67e2af5908aef Mon Sep 17 00:00:00 2001 From: proddy Date: Mon, 24 Nov 2025 23:17:27 +0100 Subject: [PATCH 14/24] fix when manually setting board type --- src/core/system.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/system.cpp b/src/core/system.cpp index 472243dae..1ecb7dcd3 100644 --- a/src/core/system.cpp +++ b/src/core/system.cpp @@ -1903,7 +1903,7 @@ bool System::command_test(const char * value, const int8_t id) { // 0=led, 1=dallas, 2=rx, 3=tx, 4=button, 5=phy_type, 6=eth_power, 7=eth_phy_addr, 8=eth_clock_mode, 9=led_type // bool System::load_board_profile(std::vector & data, const std::string & board_profile) { - if (board_profile == EMSESP_DEFAULT_BOARD_PROFILE) { + if (board_profile == "default") { return false; // unknown, return false } else if (board_profile == "S32") { data = {2, 18, 23, 5, 0, PHY_type::PHY_TYPE_NONE, 0, 0, 0, 0}; // BBQKees Gateway S32 From 7d9cb2932febf2abc4d43a515f4de656b4311072 Mon Sep 17 00:00:00 2001 From: proddy Date: Mon, 24 Nov 2025 23:17:37 +0100 Subject: [PATCH 15/24] update tests --- src/test/test.h | 2 +- test/test_api/test_api.h | 50 +++++++++++++++++++++------------------- 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/src/test/test.h b/src/test/test.h index 77e1da771..db56635df 100644 --- a/src/test/test.h +++ b/src/test/test.h @@ -62,7 +62,7 @@ namespace emsesp { // #define EMSESP_DEBUG_DEFAULT "ls" // #define EMSESP_DEBUG_DEFAULT "upload" // #define EMSESP_DEBUG_DEFAULT "hpmode" -#define EMSESP_DEBUG_DEFAULT "shuntingyard" +// #define EMSESP_DEBUG_DEFAULT "shuntingyard" // #define EMSESP_DEBUG_DEFAULT "src" #ifndef EMSESP_DEBUG_DEFAULT diff --git a/test/test_api/test_api.h b/test/test_api/test_api.h index 0d8b89fca..b22125633 100644 --- a/test/test_api/test_api.h +++ b/test/test_api/test_api.h @@ -170,14 +170,14 @@ void test_21() { "\"cleanSession\":false,\"entityFormat\":1,\"base\":\"ems-esp\",\"discoveryPrefix\":\"homeassistant\",\"discoveryType\":0,\"nestedFormat\":1," "\"haEnabled\":true,\"mqttQos\":0,\"mqttRetain\":false,\"publishTimeHeartbeat\":60,\"publishTimeBoiler\":10,\"publishTimeThermostat\":10," "\"publishTimeSolar\":10,\"publishTimeMixer\":10,\"publishTimeWater\":0,\"publishTimeOther\":10,\"publishTimeSensor\":10,\"publishSingle\":false," - "\"publish2command\":false,\"sendResponse\":false},\"syslog\":{\"enabled\":false},\"sensor\":{\"analogSensors\":5,\"analogSensorReads\":0," - "\"analogSensorFails\":0},\"api\":{\"APICalls\":0,\"APIFails\":0},\"bus\":{\"busStatus\":\"connected\",\"busProtocol\":\"Buderus\"," - "\"busTelegramsReceived\":8,\"busReads\":0,\"busWrites\":0,\"busIncompleteTelegrams\":0,\"busReadsFailed\":0,\"busWritesFailed\":0," - "\"busRxLineQuality\":100,\"busTxLineQuality\":100},\"settings\":{\"boardProfile\":\"default\",\"locale\":\"en\",\"txMode\":8,\"emsBusID\":11," - "\"showerTimer\":false,\"showerMinDuration\":180,\"showerAlert\":false,\"hideLed\":false,\"noTokenApi\":false,\"readonlyMode\":false,\"fahrenheit\":" - "false,\"dallasParasite\":false,\"boolFormat\":1,\"boolDashboard\":1,\"enumFormat\":1,\"analogEnabled\":true,\"telnetEnabled\":true," - "\"maxWebLogBuffer\":25,\"modbusEnabled\":false,\"forceHeatingOff\":false,\"developerMode\":false},\"devices\":[{\"type\":\"boiler\",\"name\":\"My " - "Custom " + "\"publish2command\":false,\"sendResponse\":false},\"syslog\":{\"enabled\":false},\"sensor\":{\"temperatureSensors\":3,\"temperatureSensorReads\":0," + "\"temperatureSensorFails\":0,\"analogSensors\":5,\"analogSensorReads\":0,\"analogSensorFails\":0},\"api\":{\"APICalls\":0,\"APIFails\":0},\"bus\":{" + "\"busStatus\":\"connected\",\"busProtocol\":\"Buderus\",\"busTelegramsReceived\":8,\"busReads\":0,\"busWrites\":0,\"busIncompleteTelegrams\":0," + "\"busReadsFailed\":0,\"busWritesFailed\":0,\"busRxLineQuality\":100,\"busTxLineQuality\":100},\"settings\":{\"boardProfile\":\"S32\",\"locale\":" + "\"en\",\"txMode\":8,\"emsBusID\":11,\"showerTimer\":false,\"showerMinDuration\":180,\"showerAlert\":false,\"hideLed\":false,\"noTokenApi\":false," + "\"readonlyMode\":false,\"fahrenheit\":false,\"dallasParasite\":false,\"boolFormat\":1,\"boolDashboard\":1,\"enumFormat\":1,\"analogEnabled\":true," + "\"telnetEnabled\":true,\"maxWebLogBuffer\":25,\"modbusEnabled\":false,\"forceHeatingOff\":false,\"developerMode\":false},\"devices\":[{\"type\":" + "\"boiler\",\"name\":\"My Custom " "Boiler\",\"deviceID\":\"0x08\",\"productID\":123,\"brand\":\"\",\"version\":\"01.00\",\"entities\":39,\"handlersReceived\":\"0x18\"," "\"handlersFetched\":\"0x14 0x33\",\"handlersPending\":\"0xBF 0x10 0x11 0xC2 0xC6 0x15 0x1C 0x19 0x1A 0x35 0x34 0x2A 0xD1 0xE3 0xE4 0xE5 0xE9 0x02E0 " "0x2E " @@ -198,14 +198,14 @@ void test_22() { "\"cleanSession\":false,\"entityFormat\":1,\"base\":\"ems-esp\",\"discoveryPrefix\":\"homeassistant\",\"discoveryType\":0,\"nestedFormat\":1," "\"haEnabled\":true,\"mqttQos\":0,\"mqttRetain\":false,\"publishTimeHeartbeat\":60,\"publishTimeBoiler\":10,\"publishTimeThermostat\":10," "\"publishTimeSolar\":10,\"publishTimeMixer\":10,\"publishTimeWater\":0,\"publishTimeOther\":10,\"publishTimeSensor\":10,\"publishSingle\":false," - "\"publish2command\":false,\"sendResponse\":false},\"syslog\":{\"enabled\":false},\"sensor\":{\"analogSensors\":5,\"analogSensorReads\":0," - "\"analogSensorFails\":0},\"api\":{\"APICalls\":0,\"APIFails\":0},\"bus\":{\"busStatus\":\"connected\",\"busProtocol\":\"Buderus\"," - "\"busTelegramsReceived\":8,\"busReads\":0,\"busWrites\":0,\"busIncompleteTelegrams\":0,\"busReadsFailed\":0,\"busWritesFailed\":0," - "\"busRxLineQuality\":100,\"busTxLineQuality\":100},\"settings\":{\"boardProfile\":\"default\",\"locale\":\"en\",\"txMode\":8,\"emsBusID\":11," - "\"showerTimer\":false,\"showerMinDuration\":180,\"showerAlert\":false,\"hideLed\":false,\"noTokenApi\":false,\"readonlyMode\":false,\"fahrenheit\":" - "false,\"dallasParasite\":false,\"boolFormat\":1,\"boolDashboard\":1,\"enumFormat\":1,\"analogEnabled\":true,\"telnetEnabled\":true," - "\"maxWebLogBuffer\":25,\"modbusEnabled\":false,\"forceHeatingOff\":false,\"developerMode\":false},\"devices\":[{\"type\":\"boiler\",\"name\":\"My " - "Custom " + "\"publish2command\":false,\"sendResponse\":false},\"syslog\":{\"enabled\":false},\"sensor\":{\"temperatureSensors\":3,\"temperatureSensorReads\":0," + "\"temperatureSensorFails\":0,\"analogSensors\":5,\"analogSensorReads\":0,\"analogSensorFails\":0},\"api\":{\"APICalls\":0,\"APIFails\":0},\"bus\":{" + "\"busStatus\":\"connected\",\"busProtocol\":\"Buderus\",\"busTelegramsReceived\":8,\"busReads\":0,\"busWrites\":0,\"busIncompleteTelegrams\":0," + "\"busReadsFailed\":0,\"busWritesFailed\":0,\"busRxLineQuality\":100,\"busTxLineQuality\":100},\"settings\":{\"boardProfile\":\"S32\",\"locale\":" + "\"en\",\"txMode\":8,\"emsBusID\":11,\"showerTimer\":false,\"showerMinDuration\":180,\"showerAlert\":false,\"hideLed\":false,\"noTokenApi\":false," + "\"readonlyMode\":false,\"fahrenheit\":false,\"dallasParasite\":false,\"boolFormat\":1,\"boolDashboard\":1,\"enumFormat\":1,\"analogEnabled\":true," + "\"telnetEnabled\":true,\"maxWebLogBuffer\":25,\"modbusEnabled\":false,\"forceHeatingOff\":false,\"developerMode\":false},\"devices\":[{\"type\":" + "\"boiler\",\"name\":\"My Custom " "Boiler\",\"deviceID\":\"0x08\",\"productID\":123,\"brand\":\"\",\"version\":\"01.00\",\"entities\":39,\"handlersReceived\":\"0x18\"," "\"handlersFetched\":\"0x14 0x33\",\"handlersPending\":\"0xBF 0x10 0x11 0xC2 0xC6 0x15 0x1C 0x19 0x1A 0x35 0x34 0x2A 0xD1 0xE3 0xE4 0xE5 0xE9 0x02E0 " "0x2E " @@ -250,27 +250,29 @@ void test_28() { } void test_29() { - auto expected_response = "[{\"message\":\"unknown device temperaturesensor\"}]"; + auto expected_response = "[{\"test_tempsensor1\":12.3,\"test_tempsensor2\":45.6,\"gateway_temperature\":28.1}]"; TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/temperaturesensor")); } void test_30() { - auto expected_response = "[{\"message\":\"unknown device temperaturesensor\"}]"; + auto expected_response = "[{\"test_tempsensor1\":12.3,\"test_tempsensor2\":45.6,\"gateway_temperature\":28.1}]"; TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/temperaturesensor/info")); } void test_31() { - auto expected_response = "[{\"message\":\"unknown device temperaturesensor\"}]"; + auto expected_response = "[{\"id\":\"0B_0C0D_0E0F_1011\",\"name\":\"test_tempsensor2\",\"fullname\":\"test_tempsensor2\",\"value\":45.6,\"type\":" + "\"number\",\"uom\":\"°C\",\"readable\":true,\"writeable\":false,\"visible\":true,\"is_system\":false}]"; TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/temperaturesensor/test_tempsensor2")); } void test_32() { - auto expected_response = "[{\"message\":\"unknown device temperaturesensor\"}]"; + auto expected_response = "[{\"id\":\"0B_0C0D_0E0F_1011\",\"name\":\"test_tempsensor2\",\"fullname\":\"test_tempsensor2\",\"value\":45.6,\"type\":" + "\"number\",\"uom\":\"°C\",\"readable\":true,\"writeable\":false,\"visible\":true,\"is_system\":false}]"; TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/temperaturesensor/0B_0C0D_0E0F_1011")); } void test_33() { - auto expected_response = "[{\"message\":\"unknown device temperaturesensor\"}]"; + auto expected_response = "[{\"api_data\":\"45.6\"}]"; TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/temperaturesensor/test_tempsensor2/value")); } @@ -352,17 +354,17 @@ void test_48() { } void test_49() { - auto expected_response = "[{\"message\":\"unknown device temperaturesensor\"}]"; + auto expected_response = "[{\"message\":\"no 'test_sensor20' in temperaturesensor\"}]"; TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/temperaturesensor/test_sensor20")); } void test_50() { - auto expected_response = "[{\"message\":\"unknown device temperaturesensor\"}]"; + auto expected_response = "[{\"message\":\"no '0b_0c0d_0e0f_xxxx' in temperaturesensor\"}]"; TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/temperaturesensor/0B_0C0D_0E0F_XXXX")); } void test_51() { - auto expected_response = "[{\"message\":\"unknown device temperaturesensor\"}]"; + auto expected_response = "[{\"message\":\"no attribute 'bad' in test_tempsensor2\"}]"; TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/temperaturesensor/test_tempsensor2/bad")); } From 3113a4be2bc9bf023d880a45bf40009588e68dd8 Mon Sep 17 00:00:00 2001 From: proddy Date: Mon, 24 Nov 2025 23:25:43 +0100 Subject: [PATCH 16/24] remove old todos --- lib/uuid-syslog/src/syslog.cpp | 1 - scripts/run_native.py | 1 - src/ESP32React/NetworkSettingsService.cpp | 1 - 3 files changed, 3 deletions(-) diff --git a/lib/uuid-syslog/src/syslog.cpp b/lib/uuid-syslog/src/syslog.cpp index e0309ba24..024fa6665 100644 --- a/lib/uuid-syslog/src/syslog.cpp +++ b/lib/uuid-syslog/src/syslog.cpp @@ -346,7 +346,6 @@ void SyslogService::loop() { } bool SyslogService::can_transmit() { - // TODO this should be checked also for Eth if (!host_.empty() && (uint32_t)ip_ == 0) { WiFi.hostByName(host_.c_str(), ip_); } diff --git a/scripts/run_native.py b/scripts/run_native.py index d79f835d0..229316993 100644 --- a/scripts/run_native.py +++ b/scripts/run_native.py @@ -36,7 +36,6 @@ def move_file(source, target, env): print("app version: " + app_version) print("platform: " + platform) - # TODO do we need to add a .exe extension for windows? - need to test variant = "native" # check if output directories exist and create if necessary diff --git a/src/ESP32React/NetworkSettingsService.cpp b/src/ESP32React/NetworkSettingsService.cpp index 07837a606..ffb6275c9 100644 --- a/src/ESP32React/NetworkSettingsService.cpp +++ b/src/ESP32React/NetworkSettingsService.cpp @@ -24,7 +24,6 @@ static bool formatBssid(const String & bssid, uint8_t (&mac)[6]) { } void NetworkSettingsService::begin() { - // TODO: may need to change this for Arduino Core 3.1 / IDF 5.x // We want the device to come up in opmode=0 (WIFI_OFF), when erasing the flash this is not the default. // If needed, we save opmode=0 before disabling persistence so the device boots with WiFi disabled in the future. if (WiFi.getMode() != WIFI_OFF) { From 2e343ce0c3bb553f5df964766ef4c8611830d984 Mon Sep 17 00:00:00 2001 From: proddy Date: Mon, 24 Nov 2025 23:25:53 +0100 Subject: [PATCH 17/24] optimize modbus --- src/core/emsdevice.cpp | 20 +++++++++++--------- src/core/emsdevice.h | 22 ++++++++++++++++++++++ 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/core/emsdevice.cpp b/src/core/emsdevice.cpp index e7cce72cd..de747f8c2 100644 --- a/src/core/emsdevice.cpp +++ b/src/core/emsdevice.cpp @@ -632,6 +632,9 @@ void EMSdevice::add_device_value(int8_t tag, // to b devicevalues_.emplace_back( device_type_, tag, value_p, type, options, options_single, numeric_operator, short_name, fullname, custom_fullname, uom, has_cmd, min, max, state); + // add to index for fast lookup by (tag, short_name) + devicevalue_index_[{static_cast(tag), short_name}] = devicevalues_.size() - 1; + // add a new command if it has a function attached if (has_cmd) { uint8_t flags = CommandFlag::ADMIN_ONLY; // executing commands require admin privileges @@ -2032,14 +2035,13 @@ std::string EMSdevice::name() { // copy a raw value (i.e. without applying the numeric_operator) to the output buffer. // returns true on success. int EMSdevice::get_modbus_value(uint8_t tag, const std::string & shortname, std::vector & result) { - // find device value by shortname - // TODO replace linear search which is inefficient - const auto & it = std::find_if(devicevalues_.begin(), devicevalues_.end(), [&](const DeviceValue & x) { return x.tag == tag && x.short_name == shortname; }); - if (it == devicevalues_.end() && (it->short_name != shortname || it->tag != tag)) { + // find device value by shortname using hash map index + auto index_it = devicevalue_index_.find({tag, shortname}); + if (index_it == devicevalue_index_.end()) { return -1; } - auto & dv = *it; + auto & dv = devicevalues_[index_it->second]; // check if it exists, there is a value for the entity. Set the flag to ACTIVE // not that this will override any previously removed states @@ -2120,13 +2122,13 @@ int EMSdevice::get_modbus_value(uint8_t tag, const std::string & shortname, std: int EMSdevice::modbus_value_to_json(uint8_t tag, const std::string & shortname, const std::vector & modbus_data, JsonObject jsonValue) { // LOG_DEBUG("modbus_value_to_json(%d,%s,[%d bytes])\n", tag, shortname.c_str(), modbus_data.size()); - // find device value by shortname - const auto & it = std::find_if(devicevalues_.begin(), devicevalues_.end(), [&](const DeviceValue & x) { return x.tag == tag && x.short_name == shortname; }); - if (it == devicevalues_.end() && (it->short_name != shortname || it->tag != tag)) { + // find device value by shortname using hash map index + auto index_it = devicevalue_index_.find({tag, shortname}); + if (index_it == devicevalue_index_.end()) { return -1; } - auto & dv = *it; + auto & dv = devicevalues_[index_it->second]; // handle Booleans if (dv.type == DeviceValueType::BOOL) { diff --git a/src/core/emsdevice.h b/src/core/emsdevice.h index 9967ab8ca..b6a5dce81 100644 --- a/src/core/emsdevice.h +++ b/src/core/emsdevice.h @@ -25,6 +25,8 @@ #include "helpers.h" #include "emsdevicevalue.h" +#include + namespace emsesp { class EMSdevice { @@ -553,6 +555,26 @@ class EMSdevice { #endif std::vector telegram_functions_; // each EMS device has its own set of registered telegram types std::vector devicevalues_; // all the device values + + // added for modbus + // Hash map for O(1) lookup of device values by (tag, short_name) key + struct DeviceValueKey { + uint8_t tag; + std::string short_name; + + bool operator==(const DeviceValueKey & other) const { + return tag == other.tag && short_name == other.short_name; + } + }; + + struct DeviceValueKeyHash { + std::size_t operator()(const DeviceValueKey & key) const { + // Combine hash of tag and short_name + return std::hash()(key.tag) ^ (std::hash()(key.short_name) << 1); + } + }; + + std::unordered_map devicevalue_index_; // index: key -> devicevalues_ position }; } // namespace emsesp From 5957300c4e92b06e82e0cd08acd090e7c15fd165 Mon Sep 17 00:00:00 2001 From: proddy Date: Mon, 24 Nov 2025 23:27:01 +0100 Subject: [PATCH 18/24] change (c) date to 2025 --- lib_standalone/ModuleLibrary.cpp | 2 +- lib_standalone/ModuleLibrary.h | 2 +- lib_standalone/emsuart_standalone.cpp | 2 +- lib_standalone/emsuart_standalone.h | 2 +- src/core/analogsensor.h | 2 +- src/core/command.cpp | 2 +- src/core/command.h | 2 +- src/core/common.h | 2 +- src/core/console.cpp | 2 +- src/core/console.h | 2 +- src/core/default_settings.h | 2 +- src/core/device_library.h | 2 +- src/core/emsdevice.cpp | 2 +- src/core/emsdevice.h | 2 +- src/core/emsdevicevalue.cpp | 2 +- src/core/emsdevicevalue.h | 2 +- src/core/emsesp.cpp | 2 +- src/core/emsesp.h | 2 +- src/core/emsfactory.h | 2 +- src/core/helpers.cpp | 2 +- src/core/helpers.h | 2 +- src/core/locale_common.h | 2 +- src/core/locale_translations.h | 2 +- src/core/main.cpp | 2 +- src/core/mqtt.cpp | 2 +- src/core/mqtt.h | 2 +- src/core/roomcontrol.cpp | 2 +- src/core/roomcontrol.h | 2 +- src/core/shower.cpp | 2 +- src/core/shower.h | 2 +- src/core/system.cpp | 2 +- src/core/system.h | 2 +- src/core/telegram.cpp | 2 +- src/core/telegram.h | 2 +- src/core/temperaturesensor.cpp | 2 +- src/core/temperaturesensor.h | 2 +- src/devices/alert.cpp | 2 +- src/devices/alert.h | 2 +- src/devices/boiler.cpp | 2 +- src/devices/boiler.h | 2 +- src/devices/connect.cpp | 2 +- src/devices/connect.h | 2 +- src/devices/controller.cpp | 2 +- src/devices/controller.h | 2 +- src/devices/extension.cpp | 2 +- src/devices/extension.h | 2 +- src/devices/gateway.cpp | 2 +- src/devices/gateway.h | 2 +- src/devices/generic.cpp | 2 +- src/devices/generic.h | 2 +- src/devices/heatpump.cpp | 2 +- src/devices/heatpump.h | 2 +- src/devices/heatsource.cpp | 2 +- src/devices/heatsource.h | 2 +- src/devices/mixer.cpp | 2 +- src/devices/mixer.h | 2 +- src/devices/solar.cpp | 2 +- src/devices/solar.h | 2 +- src/devices/switch.cpp | 2 +- src/devices/switch.h | 2 +- src/devices/thermostat.cpp | 2 +- src/devices/thermostat.h | 2 +- src/devices/ventilation.cpp | 2 +- src/devices/ventilation.h | 2 +- src/test/test.h | 2 +- src/uart/emsuart_esp32.cpp | 2 +- src/uart/emsuart_esp32.h | 2 +- src/web/WebAPIService.cpp | 2 +- src/web/WebAPIService.h | 2 +- src/web/WebActivityService.cpp | 2 +- src/web/WebActivityService.h | 2 +- src/web/WebCustomEntityService.cpp | 2 +- src/web/WebCustomEntityService.h | 2 +- src/web/WebCustomizationService.cpp | 2 +- src/web/WebCustomizationService.h | 2 +- src/web/WebDataService.cpp | 2 +- src/web/WebDataService.h | 2 +- src/web/WebLogService.cpp | 2 +- src/web/WebLogService.h | 2 +- src/web/WebModulesService.cpp | 2 +- src/web/WebModulesService.h | 2 +- src/web/WebSchedulerService.cpp | 2 +- src/web/WebSchedulerService.h | 2 +- src/web/WebSettingsService.cpp | 2 +- src/web/WebSettingsService.h | 2 +- src/web/WebStatusService.cpp | 2 +- test/test_api/test_api.cpp | 2 +- 87 files changed, 87 insertions(+), 87 deletions(-) diff --git a/lib_standalone/ModuleLibrary.cpp b/lib_standalone/ModuleLibrary.cpp index cb3b8434d..479327847 100644 --- a/lib_standalone/ModuleLibrary.cpp +++ b/lib_standalone/ModuleLibrary.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib_standalone/ModuleLibrary.h b/lib_standalone/ModuleLibrary.h index e958079b8..7d3004722 100644 --- a/lib_standalone/ModuleLibrary.h +++ b/lib_standalone/ModuleLibrary.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib_standalone/emsuart_standalone.cpp b/lib_standalone/emsuart_standalone.cpp index 4459e134f..643db2682 100644 --- a/lib_standalone/emsuart_standalone.cpp +++ b/lib_standalone/emsuart_standalone.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib_standalone/emsuart_standalone.h b/lib_standalone/emsuart_standalone.h index 018c71afd..dfab52a5c 100644 --- a/lib_standalone/emsuart_standalone.h +++ b/lib_standalone/emsuart_standalone.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/core/analogsensor.h b/src/core/analogsensor.h index 35dbf5b74..b5d28eef9 100644 --- a/src/core/analogsensor.h +++ b/src/core/analogsensor.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/core/command.cpp b/src/core/command.cpp index 0f1b186d8..e71be6b88 100644 --- a/src/core/command.cpp +++ b/src/core/command.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/core/command.h b/src/core/command.h index 4f7f200a3..b4c236a9a 100644 --- a/src/core/command.h +++ b/src/core/command.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/core/common.h b/src/core/common.h index 89e354f8f..b6a875264 100644 --- a/src/core/common.h +++ b/src/core/common.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/core/console.cpp b/src/core/console.cpp index 65dd55a0e..ee7ff0532 100644 --- a/src/core/console.cpp +++ b/src/core/console.cpp @@ -1,7 +1,7 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/core/console.h b/src/core/console.h index 7fb2051fe..80f7a9cc4 100644 --- a/src/core/console.h +++ b/src/core/console.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/core/default_settings.h b/src/core/default_settings.h index 47f991256..d8187b701 100644 --- a/src/core/default_settings.h +++ b/src/core/default_settings.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/core/device_library.h b/src/core/device_library.h index 7d6784676..d452b569e 100644 --- a/src/core/device_library.h +++ b/src/core/device_library.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/core/emsdevice.cpp b/src/core/emsdevice.cpp index de747f8c2..b6d4fd981 100644 --- a/src/core/emsdevice.cpp +++ b/src/core/emsdevice.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/core/emsdevice.h b/src/core/emsdevice.h index b6a5dce81..44a963ef4 100644 --- a/src/core/emsdevice.h +++ b/src/core/emsdevice.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/core/emsdevicevalue.cpp b/src/core/emsdevicevalue.cpp index 4ffb4b447..e568faa44 100644 --- a/src/core/emsdevicevalue.cpp +++ b/src/core/emsdevicevalue.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/core/emsdevicevalue.h b/src/core/emsdevicevalue.h index e14ed330f..f6dcb3827 100644 --- a/src/core/emsdevicevalue.h +++ b/src/core/emsdevicevalue.h @@ -1,7 +1,7 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/core/emsesp.cpp b/src/core/emsesp.cpp index bde5b1e22..9a59f5c86 100644 --- a/src/core/emsesp.cpp +++ b/src/core/emsesp.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/core/emsesp.h b/src/core/emsesp.h index 17a5aa133..1ec1f48a3 100644 --- a/src/core/emsesp.h +++ b/src/core/emsesp.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/core/emsfactory.h b/src/core/emsfactory.h index 13c9e2898..b52dfb37d 100644 --- a/src/core/emsfactory.h +++ b/src/core/emsfactory.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/core/helpers.cpp b/src/core/helpers.cpp index d340d1585..67ae61316 100644 --- a/src/core/helpers.cpp +++ b/src/core/helpers.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/core/helpers.h b/src/core/helpers.h index 1ec344c47..999f4bc40 100644 --- a/src/core/helpers.h +++ b/src/core/helpers.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/core/locale_common.h b/src/core/locale_common.h index 26b5755ff..cd85c1a96 100644 --- a/src/core/locale_common.h +++ b/src/core/locale_common.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/core/locale_translations.h b/src/core/locale_translations.h index cfb24baf4..f5ce7ce07 100644 --- a/src/core/locale_translations.h +++ b/src/core/locale_translations.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/core/main.cpp b/src/core/main.cpp index 886ebfc3e..b3c24b2c4 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/core/mqtt.cpp b/src/core/mqtt.cpp index 5efe52e2d..fa5d8d379 100644 --- a/src/core/mqtt.cpp +++ b/src/core/mqtt.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/core/mqtt.h b/src/core/mqtt.h index 421d38a3d..1dd18ca06 100644 --- a/src/core/mqtt.h +++ b/src/core/mqtt.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/core/roomcontrol.cpp b/src/core/roomcontrol.cpp index 72e8de6b2..4d8fd7bac 100644 --- a/src/core/roomcontrol.cpp +++ b/src/core/roomcontrol.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/core/roomcontrol.h b/src/core/roomcontrol.h index c6c5577d2..939f54353 100644 --- a/src/core/roomcontrol.h +++ b/src/core/roomcontrol.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/core/shower.cpp b/src/core/shower.cpp index c9e0ad06d..c0de8bd1b 100644 --- a/src/core/shower.cpp +++ b/src/core/shower.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/core/shower.h b/src/core/shower.h index 82c99c694..c764b85d7 100644 --- a/src/core/shower.h +++ b/src/core/shower.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/core/system.cpp b/src/core/system.cpp index 1ecb7dcd3..7689ac501 100644 --- a/src/core/system.cpp +++ b/src/core/system.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/core/system.h b/src/core/system.h index 17a9596ba..796ca5c7b 100644 --- a/src/core/system.h +++ b/src/core/system.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/core/telegram.cpp b/src/core/telegram.cpp index 4013cf374..c09c6e9a8 100644 --- a/src/core/telegram.cpp +++ b/src/core/telegram.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/core/telegram.h b/src/core/telegram.h index baca7a68f..227c40887 100644 --- a/src/core/telegram.h +++ b/src/core/telegram.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/core/temperaturesensor.cpp b/src/core/temperaturesensor.cpp index d6f84ca85..e7eaca812 100644 --- a/src/core/temperaturesensor.cpp +++ b/src/core/temperaturesensor.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/core/temperaturesensor.h b/src/core/temperaturesensor.h index 01451221a..5a40954d9 100644 --- a/src/core/temperaturesensor.h +++ b/src/core/temperaturesensor.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/devices/alert.cpp b/src/devices/alert.cpp index 4e4154e46..3f206fb45 100644 --- a/src/devices/alert.cpp +++ b/src/devices/alert.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/devices/alert.h b/src/devices/alert.h index af568f9b6..8e50e7c49 100644 --- a/src/devices/alert.h +++ b/src/devices/alert.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index ab985112f..83de008a5 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/devices/boiler.h b/src/devices/boiler.h index 38cd3fada..21e8b661c 100644 --- a/src/devices/boiler.h +++ b/src/devices/boiler.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/devices/connect.cpp b/src/devices/connect.cpp index e06a40650..29bc56c6a 100644 --- a/src/devices/connect.cpp +++ b/src/devices/connect.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/devices/connect.h b/src/devices/connect.h index 8de7ebb92..258adc371 100644 --- a/src/devices/connect.h +++ b/src/devices/connect.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/devices/controller.cpp b/src/devices/controller.cpp index 2953d86d4..fa6ad325f 100644 --- a/src/devices/controller.cpp +++ b/src/devices/controller.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/devices/controller.h b/src/devices/controller.h index c0881c3ec..a992bcb92 100644 --- a/src/devices/controller.h +++ b/src/devices/controller.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/devices/extension.cpp b/src/devices/extension.cpp index c330da62a..69e78c11d 100644 --- a/src/devices/extension.cpp +++ b/src/devices/extension.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/devices/extension.h b/src/devices/extension.h index 832c5cc63..7b60d454c 100644 --- a/src/devices/extension.h +++ b/src/devices/extension.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/devices/gateway.cpp b/src/devices/gateway.cpp index 96cb46799..fbcd6557b 100644 --- a/src/devices/gateway.cpp +++ b/src/devices/gateway.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/devices/gateway.h b/src/devices/gateway.h index 7f024d88f..f169518fb 100644 --- a/src/devices/gateway.h +++ b/src/devices/gateway.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/devices/generic.cpp b/src/devices/generic.cpp index c8334e18d..d01bed9fc 100644 --- a/src/devices/generic.cpp +++ b/src/devices/generic.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/devices/generic.h b/src/devices/generic.h index db07a9ac9..e16571ef9 100644 --- a/src/devices/generic.h +++ b/src/devices/generic.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/devices/heatpump.cpp b/src/devices/heatpump.cpp index 2fd6f2d46..72abd6916 100644 --- a/src/devices/heatpump.cpp +++ b/src/devices/heatpump.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/devices/heatpump.h b/src/devices/heatpump.h index 118b01386..92964cd34 100644 --- a/src/devices/heatpump.h +++ b/src/devices/heatpump.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/devices/heatsource.cpp b/src/devices/heatsource.cpp index cc2994d9a..30b3d2c0b 100644 --- a/src/devices/heatsource.cpp +++ b/src/devices/heatsource.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/devices/heatsource.h b/src/devices/heatsource.h index 659561efc..6b2d3c7be 100644 --- a/src/devices/heatsource.h +++ b/src/devices/heatsource.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/devices/mixer.cpp b/src/devices/mixer.cpp index 89dd295f9..b00050329 100644 --- a/src/devices/mixer.cpp +++ b/src/devices/mixer.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/devices/mixer.h b/src/devices/mixer.h index 6e33f113c..0285359aa 100644 --- a/src/devices/mixer.h +++ b/src/devices/mixer.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/devices/solar.cpp b/src/devices/solar.cpp index c36691cfc..6b787ccac 100644 --- a/src/devices/solar.cpp +++ b/src/devices/solar.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/devices/solar.h b/src/devices/solar.h index a00325ecf..f6514c0ee 100644 --- a/src/devices/solar.h +++ b/src/devices/solar.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/devices/switch.cpp b/src/devices/switch.cpp index cc3e97d83..e65348dc4 100644 --- a/src/devices/switch.cpp +++ b/src/devices/switch.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/devices/switch.h b/src/devices/switch.h index 9931c4ebe..6c8005b79 100644 --- a/src/devices/switch.h +++ b/src/devices/switch.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index 1a87e679a..f022ca836 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/devices/thermostat.h b/src/devices/thermostat.h index feb791713..c9b2c54e3 100644 --- a/src/devices/thermostat.h +++ b/src/devices/thermostat.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/devices/ventilation.cpp b/src/devices/ventilation.cpp index 6b41fb8d8..ff7f2cc48 100644 --- a/src/devices/ventilation.cpp +++ b/src/devices/ventilation.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/devices/ventilation.h b/src/devices/ventilation.h index d01dcd6a0..9421f85c9 100644 --- a/src/devices/ventilation.h +++ b/src/devices/ventilation.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/test/test.h b/src/test/test.h index db56635df..d57333c76 100644 --- a/src/test/test.h +++ b/src/test/test.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/uart/emsuart_esp32.cpp b/src/uart/emsuart_esp32.cpp index 82fafb78a..66bdbdbdc 100644 --- a/src/uart/emsuart_esp32.cpp +++ b/src/uart/emsuart_esp32.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/uart/emsuart_esp32.h b/src/uart/emsuart_esp32.h index 620139e66..6a6f2f2d1 100644 --- a/src/uart/emsuart_esp32.h +++ b/src/uart/emsuart_esp32.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/web/WebAPIService.cpp b/src/web/WebAPIService.cpp index 226815238..0a6037ccf 100644 --- a/src/web/WebAPIService.cpp +++ b/src/web/WebAPIService.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/web/WebAPIService.h b/src/web/WebAPIService.h index bb8ae1f28..0491bb503 100644 --- a/src/web/WebAPIService.h +++ b/src/web/WebAPIService.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/web/WebActivityService.cpp b/src/web/WebActivityService.cpp index 861d2c51e..0f80cd335 100644 --- a/src/web/WebActivityService.cpp +++ b/src/web/WebActivityService.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/web/WebActivityService.h b/src/web/WebActivityService.h index 02a6b533d..111161807 100644 --- a/src/web/WebActivityService.h +++ b/src/web/WebActivityService.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/web/WebCustomEntityService.cpp b/src/web/WebCustomEntityService.cpp index 66bf0efc8..b489a9bc5 100644 --- a/src/web/WebCustomEntityService.cpp +++ b/src/web/WebCustomEntityService.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/web/WebCustomEntityService.h b/src/web/WebCustomEntityService.h index f2f086de8..018f37fdf 100644 --- a/src/web/WebCustomEntityService.h +++ b/src/web/WebCustomEntityService.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/web/WebCustomizationService.cpp b/src/web/WebCustomizationService.cpp index 3f5e6d0eb..35e861b1b 100644 --- a/src/web/WebCustomizationService.cpp +++ b/src/web/WebCustomizationService.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/web/WebCustomizationService.h b/src/web/WebCustomizationService.h index 40f10b4e2..0a647b4d7 100644 --- a/src/web/WebCustomizationService.h +++ b/src/web/WebCustomizationService.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/web/WebDataService.cpp b/src/web/WebDataService.cpp index d932ec051..05af18da0 100644 --- a/src/web/WebDataService.cpp +++ b/src/web/WebDataService.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/web/WebDataService.h b/src/web/WebDataService.h index 53bf2be88..fad72b02c 100644 --- a/src/web/WebDataService.h +++ b/src/web/WebDataService.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/web/WebLogService.cpp b/src/web/WebLogService.cpp index 363b11576..cd1b29842 100644 --- a/src/web/WebLogService.cpp +++ b/src/web/WebLogService.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/web/WebLogService.h b/src/web/WebLogService.h index bac1d9173..a369d5a4c 100644 --- a/src/web/WebLogService.h +++ b/src/web/WebLogService.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/web/WebModulesService.cpp b/src/web/WebModulesService.cpp index cb3f4d84a..37f71961f 100644 --- a/src/web/WebModulesService.cpp +++ b/src/web/WebModulesService.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/web/WebModulesService.h b/src/web/WebModulesService.h index 1b7784c8f..43406c758 100644 --- a/src/web/WebModulesService.h +++ b/src/web/WebModulesService.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/web/WebSchedulerService.cpp b/src/web/WebSchedulerService.cpp index 479fd1c33..6ca096810 100644 --- a/src/web/WebSchedulerService.cpp +++ b/src/web/WebSchedulerService.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/web/WebSchedulerService.h b/src/web/WebSchedulerService.h index 977f14a8a..2b2f20522 100644 --- a/src/web/WebSchedulerService.h +++ b/src/web/WebSchedulerService.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/web/WebSettingsService.cpp b/src/web/WebSettingsService.cpp index 89002c900..ce763c99f 100644 --- a/src/web/WebSettingsService.cpp +++ b/src/web/WebSettingsService.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/web/WebSettingsService.h b/src/web/WebSettingsService.h index 6ce6fab8a..bc66f024c 100644 --- a/src/web/WebSettingsService.h +++ b/src/web/WebSettingsService.h @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/web/WebStatusService.cpp b/src/web/WebStatusService.cpp index a00d55a8d..e8d2a565b 100644 --- a/src/web/WebStatusService.cpp +++ b/src/web/WebStatusService.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/test/test_api/test_api.cpp b/test/test_api/test_api.cpp index 2551ca223..14a3c1601 100644 --- a/test/test_api/test_api.cpp +++ b/test/test_api/test_api.cpp @@ -1,6 +1,6 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020-2024 emsesp.org - proddy, MichaelDvP + * Copyright 2020-2025 emsesp.org - proddy, MichaelDvP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by From cc7ac5b911161dcdee43d2bac37bc733cd5854c5 Mon Sep 17 00:00:00 2001 From: proddy Date: Wed, 26 Nov 2025 13:59:08 +0100 Subject: [PATCH 19/24] package update --- interface/pnpm-lock.yaml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/interface/pnpm-lock.yaml b/interface/pnpm-lock.yaml index 10807a9e4..69a2f7ef1 100644 --- a/interface/pnpm-lock.yaml +++ b/interface/pnpm-lock.yaml @@ -1185,8 +1185,8 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cookie@1.0.2: - resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} + cookie@1.1.0: + resolution: {integrity: sha512-vXiThu1/rlos7EGu8TuNZQEg2e9TvhH9dmS4T4ZVzB7Ao1agEZ6EG3sn5n+hZRYUgduISd1HpngFzAZiDGm5vQ==} engines: {node: '>=18'} core-util-is@1.0.3: @@ -1337,8 +1337,8 @@ packages: duplexer3@0.1.5: resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} - electron-to-chromium@1.5.259: - resolution: {integrity: sha512-I+oLXgpEJzD6Cwuwt1gYjxsDmu/S/Kd41mmLA3O+/uH2pFRO/DvOjUyGozL8j3KeLV6WyZ7ssPwELMsXCcsJAQ==} + electron-to-chromium@1.5.260: + resolution: {integrity: sha512-ov8rBoOBhVawpzdre+Cmz4FB+y66Eqrk6Gwqd8NGxuhv99GQ8XqMAr351KEkOt7gukXWDg6gJWEMKgL2RLMPtA==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -4021,7 +4021,7 @@ snapshots: dependencies: baseline-browser-mapping: 2.8.31 caniuse-lite: 1.0.30001757 - electron-to-chromium: 1.5.259 + electron-to-chromium: 1.5.260 node-releases: 2.0.27 update-browserslist-db: 1.1.4(browserslist@4.28.0) @@ -4151,7 +4151,7 @@ snapshots: convert-source-map@2.0.0: {} - cookie@1.0.2: {} + cookie@1.1.0: {} core-util-is@1.0.3: {} @@ -4366,7 +4366,7 @@ snapshots: duplexer3@0.1.5: {} - electron-to-chromium@1.5.259: {} + electron-to-chromium@1.5.260: {} emoji-regex@8.0.0: {} @@ -5533,7 +5533,7 @@ snapshots: react-router@7.9.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: - cookie: 1.0.2 + cookie: 1.1.0 react: 19.2.0 set-cookie-parser: 2.7.2 optionalDependencies: From badbd9c6fe69626a233bd8d887e384380b6c8153 Mon Sep 17 00:00:00 2001 From: proddy Date: Wed, 26 Nov 2025 13:59:34 +0100 Subject: [PATCH 20/24] show system status in status page --- interface/src/app/status/Status.tsx | 32 +++++++++++++++++++++++++---- interface/src/types/system.ts | 6 ++++-- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/interface/src/app/status/Status.tsx b/interface/src/app/status/Status.tsx index 6827f5101..be5427785 100644 --- a/interface/src/app/status/Status.tsx +++ b/interface/src/app/status/Status.tsx @@ -8,10 +8,10 @@ import DeviceHubIcon from '@mui/icons-material/DeviceHub'; import DirectionsBusIcon from '@mui/icons-material/DirectionsBus'; import LogoDevIcon from '@mui/icons-material/LogoDev'; import MemoryIcon from '@mui/icons-material/Memory'; +import MonitorHeartIcon from '@mui/icons-material/MonitorHeart'; import PowerSettingsNewIcon from '@mui/icons-material/PowerSettingsNew'; import RouterIcon from '@mui/icons-material/Router'; import SettingsInputAntennaIcon from '@mui/icons-material/SettingsInputAntenna'; -import TimerIcon from '@mui/icons-material/Timer'; import WifiIcon from '@mui/icons-material/Wifi'; import { Avatar, @@ -37,7 +37,7 @@ import { FormLoader, SectionContent, useLayoutTitle } from 'components'; import ListMenuItem from 'components/layout/ListMenuItem'; import { AuthenticatedContext } from 'contexts/authentication'; import { useI18nContext } from 'i18n/i18n-react'; -import { NTPSyncStatus, NetworkConnectionStatus } from 'types'; +import { NTPSyncStatus, NetworkConnectionStatus, SystemStatusCodes } from 'types'; import { useInterval } from 'utils'; import { formatDateTime } from 'utils/time'; @@ -113,6 +113,27 @@ const SystemStatus = () => { } }, [data?.bus_status, data?.bus_uptime, LL]); + // Memoize derived status values to avoid recalculation on every render + const systemStatus = useMemo(() => { + if (!data) return '??'; + + switch (data.status) { + case SystemStatusCodes.SYSTEM_STATUS_PENDING_UPLOAD: + case SystemStatusCodes.SYSTEM_STATUS_UPLOADING: + return LL.WAIT_FIRMWARE(); + case SystemStatusCodes.SYSTEM_STATUS_ERROR_UPLOAD: + return LL.ERROR(); + case SystemStatusCodes.SYSTEM_STATUS_PENDING_RESTART: + case SystemStatusCodes.SYSTEM_STATUS_RESTART_REQUESTED: + return LL.RESTARTING_PRE(); + case SystemStatusCodes.SYSTEM_STATUS_INVALID_GPIO: + return LL.GPIO_OF(LL.FAILED(0)); + default: + // SystemStatusCodes.SYSTEM_STATUS_NORMAL + return 'OK'; + } + }, [data?.status, LL]); + const busStatusHighlight = useMemo(() => { if (!data) return theme.palette.warning.main; @@ -313,10 +334,13 @@ const SystemStatus = () => { - + - + {me.admin && (