From c16f12990a708db9816d9537d5cefa3b657df2e3 Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 22 Aug 2026 13:23:00 +0200 Subject: [PATCH 01/31] package update --- interface/package.json | 4 +- interface/pnpm-lock.yaml | 196 ++++++++++++++++++++------------------- mock-api/package.json | 2 +- 3 files changed, 106 insertions(+), 96 deletions(-) diff --git a/interface/package.json b/interface/package.json index 95c957f57..38810b5a3 100644 --- a/interface/package.json +++ b/interface/package.json @@ -29,7 +29,7 @@ "@mui/icons-material": "^9.3.1", "@mui/material": "^9.3.1", "@table-library/react-table-library": "4.1.15", - "alova": "^3.5.4", + "alova": "^3.5.5", "jwt-decode": "^4.0.0", "preact": "^10.29.8", "react": "^19.2.8", @@ -55,7 +55,7 @@ "terser": "^5.50.0", "typescript": "^6.0.3", "typescript-eslint": "^8.67.0", - "vite": "^8.2.1", + "vite": "^8.2.2", "vite-plugin-imagemin": "^0.6.1" }, "packageManager": "pnpm@11.22.0+sha512.1ff870c4c6133dfd88fb2afc46dd13d47f09c9794b438c6fdb47ca98caf3bc16381ee0be93a091b8e3824cf01f889f46d7d9e20910fb0be1ab0fb5baa80dd621" diff --git a/interface/pnpm-lock.yaml b/interface/pnpm-lock.yaml index b815c82b4..fe047aa99 100644 --- a/interface/pnpm-lock.yaml +++ b/interface/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: dependencies: '@alova/adapter-xhr': specifier: 2.3.3 - version: 2.3.3(alova@3.5.4) + version: 2.3.3(alova@3.5.5) '@emotion/react': specifier: ^11.14.0 version: 11.14.0(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2) @@ -27,8 +27,8 @@ importers: specifier: 4.1.15 version: 4.1.15(@emotion/react@11.14.0(@types/react@19.2.18)(react@19.2.8)(supports-color@10.2.2))(react-dom@19.2.8(react@19.2.8))(react@19.2.8) alova: - specifier: ^3.5.4 - version: 3.5.4 + specifier: ^3.5.5 + version: 3.5.5 jwt-decode: specifier: ^4.0.0 version: 4.0.0 @@ -56,7 +56,7 @@ importers: version: 10.0.1(eslint@10.8.1(supports-color@10.2.2)) '@preact/preset-vite': specifier: ^2.10.6 - version: 2.10.6(@babel/core@7.29.7(supports-color@10.2.2))(preact@10.29.8)(supports-color@10.2.2)(vite@8.2.1(@types/node@26.2.0)(terser@5.50.0)) + version: 2.10.6(@babel/core@7.29.7(supports-color@10.2.2))(preact@10.29.8)(supports-color@10.2.2)(vite@8.2.2(@types/node@26.2.0)(terser@5.50.0)) '@trivago/prettier-plugin-sort-imports': specifier: ^6.0.2 version: 6.0.2(prettier@3.9.6)(supports-color@10.2.2) @@ -89,7 +89,7 @@ importers: version: 3.9.6 rollup-plugin-visualizer: specifier: ^7.1.1 - version: 7.1.1(rolldown@1.2.4) + version: 7.1.1(rolldown@1.2.5) terser: specifier: ^5.50.0 version: 5.50.0 @@ -100,11 +100,11 @@ importers: specifier: ^8.67.0 version: 8.67.0(eslint@10.8.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) vite: - specifier: ^8.2.1 - version: 8.2.1(@types/node@26.2.0)(terser@5.50.0) + specifier: ^8.2.2 + version: 8.2.2(@types/node@26.2.0)(terser@5.50.0) vite-plugin-imagemin: specifier: ^0.6.1 - version: 0.6.1(supports-color@10.2.2)(vite@8.2.1(@types/node@26.2.0)(terser@5.50.0)) + version: 0.6.1(supports-color@10.2.2)(vite@8.2.2(@types/node@26.2.0)(terser@5.50.0)) packages: @@ -454,8 +454,8 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@oxc-project/types@0.144.0': - resolution: {integrity: sha512-nuhZIOLuI6TFQ32I/WnUx+SCPY7SdSKwgnFHydAuoS1+Z4BRcaP+RRJmGzl9lw+0OFF7UmaESf7KQRXaNLHypg==} + '@oxc-project/types@0.146.0': + resolution: {integrity: sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==} '@popperjs/core@2.11.8': resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} @@ -483,92 +483,98 @@ packages: preact: ^10.4.0 || ^11.0.0-0 vite: '>=2.0.0' - '@rolldown/binding-android-arm64@1.2.4': - resolution: {integrity: sha512-jHC2cnyKz5xU2fhECtFl8OZ83cYNt13GZQD+0uMJ/X3o+ijmd56okHhTUwxVSHPx1IRVIJEZ1/1pPzeLCU6XKA==} + '@rolldown/binding-android-arm-eabi@1.2.5': + resolution: {integrity: sha512-DLe/i+l8ynIBY7XEQ191TeZvCoowIGa18R+dIV30GW7DiOtp74i/xX8hs8GUjW5ARV7VZuie3d6AumSmCwbeRA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@rolldown/binding-android-arm64@1.2.5': + resolution: {integrity: sha512-zXcwKlQApYAOELHd8PwKDFkagYF9Wy4e0RJ+0qnzl9Pjnpj75TEG8ufv40p2J7kCEfwZAsNiuzRIyNNMWT38ig==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.2.4': - resolution: {integrity: sha512-Dc5mPD8F5F/FS8i01syd7FTF6yB2fVthH/TRkjwJkzUK6EpoxHtqvZQP5Zwq80/5z19TWYHIg1KOHboCgVx/aQ==} + '@rolldown/binding-darwin-arm64@1.2.5': + resolution: {integrity: sha512-dK4QakI42nzWgJT5sm4y4y/O//D4OxM75/cH28RLV+nzIN9AY+YsbuUVrUTjlLjXR6vpyxFbSsbmNuJ6BP9sww==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.2.4': - resolution: {integrity: sha512-fpDm4oBo6SqLvWUYCmFhdde3U9KH2fRNNMeAnAPAIwxRL345xutL0EtEUcuoxsoazdJGv/MuDBQHlCDrtbvqOg==} + '@rolldown/binding-darwin-x64@1.2.5': + resolution: {integrity: sha512-fqSALaUu1Wjd1nK2uW2kJDWdLCc8lx1IcY+MTY26Aurfdx19anlzhqXOgCFbBFQnlFDTn4TC1/7Nz4Bl2mLP3A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.2.4': - resolution: {integrity: sha512-rSJoreDE/HoIzoaib6MTp5jQtCTdMHKIvItAKT/ImS6Y6Ww76oUaeMyp4Vc/fAgd/ehji068IxetHXAnqUwN9A==} + '@rolldown/binding-freebsd-x64@1.2.5': + resolution: {integrity: sha512-/vCnNxlkxs9tKxNDcyWUePpJ/PgTzxIaVhoM5SmG8UV+GR/IcPam4VYxi7GIMo7PSDuNqlJqvprqii9NqqVCMw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.2.4': - resolution: {integrity: sha512-/jm8OGHgn7oGaJu3i/qZI9spUGcJ+y/lk43ttQ/iO1tOd9NissG6o97bighBCiL+BKRngmcDuR6ikfwYdJmVuQ==} + '@rolldown/binding-linux-arm-gnueabihf@1.2.5': + resolution: {integrity: sha512-abk0NLA519LxRCszmbE0jYKuQ9YPocOXTiOXOo6Yr+YAT95VH+PtqYAjOJvGKt3viEd/x4qzabAlwd5bHOOARg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.2.4': - resolution: {integrity: sha512-tIP06BeD9EqvECBrPZ+sqdPlYrT+aYaAiu1wYziVx5elRK/ftm33JxVDy2bXGbr6J0CrtirCkR87/X5a2euEng==} + '@rolldown/binding-linux-arm64-gnu@1.2.5': + resolution: {integrity: sha512-Y7eALiJ8lr0M2HH103Js+g7V34wf6snlpZLAsHI90uLhr3PVlNsbFVAXJC9d/V6BnPyKtpSwI+NcB/RLxsQxuA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.2.4': - resolution: {integrity: sha512-Ql1Q0EQqVThvn9VAVlwNzsUvbSFtCMGjLpRRi4pk5i7NZZ4n5ISiLMjHYtus4VQ2PvkSw24zyaCVsiS+sXPj1w==} + '@rolldown/binding-linux-arm64-musl@1.2.5': + resolution: {integrity: sha512-xMvZgnbZg4YVnR/AX2b3oOPDTFYJvUVaJg5FedA/LuvexAtXibZQej4cnTkw3rjsJ/ggUROB64TdtETiim+FYA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.2.4': - resolution: {integrity: sha512-GjbjXD4XXfN19D0LZNbmiCBUoDiRACsYHr0yaIbbn8aFsXjHZifcYqu/W5Er5X2X990WjHXFrxarn5chzItorQ==} + '@rolldown/binding-linux-ppc64-gnu@1.2.5': + resolution: {integrity: sha512-GRjeqTUDHTo5GwntsLaAMcBahG3nlpjftXWZLN73HiYQlhwEowvarFgQnRnQZtIp4keXX7quXFbG38uPZBa2EA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.2.4': - resolution: {integrity: sha512-p5WR0NOwaRmJ/B1b6IjEFLLivwEsf3PrdBIhRbhTCQisbo2SvHHpG4ELB/+FgQNnB88LTOF86upmJmbvZdQ2lw==} + '@rolldown/binding-linux-s390x-gnu@1.2.5': + resolution: {integrity: sha512-vLNTR45F2Uwc8AufkNXPmB4VliaXs+FvcheEogIzOXzO4l+LzieXF5A/TWxLy5HtqpsRCHUfd0lPVrrdgXdLHQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.2.4': - resolution: {integrity: sha512-4/GyVjmhR+Tc6HLJvwc1sOhPqAZtySiSMesOZyX6JQ5XBxoTDEMKQzvo07NIK6nTon/SivlZqvhzvuVBNQhObQ==} + '@rolldown/binding-linux-x64-gnu@1.2.5': + resolution: {integrity: sha512-Mgj59/HTuYeK9Gz2MA+mBWKnHsAgkBSec15ZMb1st3oIfFbX7gCjOae7GydHhzcyQi9Z/7M1QuN9bR3oFqF0jQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.2.4': - resolution: {integrity: sha512-l9eeLsCNvPpmSXUej0etw/J1eqV0Jj1D5G/xG6YTijmE6dkv6E2QezgWbTfQk63v952DPqrjOCoiqxq7Bw0YUQ==} + '@rolldown/binding-linux-x64-musl@1.2.5': + resolution: {integrity: sha512-mY8AP0/ichsbhAxGnLa3d3+MwV0EfgrPND2bplI3Ym8T6R2pJ0N87bvrKVwNXmdy3jnr6eQBecdqx/HMknBmpA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.2.4': - resolution: {integrity: sha512-e0F355MSTMm3+UOqtV3L24gFUp2N5m1f8L/7d56deik6va+AXdrt9F8LbzGpeWGWRbZEDq4m8NVnJDeBtf9DZg==} + '@rolldown/binding-openharmony-arm64@1.2.5': + resolution: {integrity: sha512-8SLssA2oweAxyRgDp789ACfRb/3P+zNRJpzZxSizxF9m8NUDQ4+3xjo8ttjhVGGw6Qxb70oZiEtIjaKikCO7Yw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-win32-arm64-msvc@1.2.4': - resolution: {integrity: sha512-AWLi0uBRYh6QlE7OKhiz+phZC0qwtij2QZmhmOdsLdFn64m7oMpooE9ICE3lhm9xMb4SpDo2WbHcxX1iFLFtqw==} + '@rolldown/binding-win32-arm64-msvc@1.2.5': + resolution: {integrity: sha512-vGbruD5zquhoc8D9SViXgN2FBJtNdTyQ4DtG+SWiEGlJiAzoKcZ2xp+xuXCffhubVdt0NJlTZqkeRuERy7g8Cw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.2.4': - resolution: {integrity: sha512-UwSDJOg3dqCAejWdxclJjCsh3Qq4vLYMDxmyHqo1btz3stK2VqgwNd3mm5tuIwzSlGIQ/1H9Hr+Zn09mrezNqQ==} + '@rolldown/binding-win32-x64-msvc@1.2.5': + resolution: {integrity: sha512-e/SXpgISz+IoqVcSSI0rx/d/he8zqLex+/rCWpnHpmVfmPIUjag9H6P7zotf0gJHwPUhQxZ/mF8tr6acebT9yw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -762,8 +768,8 @@ packages: ajv@6.15.0: resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} - alova@3.5.4: - resolution: {integrity: sha512-F4NHWWqnTZiqu0pg0X666LEyp04TbM2wWjZJ2vWxuhb1o4KRhh7xZiw74SP6ruXBAdTJLmems77qYWa0TGHYoQ==} + alova@3.5.5: + resolution: {integrity: sha512-V/w9xLNBpmBxx7Zeb+OAJapt9yD1L/hBoqi86xlRtug94F2xUkA1GFsJMeDeV/oL/iQCvW8fQyplGOiLXDkACg==} engines: {node: '>= 18.0.0'} ansi-regex@2.1.1: @@ -2499,8 +2505,8 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rolldown@1.2.4: - resolution: {integrity: sha512-rSr7irW0K7QRWzjdJXqZowkcRdDtjRduh43rBltnVKd0VFq839l1lJoDvGJb6gl7+4rTTCrPWu+YfujUL8Ug7w==} + rolldown@1.2.5: + resolution: {integrity: sha512-VD2IE5PUG4Oj8zz2VGykiYd5wbnjdIiSsNQb8Qu5B+noEp+A78mu2iVvpp27g8es14Tk9rofNs5Tku9iQCS4fA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -2874,13 +2880,13 @@ packages: peerDependencies: vite: 5.x || 6.x || 7.x || 8.x - vite@8.2.1: - resolution: {integrity: sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==} + vite@8.2.2: + resolution: {integrity: sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 - '@vitejs/devtools': ^0.4.0 + '@vitejs/devtools': ^0.4.0 || ^0.5.0 esbuild: ^0.27.0 || ^0.28.0 jiti: '>=1.21.0' less: ^4.0.0 @@ -2987,10 +2993,10 @@ packages: snapshots: - '@alova/adapter-xhr@2.3.3(alova@3.5.4)': + '@alova/adapter-xhr@2.3.3(alova@3.5.5)': dependencies: '@alova/shared': 1.3.4 - alova: 3.5.4 + alova: 3.5.5 '@alova/shared@1.3.4': {} @@ -3384,23 +3390,23 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 - '@oxc-project/types@0.144.0': {} + '@oxc-project/types@0.146.0': {} '@popperjs/core@2.11.8': {} - '@preact/preset-vite@2.10.6(@babel/core@7.29.7(supports-color@10.2.2))(preact@10.29.8)(supports-color@10.2.2)(vite@8.2.1(@types/node@26.2.0)(terser@5.50.0))': + '@preact/preset-vite@2.10.6(@babel/core@7.29.7(supports-color@10.2.2))(preact@10.29.8)(supports-color@10.2.2)(vite@8.2.2(@types/node@26.2.0)(terser@5.50.0))': dependencies: '@babel/core': 7.29.7(supports-color@10.2.2) '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) '@babel/plugin-transform-react-jsx-development': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) - '@prefresh/vite': 2.4.12(preact@10.29.8)(supports-color@10.2.2)(vite@8.2.1(@types/node@26.2.0)(terser@5.50.0)) + '@prefresh/vite': 2.4.12(preact@10.29.8)(supports-color@10.2.2)(vite@8.2.2(@types/node@26.2.0)(terser@5.50.0)) '@rollup/pluginutils': 5.4.0 babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.29.7(supports-color@10.2.2)) debug: 4.4.3(supports-color@10.2.2) magic-string: 0.30.21 picocolors: 1.1.1 - vite: 8.2.1(@types/node@26.2.0)(terser@5.50.0) - vite-prerender-plugin: 0.5.13(vite@8.2.1(@types/node@26.2.0)(terser@5.50.0)) + vite: 8.2.2(@types/node@26.2.0)(terser@5.50.0) + vite-prerender-plugin: 0.5.13(vite@8.2.2(@types/node@26.2.0)(terser@5.50.0)) zimmerframe: 1.1.4 transitivePeerDependencies: - preact @@ -3415,7 +3421,7 @@ snapshots: '@prefresh/utils@1.2.1': {} - '@prefresh/vite@2.4.12(preact@10.29.8)(supports-color@10.2.2)(vite@8.2.1(@types/node@26.2.0)(terser@5.50.0))': + '@prefresh/vite@2.4.12(preact@10.29.8)(supports-color@10.2.2)(vite@8.2.2(@types/node@26.2.0)(terser@5.50.0))': dependencies: '@babel/core': 7.29.7(supports-color@10.2.2) '@prefresh/babel-plugin': 0.5.3 @@ -3423,50 +3429,53 @@ snapshots: '@prefresh/utils': 1.2.1 '@rollup/pluginutils': 4.2.1 preact: 10.29.8 - vite: 8.2.1(@types/node@26.2.0)(terser@5.50.0) + vite: 8.2.2(@types/node@26.2.0)(terser@5.50.0) transitivePeerDependencies: - supports-color - '@rolldown/binding-android-arm64@1.2.4': + '@rolldown/binding-android-arm-eabi@1.2.5': optional: true - '@rolldown/binding-darwin-arm64@1.2.4': + '@rolldown/binding-android-arm64@1.2.5': optional: true - '@rolldown/binding-darwin-x64@1.2.4': + '@rolldown/binding-darwin-arm64@1.2.5': optional: true - '@rolldown/binding-freebsd-x64@1.2.4': + '@rolldown/binding-darwin-x64@1.2.5': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.2.4': + '@rolldown/binding-freebsd-x64@1.2.5': optional: true - '@rolldown/binding-linux-arm64-gnu@1.2.4': + '@rolldown/binding-linux-arm-gnueabihf@1.2.5': optional: true - '@rolldown/binding-linux-arm64-musl@1.2.4': + '@rolldown/binding-linux-arm64-gnu@1.2.5': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.2.4': + '@rolldown/binding-linux-arm64-musl@1.2.5': optional: true - '@rolldown/binding-linux-s390x-gnu@1.2.4': + '@rolldown/binding-linux-ppc64-gnu@1.2.5': optional: true - '@rolldown/binding-linux-x64-gnu@1.2.4': + '@rolldown/binding-linux-s390x-gnu@1.2.5': optional: true - '@rolldown/binding-linux-x64-musl@1.2.4': + '@rolldown/binding-linux-x64-gnu@1.2.5': optional: true - '@rolldown/binding-openharmony-arm64@1.2.4': + '@rolldown/binding-linux-x64-musl@1.2.5': optional: true - '@rolldown/binding-win32-arm64-msvc@1.2.4': + '@rolldown/binding-openharmony-arm64@1.2.5': optional: true - '@rolldown/binding-win32-x64-msvc@1.2.4': + '@rolldown/binding-win32-arm64-msvc@1.2.5': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.2.5': optional: true '@rolldown/pluginutils@1.0.1': {} @@ -3691,7 +3700,7 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - alova@3.5.4: + alova@3.5.5: dependencies: '@alova/shared': 1.3.4 rate-limiter-flexible: 5.0.5 @@ -5423,34 +5432,35 @@ snapshots: dependencies: glob: 7.2.3 - rolldown@1.2.4: + rolldown@1.2.5: dependencies: - '@oxc-project/types': 0.144.0 + '@oxc-project/types': 0.146.0 '@rolldown/pluginutils': 1.0.1 optionalDependencies: - '@rolldown/binding-android-arm64': 1.2.4 - '@rolldown/binding-darwin-arm64': 1.2.4 - '@rolldown/binding-darwin-x64': 1.2.4 - '@rolldown/binding-freebsd-x64': 1.2.4 - '@rolldown/binding-linux-arm-gnueabihf': 1.2.4 - '@rolldown/binding-linux-arm64-gnu': 1.2.4 - '@rolldown/binding-linux-arm64-musl': 1.2.4 - '@rolldown/binding-linux-ppc64-gnu': 1.2.4 - '@rolldown/binding-linux-s390x-gnu': 1.2.4 - '@rolldown/binding-linux-x64-gnu': 1.2.4 - '@rolldown/binding-linux-x64-musl': 1.2.4 - '@rolldown/binding-openharmony-arm64': 1.2.4 - '@rolldown/binding-win32-arm64-msvc': 1.2.4 - '@rolldown/binding-win32-x64-msvc': 1.2.4 + '@rolldown/binding-android-arm-eabi': 1.2.5 + '@rolldown/binding-android-arm64': 1.2.5 + '@rolldown/binding-darwin-arm64': 1.2.5 + '@rolldown/binding-darwin-x64': 1.2.5 + '@rolldown/binding-freebsd-x64': 1.2.5 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.5 + '@rolldown/binding-linux-arm64-gnu': 1.2.5 + '@rolldown/binding-linux-arm64-musl': 1.2.5 + '@rolldown/binding-linux-ppc64-gnu': 1.2.5 + '@rolldown/binding-linux-s390x-gnu': 1.2.5 + '@rolldown/binding-linux-x64-gnu': 1.2.5 + '@rolldown/binding-linux-x64-musl': 1.2.5 + '@rolldown/binding-openharmony-arm64': 1.2.5 + '@rolldown/binding-win32-arm64-msvc': 1.2.5 + '@rolldown/binding-win32-x64-msvc': 1.2.5 - rollup-plugin-visualizer@7.1.1(rolldown@1.2.4): + rollup-plugin-visualizer@7.1.1(rolldown@1.2.5): dependencies: open: 11.0.1 picomatch: 4.0.5 source-map: 0.8.0 yargs: 18.1.0 optionalDependencies: - rolldown: 1.2.4 + rolldown: 1.2.5 run-applescript@7.1.0: {} @@ -5765,7 +5775,7 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - vite-plugin-imagemin@0.6.1(supports-color@10.2.2)(vite@8.2.1(@types/node@26.2.0)(terser@5.50.0)): + vite-plugin-imagemin@0.6.1(supports-color@10.2.2)(vite@8.2.2(@types/node@26.2.0)(terser@5.50.0)): dependencies: '@types/imagemin': 7.0.1 '@types/imagemin-gifsicle': 7.0.4 @@ -5790,11 +5800,11 @@ snapshots: imagemin-webp: 6.1.0 jpegtran-bin: 6.0.1 pathe: 0.2.0 - vite: 8.2.1(@types/node@26.2.0)(terser@5.50.0) + vite: 8.2.2(@types/node@26.2.0)(terser@5.50.0) transitivePeerDependencies: - supports-color - vite-prerender-plugin@0.5.13(vite@8.2.1(@types/node@26.2.0)(terser@5.50.0)): + vite-prerender-plugin@0.5.13(vite@8.2.2(@types/node@26.2.0)(terser@5.50.0)): dependencies: kolorist: 1.8.0 magic-string: 0.30.21 @@ -5802,14 +5812,14 @@ snapshots: simple-code-frame: 1.3.0 source-map: 0.7.6 stack-trace: 1.0.0 - vite: 8.2.1(@types/node@26.2.0)(terser@5.50.0) + vite: 8.2.2(@types/node@26.2.0)(terser@5.50.0) - vite@8.2.1(@types/node@26.2.0)(terser@5.50.0): + vite@8.2.2(@types/node@26.2.0)(terser@5.50.0): dependencies: lightningcss: 1.33.0 picomatch: 4.0.5 postcss: 8.5.26 - rolldown: 1.2.4 + rolldown: 1.2.5 tinyglobby: 0.2.17 optionalDependencies: '@types/node': 26.2.0 diff --git a/mock-api/package.json b/mock-api/package.json index e830ca9b9..402ca22aa 100644 --- a/mock-api/package.json +++ b/mock-api/package.json @@ -18,5 +18,5 @@ "@trivago/prettier-plugin-sort-imports": "^6.0.2", "prettier": "^3.9.6" }, - "packageManager": "pnpm@11.21.0+sha512.521705bce689924eac72f5a3587122f362689ef6571e55ba80076fd637c11132ecffada26fad4ea79c485bfddbfd3d5a2a5b05805a77e893de71ec8a6cca3bb1" + "packageManager": "pnpm@11.22.0+sha512.1ff870c4c6133dfd88fb2afc46dd13d47f09c9794b438c6fdb47ca98caf3bc16381ee0be93a091b8e3824cf01f889f46d7d9e20910fb0be1ab0fb5baa80dd621" } From 55b882cec2edc7a59255bb8dda4c8c6bcd7c2949 Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 22 Aug 2026 13:23:10 +0200 Subject: [PATCH 02/31] update unit tests --- test/test_api/test_api.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/test_api/test_api.h b/test/test_api/test_api.h index 1a73f6219..48f311e5f 100644 --- a/test/test_api/test_api.h +++ b/test/test_api/test_api.h @@ -5,7 +5,7 @@ void test_1() { } void test_2() { - auto expected_response = "[{\"info\":\"list all values (verbose)\",\"values\":\"list all values\",\"commands\":\"list all commands\",\"entities\":\"list all entities\",\"boil2hystoff\":\"hysteresis stage 2 off temperature\",\"boil2hyston\":\"hysteresis stage 2 on temperature\",\"boilhystoff\":\"hysteresis off temperature\",\"boilhyston\":\"hysteresis on temperature\",\"burnmaxpower\":\"burner max power\",\"burnminperiod\":\"burner min period\",\"chimneysweeper\":\"chimney sweeper\",\"coldshot\":\"send a cold shot of water\",\"curvebase\":\"heatingcurve base\",\"curveend\":\"heatingcurve end\",\"curveon\":\"heatingcurve on\",\"dhw[n].activated\":\"activated\",\"dhw[n].chargeoptimization\":\"charge optimization\",\"dhw[n].circ\":\"circulation active\",\"dhw[n].circmode\":\"circulation pump mode\",\"dhw[n].circpump\":\"circulation pump available\",\"dhw[n].comfort\":\"comfort\",\"dhw[n].comfort1\":\"comfort mode\",\"dhw[n].dhwprio\":\"dhw priority\",\"dhw[n].disinfecting\":\"disinfecting\",\"dhw[n].disinfectiontemp\":\"disinfection temperature\",\"dhw[n].flowtempoffset\":\"flow temperature offset\",\"dhw[n].hystoff\":\"hysteresis off temperature\",\"dhw[n].hyston\":\"hysteresis on temperature\",\"dhw[n].maxpower\":\"max power\",\"dhw[n].maxtemp\":\"maximum temperature\",\"dhw[n].nrg\":\"energy\",\"dhw[n].onetime\":\"one time charging\",\"dhw[n].seltemp\":\"selected temperature\",\"dhw[n].seltemplow\":\"selected lower temperature\",\"dhw[n].seltempsingle\":\"single charge temperature\",\"dhw[n].tapactivated\":\"turn on/off\",\"dhw[n].tempecoplus\":\"selected eco+ temperature\",\"emergencyops\":\"emergency operation\",\"emergencytemp\":\"emergency temperature\",\"heatingactivated\":\"heating activated\",\"heatingoff\":\"force heating off\",\"heatingtemp\":\"heating temperature\",\"maintenance\":\"maintenance scheduled\",\"maintenancedate\":\"next maintenance date\",\"maintenancetime\":\"time to next maintenance\",\"nofrostmode\":\"nofrost mode\",\"nofrosttemp\":\"nofrost temperature\",\"nompower\":\"nominal Power\",\"nrgheat\":\"energy heating\",\"pumpcharacter\":\"boiler pump characteristic\",\"pumpdelay\":\"pump delay\",\"pumpkickday\":\"pump kick day\",\"pumpkickdelay\":\"pump kick delay\",\"pumpkickhour\":\"pump kick hour\",\"pumpmode\":\"boiler pump mode\",\"pumpmodmax\":\"boiler pump max power\",\"pumpmodmin\":\"boiler pump min power\",\"pumpontemp\":\"pump logic temperature\",\"reset\":\"reset\",\"selburnpow\":\"burner selected max power\",\"selflowtemp\":\"selected flow temperature\",\"summertemp\":\"summer temperature\"}]"; + auto expected_response = "[{\"info\":\"list all values (verbose)\",\"values\":\"list all values\",\"commands\":\"list all commands\",\"entities\":\"list all entities\",\"boil2hystoff\":\"hysteresis stage 2 off temperature\",\"boil2hyston\":\"hysteresis stage 2 on temperature\",\"boilhystoff\":\"hysteresis off temperature\",\"boilhyston\":\"hysteresis on temperature\",\"burnmaxpower\":\"burner max power\",\"burnminperiod\":\"burner min period\",\"burnminpower\":\"burner min power\",\"chimneysweeper\":\"chimney sweeper\",\"coldshot\":\"send a cold shot of water\",\"curvebase\":\"heatingcurve base\",\"curveend\":\"heatingcurve end\",\"curveon\":\"heatingcurve on\",\"dhw[n].activated\":\"activated\",\"dhw[n].chargeoptimization\":\"charge optimization\",\"dhw[n].circ\":\"circulation active\",\"dhw[n].circmode\":\"circulation pump mode\",\"dhw[n].circpump\":\"circulation pump available\",\"dhw[n].comfort\":\"comfort\",\"dhw[n].comfort1\":\"comfort mode\",\"dhw[n].dhwprio\":\"dhw priority\",\"dhw[n].disinfecting\":\"disinfecting\",\"dhw[n].disinfectiontemp\":\"disinfection temperature\",\"dhw[n].flowtempoffset\":\"flow temperature offset\",\"dhw[n].hystoff\":\"hysteresis off temperature\",\"dhw[n].hyston\":\"hysteresis on temperature\",\"dhw[n].maxpower\":\"max power\",\"dhw[n].maxtemp\":\"maximum temperature\",\"dhw[n].nrg\":\"energy\",\"dhw[n].onetime\":\"one time charging\",\"dhw[n].seltemp\":\"selected temperature\",\"dhw[n].seltemplow\":\"selected lower temperature\",\"dhw[n].seltempsingle\":\"single charge temperature\",\"dhw[n].tapactivated\":\"turn on/off\",\"dhw[n].tempecoplus\":\"selected eco+ temperature\",\"emergencyops\":\"emergency operation\",\"emergencytemp\":\"emergency temperature\",\"heatingactivated\":\"heating activated\",\"heatingoff\":\"force heating off\",\"heatingtemp\":\"heating temperature\",\"maintenance\":\"maintenance scheduled\",\"maintenancedate\":\"next maintenance date\",\"maintenancetime\":\"time to next maintenance\",\"nofrostmode\":\"nofrost mode\",\"nofrosttemp\":\"nofrost temperature\",\"nompower\":\"nominal Power\",\"nrgheat\":\"energy heating\",\"pumpcharacter\":\"boiler pump characteristic\",\"pumpdelay\":\"pump delay\",\"pumpkickday\":\"pump kick day\",\"pumpkickdelay\":\"pump kick delay\",\"pumpkickhour\":\"pump kick hour\",\"pumpmode\":\"boiler pump mode\",\"pumpmodmax\":\"boiler pump max power\",\"pumpmodmin\":\"boiler pump min power\",\"pumpontemp\":\"pump logic temperature\",\"reset\":\"reset\",\"selburnpow\":\"burner selected max power\",\"selflowtemp\":\"selected flow temperature\",\"summertemp\":\"summer temperature\"}]"; TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/boiler/commands")); } @@ -110,17 +110,17 @@ void test_22() { } void test_23() { - auto expected_response = "[{\"system\":{\"version\":\"dev\",\"uptime\":\"000+00:00:00.000\",\"uptimeSec\":0,\"resetReason\":\"Unknown / Unknown\",\"txpause\":false,\"gpios_allowed\":\"0, 2, 5, 18, 23\",\"gpios_in_use\":\"0, 2, 5, 18, 23\",\"gpios_available\":\"\"},\"network\":{\"network\":\"WiFi\",\"hostname\":\"ems-esp\",\"RSSI\":-23,\"TxPowerSetting\":0,\"staticIP\":false,\"lowBandwidth\":false,\"disableSleep\":true,\"enableMDNS\":true,\"enableCORS\":false},\"ntp\":{\"NTPstatus\":\"disconnected\",\"enabled\":true,\"server\":\"pool.ntp.org\",\"tzLabel\":\"Europe/London\",\"NTPStatus\":\"disconnected\"},\"ap\":{\"provisionMode\":\"disconnected\",\"ssid\":\"ems-esp\"},\"mqtt\":{\"MQTTStatus\":\"disconnected\",\"MQTTPublishes\":0,\"MQTTQueued\":0,\"MQTTPublishFails\":0,\"MQTTReconnects\":0,\"enabled\":true,\"clientID\":\"ems-esp\",\"keepAlive\":60,\"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},\"modbus\":{\"enabled\":false},\"sensor\":{\"temperatureSensors\":3,\"temperatureSensorReads\":0,\"temperatureSensorFails\":0},\"analog\":{\"enabled\":true,\"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\":5,\"emsBusID\":73,\"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,\"disableReset\":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 0x3B\"},{\"type\":\"thermostat\",\"name\":\"FW120\",\"deviceID\":\"0x10\",\"productID\":192,\"brand\":\"\",\"version\":\"01.00\",\"entities\":12,\"handlersReceived\":\"0x016F\",\"handlersFetched\":\"0x0170 0x0171\",\"handlersPending\":\"0xA3 0x06 0xA2 0x12 0x13 0x0172 0x0165 0x0168\"},{\"type\":\"temperaturesensor\",\"name\":\"temperaturesensor\",\"entities\":3},{\"type\":\"analogsensor\",\"name\":\"analogsensor\",\"entities\":5},{\"type\":\"scheduler\",\"name\":\"scheduler\",\"entities\":2},{\"type\":\"commands\",\"name\":\"commands\",\"entities\":3},{\"type\":\"custom\",\"name\":\"custom\",\"entities\":4}]}]"; + auto expected_response = "[{\"system\":{\"version\":\"dev\",\"uptime\":\"000+00:00:00.000\",\"uptimeSec\":0,\"resetReason\":\"Unknown / Unknown\",\"txpause\":false,\"gpios_allowed\":\"0, 2, 5, 18, 23\",\"gpios_in_use\":\"0, 2, 5, 18, 23\",\"gpios_available\":\"\"},\"network\":{\"network\":\"WiFi\",\"hostname\":\"ems-esp\",\"RSSI\":-23,\"TxPowerSetting\":0,\"staticIP\":false,\"lowBandwidth\":false,\"disableSleep\":true,\"enableMDNS\":true,\"enableCORS\":false},\"ntp\":{\"NTPstatus\":\"disconnected\",\"enabled\":true,\"server\":\"pool.ntp.org\",\"tzLabel\":\"Europe/London\",\"NTPStatus\":\"disconnected\"},\"ap\":{\"provisionMode\":\"disconnected\",\"ssid\":\"ems-esp\"},\"mqtt\":{\"MQTTStatus\":\"disconnected\",\"MQTTPublishes\":0,\"MQTTQueued\":0,\"MQTTPublishFails\":0,\"MQTTReconnects\":1,\"enabled\":true,\"clientID\":\"ems-esp\",\"keepAlive\":60,\"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},\"modbus\":{\"enabled\":false},\"sensor\":{\"temperatureSensors\":3,\"temperatureSensorReads\":0,\"temperatureSensorFails\":0},\"analog\":{\"enabled\":true,\"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\":5,\"emsBusID\":73,\"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,\"disableReset\":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 0x3B\"},{\"type\":\"thermostat\",\"name\":\"FW120\",\"deviceID\":\"0x10\",\"productID\":192,\"brand\":\"\",\"version\":\"01.00\",\"entities\":12,\"handlersReceived\":\"0x016F\",\"handlersFetched\":\"0x0170 0x0171\",\"handlersPending\":\"0xA3 0x06 0xA2 0x12 0x13 0x0172 0x0165 0x0168\"},{\"type\":\"temperaturesensor\",\"name\":\"temperaturesensor\",\"entities\":3},{\"type\":\"analogsensor\",\"name\":\"analogsensor\",\"entities\":5},{\"type\":\"scheduler\",\"name\":\"scheduler\",\"entities\":2},{\"type\":\"commands\",\"name\":\"commands\",\"entities\":3},{\"type\":\"custom\",\"name\":\"custom\",\"entities\":4}]}]"; TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/system")); } void test_24() { - auto expected_response = "[{\"system\":{\"version\":\"dev\",\"uptime\":\"000+00:00:00.000\",\"uptimeSec\":0,\"resetReason\":\"Unknown / Unknown\",\"txpause\":false,\"gpios_allowed\":\"0, 2, 5, 18, 23\",\"gpios_in_use\":\"0, 2, 5, 18, 23\",\"gpios_available\":\"\"},\"network\":{\"network\":\"WiFi\",\"hostname\":\"ems-esp\",\"RSSI\":-23,\"TxPowerSetting\":0,\"staticIP\":false,\"lowBandwidth\":false,\"disableSleep\":true,\"enableMDNS\":true,\"enableCORS\":false},\"ntp\":{\"NTPstatus\":\"disconnected\",\"enabled\":true,\"server\":\"pool.ntp.org\",\"tzLabel\":\"Europe/London\",\"NTPStatus\":\"disconnected\"},\"ap\":{\"provisionMode\":\"disconnected\",\"ssid\":\"ems-esp\"},\"mqtt\":{\"MQTTStatus\":\"disconnected\",\"MQTTPublishes\":0,\"MQTTQueued\":0,\"MQTTPublishFails\":0,\"MQTTReconnects\":0,\"enabled\":true,\"clientID\":\"ems-esp\",\"keepAlive\":60,\"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},\"modbus\":{\"enabled\":false},\"sensor\":{\"temperatureSensors\":3,\"temperatureSensorReads\":0,\"temperatureSensorFails\":0},\"analog\":{\"enabled\":true,\"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\":5,\"emsBusID\":73,\"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,\"disableReset\":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 0x3B\"},{\"type\":\"thermostat\",\"name\":\"FW120\",\"deviceID\":\"0x10\",\"productID\":192,\"brand\":\"\",\"version\":\"01.00\",\"entities\":12,\"handlersReceived\":\"0x016F\",\"handlersFetched\":\"0x0170 0x0171\",\"handlersPending\":\"0xA3 0x06 0xA2 0x12 0x13 0x0172 0x0165 0x0168\"},{\"type\":\"temperaturesensor\",\"name\":\"temperaturesensor\",\"entities\":3},{\"type\":\"analogsensor\",\"name\":\"analogsensor\",\"entities\":5},{\"type\":\"scheduler\",\"name\":\"scheduler\",\"entities\":2},{\"type\":\"commands\",\"name\":\"commands\",\"entities\":3},{\"type\":\"custom\",\"name\":\"custom\",\"entities\":4}]}]"; + auto expected_response = "[{\"system\":{\"version\":\"dev\",\"uptime\":\"000+00:00:00.000\",\"uptimeSec\":0,\"resetReason\":\"Unknown / Unknown\",\"txpause\":false,\"gpios_allowed\":\"0, 2, 5, 18, 23\",\"gpios_in_use\":\"0, 2, 5, 18, 23\",\"gpios_available\":\"\"},\"network\":{\"network\":\"WiFi\",\"hostname\":\"ems-esp\",\"RSSI\":-23,\"TxPowerSetting\":0,\"staticIP\":false,\"lowBandwidth\":false,\"disableSleep\":true,\"enableMDNS\":true,\"enableCORS\":false},\"ntp\":{\"NTPstatus\":\"disconnected\",\"enabled\":true,\"server\":\"pool.ntp.org\",\"tzLabel\":\"Europe/London\",\"NTPStatus\":\"disconnected\"},\"ap\":{\"provisionMode\":\"disconnected\",\"ssid\":\"ems-esp\"},\"mqtt\":{\"MQTTStatus\":\"disconnected\",\"MQTTPublishes\":0,\"MQTTQueued\":0,\"MQTTPublishFails\":0,\"MQTTReconnects\":1,\"enabled\":true,\"clientID\":\"ems-esp\",\"keepAlive\":60,\"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},\"modbus\":{\"enabled\":false},\"sensor\":{\"temperatureSensors\":3,\"temperatureSensorReads\":0,\"temperatureSensorFails\":0},\"analog\":{\"enabled\":true,\"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\":5,\"emsBusID\":73,\"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,\"disableReset\":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 0x3B\"},{\"type\":\"thermostat\",\"name\":\"FW120\",\"deviceID\":\"0x10\",\"productID\":192,\"brand\":\"\",\"version\":\"01.00\",\"entities\":12,\"handlersReceived\":\"0x016F\",\"handlersFetched\":\"0x0170 0x0171\",\"handlersPending\":\"0xA3 0x06 0xA2 0x12 0x13 0x0172 0x0165 0x0168\"},{\"type\":\"temperaturesensor\",\"name\":\"temperaturesensor\",\"entities\":3},{\"type\":\"analogsensor\",\"name\":\"analogsensor\",\"entities\":5},{\"type\":\"scheduler\",\"name\":\"scheduler\",\"entities\":2},{\"type\":\"commands\",\"name\":\"commands\",\"entities\":3},{\"type\":\"custom\",\"name\":\"custom\",\"entities\":4}]}]"; TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/system/info")); } void test_25() { - auto expected_response = "[{\"api_data\":\"# HELP emsesp_system_uptimesec uptimeSec\\n# TYPE emsesp_system_uptimesec gauge\\nemsesp_system_uptimesec 0\\n# HELP emsesp_system_txpause txpause\\n# TYPE emsesp_system_txpause gauge\\nemsesp_system_txpause 0\\n# HELP emsesp_system_info info\\n# TYPE emsesp_system_info gauge\\nemsesp_system_info{version=\\\"dev\\\", resetreason=\\\"Unknown / Unknown\\\", gpios_allowed=\\\"0, 2, 5, 18, 23\\\", gpios_in_use=\\\"0, 2, 5, 18, 23\\\"} 1\\n# HELP emsesp_network_rssi RSSI\\n# TYPE emsesp_network_rssi gauge\\nemsesp_network_rssi -23\\n# HELP emsesp_network_txpowersetting TxPowerSetting\\n# TYPE emsesp_network_txpowersetting gauge\\nemsesp_network_txpowersetting 0\\n# HELP emsesp_network_staticip staticIP\\n# TYPE emsesp_network_staticip gauge\\nemsesp_network_staticip 0\\n# HELP emsesp_network_lowbandwidth lowBandwidth\\n# TYPE emsesp_network_lowbandwidth gauge\\nemsesp_network_lowbandwidth 0\\n# HELP emsesp_network_disablesleep disableSleep\\n# TYPE emsesp_network_disablesleep gauge\\nemsesp_network_disablesleep 1\\n# HELP emsesp_network_enablemdns enableMDNS\\n# TYPE emsesp_network_enablemdns gauge\\nemsesp_network_enablemdns 1\\n# HELP emsesp_network_enablecors enableCORS\\n# TYPE emsesp_network_enablecors gauge\\nemsesp_network_enablecors 0\\n# HELP emsesp_network_info info\\n# TYPE emsesp_network_info gauge\\nemsesp_network_info{network=\\\"WiFi\\\", hostname=\\\"ems-esp\\\"} 1\\n# HELP emsesp_ntp_enabled enabled\\n# TYPE emsesp_ntp_enabled gauge\\nemsesp_ntp_enabled 1\\n# HELP emsesp_ntp_info info\\n# TYPE emsesp_ntp_info gauge\\nemsesp_ntp_info{ntpstatus=\\\"disconnected\\\", server=\\\"pool.ntp.org\\\", tzlabel=\\\"Europe/London\\\"} 1\\n# HELP emsesp_ap_info info\\n# TYPE emsesp_ap_info gauge\\nemsesp_ap_info{provisionmode=\\\"disconnected\\\", ssid=\\\"ems-esp\\\"} 1\\n# HELP emsesp_mqtt_mqttpublishes MQTTPublishes\\n# TYPE emsesp_mqtt_mqttpublishes gauge\\nemsesp_mqtt_mqttpublishes 0\\n# HELP emsesp_mqtt_mqttqueued MQTTQueued\\n# TYPE emsesp_mqtt_mqttqueued gauge\\nemsesp_mqtt_mqttqueued 0\\n# HELP emsesp_mqtt_mqttpublishfails MQTTPublishFails\\n# TYPE emsesp_mqtt_mqttpublishfails gauge\\nemsesp_mqtt_mqttpublishfails 0\\n# HELP emsesp_mqtt_mqttreconnects MQTTReconnects\\n# TYPE emsesp_mqtt_mqttreconnects gauge\\nemsesp_mqtt_mqttreconnects 0\\n# HELP emsesp_mqtt_enabled enabled\\n# TYPE emsesp_mqtt_enabled gauge\\nemsesp_mqtt_enabled 1\\n# HELP emsesp_mqtt_keepalive keepAlive\\n# TYPE emsesp_mqtt_keepalive gauge\\nemsesp_mqtt_keepalive 60\\n# HELP emsesp_mqtt_cleansession cleanSession\\n# TYPE emsesp_mqtt_cleansession gauge\\nemsesp_mqtt_cleansession 0\\n# HELP emsesp_mqtt_entityformat entityFormat\\n# TYPE emsesp_mqtt_entityformat gauge\\nemsesp_mqtt_entityformat 1\\n# HELP emsesp_mqtt_discoverytype discoveryType\\n# TYPE emsesp_mqtt_discoverytype gauge\\nemsesp_mqtt_discoverytype 0\\n# HELP emsesp_mqtt_nestedformat nestedFormat\\n# TYPE emsesp_mqtt_nestedformat gauge\\nemsesp_mqtt_nestedformat 1\\n# HELP emsesp_mqtt_haenabled haEnabled\\n# TYPE emsesp_mqtt_haenabled gauge\\nemsesp_mqtt_haenabled 1\\n# HELP emsesp_mqtt_mqttqos mqttQos\\n# TYPE emsesp_mqtt_mqttqos gauge\\nemsesp_mqtt_mqttqos 0\\n# HELP emsesp_mqtt_mqttretain mqttRetain\\n# TYPE emsesp_mqtt_mqttretain gauge\\nemsesp_mqtt_mqttretain 0\\n# HELP emsesp_mqtt_publishtimeheartbeat publishTimeHeartbeat\\n# TYPE emsesp_mqtt_publishtimeheartbeat gauge\\nemsesp_mqtt_publishtimeheartbeat 60\\n# HELP emsesp_mqtt_publishtimeboiler publishTimeBoiler\\n# TYPE emsesp_mqtt_publishtimeboiler gauge\\nemsesp_mqtt_publishtimeboiler 10\\n# HELP emsesp_mqtt_publishtimethermostat publishTimeThermostat\\n# TYPE emsesp_mqtt_publishtimethermostat gauge\\nemsesp_mqtt_publishtimethermostat 10\\n# HELP emsesp_mqtt_publishtimesolar publishTimeSolar\\n# TYPE emsesp_mqtt_publishtimesolar gauge\\nemsesp_mqtt_publishtimesolar 10\\n# HELP emsesp_mqtt_publishtimemixer publishTimeMixer\\n# TYPE emsesp_mqtt_publishtimemixer gauge\\nemsesp_mqtt_publishtimemixer 10\\n# HELP emsesp_mqtt_publishtimewater publishTimeWater\\n# TYPE emsesp_mqtt_publishtimewater gauge\\nemsesp_mqtt_publishtimewater 0\\n# HELP emsesp_mqtt_publishtimeother publishTimeOther\\n# TYPE emsesp_mqtt_publishtimeother gauge\\nemsesp_mqtt_publishtimeother 10\\n# HELP emsesp_mqtt_publishtimesensor publishTimeSensor\\n# TYPE emsesp_mqtt_publishtimesensor gauge\\nemsesp_mqtt_publishtimesensor 10\\n# HELP emsesp_mqtt_publishsingle publishSingle\\n# TYPE emsesp_mqtt_publishsingle gauge\\nemsesp_mqtt_publishsingle 0\\n# HELP emsesp_mqtt_publish2command publish2command\\n# TYPE emsesp_mqtt_publish2command gauge\\nemsesp_mqtt_publish2command 0\\n# HELP emsesp_mqtt_sendresponse sendResponse\\n# TYPE emsesp_mqtt_sendresponse gauge\\nemsesp_mqtt_sendresponse 0\\n# HELP emsesp_mqtt_info info\\n# TYPE emsesp_mqtt_info gauge\\nemsesp_mqtt_info{mqttstatus=\\\"disconnected\\\", clientid=\\\"ems-esp\\\", base=\\\"ems-esp\\\", discoveryprefix=\\\"homeassistant\\\"} 1\\n# HELP emsesp_syslog_enabled enabled\\n# TYPE emsesp_syslog_enabled gauge\\nemsesp_syslog_enabled 0\\n# HELP emsesp_modbus_enabled enabled\\n# TYPE emsesp_modbus_enabled gauge\\nemsesp_modbus_enabled 0\\n# HELP emsesp_sensor_temperaturesensors temperatureSensors\\n# TYPE emsesp_sensor_temperaturesensors gauge\\nemsesp_sensor_temperaturesensors 3\\n# HELP emsesp_sensor_temperaturesensorreads temperatureSensorReads\\n# TYPE emsesp_sensor_temperaturesensorreads gauge\\nemsesp_sensor_temperaturesensorreads 0\\n# HELP emsesp_sensor_temperaturesensorfails temperatureSensorFails\\n# TYPE emsesp_sensor_temperaturesensorfails gauge\\nemsesp_sensor_temperaturesensorfails 0\\n# HELP emsesp_analog_enabled enabled\\n# TYPE emsesp_analog_enabled gauge\\nemsesp_analog_enabled 1\\n# HELP emsesp_analog_analogsensors analogSensors\\n# TYPE emsesp_analog_analogsensors gauge\\nemsesp_analog_analogsensors 5\\n# HELP emsesp_analog_analogsensorreads analogSensorReads\\n# TYPE emsesp_analog_analogsensorreads gauge\\nemsesp_analog_analogsensorreads 0\\n# HELP emsesp_analog_analogsensorfails analogSensorFails\\n# TYPE emsesp_analog_analogsensorfails gauge\\nemsesp_analog_analogsensorfails 0\\n# HELP emsesp_api_apicalls APICalls\\n# TYPE emsesp_api_apicalls gauge\\nemsesp_api_apicalls 0\\n# HELP emsesp_api_apifails APIFails\\n# TYPE emsesp_api_apifails gauge\\nemsesp_api_apifails 0\\n# HELP emsesp_bus_bustelegramsreceived busTelegramsReceived\\n# TYPE emsesp_bus_bustelegramsreceived gauge\\nemsesp_bus_bustelegramsreceived 8\\n# HELP emsesp_bus_busreads busReads\\n# TYPE emsesp_bus_busreads gauge\\nemsesp_bus_busreads 0\\n# HELP emsesp_bus_buswrites busWrites\\n# TYPE emsesp_bus_buswrites gauge\\nemsesp_bus_buswrites 0\\n# HELP emsesp_bus_busincompletetelegrams busIncompleteTelegrams\\n# TYPE emsesp_bus_busincompletetelegrams gauge\\nemsesp_bus_busincompletetelegrams 0\\n# HELP emsesp_bus_busreadsfailed busReadsFailed\\n# TYPE emsesp_bus_busreadsfailed gauge\\nemsesp_bus_busreadsfailed 0\\n# HELP emsesp_bus_buswritesfailed busWritesFailed\\n# TYPE emsesp_bus_buswritesfailed gauge\\nemsesp_bus_buswritesfailed 0\\n# HELP emsesp_bus_busrxlinequality busRxLineQuality\\n# TYPE emsesp_bus_busrxlinequality gauge\\nemsesp_bus_busrxlinequality 100\\n# HELP emsesp_bus_bustxlinequality busTxLineQuality\\n# TYPE emsesp_bus_bustxlinequality gauge\\nemsesp_bus_bustxlinequality 100\\n# HELP emsesp_bus_info info\\n# TYPE emsesp_bus_info gauge\\nemsesp_bus_info{busstatus=\\\"connected\\\", busprotocol=\\\"Buderus\\\"} 1\\n# HELP emsesp_settings_txmode txMode\\n# TYPE emsesp_settings_txmode gauge\\nemsesp_settings_txmode 5\\n# HELP emsesp_settings_emsbusid emsBusID\\n# TYPE emsesp_settings_emsbusid gauge\\nemsesp_settings_emsbusid 73\\n# HELP emsesp_settings_showertimer showerTimer\\n# TYPE emsesp_settings_showertimer gauge\\nemsesp_settings_showertimer 0\\n# HELP emsesp_settings_showerminduration showerMinDuration\\n# TYPE emsesp_settings_showerminduration gauge\\nemsesp_settings_showerminduration 180\\n# HELP emsesp_settings_showeralert showerAlert\\n# TYPE emsesp_settings_showeralert gauge\\nemsesp_settings_showeralert 0\\n# HELP emsesp_settings_hideled hideLed\\n# TYPE emsesp_settings_hideled gauge\\nemsesp_settings_hideled 0\\n# HELP emsesp_settings_notokenapi noTokenApi\\n# TYPE emsesp_settings_notokenapi gauge\\nemsesp_settings_notokenapi 0\\n# HELP emsesp_settings_readonlymode readonlyMode\\n# TYPE emsesp_settings_readonlymode gauge\\nemsesp_settings_readonlymode 0\\n# HELP emsesp_settings_fahrenheit fahrenheit\\n# TYPE emsesp_settings_fahrenheit gauge\\nemsesp_settings_fahrenheit 0\\n# HELP emsesp_settings_dallasparasite dallasParasite\\n# TYPE emsesp_settings_dallasparasite gauge\\nemsesp_settings_dallasparasite 0\\n# HELP emsesp_settings_boolformat boolFormat\\n# TYPE emsesp_settings_boolformat gauge\\nemsesp_settings_boolformat 1\\n# HELP emsesp_settings_booldashboard boolDashboard\\n# TYPE emsesp_settings_booldashboard gauge\\nemsesp_settings_booldashboard 1\\n# HELP emsesp_settings_enumformat enumFormat\\n# TYPE emsesp_settings_enumformat gauge\\nemsesp_settings_enumformat 1\\n# HELP emsesp_settings_analogenabled analogEnabled\\n# TYPE emsesp_settings_analogenabled gauge\\nemsesp_settings_analogenabled 1\\n# HELP emsesp_settings_telnetenabled telnetEnabled\\n# TYPE emsesp_settings_telnetenabled gauge\\nemsesp_settings_telnetenabled 1\\n# HELP emsesp_settings_maxweblogbuffer maxWebLogBuffer\\n# TYPE emsesp_settings_maxweblogbuffer gauge\\nemsesp_settings_maxweblogbuffer 25\\n# HELP emsesp_settings_modbusenabled modbusEnabled\\n# TYPE emsesp_settings_modbusenabled gauge\\nemsesp_settings_modbusenabled 0\\n# HELP emsesp_settings_forceheatingoff forceHeatingOff\\n# TYPE emsesp_settings_forceheatingoff gauge\\nemsesp_settings_forceheatingoff 0\\n# HELP emsesp_settings_developermode developerMode\\n# TYPE emsesp_settings_developermode gauge\\nemsesp_settings_developermode 0\\n# HELP emsesp_settings_disablereset disableReset\\n# TYPE emsesp_settings_disablereset gauge\\nemsesp_settings_disablereset 0\\n# HELP emsesp_settings_info info\\n# TYPE emsesp_settings_info gauge\\nemsesp_settings_info{boardprofile=\\\"S32\\\", locale=\\\"en\\\"} 1\\n# HELP emsesp_device_productid productID\\n# TYPE emsesp_device_productid gauge\\nemsesp_device_productid{type=\\\"boiler\\\", name=\\\"My Custom Boiler\\\", deviceid=\\\"0x08\\\", version=\\\"01.00\\\"} 123\\n# HELP emsesp_device_entities entities\\n# TYPE emsesp_device_entities gauge\\nemsesp_device_entities{type=\\\"boiler\\\", name=\\\"My Custom Boiler\\\", deviceid=\\\"0x08\\\", version=\\\"01.00\\\"} 39\\nemsesp_device_productid{type=\\\"thermostat\\\", name=\\\"FW120\\\", deviceid=\\\"0x10\\\", version=\\\"01.00\\\"} 192\\nemsesp_device_entities{type=\\\"thermostat\\\", name=\\\"FW120\\\", deviceid=\\\"0x10\\\", version=\\\"01.00\\\"} 12\\nemsesp_device_entities{type=\\\"temperaturesensor\\\", name=\\\"temperaturesensor\\\"} 3\\nemsesp_device_entities{type=\\\"analogsensor\\\", name=\\\"analogsensor\\\"} 5\\nemsesp_device_entities{type=\\\"scheduler\\\", name=\\\"scheduler\\\"} 2\\nemsesp_device_entities{type=\\\"commands\\\", name=\\\"commands\\\"} 3\\nemsesp_device_entities{type=\\\"custom\\\", name=\\\"custom\\\"} 4\\n\"}]"; + auto expected_response = "[{\"api_data\":\"# HELP emsesp_system_uptimesec uptimeSec\\n# TYPE emsesp_system_uptimesec gauge\\nemsesp_system_uptimesec 0\\n# HELP emsesp_system_txpause txpause\\n# TYPE emsesp_system_txpause gauge\\nemsesp_system_txpause 0\\n# HELP emsesp_system_info info\\n# TYPE emsesp_system_info gauge\\nemsesp_system_info{version=\\\"dev\\\", resetreason=\\\"Unknown / Unknown\\\", gpios_allowed=\\\"0, 2, 5, 18, 23\\\", gpios_in_use=\\\"0, 2, 5, 18, 23\\\"} 1\\n# HELP emsesp_network_rssi RSSI\\n# TYPE emsesp_network_rssi gauge\\nemsesp_network_rssi -23\\n# HELP emsesp_network_txpowersetting TxPowerSetting\\n# TYPE emsesp_network_txpowersetting gauge\\nemsesp_network_txpowersetting 0\\n# HELP emsesp_network_staticip staticIP\\n# TYPE emsesp_network_staticip gauge\\nemsesp_network_staticip 0\\n# HELP emsesp_network_lowbandwidth lowBandwidth\\n# TYPE emsesp_network_lowbandwidth gauge\\nemsesp_network_lowbandwidth 0\\n# HELP emsesp_network_disablesleep disableSleep\\n# TYPE emsesp_network_disablesleep gauge\\nemsesp_network_disablesleep 1\\n# HELP emsesp_network_enablemdns enableMDNS\\n# TYPE emsesp_network_enablemdns gauge\\nemsesp_network_enablemdns 1\\n# HELP emsesp_network_enablecors enableCORS\\n# TYPE emsesp_network_enablecors gauge\\nemsesp_network_enablecors 0\\n# HELP emsesp_network_info info\\n# TYPE emsesp_network_info gauge\\nemsesp_network_info{network=\\\"WiFi\\\", hostname=\\\"ems-esp\\\"} 1\\n# HELP emsesp_ntp_enabled enabled\\n# TYPE emsesp_ntp_enabled gauge\\nemsesp_ntp_enabled 1\\n# HELP emsesp_ntp_info info\\n# TYPE emsesp_ntp_info gauge\\nemsesp_ntp_info{ntpstatus=\\\"disconnected\\\", server=\\\"pool.ntp.org\\\", tzlabel=\\\"Europe/London\\\"} 1\\n# HELP emsesp_ap_info info\\n# TYPE emsesp_ap_info gauge\\nemsesp_ap_info{provisionmode=\\\"disconnected\\\", ssid=\\\"ems-esp\\\"} 1\\n# HELP emsesp_mqtt_mqttpublishes MQTTPublishes\\n# TYPE emsesp_mqtt_mqttpublishes gauge\\nemsesp_mqtt_mqttpublishes 0\\n# HELP emsesp_mqtt_mqttqueued MQTTQueued\\n# TYPE emsesp_mqtt_mqttqueued gauge\\nemsesp_mqtt_mqttqueued 0\\n# HELP emsesp_mqtt_mqttpublishfails MQTTPublishFails\\n# TYPE emsesp_mqtt_mqttpublishfails gauge\\nemsesp_mqtt_mqttpublishfails 0\\n# HELP emsesp_mqtt_mqttreconnects MQTTReconnects\\n# TYPE emsesp_mqtt_mqttreconnects gauge\\nemsesp_mqtt_mqttreconnects 1\\n# HELP emsesp_mqtt_enabled enabled\\n# TYPE emsesp_mqtt_enabled gauge\\nemsesp_mqtt_enabled 1\\n# HELP emsesp_mqtt_keepalive keepAlive\\n# TYPE emsesp_mqtt_keepalive gauge\\nemsesp_mqtt_keepalive 60\\n# HELP emsesp_mqtt_cleansession cleanSession\\n# TYPE emsesp_mqtt_cleansession gauge\\nemsesp_mqtt_cleansession 0\\n# HELP emsesp_mqtt_entityformat entityFormat\\n# TYPE emsesp_mqtt_entityformat gauge\\nemsesp_mqtt_entityformat 1\\n# HELP emsesp_mqtt_discoverytype discoveryType\\n# TYPE emsesp_mqtt_discoverytype gauge\\nemsesp_mqtt_discoverytype 0\\n# HELP emsesp_mqtt_nestedformat nestedFormat\\n# TYPE emsesp_mqtt_nestedformat gauge\\nemsesp_mqtt_nestedformat 1\\n# HELP emsesp_mqtt_haenabled haEnabled\\n# TYPE emsesp_mqtt_haenabled gauge\\nemsesp_mqtt_haenabled 1\\n# HELP emsesp_mqtt_mqttqos mqttQos\\n# TYPE emsesp_mqtt_mqttqos gauge\\nemsesp_mqtt_mqttqos 0\\n# HELP emsesp_mqtt_mqttretain mqttRetain\\n# TYPE emsesp_mqtt_mqttretain gauge\\nemsesp_mqtt_mqttretain 0\\n# HELP emsesp_mqtt_publishtimeheartbeat publishTimeHeartbeat\\n# TYPE emsesp_mqtt_publishtimeheartbeat gauge\\nemsesp_mqtt_publishtimeheartbeat 60\\n# HELP emsesp_mqtt_publishtimeboiler publishTimeBoiler\\n# TYPE emsesp_mqtt_publishtimeboiler gauge\\nemsesp_mqtt_publishtimeboiler 10\\n# HELP emsesp_mqtt_publishtimethermostat publishTimeThermostat\\n# TYPE emsesp_mqtt_publishtimethermostat gauge\\nemsesp_mqtt_publishtimethermostat 10\\n# HELP emsesp_mqtt_publishtimesolar publishTimeSolar\\n# TYPE emsesp_mqtt_publishtimesolar gauge\\nemsesp_mqtt_publishtimesolar 10\\n# HELP emsesp_mqtt_publishtimemixer publishTimeMixer\\n# TYPE emsesp_mqtt_publishtimemixer gauge\\nemsesp_mqtt_publishtimemixer 10\\n# HELP emsesp_mqtt_publishtimewater publishTimeWater\\n# TYPE emsesp_mqtt_publishtimewater gauge\\nemsesp_mqtt_publishtimewater 0\\n# HELP emsesp_mqtt_publishtimeother publishTimeOther\\n# TYPE emsesp_mqtt_publishtimeother gauge\\nemsesp_mqtt_publishtimeother 10\\n# HELP emsesp_mqtt_publishtimesensor publishTimeSensor\\n# TYPE emsesp_mqtt_publishtimesensor gauge\\nemsesp_mqtt_publishtimesensor 10\\n# HELP emsesp_mqtt_publishsingle publishSingle\\n# TYPE emsesp_mqtt_publishsingle gauge\\nemsesp_mqtt_publishsingle 0\\n# HELP emsesp_mqtt_publish2command publish2command\\n# TYPE emsesp_mqtt_publish2command gauge\\nemsesp_mqtt_publish2command 0\\n# HELP emsesp_mqtt_sendresponse sendResponse\\n# TYPE emsesp_mqtt_sendresponse gauge\\nemsesp_mqtt_sendresponse 0\\n# HELP emsesp_mqtt_info info\\n# TYPE emsesp_mqtt_info gauge\\nemsesp_mqtt_info{mqttstatus=\\\"disconnected\\\", clientid=\\\"ems-esp\\\", base=\\\"ems-esp\\\", discoveryprefix=\\\"homeassistant\\\"} 1\\n# HELP emsesp_syslog_enabled enabled\\n# TYPE emsesp_syslog_enabled gauge\\nemsesp_syslog_enabled 0\\n# HELP emsesp_modbus_enabled enabled\\n# TYPE emsesp_modbus_enabled gauge\\nemsesp_modbus_enabled 0\\n# HELP emsesp_sensor_temperaturesensors temperatureSensors\\n# TYPE emsesp_sensor_temperaturesensors gauge\\nemsesp_sensor_temperaturesensors 3\\n# HELP emsesp_sensor_temperaturesensorreads temperatureSensorReads\\n# TYPE emsesp_sensor_temperaturesensorreads gauge\\nemsesp_sensor_temperaturesensorreads 0\\n# HELP emsesp_sensor_temperaturesensorfails temperatureSensorFails\\n# TYPE emsesp_sensor_temperaturesensorfails gauge\\nemsesp_sensor_temperaturesensorfails 0\\n# HELP emsesp_analog_enabled enabled\\n# TYPE emsesp_analog_enabled gauge\\nemsesp_analog_enabled 1\\n# HELP emsesp_analog_analogsensors analogSensors\\n# TYPE emsesp_analog_analogsensors gauge\\nemsesp_analog_analogsensors 5\\n# HELP emsesp_analog_analogsensorreads analogSensorReads\\n# TYPE emsesp_analog_analogsensorreads gauge\\nemsesp_analog_analogsensorreads 0\\n# HELP emsesp_analog_analogsensorfails analogSensorFails\\n# TYPE emsesp_analog_analogsensorfails gauge\\nemsesp_analog_analogsensorfails 0\\n# HELP emsesp_api_apicalls APICalls\\n# TYPE emsesp_api_apicalls gauge\\nemsesp_api_apicalls 0\\n# HELP emsesp_api_apifails APIFails\\n# TYPE emsesp_api_apifails gauge\\nemsesp_api_apifails 0\\n# HELP emsesp_bus_bustelegramsreceived busTelegramsReceived\\n# TYPE emsesp_bus_bustelegramsreceived gauge\\nemsesp_bus_bustelegramsreceived 8\\n# HELP emsesp_bus_busreads busReads\\n# TYPE emsesp_bus_busreads gauge\\nemsesp_bus_busreads 0\\n# HELP emsesp_bus_buswrites busWrites\\n# TYPE emsesp_bus_buswrites gauge\\nemsesp_bus_buswrites 0\\n# HELP emsesp_bus_busincompletetelegrams busIncompleteTelegrams\\n# TYPE emsesp_bus_busincompletetelegrams gauge\\nemsesp_bus_busincompletetelegrams 0\\n# HELP emsesp_bus_busreadsfailed busReadsFailed\\n# TYPE emsesp_bus_busreadsfailed gauge\\nemsesp_bus_busreadsfailed 0\\n# HELP emsesp_bus_buswritesfailed busWritesFailed\\n# TYPE emsesp_bus_buswritesfailed gauge\\nemsesp_bus_buswritesfailed 0\\n# HELP emsesp_bus_busrxlinequality busRxLineQuality\\n# TYPE emsesp_bus_busrxlinequality gauge\\nemsesp_bus_busrxlinequality 100\\n# HELP emsesp_bus_bustxlinequality busTxLineQuality\\n# TYPE emsesp_bus_bustxlinequality gauge\\nemsesp_bus_bustxlinequality 100\\n# HELP emsesp_bus_info info\\n# TYPE emsesp_bus_info gauge\\nemsesp_bus_info{busstatus=\\\"connected\\\", busprotocol=\\\"Buderus\\\"} 1\\n# HELP emsesp_settings_txmode txMode\\n# TYPE emsesp_settings_txmode gauge\\nemsesp_settings_txmode 5\\n# HELP emsesp_settings_emsbusid emsBusID\\n# TYPE emsesp_settings_emsbusid gauge\\nemsesp_settings_emsbusid 73\\n# HELP emsesp_settings_showertimer showerTimer\\n# TYPE emsesp_settings_showertimer gauge\\nemsesp_settings_showertimer 0\\n# HELP emsesp_settings_showerminduration showerMinDuration\\n# TYPE emsesp_settings_showerminduration gauge\\nemsesp_settings_showerminduration 180\\n# HELP emsesp_settings_showeralert showerAlert\\n# TYPE emsesp_settings_showeralert gauge\\nemsesp_settings_showeralert 0\\n# HELP emsesp_settings_hideled hideLed\\n# TYPE emsesp_settings_hideled gauge\\nemsesp_settings_hideled 0\\n# HELP emsesp_settings_notokenapi noTokenApi\\n# TYPE emsesp_settings_notokenapi gauge\\nemsesp_settings_notokenapi 0\\n# HELP emsesp_settings_readonlymode readonlyMode\\n# TYPE emsesp_settings_readonlymode gauge\\nemsesp_settings_readonlymode 0\\n# HELP emsesp_settings_fahrenheit fahrenheit\\n# TYPE emsesp_settings_fahrenheit gauge\\nemsesp_settings_fahrenheit 0\\n# HELP emsesp_settings_dallasparasite dallasParasite\\n# TYPE emsesp_settings_dallasparasite gauge\\nemsesp_settings_dallasparasite 0\\n# HELP emsesp_settings_boolformat boolFormat\\n# TYPE emsesp_settings_boolformat gauge\\nemsesp_settings_boolformat 1\\n# HELP emsesp_settings_booldashboard boolDashboard\\n# TYPE emsesp_settings_booldashboard gauge\\nemsesp_settings_booldashboard 1\\n# HELP emsesp_settings_enumformat enumFormat\\n# TYPE emsesp_settings_enumformat gauge\\nemsesp_settings_enumformat 1\\n# HELP emsesp_settings_analogenabled analogEnabled\\n# TYPE emsesp_settings_analogenabled gauge\\nemsesp_settings_analogenabled 1\\n# HELP emsesp_settings_telnetenabled telnetEnabled\\n# TYPE emsesp_settings_telnetenabled gauge\\nemsesp_settings_telnetenabled 1\\n# HELP emsesp_settings_maxweblogbuffer maxWebLogBuffer\\n# TYPE emsesp_settings_maxweblogbuffer gauge\\nemsesp_settings_maxweblogbuffer 25\\n# HELP emsesp_settings_modbusenabled modbusEnabled\\n# TYPE emsesp_settings_modbusenabled gauge\\nemsesp_settings_modbusenabled 0\\n# HELP emsesp_settings_forceheatingoff forceHeatingOff\\n# TYPE emsesp_settings_forceheatingoff gauge\\nemsesp_settings_forceheatingoff 0\\n# HELP emsesp_settings_developermode developerMode\\n# TYPE emsesp_settings_developermode gauge\\nemsesp_settings_developermode 0\\n# HELP emsesp_settings_disablereset disableReset\\n# TYPE emsesp_settings_disablereset gauge\\nemsesp_settings_disablereset 0\\n# HELP emsesp_settings_info info\\n# TYPE emsesp_settings_info gauge\\nemsesp_settings_info{boardprofile=\\\"S32\\\", locale=\\\"en\\\"} 1\\n# HELP emsesp_device_productid productID\\n# TYPE emsesp_device_productid gauge\\nemsesp_device_productid{type=\\\"boiler\\\", name=\\\"My Custom Boiler\\\", deviceid=\\\"0x08\\\", version=\\\"01.00\\\"} 123\\n# HELP emsesp_device_entities entities\\n# TYPE emsesp_device_entities gauge\\nemsesp_device_entities{type=\\\"boiler\\\", name=\\\"My Custom Boiler\\\", deviceid=\\\"0x08\\\", version=\\\"01.00\\\"} 39\\nemsesp_device_productid{type=\\\"thermostat\\\", name=\\\"FW120\\\", deviceid=\\\"0x10\\\", version=\\\"01.00\\\"} 192\\nemsesp_device_entities{type=\\\"thermostat\\\", name=\\\"FW120\\\", deviceid=\\\"0x10\\\", version=\\\"01.00\\\"} 12\\nemsesp_device_entities{type=\\\"temperaturesensor\\\", name=\\\"temperaturesensor\\\"} 3\\nemsesp_device_entities{type=\\\"analogsensor\\\", name=\\\"analogsensor\\\"} 5\\nemsesp_device_entities{type=\\\"scheduler\\\", name=\\\"scheduler\\\"} 2\\nemsesp_device_entities{type=\\\"commands\\\", name=\\\"commands\\\"} 3\\nemsesp_device_entities{type=\\\"custom\\\", name=\\\"custom\\\"} 4\\n\"}]"; TEST_ASSERT_EQUAL_STRING(expected_response, call_url("/api/system/metrics")); } From f5189b4d093d3ce49b8ccd19d04c03c328ce8fcb Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 22 Aug 2026 13:23:21 +0200 Subject: [PATCH 03/31] mention how to update unit tests --- platformio.ini | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 782b82c57..2a512e488 100644 --- a/platformio.ini +++ b/platformio.ini @@ -196,9 +196,10 @@ lib_ldf_mode = off lib_deps = ; unit tests -; The test code is in ./test/test_api.cpp and the test_api.h file is created by the native-test-create environment. +; The test code is in ./test/test_api.cpp and the test_api.h file is generated by the native-test-create environment. ; to run use `platformio run -e native-test -t exec`. All tests should PASS. ; tip: use https://jsondiff.com/ to compare the expected and actual responses. +; to update the test output run `python3 scripts/generate_test_api.py` [env:native-test] platform = native test_build_src = true From 51b689d91bb0414a144ba205f5d572ee0735349f Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 22 Aug 2026 13:23:36 +0200 Subject: [PATCH 04/31] text changes --- src/web/WebStatusService.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/web/WebStatusService.cpp b/src/web/WebStatusService.cpp index 16f2e45e7..78ecda5f6 100644 --- a/src/web/WebStatusService.cpp +++ b/src/web/WebStatusService.cpp @@ -426,13 +426,13 @@ bool WebStatusService::refresh_versions_cache() { JsonDocument doc; auto http_code = http_request(VERSIONS_URL, "GET", "", doc.as(), result); if (http_code != 200) { - EMSESP::logger().warning("versions.json: HTTP error code %d", http_code); + EMSESP::logger().warning("refresh_versions_cache() HTTP error code %d", http_code); return false; } DeserializationError err = deserializeJson(doc, result); if (err) { #if defined(EMSESP_DEBUG) - EMSESP::logger().debug("versions.json: parse error"); + EMSESP::logger().debug("refresh_versions_cache() parse error"); #endif return false; } @@ -455,7 +455,8 @@ bool WebStatusService::refresh_versions_cache() { versions_cache_valid_ = true; #if defined(EMSESP_DEBUG) - EMSESP::logger().debug("versions.json: fetched stable=%s, dev=%s, current=%s", + EMSESP::logger().debug("Fetched from %s: stable=%s, dev=%s, current=%s", + VERSIONS_URL, versions_stable_.version.c_str(), versions_dev_.version.c_str(), current_version_s.c_str()); From 4fe64fbff8a1eb9d8fdc53bfe5470d34e5c6558f Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 22 Aug 2026 13:24:05 +0200 Subject: [PATCH 05/31] set system status to SYSTEM_STATUS_UPLOADING to pause MQTT/NTP etc during upload --- src/ESP32React/UploadFileService.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/ESP32React/UploadFileService.cpp b/src/ESP32React/UploadFileService.cpp index d369d874c..240701ef2 100644 --- a/src/ESP32React/UploadFileService.cpp +++ b/src/ESP32React/UploadFileService.cpp @@ -94,11 +94,14 @@ void UploadFileService::handleUpload(AsyncWebServerRequest * request, const Stri } #endif // it's firmware - initialize the ArduinoOTA updater - emsesp::EMSESP::logger().info("Uploading firmware file %s (size: %dKB). Please wait...", filename.c_str(), filesize / 1024); + emsesp::EMSESP::logger().info("Firmware uploading (file %s, size: %dKB). Please wait...", filename.c_str(), filesize / 1024); // turn off UART to prevent interference with the upload emsesp::EMSuart::stop(); + // tell main loop we're uploading so services as paused (e.g. MQTT) + emsesp::EMSESP::system_.systemStatus(emsesp::SYSTEM_STATUS::SYSTEM_STATUS_UPLOADING); + if (Update.begin(filesize - sizeof(esp_image_header_t))) { if (strlen(_md5.data()) == _md5.size() - 1) { Update.setMD5(_md5.data()); @@ -111,7 +114,7 @@ void UploadFileService::handleUpload(AsyncWebServerRequest * request, const Stri } } else if (_is_filesystem) { // LittleFS filesystem image - flash directly to the spiffs/littlefs partition - emsesp::EMSESP::logger().info("Uploading filesystem image %s (size: %uKB). Please wait...", filename.c_str(), static_cast(filesize / 1024)); + emsesp::EMSESP::logger().info("Uploading filesystem file %s (size: %uKB). Please wait...", filename.c_str(), static_cast(filesize / 1024)); emsesp::EMSuart::stop(); LittleFS.end(); // unmount LittleFS before we overwrite the partition under it From 9b0ee07ee16546e8977087b1cb7c1b7e8996380b Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 22 Aug 2026 13:24:18 +0200 Subject: [PATCH 06/31] remove comments --- src/ESP32React/MqttSettingsService.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ESP32React/MqttSettingsService.cpp b/src/ESP32React/MqttSettingsService.cpp index e45842f51..008934bd5 100644 --- a/src/ESP32React/MqttSettingsService.cpp +++ b/src/ESP32React/MqttSettingsService.cpp @@ -147,7 +147,9 @@ void MqttSettingsService::onConfigUpdated() { bool MqttSettingsService::configureMqtt() { // disconnect if already connected if (_mqttClient->connected()) { - // emsesp::EMSESP::logger().info("Disconnecting to configure"); +#if defined(EMSESP_DEBUG) + emsesp::EMSESP::logger().debug("Disconnecting to configure"); +#endif _mqttClient->disconnect(true); } @@ -184,7 +186,6 @@ bool MqttSettingsService::configureMqtt() { static_cast(_mqttClient)->setKeepAlive(_state.keepAlive); static_cast(_mqttClient)->setCleanSession(_state.cleanSession); static_cast(_mqttClient)->setWill(will_topic, 1, true, "offline"); // QOS 1, retain - // return _mqttClient->connect(); if (_mqttClient->connect()) { emsesp::EMSESP::logger().info("Starting MQTT service"); return true; @@ -199,7 +200,6 @@ bool MqttSettingsService::configureMqtt() { static_cast(_mqttClient)->setKeepAlive(_state.keepAlive); static_cast(_mqttClient)->setCleanSession(_state.cleanSession); static_cast(_mqttClient)->setWill(will_topic, 1, true, "offline"); // QOS 1, retain - // return _mqttClient->connect(); if (_mqttClient->connect()) { emsesp::EMSESP::logger().info("Starting MQTT service"); return true; From bc6351cc2249b8d7974e6ee26dcff121acdf87e5 Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 22 Aug 2026 13:24:40 +0200 Subject: [PATCH 07/31] move MQTT and NTP to main loop --- src/core/emsesp.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/core/emsesp.cpp b/src/core/emsesp.cpp index f43ce861d..6448c3f66 100644 --- a/src/core/emsesp.cpp +++ b/src/core/emsesp.cpp @@ -1893,7 +1893,7 @@ void EMSESP::shell_prompt() { void EMSESP::loop() { uuid::loop(); // store system uptime - // handle network + // handle network (Wifi, ETH and AP) network_.loop(); // handles LED and checks system health, and syslog service @@ -1901,14 +1901,13 @@ void EMSESP::loop() { return; // LED flashing is active meaning its about to reboot, skip the rest of the loop } - esp32React.loop(); // core services: Network, AP, MQTT and NTP webLogService.loop(); // log in Web UI - // run the loop, unless we're in the middle of an OTA upload + // run the main loop, unless we're in the middle of an OTA upload // if (EMSESP::system_.systemStatus() == SYSTEM_STATUS::SYSTEM_STATUS_NORMAL || EMSESP::system_.systemStatus() == SYSTEM_STATUS::SYSTEM_STATUS_INVALID_GPIO) { if (EMSESP::system_.systemStatus() != SYSTEM_STATUS::SYSTEM_STATUS_PENDING_UPLOAD && EMSESP::system_.systemStatus() != SYSTEM_STATUS::SYSTEM_STATUS_UPLOADING) { - // loop through the services + esp32React.loop(); // MQTT and NTP webStatusService.loop(); // periodic refresh of cached versions.json rxservice_.loop(); // process any incoming Rx telegrams shower_.loop(); // check for shower on/off @@ -1921,6 +1920,7 @@ void EMSESP::loop() { scheduled_fetch_values(); // force a query on the EMS devices to fetch latest data at a set interval (1 min) compact_entities_if_stable(); // reclaim over-reserved entity vector capacity once device discovery settles } + // check for GPIO Errors - this is called once when booting if (EMSESP::system_.systemStatus() == SYSTEM_STATUS::SYSTEM_STATUS_INVALID_GPIO) { static bool only_once = false; From 9d3eaa5ff7cbb9ce7b3f1f2f4fc7bd75e820ac51 Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 22 Aug 2026 13:24:51 +0200 Subject: [PATCH 08/31] rename connecting_ --- src/core/mqtt.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/core/mqtt.h b/src/core/mqtt.h index 46e69478c..81d1aed7f 100644 --- a/src/core/mqtt.h +++ b/src/core/mqtt.h @@ -61,8 +61,8 @@ class Mqtt { enum Operation : uint8_t { PUBLISH, SUBSCRIBE, UNSUBSCRIBE }; enum NestedFormat : uint8_t { NESTED = 1, SINGLE }; - static constexpr uint8_t MQTT_TOPIC_MAX_SIZE = 128; // fixed, not a user setting anymore - static constexpr uint16_t MQTT_QUEUE_MAX_SIZE = 300; + static constexpr uint8_t MQTT_TOPIC_MAX_SIZE = 128; // fixed, not a user setting anymore + static constexpr uint16_t MQTT_QUEUE_MAX_SIZE = 300; static constexpr uint32_t MQTT_DISCONNECT_TIMEOUT = 1000; // max ms to flush a graceful disconnect on non-PSRAM boards static void on_connect(); @@ -297,7 +297,7 @@ class Mqtt { uint32_t last_publish_heartbeat_ = 0; // uint32_t last_publish_queue_ = 0; - static bool connecting_; + static bool connected_; static bool initialized_; static uint32_t mqtt_publish_fails_; static uint16_t queuecount_; From cedafbd462c76e582d66f6bf56c107a11429c36b Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 22 Aug 2026 13:25:31 +0200 Subject: [PATCH 09/31] move reconnect count to onConnect. always show MQTT disconnect error --- src/core/mqtt.cpp | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/src/core/mqtt.cpp b/src/core/mqtt.cpp index e593794e1..defc7f7d6 100644 --- a/src/core/mqtt.cpp +++ b/src/core/mqtt.cpp @@ -51,7 +51,7 @@ bool Mqtt::publish_single2cmd_; std::vector> Mqtt::mqtt_subfunctions_; uint32_t Mqtt::mqtt_publish_fails_ = 0; -bool Mqtt::connecting_ = false; +bool Mqtt::connected_ = false; bool Mqtt::initialized_ = false; uint16_t Mqtt::queuecount_ = 0; uint8_t Mqtt::connectcount_ = 0; @@ -473,29 +473,24 @@ bool Mqtt::get_publish_onchange(uint8_t device_type) { return false; } void Mqtt::on_disconnect(espMqttClientTypes::DisconnectReason reason) { - // only show the error once on the first connect failure - if (!connecting_) { - return; - } - connecting_ = false; - connectcount_++; // count # reconnects + connected_ = false; if (reason == espMqttClientTypes::DisconnectReason::TCP_DISCONNECTED) { - LOG_WARNING("MQTT disconnected: TCP"); + LOG_ERROR("MQTT connection failure: TCP"); } else if (reason == espMqttClientTypes::DisconnectReason::MQTT_UNACCEPTABLE_PROTOCOL_VERSION) { - LOG_WARNING("MQTT disconnected: Unacceptable protocol version"); + LOG_ERROR("MQTT connection failure: Unaccepted protocol version"); } else if (reason == espMqttClientTypes::DisconnectReason::MQTT_IDENTIFIER_REJECTED) { - LOG_WARNING("MQTT disconnected: Identifier Rejected"); + LOG_ERROR("MQTT connection failure: Identifier Rejected"); } else if (reason == espMqttClientTypes::DisconnectReason::MQTT_SERVER_UNAVAILABLE) { - LOG_WARNING("MQTT disconnected: Server unavailable"); + LOG_ERROR("MQTT connection failure: Server unavailable"); } else if (reason == espMqttClientTypes::DisconnectReason::MQTT_MALFORMED_CREDENTIALS) { - LOG_WARNING("MQTT disconnected: Malformed credentials"); + LOG_ERROR("MQTT connection failure: Malformed credentials"); } else if (reason == espMqttClientTypes::DisconnectReason::MQTT_NOT_AUTHORIZED) { - LOG_WARNING("MQTT disconnected: Not authorized"); + LOG_ERROR("MQTT connection failure: Not authorized"); } else if (reason == espMqttClientTypes::DisconnectReason::TLS_BAD_FINGERPRINT) { - LOG_WARNING("MQTT disconnected: Server fingerprint invalid"); + LOG_ERROR("MQTT connection failure: Server fingerprint invalid"); } else { - LOG_WARNING("MQTT disconnected: code %d", reason); + LOG_ERROR("MQTT connection failure: code %d", reason); } mqttClient_->clearQueue(true); @@ -503,13 +498,14 @@ void Mqtt::on_disconnect(espMqttClientTypes::DisconnectReason reason) { // MQTT on_connect - when an MQTT connect is established void Mqtt::on_connect() { - if (connecting_) { + if (connected_) { return; // prevent duplicated connections } LOG_INFO("MQTT connected"); - connecting_ = true; + connected_ = true; + connectcount_++; queuecount_ = mqttClient_->queueSize(); if (ha_enabled_) { From 80e48430f5c9ebe49f4ee2915a4044fb44d4a71c Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 22 Aug 2026 15:44:41 +0200 Subject: [PATCH 10/31] pkg update - eslint --- interface/package.json | 2 +- interface/pnpm-lock.yaml | 66 ++++++++++++++++++++-------------------- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/interface/package.json b/interface/package.json index 38810b5a3..fddd449fc 100644 --- a/interface/package.json +++ b/interface/package.json @@ -46,7 +46,7 @@ "@types/react": "^19.2.18", "@types/react-dom": "^19.2.4", "concurrently": "^10.0.5", - "eslint": "^10.8.1", + "eslint": "^10.9.0", "eslint-config-prettier": "^10.1.8", "etag": "^1.8.1", "mime-types": "^3.0.2", diff --git a/interface/pnpm-lock.yaml b/interface/pnpm-lock.yaml index fe047aa99..ab3dd13dc 100644 --- a/interface/pnpm-lock.yaml +++ b/interface/pnpm-lock.yaml @@ -53,7 +53,7 @@ importers: devDependencies: '@eslint/js': specifier: ^10.0.1 - version: 10.0.1(eslint@10.8.1(supports-color@10.2.2)) + version: 10.0.1(eslint@10.9.0(supports-color@10.2.2)) '@preact/preset-vite': specifier: ^2.10.6 version: 2.10.6(@babel/core@7.29.7(supports-color@10.2.2))(preact@10.29.8)(supports-color@10.2.2)(vite@8.2.2(@types/node@26.2.0)(terser@5.50.0)) @@ -73,11 +73,11 @@ importers: specifier: ^10.0.5 version: 10.0.5 eslint: - specifier: ^10.8.1 - version: 10.8.1(supports-color@10.2.2) + specifier: ^10.9.0 + version: 10.9.0(supports-color@10.2.2) eslint-config-prettier: specifier: ^10.1.8 - version: 10.1.8(eslint@10.8.1(supports-color@10.2.2)) + version: 10.1.8(eslint@10.9.0(supports-color@10.2.2)) etag: specifier: ^1.8.1 version: 1.8.1 @@ -98,7 +98,7 @@ importers: version: 6.0.3 typescript-eslint: specifier: ^8.67.0 - version: 8.67.0(eslint@10.8.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) + version: 8.67.0(eslint@10.9.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) vite: specifier: ^8.2.2 version: 8.2.2(@types/node@26.2.0)(terser@5.50.0) @@ -1347,8 +1347,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.8.1: - resolution: {integrity: sha512-wqA7W2jbsC/BnV9Iv1UZpKVFkO1AdNoSmYW8NWG4HNOBbkAMvIqDZ27pI2f07dqn583NcIC44ckjAcOXDL1QbQ==} + eslint@10.9.0: + resolution: {integrity: sha512-5KeEOJZBfEVA47boFiBsf+6MmmJpffM7qEBg4pLla2e4nlKgdKlqCW0oSLOGsT8Wl5uCGJptLV1bkaiShj90Gw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -3217,9 +3217,9 @@ snapshots: '@esbuild/linux-loong64@0.14.54': optional: true - '@eslint-community/eslint-utils@4.10.1(eslint@10.8.1(supports-color@10.2.2))': + '@eslint-community/eslint-utils@4.10.1(eslint@10.9.0(supports-color@10.2.2))': dependencies: - eslint: 10.8.1(supports-color@10.2.2) + eslint: 10.9.0(supports-color@10.2.2) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -3240,9 +3240,9 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/js@10.0.1(eslint@10.8.1(supports-color@10.2.2))': + '@eslint/js@10.0.1(eslint@10.9.0(supports-color@10.2.2))': optionalDependencies: - eslint: 10.8.1(supports-color@10.2.2) + eslint: 10.9.0(supports-color@10.2.2) '@eslint/object-schema@3.0.5': {} @@ -3596,15 +3596,15 @@ snapshots: dependencies: '@types/node': 26.2.0 - '@typescript-eslint/eslint-plugin@8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3))(eslint@10.8.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.9.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3))(eslint@10.9.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.67.0(eslint@10.8.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) + '@typescript-eslint/parser': 8.67.0(eslint@10.9.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) '@typescript-eslint/scope-manager': 8.67.0 - '@typescript-eslint/type-utils': 8.67.0(eslint@10.8.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) - '@typescript-eslint/utils': 8.67.0(eslint@10.8.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) + '@typescript-eslint/type-utils': 8.67.0(eslint@10.9.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) + '@typescript-eslint/utils': 8.67.0(eslint@10.9.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.67.0 - eslint: 10.8.1(supports-color@10.2.2) + eslint: 10.9.0(supports-color@10.2.2) ignore: 7.0.6 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@6.0.3) @@ -3612,14 +3612,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.67.0(eslint@10.8.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)': + '@typescript-eslint/parser@8.67.0(eslint@10.9.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)': dependencies: '@typescript-eslint/scope-manager': 8.67.0 '@typescript-eslint/types': 8.67.0 '@typescript-eslint/typescript-estree': 8.67.0(supports-color@10.2.2)(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.67.0 debug: 4.4.3(supports-color@10.2.2) - eslint: 10.8.1(supports-color@10.2.2) + eslint: 10.9.0(supports-color@10.2.2) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -3642,13 +3642,13 @@ snapshots: dependencies: typescript: 6.0.3 - '@typescript-eslint/type-utils@8.67.0(eslint@10.8.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.67.0(eslint@10.9.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)': dependencies: '@typescript-eslint/types': 8.67.0 '@typescript-eslint/typescript-estree': 8.67.0(supports-color@10.2.2)(typescript@6.0.3) - '@typescript-eslint/utils': 8.67.0(eslint@10.8.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) + '@typescript-eslint/utils': 8.67.0(eslint@10.9.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) debug: 4.4.3(supports-color@10.2.2) - eslint: 10.8.1(supports-color@10.2.2) + eslint: 10.9.0(supports-color@10.2.2) ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: @@ -3671,13 +3671,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.67.0(eslint@10.8.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)': + '@typescript-eslint/utils@8.67.0(eslint@10.9.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)': dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.1(supports-color@10.2.2)) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.9.0(supports-color@10.2.2)) '@typescript-eslint/scope-manager': 8.67.0 '@typescript-eslint/types': 8.67.0 '@typescript-eslint/typescript-estree': 8.67.0(supports-color@10.2.2)(typescript@6.0.3) - eslint: 10.8.1(supports-color@10.2.2) + eslint: 10.9.0(supports-color@10.2.2) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -4281,9 +4281,9 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-prettier@10.1.8(eslint@10.8.1(supports-color@10.2.2)): + eslint-config-prettier@10.1.8(eslint@10.9.0(supports-color@10.2.2)): dependencies: - eslint: 10.8.1(supports-color@10.2.2) + eslint: 10.9.0(supports-color@10.2.2) eslint-scope@9.1.2: dependencies: @@ -4296,9 +4296,9 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.8.1(supports-color@10.2.2): + eslint@10.9.0(supports-color@10.2.2): dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.1(supports-color@10.2.2)) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.9.0(supports-color@10.2.2)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.5(supports-color@10.2.2) '@eslint/config-helpers': 0.7.0 @@ -5724,13 +5724,13 @@ snapshots: dependencies: typescript: 6.0.3 - typescript-eslint@8.67.0(eslint@10.8.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3): + typescript-eslint@8.67.0(eslint@10.9.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3))(eslint@10.8.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) - '@typescript-eslint/parser': 8.67.0(eslint@10.8.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) + '@typescript-eslint/eslint-plugin': 8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.9.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3))(eslint@10.9.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) + '@typescript-eslint/parser': 8.67.0(eslint@10.9.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) '@typescript-eslint/typescript-estree': 8.67.0(supports-color@10.2.2)(typescript@6.0.3) - '@typescript-eslint/utils': 8.67.0(eslint@10.8.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) - eslint: 10.8.1(supports-color@10.2.2) + '@typescript-eslint/utils': 8.67.0(eslint@10.9.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) + eslint: 10.9.0(supports-color@10.2.2) typescript: 6.0.3 transitivePeerDependencies: - supports-color From 5d992e5a70b35ece6db8a3f76d461292bd5ec573 Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 22 Aug 2026 15:45:24 +0200 Subject: [PATCH 11/31] remove useMemo --- interface/src/app/settings/Version.tsx | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/interface/src/app/settings/Version.tsx b/interface/src/app/settings/Version.tsx index 4bf545018..58a784731 100644 --- a/interface/src/app/settings/Version.tsx +++ b/interface/src/app/settings/Version.tsx @@ -1,4 +1,4 @@ -import { memo, useContext, useMemo, useState } from 'react'; +import { memo, useContext, useState } from 'react'; import { Link } from 'react-router'; import CancelIcon from '@mui/icons-material/Cancel'; @@ -430,20 +430,12 @@ const Version = () => { const [showVersionInfo, setShowVersionInfo] = useState(0); // 1 = stable, 2 = dev, 3 = partition const [firmwareSize, setFirmwareSize] = useState(0); - const latestVersion = useMemo( - () => - versions?.stable - ? { version: versions.stable.version, date: versions.stable.date } - : undefined, - [versions?.stable] - ); - const latestDevVersion = useMemo( - () => - versions?.dev - ? { version: versions.dev.version, date: versions.dev.date } - : undefined, - [versions?.dev] - ); + const latestVersion: VersionInfo | undefined = versions?.stable + ? { version: versions.stable.version, date: versions.stable.date } + : undefined; + const latestDevVersion: VersionInfo | undefined = versions?.dev + ? { version: versions.dev.version, date: versions.dev.date } + : undefined; const usingDevVersion = versions?.current?.type === 'dev'; const stableUpgradeAvailable = versions?.stable?.upgradeable ?? false; const devUpgradeAvailable = versions?.dev?.upgradeable ?? false; From b18b27d2f62b600cdb17c31d46079a1a060ef8c2 Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 22 Aug 2026 15:45:34 +0200 Subject: [PATCH 12/31] remove useMemo --- .../authentication/Authentication.tsx | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/interface/src/contexts/authentication/Authentication.tsx b/interface/src/contexts/authentication/Authentication.tsx index 823a5c9fc..2801235b1 100644 --- a/interface/src/contexts/authentication/Authentication.tsx +++ b/interface/src/contexts/authentication/Authentication.tsx @@ -1,4 +1,4 @@ -import { useCallback, useEffect, useMemo, useState } from 'react'; +import { useCallback, useEffect, useState } from 'react'; import type { FC } from 'react'; import { useNavigate } from 'react-router'; @@ -88,21 +88,18 @@ const Authentication: FC = ({ children }) => { void refresh(); }, [refresh]); - const obj = useMemo( - () => ({ - signIn, - signOut, - refresh, - refreshVersions, - ...(me && { me }), - ...(versions && { versions }) - }), - [signIn, signOut, me, refresh, refreshVersions, versions] - ); - if (initialized) { return ( - + {children} ); From 48d425e0b65898f5e932eed5867bd34bef962899 Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 22 Aug 2026 15:45:48 +0200 Subject: [PATCH 13/31] remove useMemo --- interface/src/SignIn.tsx | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/interface/src/SignIn.tsx b/interface/src/SignIn.tsx index 00f8f36de..090881955 100644 --- a/interface/src/SignIn.tsx +++ b/interface/src/SignIn.tsx @@ -1,4 +1,4 @@ -import { memo, useCallback, useContext, useEffect, useMemo, useState } from 'react'; +import { memo, useContext, useEffect, useState } from 'react'; import ForwardIcon from '@mui/icons-material/Forward'; import { Box, Button, Paper, Typography } from '@mui/material'; @@ -43,17 +43,13 @@ const SignIn = memo(() => { } }); - const updateLoginRequestValue = useMemo( - () => - updateValue((updater) => - setSignInRequest( - updater as unknown as (prevState: SignInRequest) => SignInRequest - ) - ), - [] + const updateLoginRequestValue = updateValue((updater) => + setSignInRequest( + updater as unknown as (prevState: SignInRequest) => SignInRequest + ) ); - const signIn = useCallback(async () => { + const signIn = async () => { await callSignIn(signInRequest).catch((event: Error) => { if (event.message === 'Unauthorized') { toast.warning(LL.INVALID_LOGIN()); @@ -62,7 +58,7 @@ const SignIn = memo(() => { } setProcessing(false); }); - }, [callSignIn, signInRequest, LL]); + }; const validateAndSignIn = async () => { setProcessing(true); @@ -78,7 +74,7 @@ const SignIn = memo(() => { } }; - const submitOnEnter = useMemo(() => onEnterCallback(signIn), [signIn]); + const submitOnEnter = onEnterCallback(signIn); // get rid of scrollbar useEffect(() => { From 6efc7113b3c76bfcdb37a68fed11964b2e0821c5 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 23 Aug 2026 12:21:32 +0200 Subject: [PATCH 14/31] suppress rollout timings --- interface/vite.config.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/interface/vite.config.ts b/interface/vite.config.ts index ba4f39b1a..65ff0d722 100644 --- a/interface/vite.config.ts +++ b/interface/vite.config.ts @@ -257,6 +257,9 @@ export default defineConfig( minify: 'terser' as const, terserOptions: createHostedTerserOptions(), rollupOptions: { + checks: { + pluginTimings: false + }, treeshake: { moduleSideEffects: false }, @@ -292,6 +295,9 @@ export default defineConfig( minify: 'terser' as const, terserOptions: createProductionTerserOptions(), rollupOptions: { + checks: { + pluginTimings: false + }, treeshake: { moduleSideEffects: false, propertyReadSideEffects: false as const, From 42f86cd12b0d13767ca434f5299e2153517ed193 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 23 Aug 2026 12:22:45 +0200 Subject: [PATCH 15/31] get and send system name in AuthenticaionContext to prevent /rest/settings on each render --- interface/src/app/settings/ApplicationSettings.tsx | 11 ++++++++++- interface/src/components/layout/LayoutDrawer.tsx | 13 +++++-------- .../src/contexts/authentication/Authentication.tsx | 10 ++++++++-- interface/src/contexts/authentication/context.ts | 2 ++ interface/src/types/versions.ts | 4 +++- src/web/WebStatusService.cpp | 5 ++++- 6 files changed, 32 insertions(+), 13 deletions(-) diff --git a/interface/src/app/settings/ApplicationSettings.tsx b/interface/src/app/settings/ApplicationSettings.tsx index ddcfadeff..15cd5770b 100644 --- a/interface/src/app/settings/ApplicationSettings.tsx +++ b/interface/src/app/settings/ApplicationSettings.tsx @@ -1,4 +1,4 @@ -import { useState } from 'react'; +import { useContext, useEffect, useState } from 'react'; import CancelIcon from '@mui/icons-material/Cancel'; import PowerSettingsNewIcon from '@mui/icons-material/PowerSettingsNew'; @@ -31,6 +31,7 @@ import { useLayoutTitle } from 'components'; import { toast } from 'components/toast'; +import { AuthenticatedContext } from 'contexts/authentication'; import { useI18nContext } from 'i18n/i18n-react'; import { numberValue, updateValueDirty, useRest } from 'utils'; import { ValidationError, validate } from 'validators'; @@ -68,6 +69,14 @@ const ApplicationSettings = () => { update: writeSettings }); + // the menu drawer reads the system name from the authentication context + const { setSystemName } = useContext(AuthenticatedContext); + useEffect(() => { + if (origData?.system_name !== undefined) { + setSystemName(origData.system_name); + } + }, [origData?.system_name, setSystemName]); + const [restarting, setRestarting] = useState(); const { LL } = useI18nContext(); diff --git a/interface/src/components/layout/LayoutDrawer.tsx b/interface/src/components/layout/LayoutDrawer.tsx index debe49bcb..901673cd5 100644 --- a/interface/src/components/layout/LayoutDrawer.tsx +++ b/interface/src/components/layout/LayoutDrawer.tsx @@ -1,10 +1,8 @@ -import { memo } from 'react'; +import { memo, useContext } from 'react'; import { Box, Divider, Drawer, Toolbar, Typography, styled } from '@mui/material'; -import { readSettings } from 'api/app'; - -import { useRequest } from 'alova/client'; +import { AuthenticatedContext } from 'contexts/authentication'; import { PROJECT_NAME } from 'env'; import { DRAWER_WIDTH } from './Layout'; @@ -27,8 +25,7 @@ interface LayoutDrawerProps { } const LayoutDrawerComponent = ({ mobileOpen, onClose }: LayoutDrawerProps) => { - const { data: settings } = useRequest(readSettings); - const system_name = settings?.system_name; + const { systemName } = useContext(AuthenticatedContext); const drawer = ( <> @@ -43,9 +40,9 @@ const LayoutDrawerComponent = ({ mobileOpen, onClose }: LayoutDrawerProps) => { }} > {PROJECT_NAME} - {system_name && ( + {systemName && ( - {system_name} + {systemName} )} diff --git a/interface/src/contexts/authentication/Authentication.tsx b/interface/src/contexts/authentication/Authentication.tsx index 2801235b1..ee02a1c55 100644 --- a/interface/src/contexts/authentication/Authentication.tsx +++ b/interface/src/contexts/authentication/Authentication.tsx @@ -23,6 +23,7 @@ const Authentication: FC = ({ children }) => { const [initialized, setInitialized] = useState(false); const [me, setMe] = useState(); const [versions, setVersions] = useState(); + const [systemName, setSystemName] = useState(); const { send: sendVerifyAuthorization } = useRequest(verifyAuthorization(), { immediate: false @@ -33,7 +34,9 @@ const Authentication: FC = ({ children }) => { { immediate: false } ) .onSuccess((event) => { - setVersions(event.data as VersionsResponse); + const response = event.data as VersionsResponse; + setVersions(response); + setSystemName(response.system_name); }) .onError(() => { setVersions(undefined); @@ -60,6 +63,7 @@ const Authentication: FC = ({ children }) => { AuthenticationApi.clearAccessToken(); setMe(undefined); setVersions(undefined); + setSystemName(undefined); if (doRedirect) { void navigate('/', { replace: true }); } @@ -96,8 +100,10 @@ const Authentication: FC = ({ children }) => { signOut, refresh, refreshVersions, + setSystemName, ...(me && { me }), - ...(versions && { versions }) + ...(versions && { versions }), + ...(systemName !== undefined && { systemName }) }} > {children} diff --git a/interface/src/contexts/authentication/context.ts b/interface/src/contexts/authentication/context.ts index 1717bfaef..b1792a169 100644 --- a/interface/src/contexts/authentication/context.ts +++ b/interface/src/contexts/authentication/context.ts @@ -9,6 +9,8 @@ export interface AuthenticationContextValue { me?: Me; versions?: VersionsResponse; refreshVersions: () => Promise; + systemName?: string; + setSystemName: (systemName: string) => void; } const AuthenticationContextDefaultValue = {} as AuthenticationContextValue; diff --git a/interface/src/types/versions.ts b/interface/src/types/versions.ts index 6f081c613..d1ee0d7f1 100644 --- a/interface/src/types/versions.ts +++ b/interface/src/types/versions.ts @@ -1,6 +1,7 @@ // Types for the `getVersions` action response coming from the device. // The device proxies the request to emsesp.org/versions.json. If the device -// is offline the `stable` and `dev` fields are omitted. +// is offline the `stable` and `dev` fields are omitted, but `system_name` is +// always sent as it comes from the device itself. export interface VersionInfo { version: string; @@ -20,4 +21,5 @@ export interface VersionsResponse { current: CurrentVersionInfo; stable?: RemoteVersionInfo; dev?: RemoteVersionInfo; + system_name?: string; } diff --git a/src/web/WebStatusService.cpp b/src/web/WebStatusService.cpp index 78ecda5f6..ce4fd1a61 100644 --- a/src/web/WebStatusService.cpp +++ b/src/web/WebStatusService.cpp @@ -321,12 +321,15 @@ uint8_t WebStatusService::upgradeImportantMessages(std::string & version) { } // action = getVersions -// returns the device's current version for dev and stable +// returns the device's current version for dev and stable, plus the system name // The remote fetch runs from the main loop task via WebStatusService::loop() so that we never block the AsyncTCP callback void WebStatusService::getVersions(JsonObject root) { FirmwareVersion current_version(current_version_s); bool is_dev = current_version.prerelease().find("dev") != std::string::npos; + // the WebUI shows this in the menu drawer. It's included here because this action is called once after login + root["system_name"] = EMSESP::system_.system_name(); + JsonObject current = root["current"].to(); current["version"] = current_version_s; current["type"] = is_dev ? "dev" : "stable"; From 89e88135bc3a22c7d96f336465604ef0907833bc Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 23 Aug 2026 12:22:55 +0200 Subject: [PATCH 16/31] comment changes --- interface/src/api/system.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/api/system.ts b/interface/src/api/system.ts index 43829025a..f12d5daa1 100644 --- a/interface/src/api/system.ts +++ b/interface/src/api/system.ts @@ -2,7 +2,7 @@ import type { LogSettings, SystemStatus } from 'types'; import { alovaInstance } from './endpoints'; -// systemStatus - also used to ping in System Monitor for pinging +// systemStatus - also used in System Monitor to ping the ESP export const readSystemStatus = () => alovaInstance.Get('/rest/systemStatus'); From 91955689a291265df392a4e8b3f37fbb12afc4ad Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 23 Aug 2026 12:23:07 +0200 Subject: [PATCH 17/31] include system name --- mock-api/restServer.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mock-api/restServer.ts b/mock-api/restServer.ts index a82d209c3..7f9de376a 100644 --- a/mock-api/restServer.ts +++ b/mock-api/restServer.ts @@ -450,6 +450,8 @@ function upgradeImportantMessages(version: string) { // called by Action endpoint getVersions // Set MOCK_OFFLINE = true to simulate a device with no internet (omits stable/dev). const MOCK_OFFLINE = false; +// const MOCK_OFFLINE = true; + function get_versions() { const isDev = THIS_VERSION.includes('dev'); const currentUpgradeable = @@ -457,6 +459,7 @@ function get_versions() { (isDev ? DEV_VERSION_IS_UPGRADEABLE : STABLE_VERSION_IS_UPGRADEABLE); const data: { + system_name: string; current: { version: string; type: 'stable' | 'dev'; @@ -466,6 +469,7 @@ function get_versions() { stable?: { version: string; date: string; upgradeable: boolean }; dev?: { version: string; date: string; upgradeable: boolean }; } = { + system_name: settings.system_name, current: { version: THIS_VERSION, type: isDev ? 'dev' : 'stable', From c3cd4ac6b6ff7ff7707cd3ffab7b6655af9a7a8d Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 23 Aug 2026 12:23:25 +0200 Subject: [PATCH 18/31] if there is no internet, keep trying every few seconds --- interface/src/app/settings/Version.tsx | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/interface/src/app/settings/Version.tsx b/interface/src/app/settings/Version.tsx index 58a784731..461a65123 100644 --- a/interface/src/app/settings/Version.tsx +++ b/interface/src/app/settings/Version.tsx @@ -1,4 +1,4 @@ -import { memo, useContext, useState } from 'react'; +import { memo, useContext, useEffect, useState } from 'react'; import { Link } from 'react-router'; import CancelIcon from '@mui/icons-material/Cancel'; @@ -412,7 +412,7 @@ const getPlatform = (data: VersionData): string => { const Version = () => { const { LL, locale } = useI18nContext(); - const { me, versions } = useContext(AuthenticatedContext); + const { me, versions, refreshVersions } = useContext(AuthenticatedContext); const [restarting, setRestarting] = useState(false); const [confirmFactoryReset, setConfirmFactoryReset] = useState(false); @@ -441,6 +441,16 @@ const Version = () => { const devUpgradeAvailable = versions?.dev?.upgradeable ?? false; const internetLive = Boolean(versions?.stable || versions?.dev); + useEffect(() => { + if (internetLive) { + return; + } + const interval = setInterval(() => { + void refreshVersions(); + }, 3000); + return () => clearInterval(interval); + }, [internetLive, refreshVersions]); + const { send: sendSetPartition } = useRequest( (partition: string) => callAction({ action: 'setPartition', param: partition }), { immediate: false } From fce46f7613336cdccc6074a3f7cc8595c32e7f54 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 23 Aug 2026 12:31:27 +0200 Subject: [PATCH 19/31] auto-formatting --- src/core/system.cpp | 2 +- src/devices/boiler.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/system.cpp b/src/core/system.cpp index 4ee92d8fc..2debad3be 100644 --- a/src/core/system.cpp +++ b/src/core/system.cpp @@ -842,7 +842,7 @@ bool System::loop() { void System::send_info_mqtt() { static uint8_t _connection = 0; uint8_t connection = (EMSESP::network_.ethernet_connected() ? 1 : 0) + (EMSESP::network_.wifi_connected() ? 2 : 0) + (ntp_connected_ ? 4 : 0) - + (EMSESP::network_.has_ipv6() ? 8 : 0); + + (EMSESP::network_.has_ipv6() ? 8 : 0); // check if connection status has changed if (!Mqtt::connected() || connection == _connection) { return; diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index 4d14b3397..e5767f600 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -222,7 +222,7 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &oilPreHeat_, DeviceValueType::BOOL, FL_(oilPreHeat), DeviceValueUOM::NONE); // remove burnMinPower, #2918, add back for 0xE6, #3193 register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, - &burnMinPower_, + &burnMinPower_, DeviceValueType::UINT8, FL_(burnMinPower), DeviceValueUOM::PERCENT, From b0255d726bde582ba2b45fd5262aa310ca9ac6f0 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 23 Aug 2026 12:41:23 +0200 Subject: [PATCH 20/31] check text for online version check --- interface/src/app/settings/Version.tsx | 3 +-- interface/src/i18n/cs/index.ts | 4 ++-- interface/src/i18n/de/index.ts | 4 ++-- interface/src/i18n/en/index.ts | 4 ++-- interface/src/i18n/fr/index.ts | 4 ++-- interface/src/i18n/it/index.ts | 4 ++-- interface/src/i18n/nl/index.ts | 4 ++-- interface/src/i18n/no/index.ts | 4 ++-- interface/src/i18n/pl/index.ts | 4 ++-- interface/src/i18n/sk/index.ts | 4 ++-- interface/src/i18n/sv/index.ts | 4 ++-- interface/src/i18n/tr/index.ts | 4 ++-- 12 files changed, 23 insertions(+), 24 deletions(-) diff --git a/interface/src/app/settings/Version.tsx b/interface/src/app/settings/Version.tsx index 461a65123..c21c9eff6 100644 --- a/interface/src/app/settings/Version.tsx +++ b/interface/src/app/settings/Version.tsx @@ -807,8 +807,7 @@ const Version = () => { ) : ( - - {LL.INTERNET_CONNECTION_REQUIRED()} + {LL.INTERNET_CONNECTION_CHECK()}… )} {me.admin && ( diff --git a/interface/src/i18n/cs/index.ts b/interface/src/i18n/cs/index.ts index cb79ed473..3379a5bd6 100644 --- a/interface/src/i18n/cs/index.ts +++ b/interface/src/i18n/cs/index.ts @@ -350,7 +350,6 @@ const cs: Translation = { THIS_VERSION: 'Tato verze', PLATFORM: 'Platforma', RELEASE_TYPE: 'Typ sestavení', - INTERNET_CONNECTION_REQUIRED: 'Pro automatickou kontrolu a instalaci aktualizací je třeba internetové připojení', SWITCH_RELEASE_TYPE: 'Přepnout na {0} verzi', FIRMWARE_VERSION_INFO: 'Informace o verzi firmwaru', NO_DATA: 'žádné údaje', @@ -367,7 +366,8 @@ const cs: Translation = { COMMANDS_UPDATED: 'Příkazy byly aktualizovány', COMMANDS_HELP_1: 'Definujte vlastní příkazy pro magistrali EMS', COMMAND_SENT: 'Příkaz odeslán', - RUN: 'Spustit příkaz' + RUN: 'Spustit příkaz', + INTERNET_CONNECTION_CHECK: 'Kontrola online pro dostupné verze' }; export default cs; diff --git a/interface/src/i18n/de/index.ts b/interface/src/i18n/de/index.ts index 223afbf59..0907d4d81 100644 --- a/interface/src/i18n/de/index.ts +++ b/interface/src/i18n/de/index.ts @@ -350,7 +350,6 @@ const de: Translation = { THIS_VERSION: 'Diese Version', PLATFORM: 'Plattform', RELEASE_TYPE: 'Release Typ', - INTERNET_CONNECTION_REQUIRED: 'Für die automatische Versionsprüfung und Aktualisierung ist eine Internetverbindung erforderlich', SWITCH_RELEASE_TYPE: 'Zum {0}-Release wechseln', FIRMWARE_VERSION_INFO: 'Firmware-Versionsinformation', NO_DATA: 'Keine Daten', @@ -367,7 +366,8 @@ const de: Translation = { COMMANDS_UPDATED: 'Befehle wurden aktualisiert', COMMANDS_HELP_1: 'Definieren Sie eigene Befehle für die EMS-Magistral', COMMAND_SENT: 'Befehl gesendet', - RUN: 'Befehl ausführen' + RUN: 'Befehl ausführen', + INTERNET_CONNECTION_CHECK: 'Online-Prüfung auf verfügbare Versionen' }; export default de; diff --git a/interface/src/i18n/en/index.ts b/interface/src/i18n/en/index.ts index d140dea12..c1df119c2 100644 --- a/interface/src/i18n/en/index.ts +++ b/interface/src/i18n/en/index.ts @@ -350,7 +350,6 @@ const en: Translation = { THIS_VERSION: 'This Version', PLATFORM: 'Platform', RELEASE_TYPE: 'Release Type', - INTERNET_CONNECTION_REQUIRED: 'Internet connection required for automatic version checking and upgrading', SWITCH_RELEASE_TYPE: 'Switch to {0} release', FIRMWARE_VERSION_INFO: 'Firmware Version Information', NO_DATA: 'No data', @@ -367,7 +366,8 @@ const en: Translation = { COMMANDS_UPDATED: 'Commands updated', COMMANDS_HELP_1: 'Define reusable named commands below. These can be executed from the console, API/MQTT, or referenced by the Scheduler', COMMAND_SENT: 'Command sent', - RUN: 'Run' + RUN: 'Run', + INTERNET_CONNECTION_CHECK: 'Checking online for available versions' }; export default en; diff --git a/interface/src/i18n/fr/index.ts b/interface/src/i18n/fr/index.ts index b61ac6828..7e9bc51bb 100644 --- a/interface/src/i18n/fr/index.ts +++ b/interface/src/i18n/fr/index.ts @@ -350,7 +350,6 @@ const fr: Translation = { THIS_VERSION: 'Cette version', PLATFORM: 'Plateforme', RELEASE_TYPE: 'Type de version', - INTERNET_CONNECTION_REQUIRED: 'Connexion Internet requise pour la vérification automatique des versions et la mise à niveau', SWITCH_RELEASE_TYPE: 'Passer à la version {0}', FIRMWARE_VERSION_INFO: 'Informations sur la version du firmware', NO_DATA: 'Aucune donnée', @@ -367,7 +366,8 @@ const fr: Translation = { COMMANDS_UPDATED: 'Commandes mises à jour', COMMANDS_HELP_1: 'Définir des commandes personnalisées pour la magistral EMS', COMMAND_SENT: 'Commande envoyée', - RUN: 'Exécuter une commande' + RUN: 'Exécuter une commande', + INTERNET_CONNECTION_CHECK: 'Vérification en ligne pour les versions disponibles' }; export default fr; diff --git a/interface/src/i18n/it/index.ts b/interface/src/i18n/it/index.ts index 34d510e0d..527a9bc06 100644 --- a/interface/src/i18n/it/index.ts +++ b/interface/src/i18n/it/index.ts @@ -350,7 +350,6 @@ const it: Translation = { THIS_VERSION: 'Questa versione', PLATFORM: 'Piattaforma', RELEASE_TYPE: 'Tipo di rilascio', - INTERNET_CONNECTION_REQUIRED: 'Connessione internet richiesta per il controllo automatico delle versioni e l\'aggiornamento', SWITCH_RELEASE_TYPE: 'Cambia in {0} rilascio', FIRMWARE_VERSION_INFO: 'Informazioni sulla versione del firmware', NO_DATA: 'Nessun dato', @@ -367,7 +366,8 @@ const it: Translation = { COMMANDS_UPDATED: 'Comandi aggiornati', COMMANDS_HELP_1: 'Definisci comandi personalizzati per la magistrali EMS', COMMAND_SENT: 'Comando inviato', - RUN: 'Esegui comando' + RUN: 'Esegui comando', + INTERNET_CONNECTION_CHECK: 'Controllo online per le versioni disponibili' }; export default it; diff --git a/interface/src/i18n/nl/index.ts b/interface/src/i18n/nl/index.ts index 35db7369b..3b0335d8c 100644 --- a/interface/src/i18n/nl/index.ts +++ b/interface/src/i18n/nl/index.ts @@ -350,7 +350,6 @@ const nl: Translation = { THIS_VERSION: 'Deze Versie', PLATFORM: 'Platform', RELEASE_TYPE: 'Release Typ', - INTERNET_CONNECTION_REQUIRED: 'Internetverbinding vereist voor automatische versiecontrole en -upgrade', SWITCH_RELEASE_TYPE: 'Switch naar {0} release', FIRMWARE_VERSION_INFO: 'Informatie over firmwareversie', NO_DATA: 'Geen data', @@ -367,7 +366,8 @@ const nl: Translation = { COMMANDS_UPDATED: 'Commando\'s bijgewerkt', COMMANDS_HELP_1: 'Definieer hergebruikbare benoemde commando\'s hieronder. Deze kunnen worden uitgevoerd vanuit de console, API/MQTT, of worden aangeroepen door de Scheduler', COMMAND_SENT: 'Commando verzonden', - RUN: 'Commando uitvoeren' + RUN: 'Commando uitvoeren', + INTERNET_CONNECTION_CHECK: 'Controleren op online beschikbare versies' }; export default nl; diff --git a/interface/src/i18n/no/index.ts b/interface/src/i18n/no/index.ts index 506781527..4e31e220b 100644 --- a/interface/src/i18n/no/index.ts +++ b/interface/src/i18n/no/index.ts @@ -350,7 +350,6 @@ const no: Translation = { THIS_VERSION: 'Denne versjonen', PLATFORM: 'Plattform', RELEASE_TYPE: 'Utgivelses type', - INTERNET_CONNECTION_REQUIRED: 'Internettilkobling kreves for automatisk versjonskontroll og oppgradering', SWITCH_RELEASE_TYPE: 'Bytt til {0} utgivelse', FIRMWARE_VERSION_INFO: 'Informasjon om firmwareversjon', NO_DATA: 'Ingen data', @@ -367,7 +366,8 @@ const no: Translation = { COMMANDS_UPDATED: 'Kommandoer oppdatert', COMMANDS_HELP_1: 'Definer egne kommandoer for EMS-Magistral', COMMAND_SENT: 'Kommando sendt', - RUN: 'Kjør' + RUN: 'Kjør', + INTERNET_CONNECTION_CHECK: 'Kontrollerer online for tilgjengelige versjoner' }; export default no; diff --git a/interface/src/i18n/pl/index.ts b/interface/src/i18n/pl/index.ts index bdb22f3fe..29b991e85 100644 --- a/interface/src/i18n/pl/index.ts +++ b/interface/src/i18n/pl/index.ts @@ -350,7 +350,6 @@ const pl: BaseTranslation = { THIS_VERSION: 'Ta wersja', PLATFORM: 'Platforma', RELEASE_TYPE: 'Typ wydania', - INTERNET_CONNECTION_REQUIRED: 'Połączenie internetowe jest wymagane do automatycznej kontroli wersji i aktualizacji', SWITCH_RELEASE_TYPE: 'Zmień na {0} wydanie', FIRMWARE_VERSION_INFO: 'Informacje o wersji firmware', NO_DATA: 'Brak danych', @@ -367,7 +366,8 @@ const pl: BaseTranslation = { COMMANDS_UPDATED: 'Komendy zostały zaktualizowane', COMMANDS_HELP_1: 'Zdefiniuj niestandardowe komendy dla magistrali EMS', COMMAND_SENT: 'Komenda wysłana', - RUN: 'Wykonaj' + RUN: 'Wykonaj', + INTERNET_CONNECTION_CHECK: 'Sprawdzanie online dla dostępnych wersji' }; export default pl; diff --git a/interface/src/i18n/sk/index.ts b/interface/src/i18n/sk/index.ts index 5a65edf9f..251c31775 100644 --- a/interface/src/i18n/sk/index.ts +++ b/interface/src/i18n/sk/index.ts @@ -350,7 +350,6 @@ const sk: Translation = { THIS_VERSION: 'Táto verzia', PLATFORM: 'Platforma', RELEASE_TYPE: 'Typ vydania', - INTERNET_CONNECTION_REQUIRED: 'Internetové pripojenie je potrebné pre automatickú kontrolu a aktualizáciu', SWITCH_RELEASE_TYPE: 'Prepnúť na {0} verziu', FIRMWARE_VERSION_INFO: 'Informácie o verzii firmware', NO_DATA: 'Žiadne dáta', @@ -367,7 +366,8 @@ const sk: Translation = { COMMANDS_UPDATED: 'Príkazy aktualizované', COMMANDS_HELP_1: 'Definujte vlastné príkazy pre magistrali EMS', COMMAND_SENT: 'Príkaz odoslaný', - RUN: 'Volať príkaz' + RUN: 'Volať príkaz', + INTERNET_CONNECTION_CHECK: 'Kontrola online pre dostupné verzie' }; export default sk; diff --git a/interface/src/i18n/sv/index.ts b/interface/src/i18n/sv/index.ts index c933d48cd..cf470e668 100644 --- a/interface/src/i18n/sv/index.ts +++ b/interface/src/i18n/sv/index.ts @@ -350,7 +350,6 @@ const sv: Translation = { THIS_VERSION: 'Denna version', PLATFORM: 'Plattform', RELEASE_TYPE: 'Utgivelsestyp', - INTERNET_CONNECTION_REQUIRED: 'Internetanslutning krävs för automatisk version kontroll och uppdatering', SWITCH_RELEASE_TYPE: 'Byt till {0} utgåva', FIRMWARE_VERSION_INFO: 'Information om firmwareversion', NO_DATA: 'Ingen data', @@ -367,7 +366,8 @@ const sv: Translation = { COMMANDS_UPDATED: 'Kommandon uppdaterade', COMMANDS_HELP_1: 'Definiera egna kommandon för EMS-Magistral', COMMAND_SENT: 'Kommando skickat', - RUN: 'Kör kommando' + RUN: 'Kör kommando', + INTERNET_CONNECTION_CHECK: 'Kontrollerar online för tillgängliga versioner' }; export default sv; diff --git a/interface/src/i18n/tr/index.ts b/interface/src/i18n/tr/index.ts index bfa15079e..5fd35d1c2 100644 --- a/interface/src/i18n/tr/index.ts +++ b/interface/src/i18n/tr/index.ts @@ -350,7 +350,6 @@ const tr: Translation = { THIS_VERSION: 'Bu Sürüm', PLATFORM: 'Platforma', RELEASE_TYPE: 'Sürüm Tipi', - INTERNET_CONNECTION_REQUIRED: 'Otomatik sürüm kontrolü ve güncelleme için internet bağlantısı gereklidir', SWITCH_RELEASE_TYPE: '{0} sürümüne geç', FIRMWARE_VERSION_INFO: 'Firmware Sürüm Bilgisi', NO_DATA: 'Hiçbir veri yok', @@ -367,7 +366,8 @@ const tr: Translation = { COMMANDS_UPDATED: 'Komutlar güncellendi', COMMANDS_HELP_1: 'Özel komutları EMS hattına tanımlayın', COMMAND_SENT: 'Komut gönderildi', - RUN: 'Komutu çalıştır' + RUN: 'Komutu çalıştır', + INTERNET_CONNECTION_CHECK: 'Online bağlantısı kontrol ediliyor' }; export default tr; From 0b47e5ec05db52af3ee9700d66aadfc232c738f0 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 23 Aug 2026 12:54:49 +0200 Subject: [PATCH 21/31] remove unused translations --- interface/src/i18n/cs/index.ts | 18 ------------------ interface/src/i18n/de/index.ts | 18 ------------------ interface/src/i18n/en/index.ts | 18 ------------------ interface/src/i18n/fr/index.ts | 18 ------------------ interface/src/i18n/it/index.ts | 18 ------------------ interface/src/i18n/nl/index.ts | 18 ------------------ interface/src/i18n/no/index.ts | 18 ------------------ interface/src/i18n/pl/index.ts | 18 ------------------ interface/src/i18n/sk/index.ts | 18 ------------------ interface/src/i18n/sv/index.ts | 18 ------------------ interface/src/i18n/tr/index.ts | 18 ------------------ 11 files changed, 198 deletions(-) diff --git a/interface/src/i18n/cs/index.ts b/interface/src/i18n/cs/index.ts index 3379a5bd6..ea7fb2ad7 100644 --- a/interface/src/i18n/cs/index.ts +++ b/interface/src/i18n/cs/index.ts @@ -3,7 +3,6 @@ import type { Translation } from '../i18n-types'; const cs: Translation = { LANGUAGE: 'Jazyk', RETRY: 'Zkusit znovu', - LOADING: 'Načítání', IS_REQUIRED: '{0} je vyžadováno', SIGN_IN: 'Přihlásit se', SIGN_OUT: 'Odhlásit se', @@ -50,8 +49,6 @@ const cs: Translation = { SETTINGS: 'Nastavení', UPDATED_OF: '{0} Aktualizováno', UPDATE_OF: '{0} Aktualizace', - REMOVED_OF: '{0} Odebráno', - DELETION_OF: '{0} Smazání', OFFSET: 'Offset', FACTOR: 'Faktor', FREQ: 'Frekvence', @@ -64,17 +61,14 @@ const cs: Translation = { TEMP_SENSORS: 'Teplotní senzory', WRITE_CMD_SENT: 'Zapisovací příkaz odeslán', EMS_BUS_WARNING: 'EMS sběrnice je odpojena. Pokud toto varování přetrvává i po několika sekundách, zkontrolujte nastavení a profil desky', - EMS_BUS_SCANNING: 'Prohledávání zařízení na EMS sběrnici...', CONNECTED: 'Připojeno', TX_ISSUES: 'Problémy s Tx - zkontrolujte režim Tx', DISCONNECTED: 'Odpojeno', - EMS_SCAN: 'Opravdu chcete zahájit úplné skenování zařízení na EMS sběrnici?', DATA_TRAFFIC: 'Datový provoz', EMS_DEVICE: 'EMS zařízení', SUCCESS: 'ÚSPĚCH', FAIL: 'SELHÁNÍ', QUALITY: 'KVALITA', - SCAN: 'Skenovat', STATUS_NAMES: [ 'Přijaté EMS telegramy (Rx)', 'Čtení EMS (Tx)', @@ -125,7 +119,6 @@ const cs: Translation = { ENUM_FORMAT: 'Formát enum v API/MQTT', INDEX: 'Index', ENABLE_PARASITE: 'Povolit 1-Wire parazitní napájení', - LOGGING: 'Protokolování', LOG_HEX: 'Protokolovat EMS telegramy v hexadecimálním formátu', ENABLE_SYSLOG: 'Povolit Syslog', LOG_LEVEL: 'Úroveň protokolování', @@ -170,7 +163,6 @@ const cs: Translation = { CLOSE: 'Zavřít', USE: 'Použít', FACTORY_RESET: 'Obnovení továrního nastavení', - SYSTEM_FACTORY_TEXT: 'Zařízení bylo obnoveno do továrního nastavení a nyní se restartuje', SYSTEM_FACTORY_TEXT_DIALOG: 'Opravdu chcete resetovat zařízení EMS-ESP do továrního nastavení?', AVAILABLE_VERSION: 'Nejnovější dostupné verze', STABLE: 'Stabilní', @@ -255,9 +247,7 @@ const cs: Translation = { NETWORK_SCAN: 'Skenovat WiFi sítě', IDLE: 'Nečinný', LOST: 'Ztraceno', - SCANNING: 'Skenování', SCAN_AGAIN: 'Skenovat znovu', - NETWORK_SCANNER: 'Síťový skener', NETWORK_NO_WIFI: 'Nenalezeny žádné WiFi sítě', NETWORK_BLANK_BSSID: 'ponechte prázdné pokud použijete jen SSID', TX_POWER: 'Vysílací výkon', @@ -292,9 +282,6 @@ const cs: Translation = { ONCHANGE: 'Při změně', CONDITION: 'Podmínka', SCHEDULE_UPDATED: 'Harmonogram aktualizován', - SCHEDULE_TIMER_1: 'při startu', - SCHEDULE_TIMER_2: 'každou minutu', - SCHEDULE_TIMER_3: 'každou hodinu', CUSTOM_ENTITIES: 'Vlastní entity', ENTITIES_HELP_1: 'Definujte vlastní EMS entity nebo dynamické uživatelské proměnné', ENTITIES_UPDATED: 'Entity aktualizovány', @@ -310,9 +297,7 @@ const cs: Translation = { ACTIVELOW: 'Aktivní nízká', UNCHANGED: 'Beze změny', ALWAYS: 'Vždy', - ACTIVITY: 'Aktivita', CONFIGURE: '{0} Konfigurovat', - SYSTEM_MEMORY: 'Paměť systému', APPLICATION_SETTINGS_1: 'Upravit nastavení aplikace EMS-ESP', SECURITY_1: 'Přidat nebo odebrat uživatele', DOWNLOAD_UPLOAD_1: 'Stáhnout a nahrát nastavení a firmware', @@ -324,7 +309,6 @@ const cs: Translation = { RENAME: 'Přejmenovat', ENABLE_MODBUS: 'Povolit Modbus', VIEW_LOG: 'Zobrazit záznam pro diagnostiku problémů', - UPLOAD_DRAG: 'přetáhněte soubor sem nebo klikněte pro výběr', SERVICES: 'Služby', ALLVALUES: 'Všechny hodnoty', SPECIAL_FUNCTIONS: 'Speciální funkce', @@ -352,7 +336,6 @@ const cs: Translation = { RELEASE_TYPE: 'Typ sestavení', SWITCH_RELEASE_TYPE: 'Přepnout na {0} verzi', FIRMWARE_VERSION_INFO: 'Informace o verzi firmwaru', - NO_DATA: 'žádné údaje', USER_PROFILE: 'Uživatelský profil', STORED_VERSIONS: 'Uložené verze', ONLINE_HELP: 'online nápověda', @@ -363,7 +346,6 @@ const cs: Translation = { TEST_EMAIL_SUCCESSFUL: 'Test email byl úspěšně odeslán', SYSTEM_NAME: 'Název systému', COMMANDS: 'Příkazy', - COMMANDS_UPDATED: 'Příkazy byly aktualizovány', COMMANDS_HELP_1: 'Definujte vlastní příkazy pro magistrali EMS', COMMAND_SENT: 'Příkaz odeslán', RUN: 'Spustit příkaz', diff --git a/interface/src/i18n/de/index.ts b/interface/src/i18n/de/index.ts index 0907d4d81..38c7ffe84 100644 --- a/interface/src/i18n/de/index.ts +++ b/interface/src/i18n/de/index.ts @@ -3,7 +3,6 @@ import type { Translation } from '../i18n-types'; const de: Translation = { LANGUAGE: 'Sprache', RETRY: 'Neuer Versuch', - LOADING: 'Laden', IS_REQUIRED: '{0} ist erforderlich', SIGN_IN: 'Einloggen', SIGN_OUT: 'Ausloggen', @@ -50,8 +49,6 @@ const de: Translation = { SETTINGS: 'Einstellungen', UPDATED_OF: '{0} Aktualisiert', UPDATE_OF: '{0} Aktualisieren', - REMOVED_OF: '{0} Entfernt', - DELETION_OF: '{0} Löschung', OFFSET: 'Position', FACTOR: 'Faktor', FREQ: 'Frequenz', @@ -64,17 +61,14 @@ const de: Translation = { TEMP_SENSORS: 'Temperatursensoren', WRITE_CMD_SENT: 'Befehl schreiben wurde gesendet', EMS_BUS_WARNING: 'EMS-Bus getrennt. Wenn diese Warnung nach einigen Sekunden immer noch besteht, überprüfen Sie bitte die Einstellungen und das Board-Profil.', - EMS_BUS_SCANNING: 'Suche nach EMS Geräten...', CONNECTED: 'Verbunden', TX_ISSUES: 'Tx-Probleme - Versuchen Sie einen anderen Tx-Modus', DISCONNECTED: 'Getrennt', - EMS_SCAN: 'Möchten Sie wirklich eine vollständige Gerätesuche des EMS-Busses starten?', DATA_TRAFFIC: 'Datenverkehr', EMS_DEVICE: 'EMS Gerät', SUCCESS: 'ERFOLG', FAIL: 'FEHLER', QUALITY: 'QUALITÄT', - SCAN: 'Suche', STATUS_NAMES: [ 'EMS-Telegramme empfangen (Rx)', 'EMS-Telegramme gelesen (Tx)', @@ -125,7 +119,6 @@ const de: Translation = { ENUM_FORMAT: 'Enum Format API/MQTT', INDEX: 'Index', ENABLE_PARASITE: '1-Wire parasitäre Stomversorgung', - LOGGING: 'Protokollierung', LOG_HEX: 'EMS-Telegramme hexadezimal protokollieren', ENABLE_SYSLOG: 'Syslog aktivieren', LOG_LEVEL: 'Protokollebene', @@ -170,7 +163,6 @@ const de: Translation = { CLOSE: 'Schließen', USE: 'Verwenden Sie', FACTORY_RESET: 'Werkseinstellung', - SYSTEM_FACTORY_TEXT: 'EMS-ESP wurde auf Werkseinstellung gesetzt und startet als Zugangspunkt neu.', SYSTEM_FACTORY_TEXT_DIALOG: 'Sind Sie sicher, alle Einstellungen auf Werkseinstellung zu setzen?', AVAILABLE_VERSION: 'Neuesten verfügbaren Versionen', STABLE: 'Stabil', @@ -255,9 +247,7 @@ const de: Translation = { NETWORK_SCAN: 'Suche nach WiFi-Netzwerken', IDLE: 'Leerlauf', LOST: 'Verloren', - SCANNING: 'Suche', SCAN_AGAIN: 'Erneute Suche', - NETWORK_SCANNER: 'Netzwerksuche', NETWORK_NO_WIFI: 'Keine WiFi-Netzwerke gefunden', NETWORK_BLANK_BSSID: 'Freilassen, um nur SSID für die Verbindung zu nutzen.', TX_POWER: 'Tx Leistung', @@ -292,9 +282,6 @@ const de: Translation = { ONCHANGE: 'Bei Änderung', CONDITION: 'Zustand', SCHEDULE_UPDATED: 'Zeitplan aktualisiert', - SCHEDULE_TIMER_1: 'beim Start', - SCHEDULE_TIMER_2: 'jede Minute', - SCHEDULE_TIMER_3: 'jede Stunde', CUSTOM_ENTITIES: 'Individuelle Entitäten', ENTITIES_HELP_1: 'Definition eigener EMS-Werte oder dynamischer Variablen', ENTITIES_UPDATED: 'Entitäten gespeichert', @@ -310,9 +297,7 @@ const de: Translation = { ACTIVELOW: 'Aktiv Negativ', UNCHANGED: 'Unverändert', ALWAYS: 'Immer', - ACTIVITY: 'Aktivität', CONFIGURE: 'Konfiguriere {0}', - SYSTEM_MEMORY: 'Systemspeicher', APPLICATION_SETTINGS_1: 'Ändern Sie die EMS-ESP-Anwendungseinstellungen.', SECURITY_1: 'Benutzer hinzufügen oder entfernen', DOWNLOAD_UPLOAD_1: 'Einstellungen und Firmware herunterladen/hochladen', @@ -324,7 +309,6 @@ const de: Translation = { RENAME: 'Umbenennen', ENABLE_MODBUS: 'Modbus aktivieren', VIEW_LOG: 'Sehen Sie sich das Protokoll an, um Probleme zu diagnostizieren.', - UPLOAD_DRAG: 'Ziehen Sie eine Datei hierher oder klicken Sie, um eine auszuwählen.', SERVICES: 'Dienste', ALLVALUES: 'Alle Werte', SPECIAL_FUNCTIONS: 'Sonderfunktionen', @@ -352,7 +336,6 @@ const de: Translation = { RELEASE_TYPE: 'Release Typ', SWITCH_RELEASE_TYPE: 'Zum {0}-Release wechseln', FIRMWARE_VERSION_INFO: 'Firmware-Versionsinformation', - NO_DATA: 'Keine Daten', USER_PROFILE: 'Benutzerprofil', STORED_VERSIONS: 'Gespeicherte Versionen', ONLINE_HELP: 'Online-Hilfe', @@ -363,7 +346,6 @@ const de: Translation = { TEST_EMAIL_SUCCESSFUL: 'Test email erfolgreich gesendet', SYSTEM_NAME: 'Systemname', COMMANDS: 'Befehle', - COMMANDS_UPDATED: 'Befehle wurden aktualisiert', COMMANDS_HELP_1: 'Definieren Sie eigene Befehle für die EMS-Magistral', COMMAND_SENT: 'Befehl gesendet', RUN: 'Befehl ausführen', diff --git a/interface/src/i18n/en/index.ts b/interface/src/i18n/en/index.ts index c1df119c2..db133cba7 100644 --- a/interface/src/i18n/en/index.ts +++ b/interface/src/i18n/en/index.ts @@ -3,7 +3,6 @@ import type { Translation } from '../i18n-types'; const en: Translation = { LANGUAGE: 'Language', RETRY: 'Retry', - LOADING: 'Loading', IS_REQUIRED: '{0} is required', SIGN_IN: 'Sign In', SIGN_OUT: 'Sign Out', @@ -50,8 +49,6 @@ const en: Translation = { SETTINGS: 'Settings', UPDATED_OF: '{0} Updated', UPDATE_OF: '{0} Update', - REMOVED_OF: '{0} Removed', - DELETION_OF: '{0} Deletion', OFFSET: 'Offset', FACTOR: 'Factor', FREQ: 'Frequency', @@ -64,17 +61,14 @@ const en: Translation = { TEMP_SENSORS: 'Temperature Sensors', WRITE_CMD_SENT: 'Write command sent', EMS_BUS_WARNING: 'EMS bus disconnected. If this warning still persists after a few seconds please check settings and board profile', - EMS_BUS_SCANNING: 'Scanning for EMS devices...', CONNECTED: 'Connected', TX_ISSUES: 'Tx issues - check Tx Mode', DISCONNECTED: 'Disconnected', - EMS_SCAN: 'Are you sure you want to initiate a full device scan of the EMS bus?', DATA_TRAFFIC: 'Data Traffic', EMS_DEVICE: 'EMS Device', SUCCESS: 'SUCCESS', FAIL: 'FAIL', QUALITY: 'QUALITY', - SCAN: 'Scan', STATUS_NAMES: [ 'EMS Telegrams Received (Rx)', 'EMS Reads (Tx)', @@ -125,7 +119,6 @@ const en: Translation = { ENUM_FORMAT: 'Enum Format API/MQTT', INDEX: 'Index', ENABLE_PARASITE: 'Enable 1-Wire Parasite-Power', - LOGGING: 'Logging', LOG_HEX: 'Log EMS telegrams in hexadecimal', ENABLE_SYSLOG: 'Enable Syslog', LOG_LEVEL: 'Log Level', @@ -170,7 +163,6 @@ const en: Translation = { CLOSE: 'Close', USE: 'Use', FACTORY_RESET: 'Factory Reset', - SYSTEM_FACTORY_TEXT: 'Device has been factory reset and will now restart', SYSTEM_FACTORY_TEXT_DIALOG: 'Are you sure you want to reset EMS-ESP to its factory defaults?', AVAILABLE_VERSION: 'Latest Available Versions', STABLE: 'Stable', @@ -255,9 +247,7 @@ const en: Translation = { NETWORK_SCAN: 'Scan WiFi Networks', IDLE: 'Idle', LOST: 'Lost', - SCANNING: 'Scanning', SCAN_AGAIN: 'Scan again', - NETWORK_SCANNER: 'Network Scanner', NETWORK_NO_WIFI: 'No WiFi networks found', NETWORK_BLANK_BSSID: 'leave blank to use only SSID', TX_POWER: 'Tx Power', @@ -292,9 +282,6 @@ const en: Translation = { ONCHANGE: 'On Change', CONDITION: 'Condition', SCHEDULE_UPDATED: 'Schedule updated', - SCHEDULE_TIMER_1: 'on startup', - SCHEDULE_TIMER_2: 'every minute', - SCHEDULE_TIMER_3: 'every hour', CUSTOM_ENTITIES: 'Custom Entities', ENTITIES_HELP_1: 'Define custom EMS entities or dynamic user variables', ENTITIES_UPDATED: 'Entities updated', @@ -310,9 +297,7 @@ const en: Translation = { ACTIVELOW: 'Active Low', UNCHANGED: 'Unchanged', ALWAYS: 'Always', - ACTIVITY: 'Activity', CONFIGURE: 'Configure {0}', - SYSTEM_MEMORY: 'System Memory', APPLICATION_SETTINGS_1: 'Modify EMS-ESP Application Settings', SECURITY_1: 'Add or remove users', DOWNLOAD_UPLOAD_1: 'Download and Upload Settings and Firmware', @@ -324,7 +309,6 @@ const en: Translation = { RENAME: 'Rename', ENABLE_MODBUS: 'Enable Modbus', VIEW_LOG: 'View log to diagnose issues', - UPLOAD_DRAG: 'drag and drop a file here or click to select one', SERVICES: 'Services', ALLVALUES: 'All Values', SPECIAL_FUNCTIONS: 'Special Functions', @@ -352,7 +336,6 @@ const en: Translation = { RELEASE_TYPE: 'Release Type', SWITCH_RELEASE_TYPE: 'Switch to {0} release', FIRMWARE_VERSION_INFO: 'Firmware Version Information', - NO_DATA: 'No data', USER_PROFILE: 'User Profile', STORED_VERSIONS: 'Stored Versions', ONLINE_HELP: 'online help', @@ -363,7 +346,6 @@ const en: Translation = { TEST_EMAIL_SUCCESSFUL: 'Test email sent successfully', SYSTEM_NAME: 'System Name', COMMANDS: 'Commands', - COMMANDS_UPDATED: 'Commands updated', COMMANDS_HELP_1: 'Define reusable named commands below. These can be executed from the console, API/MQTT, or referenced by the Scheduler', COMMAND_SENT: 'Command sent', RUN: 'Run', diff --git a/interface/src/i18n/fr/index.ts b/interface/src/i18n/fr/index.ts index 7e9bc51bb..fbc02d274 100644 --- a/interface/src/i18n/fr/index.ts +++ b/interface/src/i18n/fr/index.ts @@ -3,7 +3,6 @@ import type { Translation } from '../i18n-types'; const fr: Translation = { LANGUAGE: 'Langue', RETRY: 'Réessayer', - LOADING: 'Chargement', IS_REQUIRED: '{0} est requis', SIGN_IN: 'Se connecter', SIGN_OUT: 'Se déconnecter', @@ -50,8 +49,6 @@ const fr: Translation = { SETTINGS: 'Paramètres', UPDATED_OF: '{0} mis à jour', UPDATE_OF: 'Mise à jour de {0}', - REMOVED_OF: '{0} enlevé', - DELETION_OF: '{0} supprimé', OFFSET: 'Offset', FACTOR: 'Facteur', FREQ: 'Fréquence', @@ -64,17 +61,14 @@ const fr: Translation = { TEMP_SENSORS: 'Capteurs de température', WRITE_CMD_SENT: 'Envoyer la commande sent', EMS_BUS_WARNING: 'Bus EMS déconnecté. Si ce message persiste après quelques secondes, vérifiez les paramètres et la configuration de la carte.', - EMS_BUS_SCANNING: 'Scan des appareils EMS...', CONNECTED: 'Connecté', TX_ISSUES: 'Problèmes de transmission (Tx) - Essayez un autre mode Tx', DISCONNECTED: 'Déconnecté', - EMS_SCAN: 'Etes-vous sûr de vouloir lancer un scan complet du bus EMS ?', DATA_TRAFFIC: 'Traffic des données', EMS_DEVICE: 'Appareils EMS', SUCCESS: 'SUCCÈS', FAIL: 'ÉCHEC', QUALITY: 'QUALITÉ', - SCAN: 'Scan', STATUS_NAMES: [ 'Télégrammes EMS reçus (Rx)', 'Lectures EMS (Tx)', @@ -125,7 +119,6 @@ const fr: Translation = { ENUM_FORMAT: 'Format enum API/MQTT', INDEX: 'Index', ENABLE_PARASITE: 'Activer la puissance 1-wire parasite', - LOGGING: 'Journal', LOG_HEX: 'Enregistrer les télégrammes EMS en hexadécimal', ENABLE_SYSLOG: 'Activer les logs système', LOG_LEVEL: 'Niveau de log', @@ -170,7 +163,6 @@ const fr: Translation = { CLOSE: 'Fermer', USE: 'Utiliser', FACTORY_RESET: 'Réinitialisation', - SYSTEM_FACTORY_TEXT: "L'appareil a été réinitialisé et va maintenant redémarrer", SYSTEM_FACTORY_TEXT_DIALOG: "Êtes-vous sûr de vouloir réinitialiser l'appareil à ses paramètres d'usine ?", AVAILABLE_VERSION: 'Versions disponibles', STABLE: 'Stable', @@ -255,9 +247,7 @@ const fr: Translation = { NETWORK_SCAN: 'Scanner les réseaux WiFi', IDLE: 'Inactif', LOST: 'Perdu', - SCANNING: 'Scan en cours', SCAN_AGAIN: 'Rescanner', - NETWORK_SCANNER: 'Scan réseau', NETWORK_NO_WIFI: 'Pas de réseau WiFi trouvé', NETWORK_BLANK_BSSID: 'laisser vide pour utiliser uniquement le SSID', TX_POWER: 'Puissance Tx', @@ -292,9 +282,6 @@ const fr: Translation = { ONCHANGE: 'Sur le changement', CONDITION: 'Condition', SCHEDULE_UPDATED: 'Programme mis à jour', - SCHEDULE_TIMER_1: 'au démarrage', - SCHEDULE_TIMER_2: 'toutes les minutes', - SCHEDULE_TIMER_3: 'toutes les heures', CUSTOM_ENTITIES: 'Entités personnalisées', ENTITIES_HELP_1: 'Récupérer les entités personnalisées du bus EMS', ENTITIES_UPDATED: 'Entités mises à jour', @@ -310,9 +297,7 @@ const fr: Translation = { ACTIVELOW: 'Actif bas', UNCHANGED: 'Inchangé', ALWAYS: 'Toujours', - ACTIVITY: 'Activité', CONFIGURE: 'Configurer {0}', - SYSTEM_MEMORY: 'Mémoire système', APPLICATION_SETTINGS_1: 'Modifier les paramètres de l\'application EMS-ESP', SECURITY_1: 'Ajouter ou supprimer des utilisateurs', DOWNLOAD_UPLOAD_1: 'Télécharger et mettre à jour les paramètres et le firmware', @@ -324,7 +309,6 @@ const fr: Translation = { RENAME: 'Renommer', ENABLE_MODBUS: 'Activer Modbus', VIEW_LOG: 'Voir le journal pour diagnostiquer les problèmes', - UPLOAD_DRAG: 'glisser-déposer un fichier ici ou cliquer pour en sélectionner un', SERVICES: 'Services', ALLVALUES: 'Toutes les valeurs', SPECIAL_FUNCTIONS: 'Fonctions spéciales', @@ -352,7 +336,6 @@ const fr: Translation = { RELEASE_TYPE: 'Type de version', SWITCH_RELEASE_TYPE: 'Passer à la version {0}', FIRMWARE_VERSION_INFO: 'Informations sur la version du firmware', - NO_DATA: 'Aucune donnée', USER_PROFILE: 'Profil utilisateur', STORED_VERSIONS: 'Versions stockées', ONLINE_HELP: 'aide en ligne', @@ -363,7 +346,6 @@ const fr: Translation = { TEST_EMAIL_SUCCESSFUL: 'Test email envoyé avec succès', SYSTEM_NAME: 'Nom du système', COMMANDS: 'Commandes', - COMMANDS_UPDATED: 'Commandes mises à jour', COMMANDS_HELP_1: 'Définir des commandes personnalisées pour la magistral EMS', COMMAND_SENT: 'Commande envoyée', RUN: 'Exécuter une commande', diff --git a/interface/src/i18n/it/index.ts b/interface/src/i18n/it/index.ts index 527a9bc06..b7977cb6f 100644 --- a/interface/src/i18n/it/index.ts +++ b/interface/src/i18n/it/index.ts @@ -3,7 +3,6 @@ import type { Translation } from '../i18n-types'; const it: Translation = { LANGUAGE: 'Lingua', RETRY: 'Riprovare', - LOADING: 'Caricamento', IS_REQUIRED: '{0} é richiesto', SIGN_IN: 'Connettersi', SIGN_OUT: 'Disconnettersi', @@ -50,8 +49,6 @@ const it: Translation = { SETTINGS: 'Settings', UPDATED_OF: '{0} Aggiornati', UPDATE_OF: 'Aggiorna {0}', - REMOVED_OF: '{0} Rimossi', - DELETION_OF: '{0} Cancellati', OFFSET: 'Offset', FACTOR: 'Fattore', FREQ: 'Frequenza', @@ -64,17 +61,14 @@ const it: Translation = { TEMP_SENSORS: 'Sensori Temperatura', WRITE_CMD_SENT: 'Scrittura comando inviata', EMS_BUS_WARNING: 'EMS bus disconnesso. Se questo avvertimento persiste dopo alcuni secondi prego verificare impostazioni scheda', - EMS_BUS_SCANNING: 'Scansione dispositivi EMS ...', CONNECTED: 'Connesso', TX_ISSUES: 'Problema di Tx - prova una modalità differente', DISCONNECTED: 'Disconnesso', - EMS_SCAN: 'Sei sicuro di voler iniziare una scansione completa del bus EMS ?', DATA_TRAFFIC: 'Traffico dati', EMS_DEVICE: 'Dispositivo EMS ', SUCCESS: 'SUCCESSO', FAIL: 'FALLITO', QUALITY: 'QUALITÂ', - SCAN: 'Scansione', STATUS_NAMES: [ 'Telegrammi EMS Ricevuti (Rx)', 'EMS Letti (Tx)', @@ -125,7 +119,6 @@ const it: Translation = { ENUM_FORMAT: 'Enum Format API/MQTT', INDEX: 'Indice', ENABLE_PARASITE: 'Abilita potenza 1-wire parassita', - LOGGING: 'Registrazione', LOG_HEX: 'Registra telegrammi EMS in esadecimale', ENABLE_SYSLOG: 'Abilita Syslog', LOG_LEVEL: 'Livello registrazione', @@ -170,7 +163,6 @@ const it: Translation = { CLOSE: 'Chiudere', USE: 'Usa', FACTORY_RESET: 'Impostazioni di fabbrica', - SYSTEM_FACTORY_TEXT: 'Il dispositivo è stato ripristinato alle impostazioni di fabbrica e ora verrà riavviato', SYSTEM_FACTORY_TEXT_DIALOG: 'Sei sicuro di voler ripristinare il dispositivo alle impostazioni di fabbrica??', AVAILABLE_VERSION: 'Versioni disponibili', STABLE: 'Stabile', @@ -255,9 +247,7 @@ const it: Translation = { NETWORK_SCAN: 'Scansione reti WiFi', IDLE: 'Inattivo', LOST: 'Perso', - SCANNING: 'Scansione', SCAN_AGAIN: 'Scansiona ancora', - NETWORK_SCANNER: 'Scansione Rete', NETWORK_NO_WIFI: 'Nessuana rete WiFi trovata', NETWORK_BLANK_BSSID: 'lasciare vuoto per usare solo SSID', TX_POWER: 'Potenza Tx', @@ -292,9 +282,6 @@ const it: Translation = { ONCHANGE: 'Sul cambiamento', CONDITION: 'Condizione', SCHEDULE_UPDATED: 'Calendario aggiornato', - SCHEDULE_TIMER_1: 'All avvio', - SCHEDULE_TIMER_2: 'Ogni minuto', - SCHEDULE_TIMER_3: 'Ogni ora', CUSTOM_ENTITIES: 'Entità personalizzate', ENTITIES_HELP_1: 'Recupera entità personalizzate dal BUS EMS', ENTITIES_UPDATED: 'Entità aggiornate', @@ -310,9 +297,7 @@ const it: Translation = { ACTIVELOW: 'Active Low', UNCHANGED: 'Unchanged', ALWAYS: 'Always', - ACTIVITY: 'Activity', CONFIGURE: 'Configure {0}', - SYSTEM_MEMORY: 'System Memory', APPLICATION_SETTINGS_1: 'Modify EMS-ESP Application Settings', SECURITY_1: 'Add or remove users', DOWNLOAD_UPLOAD_1: 'Download and Upload Settings and Firmware', @@ -324,7 +309,6 @@ const it: Translation = { RENAME: 'Rename', ENABLE_MODBUS: 'Abilita Modbus', VIEW_LOG: 'Visualizza log per diagnosticare problemi', - UPLOAD_DRAG: 'trascina e rilascia un file qui o clicca per selezionare uno', SERVICES: 'Servizi', ALLVALUES: 'Tutti i valori', SPECIAL_FUNCTIONS: 'Funzioni speciali', @@ -352,7 +336,6 @@ const it: Translation = { RELEASE_TYPE: 'Tipo di rilascio', SWITCH_RELEASE_TYPE: 'Cambia in {0} rilascio', FIRMWARE_VERSION_INFO: 'Informazioni sulla versione del firmware', - NO_DATA: 'Nessun dato', USER_PROFILE: 'Profilo utente', STORED_VERSIONS: 'Versioni memorizzate', ONLINE_HELP: 'aiuto online', @@ -363,7 +346,6 @@ const it: Translation = { TEST_EMAIL_SUCCESSFUL: 'Test email inviata con successo', SYSTEM_NAME: 'Nome del sistema', COMMANDS: 'Comandi', - COMMANDS_UPDATED: 'Comandi aggiornati', COMMANDS_HELP_1: 'Definisci comandi personalizzati per la magistrali EMS', COMMAND_SENT: 'Comando inviato', RUN: 'Esegui comando', diff --git a/interface/src/i18n/nl/index.ts b/interface/src/i18n/nl/index.ts index 3b0335d8c..4598d1545 100644 --- a/interface/src/i18n/nl/index.ts +++ b/interface/src/i18n/nl/index.ts @@ -3,7 +3,6 @@ import type { Translation } from '../i18n-types'; const nl: Translation = { LANGUAGE: 'Taal', RETRY: 'Opnieuw proberen', - LOADING: 'Laden', IS_REQUIRED: '{0} is verplicht', SIGN_IN: 'Inloggen', SIGN_OUT: 'Uitloggen', @@ -50,8 +49,6 @@ const nl: Translation = { SETTINGS: 'Instellingen', UPDATED_OF: '{0} Bijgewerkt', UPDATE_OF: '{0} Bijwerken', - REMOVED_OF: '{0} Verwijderd', - DELETION_OF: '{0} Verwijder', OFFSET: 'Offset', FACTOR: 'Factor', FREQ: 'Frequentie', @@ -64,17 +61,14 @@ const nl: Translation = { TEMP_SENSORS: 'Temperatuur Sensoren', WRITE_CMD_SENT: 'Schrijf commando gestuurd', EMS_BUS_WARNING: 'EMS bus niet gevonden. Als deze waarschuwing blijft staan na een paar seconden loop dan de instellingen na en in het bijzonder het apparaat type profiel.', - EMS_BUS_SCANNING: 'Scannen naar EMS apparaten...', CONNECTED: 'Verbonden', TX_ISSUES: 'Tx bus probleem. Probeer een andere Tx verzendmodus', DISCONNECTED: 'Niet verbonden', - EMS_SCAN: 'Weet je zeker dat je een volledige EMS bus scan uit wilt voeren?', DATA_TRAFFIC: 'Dataverkeer', EMS_DEVICE: 'EMS Apparaat', SUCCESS: 'SUCCESS', FAIL: 'MISLUKT', QUALITY: 'KWALITEIT', - SCAN: 'Scan', STATUS_NAMES: [ 'EMS Telegrammen ontvangen (Rx)', 'EMS Leesopdrachten (Tx)', @@ -125,7 +119,6 @@ const nl: Translation = { ENUM_FORMAT: 'Enum formaat API/MQTT', INDEX: 'Index', ENABLE_PARASITE: 'Activeer 1-wire parasitaire modus', - LOGGING: 'Logging', LOG_HEX: 'Log EMS telegrammen in hexadecimaal', ENABLE_SYSLOG: 'Activeer Syslog', LOG_LEVEL: 'Log Level', @@ -170,7 +163,6 @@ const nl: Translation = { CLOSE: 'Sluiten', USE: 'Gebruik', FACTORY_RESET: 'Fabrieksinstellingen', - SYSTEM_FACTORY_TEXT: 'Gateway is gereset en start nu weer op met fabrieksinstellingen', SYSTEM_FACTORY_TEXT_DIALOG: 'Weet je zeker dat je een reset naar fabrieksinstellingen uit wilt voeren?', AVAILABLE_VERSION: 'Nieuwste beschikbare versies', STABLE: 'Stable', @@ -255,9 +247,7 @@ const nl: Translation = { NETWORK_SCAN: 'Scan WiFi Netwerken', IDLE: 'Inactief', LOST: 'Verloren', - SCANNING: 'Scannen', SCAN_AGAIN: 'Opnieuw scannen', - NETWORK_SCANNER: 'Netwerk Scannen', NETWORK_NO_WIFI: 'Geen WiFi netwerken gevonden', NETWORK_BLANK_BSSID: 'laat leeg om alleen SSID te bebruiken', TX_POWER: 'Tx Vermogen', @@ -292,9 +282,6 @@ const nl: Translation = { ONCHANGE: 'Op verandering', CONDITION: 'Voorwaarde', SCHEDULE_UPDATED: 'Schema bijgewerkt', - SCHEDULE_TIMER_1: 'bij het opstarten', - SCHEDULE_TIMER_2: 'elke minuut', - SCHEDULE_TIMER_3: 'elke huur', CUSTOM_ENTITIES: 'Eigen entiteiten', ENTITIES_HELP_1: 'Eigen entiteiten ophalen uit de EMS-bus', ENTITIES_UPDATED: 'Entiteiten bijgewerkt', @@ -310,9 +297,7 @@ const nl: Translation = { ACTIVELOW: 'Actiev Laag', UNCHANGED: 'Ongewijzigd', ALWAYS: 'Altijd', - ACTIVITY: 'Activiteit', CONFIGURE: '{0} Configureren', - SYSTEM_MEMORY: 'System Geheugen', APPLICATION_SETTINGS_1: 'Applicatie-instellingen wijzigen', SECURITY_1: 'Gebruikers toevoegen of verwijderen', DOWNLOAD_UPLOAD_1: 'Download en upload instellingen en firmware', @@ -324,7 +309,6 @@ const nl: Translation = { RENAME: 'Hernoemen', ENABLE_MODBUS: 'Activeer Modbus', VIEW_LOG: 'Log weergeven om problemen te diagnosticeren', - UPLOAD_DRAG: 'sleep hier een bestand en zet het neer of klik om er een te selecteren', SERVICES: 'Services', ALLVALUES: 'All waarden', SPECIAL_FUNCTIONS: 'Speciale functies', @@ -352,7 +336,6 @@ const nl: Translation = { RELEASE_TYPE: 'Release Typ', SWITCH_RELEASE_TYPE: 'Switch naar {0} release', FIRMWARE_VERSION_INFO: 'Informatie over firmwareversie', - NO_DATA: 'Geen data', USER_PROFILE: 'Gebruikersprofiel', STORED_VERSIONS: 'Opgeslagen versies', ONLINE_HELP: 'online help', @@ -363,7 +346,6 @@ const nl: Translation = { TEST_EMAIL_SUCCESSFUL: 'Test email verzonden succesvol', SYSTEM_NAME: 'Systeemnaam', COMMANDS: 'Commando\'s', - COMMANDS_UPDATED: 'Commando\'s bijgewerkt', COMMANDS_HELP_1: 'Definieer hergebruikbare benoemde commando\'s hieronder. Deze kunnen worden uitgevoerd vanuit de console, API/MQTT, of worden aangeroepen door de Scheduler', COMMAND_SENT: 'Commando verzonden', RUN: 'Commando uitvoeren', diff --git a/interface/src/i18n/no/index.ts b/interface/src/i18n/no/index.ts index 4e31e220b..b54932f8f 100644 --- a/interface/src/i18n/no/index.ts +++ b/interface/src/i18n/no/index.ts @@ -3,7 +3,6 @@ import type { Translation } from '../i18n-types'; const no: Translation = { LANGUAGE: 'Språk', RETRY: 'Forsøk igjen', - LOADING: 'Laster', IS_REQUIRED: '{0} er nødvendig', SIGN_IN: 'Logg inn', SIGN_OUT: 'Logg ut', @@ -50,8 +49,6 @@ const no: Translation = { SETTINGS: 'Innstillinger', UPDATED_OF: '{0} Oppdatert', UPDATE_OF: '{0} Oppdater', - REMOVED_OF: '{0} Slettet', - DELETION_OF: '{0} Sletting', OFFSET: 'Kompensering', FACTOR: 'Faktor', FREQ: 'Frekvens', @@ -64,17 +61,14 @@ const no: Translation = { TEMP_SENSORS: 'Temperaturesensorer', WRITE_CMD_SENT: 'Skriv kommando sent', EMS_BUS_WARNING: 'EMS bussen koblet ned. Hvis denne advarselen fortsetter etter noen f¨sekunder sjekk instillinger og prosessorkort', - EMS_BUS_SCANNING: 'Søker etter EMS enheter...', CONNECTED: 'Tilkoblet', TX_ISSUES: 'Tx problemer - prøv en annen Tx Modus', DISCONNECTED: 'Frakoblet', - EMS_SCAN: 'Er du sikker på du vil starte full søking av EMS bussen?', DATA_TRAFFIC: 'Data trafikk', EMS_DEVICE: 'EMS Enhet', SUCCESS: 'VELLYKKET', FAIL: 'MISLYKKET', QUALITY: 'KVALITET', - SCAN: 'Søk', STATUS_NAMES: [ 'EMS Telegrammer Mottatt (Rx)', 'EMS Lest (Tx)', @@ -125,7 +119,6 @@ const no: Translation = { ENUM_FORMAT: 'Enum Format API/MQTT', INDEX: 'Indeks', ENABLE_PARASITE: 'Aktiver 1-wire parasitt strømforsyning', - LOGGING: 'Logging', LOG_HEX: 'Logg EMS telegrammer i hexadesimal', ENABLE_SYSLOG: 'Aktiver Syslog', LOG_LEVEL: 'Log Level', @@ -170,7 +163,6 @@ const no: Translation = { CLOSE: 'Steng', USE: 'Bruk', FACTORY_RESET: 'Sett tilbake til fabrikkinstilling', - SYSTEM_FACTORY_TEXT: 'Enhet har blitt satt tilbake til fabrikkinstilling og vil restarte', SYSTEM_FACTORY_TEXT_DIALOG: 'Er du sikker på at du vil resette enheten til fabrikkinstillinger?', AVAILABLE_VERSION: 'Tilgjengelige versjoner', STABLE: 'Stabil', @@ -255,9 +247,7 @@ const no: Translation = { NETWORK_SCAN: 'Søk etter trådløst nettverk', IDLE: 'Klar', LOST: 'Mistet', - SCANNING: 'Søker', SCAN_AGAIN: 'Søk igjen', - NETWORK_SCANNER: 'Nettverk Scanner', NETWORK_NO_WIFI: 'Ingen trådløse nett funnet', NETWORK_BLANK_BSSID: 'la feltet være blankt for å bruke kun SSID', TX_POWER: 'Tx Effekt', @@ -292,9 +282,6 @@ const no: Translation = { ONCHANGE: 'På endring', CONDITION: 'Betingelse', SCHEDULE_UPDATED: 'Planlegger er oppdatert', - SCHEDULE_TIMER_1: 'ved oppstart', - SCHEDULE_TIMER_2: 'hvert minutt', - SCHEDULE_TIMER_3: 'hver time', CUSTOM_ENTITIES: 'Personlige entiteter', ENTITIES_HELP_1: 'Hent personlige entiteter fra EMS bussen', ENTITIES_UPDATED: 'Entiteter oppdatert', @@ -310,9 +297,7 @@ const no: Translation = { ACTIVELOW: 'Active Low', UNCHANGED: 'Unchanged', ALWAYS: 'Always', - ACTIVITY: 'Aktivitet', CONFIGURE: 'Konfigurer {0}', - SYSTEM_MEMORY: 'System Memory', APPLICATION_SETTINGS_1: 'Modify EMS-ESP Application Settings', SECURITY_1: 'Add or remove users', DOWNLOAD_UPLOAD_1: 'Download and Upload Settings and Firmware', @@ -324,7 +309,6 @@ const no: Translation = { RENAME: 'Gi nytt navn', ENABLE_MODBUS: 'Aktiver Modbus', VIEW_LOG: 'Se logg for å diagnostisere problemer', - UPLOAD_DRAG: 'dra og slippe en fil her eller klikk for å velge en', SERVICES: 'Tjenester', ALLVALUES: 'Alle verdier', SPECIAL_FUNCTIONS: 'Spesielle funksjoner', @@ -352,7 +336,6 @@ const no: Translation = { RELEASE_TYPE: 'Utgivelses type', SWITCH_RELEASE_TYPE: 'Bytt til {0} utgivelse', FIRMWARE_VERSION_INFO: 'Informasjon om firmwareversjon', - NO_DATA: 'Ingen data', USER_PROFILE: 'Brukerprofil', STORED_VERSIONS: 'Lagret versjoner', ONLINE_HELP: 'online hjelp', @@ -363,7 +346,6 @@ const no: Translation = { TEST_EMAIL_SUCCESSFUL: 'Test email sendt suksessfullt', SYSTEM_NAME: 'Systemnavn', COMMANDS: 'Kommandoer', - COMMANDS_UPDATED: 'Kommandoer oppdatert', COMMANDS_HELP_1: 'Definer egne kommandoer for EMS-Magistral', COMMAND_SENT: 'Kommando sendt', RUN: 'Kjør', diff --git a/interface/src/i18n/pl/index.ts b/interface/src/i18n/pl/index.ts index 29b991e85..072da8799 100644 --- a/interface/src/i18n/pl/index.ts +++ b/interface/src/i18n/pl/index.ts @@ -3,7 +3,6 @@ import type { BaseTranslation } from '../i18n-types'; const pl: BaseTranslation = { LANGUAGE: 'Język', RETRY: 'Ponów', - LOADING: 'Ładowanie', IS_REQUIRED: 'Pole {0} nie może być puste!', SIGN_IN: 'Zaloguj się', SIGN_OUT: 'Wyloguj się', @@ -50,8 +49,6 @@ const pl: BaseTranslation = { SETTINGS: '{{U|u|}}stawienia', UPDATED_OF: 'Zaktualizowano {0}.', UPDATE_OF: 'Aktualizacja {0}', - REMOVED_OF: 'Usunięto ustawienia {0}.', - DELETION_OF: 'Kasowanie {0}', OFFSET: 'Korekta ±', FACTOR: 'Mnożnik', FREQ: 'Częstotliwość', @@ -64,17 +61,14 @@ const pl: BaseTranslation = { TEMP_SENSORS: 'Czujniki temperatury 1-Wire®', WRITE_CMD_SENT: 'Komenda zapisu została wysłana.', EMS_BUS_WARNING: 'Brak połączenia z magistralą EMS. Jeśli ten błąd występuje dłużej niż kilka sekund, sprawdź ustawienia oraz profil płytki interfejsu.', - EMS_BUS_SCANNING: 'Trwa skanowanie urządzeń na magistrali EMS...', CONNECTED: '{{połączono|połączenie|}}', TX_ISSUES: 'problem z zapisem na magistralę EMS, spróbuj wybrać inny "Tryb transmisji (Tx)"', DISCONNECTED: 'brak połączenia', - EMS_SCAN: 'Czy na pewno wykonać pełne skanowanie magistrali EMS?', DATA_TRAFFIC: 'Ruch Danych', EMS_DEVICE: 'Urządzenie EMS', SUCCESS: 'Udane', FAIL: 'Nieudane', QUALITY: 'Jakość', - SCAN: 'Skanuj', STATUS_NAMES: [ 'EMS, telegramy odebrane (Rx)', 'EMS, wysłane telegramy "odczyt" (Tx)', @@ -125,7 +119,6 @@ const pl: BaseTranslation = { ENUM_FORMAT: 'Wartości z listy w API/MQTT', INDEX: 'indeks', ENABLE_PARASITE: 'Aktywuj zasilanie 1-wire pasożytnicze', - LOGGING: 'Logowanie', LOG_HEX: 'Loguj telegramy EMS w systemie szesnastkowym (hex)', ENABLE_SYSLOG: 'Aktywuj SysLog', LOG_LEVEL: 'Poziom logowania', @@ -170,7 +163,6 @@ const pl: BaseTranslation = { CLOSE: 'Zamknij', USE: 'Aby zaktualizować firmware skorzystaj z funkcji', FACTORY_RESET: 'Ustawienia fabryczne', - SYSTEM_FACTORY_TEXT: 'Interfejs EMS-ESP został przywrócony do ustawień fabrycznych i zostanie teraz ponownie uruchomiony.', SYSTEM_FACTORY_TEXT_DIALOG: 'Na pewno chcesz przywrócić ustawienia fabryczne interfejsu EMS-ESP?', AVAILABLE_VERSION: 'Najnowsze dostępne wersje', STABLE: 'Stabilna', @@ -255,9 +247,7 @@ const pl: BaseTranslation = { NETWORK_SCAN: 'Skanowanie sieci WiFi', IDLE: 'bezczynna', LOST: 'zostało utracone.', - SCANNING: 'Skanuję', SCAN_AGAIN: 'Skanuj ponownie', - NETWORK_SCANNER: 'Skaner sieci WiFi', NETWORK_NO_WIFI: 'Brak sieci WiFi w zasięgu', NETWORK_BLANK_BSSID: 'pozostaw puste aby używać tylko SSID', TX_POWER: 'Moc nadawania', @@ -292,9 +282,6 @@ const pl: BaseTranslation = { ONCHANGE: 'O zmianie', CONDITION: 'Stan', SCHEDULE_UPDATED: 'Harmonogram został uaktualniony.', - SCHEDULE_TIMER_1: 'przy starcie', - SCHEDULE_TIMER_2: 'co minutę', - SCHEDULE_TIMER_3: 'co godzinę', CUSTOM_ENTITIES: '{{N|n|}}iestandardowe{{|j|}} encj{{e|i|}}', ENTITIES_HELP_1: 'Zdefiniuj niestandardowe encje dla magistrali EMS', ENTITIES_UPDATED: 'Niestandardowe encje zostały uaktualnione.', @@ -310,9 +297,7 @@ const pl: BaseTranslation = { ACTIVELOW: 'Wyzwalany stanem niskim', UNCHANGED: 'Zachowaj stan', ALWAYS: 'Zawsze', - ACTIVITY: 'Aktywność', CONFIGURE: 'Konfiguracja {0}', - SYSTEM_MEMORY: 'Pamięć systemowa', APPLICATION_SETTINGS_1: 'Modyfikacja ustawień aplikacji EMS-ESP', SECURITY_1: 'Dodawanie i usuwanie użytkowników', DOWNLOAD_UPLOAD_1: 'Pobieranie/wysyłanie ustawień i firmware', @@ -324,7 +309,6 @@ const pl: BaseTranslation = { RENAME: 'Zmień nazwę', ENABLE_MODBUS: 'Aktywuj Modbus', VIEW_LOG: 'Zdiagnozuj problemy', - UPLOAD_DRAG: 'przeciągnij i upuść plik lub kliknij tutaj', SERVICES: 'Usługi', ALLVALUES: 'Wszystkie wartości', SPECIAL_FUNCTIONS: 'Specjalne funkcje', @@ -352,7 +336,6 @@ const pl: BaseTranslation = { RELEASE_TYPE: 'Typ wydania', SWITCH_RELEASE_TYPE: 'Zmień na {0} wydanie', FIRMWARE_VERSION_INFO: 'Informacje o wersji firmware', - NO_DATA: 'Brak danych', USER_PROFILE: 'Profil użytkownika', STORED_VERSIONS: 'Zapisane wersje', ONLINE_HELP: 'pomoc online', @@ -363,7 +346,6 @@ const pl: BaseTranslation = { TEST_EMAIL_SUCCESSFUL: 'Test email wysłany pomyślnie', SYSTEM_NAME: 'Nazwa systemu', COMMANDS: 'Komendy', - COMMANDS_UPDATED: 'Komendy zostały zaktualizowane', COMMANDS_HELP_1: 'Zdefiniuj niestandardowe komendy dla magistrali EMS', COMMAND_SENT: 'Komenda wysłana', RUN: 'Wykonaj', diff --git a/interface/src/i18n/sk/index.ts b/interface/src/i18n/sk/index.ts index 251c31775..5d8f61623 100644 --- a/interface/src/i18n/sk/index.ts +++ b/interface/src/i18n/sk/index.ts @@ -3,7 +3,6 @@ import type { Translation } from '../i18n-types'; const sk: Translation = { LANGUAGE: 'Jazyk', RETRY: 'Opakovať', - LOADING: 'Načítanie', IS_REQUIRED: '{0} je požadovaná', SIGN_IN: 'Prihlásiť sa', SIGN_OUT: 'Odhlásiť sa', @@ -50,8 +49,6 @@ const sk: Translation = { SETTINGS: 'Nastavenia', UPDATED_OF: '{0} aktualizovaných', UPDATE_OF: '{0} aktualizované', - REMOVED_OF: '{0} odstránených', - DELETION_OF: '{0} zmazaných', OFFSET: 'Ofset', FACTOR: 'Faktor', FREQ: 'Frekvencia', @@ -64,17 +61,14 @@ const sk: Translation = { TEMP_SENSORS: 'Snímače teploty', WRITE_CMD_SENT: 'Príkaz zápisu bol odoslaný', EMS_BUS_WARNING: 'Zbernica EMS odpojená. Ak toto upozornenie pretrváva aj po niekoľkých sekundách, skontrolujte nastavenia a profil dosky', - EMS_BUS_SCANNING: 'Zisťovanie EMS zariadení...', CONNECTED: 'Pripojené', TX_ISSUES: 'Problémy s Tx – skontrolujte Tx režim', DISCONNECTED: 'Odpojené', - EMS_SCAN: 'Naozaj chcete spustiť úplnú kontrolu zariadenia zbernice EMS?', DATA_TRAFFIC: 'Dátová prevádzka', EMS_DEVICE: 'EMS zariadenie', SUCCESS: 'ÚSPEŠNÉ', FAIL: 'ZLYHANIE', QUALITY: 'KVALITA', - SCAN: 'Scan', STATUS_NAMES: [ 'EMS Telegramy prijaté (Rx)', 'EMS Čítania (Tx)', @@ -125,7 +119,6 @@ const sk: Translation = { ENUM_FORMAT: 'Enum formát API/MQTT', INDEX: 'Index', ENABLE_PARASITE: 'Povoliť 1-wire parazitné napájanie DS18B20', - LOGGING: 'Logovanie', LOG_HEX: 'Záznam telegramov EMS v hexadecimálnej sústave', ENABLE_SYSLOG: 'Povoliť Syslog', LOG_LEVEL: 'Log úroveň', @@ -170,7 +163,6 @@ const sk: Translation = { CLOSE: 'Zatvoriť', USE: 'Použiť', FACTORY_RESET: 'Továrenské nastavenia', - SYSTEM_FACTORY_TEXT: 'Zariadenie bolo obnovené z výroby a teraz sa reštartuje', SYSTEM_FACTORY_TEXT_DIALOG: 'Naozaj chcete resetovať EMS-ESP na predvolené výrobné nastavenia?', AVAILABLE_VERSION: 'Najnovšie dostupné verzie', STABLE: 'Stabilná', @@ -255,9 +247,7 @@ const sk: Translation = { NETWORK_SCAN: 'Scan WiFi siete', IDLE: 'Nečinné', LOST: 'Stratené', - SCANNING: 'Skenovanie', SCAN_AGAIN: 'Skenovať znova', - NETWORK_SCANNER: 'Sieťový skener', NETWORK_NO_WIFI: 'WiFi siete nenájdené', NETWORK_BLANK_BSSID: 'ponechajte prázdne, ak chcete používať iba SSID', TX_POWER: 'Tx výkon', @@ -292,9 +282,6 @@ const sk: Translation = { ONCHANGE: 'Pri zmene', CONDITION: 'Podmienka', SCHEDULE_UPDATED: 'Plánovanie aktualizované', - SCHEDULE_TIMER_1: 'pri spustení', - SCHEDULE_TIMER_2: 'každú minútu', - SCHEDULE_TIMER_3: 'každú hodinu', CUSTOM_ENTITIES: 'Vlastné entity', ENTITIES_HELP_1: 'Získavanie vlastných entít zo zbernice EMS', ENTITIES_UPDATED: 'Aktualizované entity', @@ -310,9 +297,7 @@ const sk: Translation = { ACTIVELOW: 'Aktívny Nízky', UNCHANGED: 'Nezmenené', ALWAYS: 'Vždy', - ACTIVITY: 'Aktivita', CONFIGURE: 'Konfigurácia {0}', - SYSTEM_MEMORY: 'Systémová pamäť', APPLICATION_SETTINGS_1: 'Zmeniť nastavenia aplikácie EMS-ESP', SECURITY_1: 'Pridať, alebo odstrániť používateľov', DOWNLOAD_UPLOAD_1: 'Stiahnuť a nahrať nastavenia a firmware', @@ -324,7 +309,6 @@ const sk: Translation = { RENAME: 'Premenovať', ENABLE_MODBUS: 'Povoliť Modbus', VIEW_LOG: 'Zobrazte log na diagnostiku problémov', - UPLOAD_DRAG: 'presuňte sem súbor alebo ho kliknutím vyberte', SERVICES: 'Služby', ALLVALUES: 'Všetky hodnoty', SPECIAL_FUNCTIONS: 'Špeciálne funkcie', @@ -352,7 +336,6 @@ const sk: Translation = { RELEASE_TYPE: 'Typ vydania', SWITCH_RELEASE_TYPE: 'Prepnúť na {0} verziu', FIRMWARE_VERSION_INFO: 'Informácie o verzii firmware', - NO_DATA: 'Žiadne dáta', USER_PROFILE: 'Profil používateľa', STORED_VERSIONS: 'Uložené verzie', ONLINE_HELP: 'online pomoc', @@ -363,7 +346,6 @@ const sk: Translation = { TEST_EMAIL_SUCCESSFUL: 'Test email bol úspešne odoslaný', SYSTEM_NAME: 'Názov systému', COMMANDS: 'Príkazy', - COMMANDS_UPDATED: 'Príkazy aktualizované', COMMANDS_HELP_1: 'Definujte vlastné príkazy pre magistrali EMS', COMMAND_SENT: 'Príkaz odoslaný', RUN: 'Volať príkaz', diff --git a/interface/src/i18n/sv/index.ts b/interface/src/i18n/sv/index.ts index cf470e668..0f0c35787 100644 --- a/interface/src/i18n/sv/index.ts +++ b/interface/src/i18n/sv/index.ts @@ -3,7 +3,6 @@ import type { Translation } from '../i18n-types'; const sv: Translation = { LANGUAGE: 'Språk', RETRY: 'Försök igen', - LOADING: 'Laddar', IS_REQUIRED: '{0} Krävs', SIGN_IN: 'Logga in', SIGN_OUT: 'Logga ut', @@ -50,8 +49,6 @@ const sv: Translation = { SETTINGS: 'Inställningar', UPDATED_OF: '{0} Uppdaterad', UPDATE_OF: '{0} Uppdatera', - REMOVED_OF: '{0} Raderad', - DELETION_OF: '{0} Radering', OFFSET: 'Offset', FACTOR: 'Faktor', FREQ: 'Frekvens', @@ -64,17 +61,14 @@ const sv: Translation = { TEMP_SENSORS: 'Temperatursensorer', WRITE_CMD_SENT: 'Skrivkommandon skickade', EMS_BUS_WARNING: 'EMS-buss nedkopplad. Om denna varning kvarstår efter några sekunder, kontrollera inställningar och enhets-profil.', - EMS_BUS_SCANNING: 'Söker efter EMS-enheter...', CONNECTED: 'Ansluten', TX_ISSUES: 'Sändfel - Prova ett annat TX-läge', DISCONNECTED: 'Nedkopplad', - EMS_SCAN: 'Är du säker på att du vill starta en full genomsökning av EMS-bussen?', DATA_TRAFFIC: 'Datatrafik', EMS_DEVICE: 'EMS enhet', SUCCESS: 'Lyckades', FAIL: 'Misslyckades', QUALITY: 'Kvalitet', - SCAN: 'Sök', STATUS_NAMES: [ 'EMS-telegram (Rx)', 'EMS-läsningar (Tx)', @@ -125,7 +119,6 @@ const sv: Translation = { ENUM_FORMAT: 'Enum-format API/MQTT', INDEX: 'Index', ENABLE_PARASITE: 'Aktivera 1-wire parasitström', - LOGGING: 'Loggning', LOG_HEX: 'Logga EMS-telegram i hexadecimalformat', ENABLE_SYSLOG: 'Aktivera Syslog', LOG_LEVEL: 'Loggnivå', @@ -170,7 +163,6 @@ const sv: Translation = { CLOSE: 'Stäng', USE: 'Använd', FACTORY_RESET: 'Fabriksåterställning', - SYSTEM_FACTORY_TEXT: 'Enheten har blivit fabriksåterställd och startar nu om', SYSTEM_FACTORY_TEXT_DIALOG: 'Är du säker på att du vill fabriksåterställa enheten?', AVAILABLE_VERSION: 'Senaste tillgängliga versioner', STABLE: 'Stabil', @@ -255,9 +247,7 @@ const sv: Translation = { NETWORK_SCAN: 'Sök efter WiFi-nätverk', IDLE: 'Vilande', LOST: 'Förlorad', - SCANNING: 'Söker', SCAN_AGAIN: 'Sök igen', - NETWORK_SCANNER: 'Hittade nätverk', NETWORK_NO_WIFI: 'Inga WiFi-nätverk hittades', NETWORK_BLANK_BSSID: 'lämna blankt för att bara använda SSID', TX_POWER: 'Tx effekt', @@ -292,9 +282,6 @@ const sv: Translation = { ONCHANGE: 'Vid förändring', CONDITION: 'Villkor', SCHEDULE_UPDATED: 'Schema uppdaterat', - SCHEDULE_TIMER_1: 'vid uppstart', - SCHEDULE_TIMER_2: 'varje minut', - SCHEDULE_TIMER_3: 'varje timme', CUSTOM_ENTITIES: 'Anpassade entiteter', ENTITIES_HELP_1: 'Hämta anpassade entiteter från EMS bussen', ENTITIES_UPDATED: 'Entiteter uppdaterade', @@ -310,9 +297,7 @@ const sv: Translation = { ACTIVELOW: 'Aktivt låg', UNCHANGED: 'Oändrad', ALWAYS: 'Alltid', - ACTIVITY: 'Aktivitet', CONFIGURE: 'Konfigurera {0}', - SYSTEM_MEMORY: 'Systemminne', APPLICATION_SETTINGS_1: 'Ändra EMS-ESP Applikationsinställningar', SECURITY_1: 'Lägg till eller ta bort användare', DOWNLOAD_UPLOAD_1: 'Ladda ner eller ladda upp inställningar och firmware', @@ -324,7 +309,6 @@ const sv: Translation = { RENAME: 'Byt namn', ENABLE_MODBUS: 'Aktivera Modbus', VIEW_LOG: 'Titta i loggen för att felsöka problem', - UPLOAD_DRAG: 'dra och släpp en fil här eller klicka för att välja en', SERVICES: 'Tjänster', ALLVALUES: 'Alla värden', SPECIAL_FUNCTIONS: 'Specialfunktioner', @@ -352,7 +336,6 @@ const sv: Translation = { RELEASE_TYPE: 'Utgivelsestyp', SWITCH_RELEASE_TYPE: 'Byt till {0} utgåva', FIRMWARE_VERSION_INFO: 'Information om firmwareversion', - NO_DATA: 'Ingen data', USER_PROFILE: 'Användarprofil', STORED_VERSIONS: 'Lagrad versioner', ONLINE_HELP: 'online hjälp', @@ -363,7 +346,6 @@ const sv: Translation = { TEST_EMAIL_SUCCESSFUL: 'Test email skickad lyckades', SYSTEM_NAME: 'Systemnamn', COMMANDS: 'Kommandon', - COMMANDS_UPDATED: 'Kommandon uppdaterade', COMMANDS_HELP_1: 'Definiera egna kommandon för EMS-Magistral', COMMAND_SENT: 'Kommando skickat', RUN: 'Kör kommando', diff --git a/interface/src/i18n/tr/index.ts b/interface/src/i18n/tr/index.ts index 5fd35d1c2..c4164416a 100644 --- a/interface/src/i18n/tr/index.ts +++ b/interface/src/i18n/tr/index.ts @@ -3,7 +3,6 @@ import type { Translation } from '../i18n-types'; const tr: Translation = { LANGUAGE: 'Dil', RETRY: 'Tekrar Dene', - LOADING: 'Yükleniyor', IS_REQUIRED: '{0} gerekiyor', SIGN_IN: 'Giriş Yap', SIGN_OUT: 'Çıkış Yap', @@ -50,8 +49,6 @@ const tr: Translation = { SETTINGS: 'Ayarlar', UPDATED_OF: '{0} Güncellendi', UPDATE_OF: '{0} Güncelleme', - REMOVED_OF: '{0} Kaldırıldı', - DELETION_OF: '{0} Silindi', OFFSET: 'Fark', FACTOR: 'Etmen', FREQ: 'Frekans', @@ -64,17 +61,14 @@ const tr: Translation = { TEMP_SENSORS: 'Sıcaklık Sensörleri', WRITE_CMD_SENT: 'Yazma komutu gönderildi', EMS_BUS_WARNING: 'EMS hat bağlantısı kesildi. Eğer bu uyarı birkaç saniye sonra devam ediyorsa lütfen ayarları ve kart tipini kontrol edin', - EMS_BUS_SCANNING: 'EMS cihazları aranıyor...', CONNECTED: 'Bağlandı', TX_ISSUES: 'Tx sorunu - başka bir Tx Modu deneyin', DISCONNECTED: 'Bağlantı kesildi', - EMS_SCAN: 'EMS Hattında tam bir cihaz taraması başlatmak istediğinizden emin misiniz?', DATA_TRAFFIC: 'Veri trafiği', EMS_DEVICE: 'EMS Cihazı', SUCCESS: 'BAŞARILI', FAIL: 'HATA', QUALITY: 'KALİTE', - SCAN: 'Tara', STATUS_NAMES: [ 'EMS Telegramlar Alındı (Rx)', 'EMS Okuması (Tx)', @@ -125,7 +119,6 @@ const tr: Translation = { ENUM_FORMAT: 'Enum Biçimleme API/MQTT', INDEX: 'İndeks', ENABLE_PARASITE: '1-wire parazit gücü devreye al', - LOGGING: 'Kayıt ediliyor', LOG_HEX: 'EMS telegramlarını hexadecimal olarak kayıt et', ENABLE_SYSLOG: 'Sistem Kaydını Devreye Al', LOG_LEVEL: 'Kayıt Seviyesi', @@ -170,7 +163,6 @@ const tr: Translation = { CLOSE: 'Kapat', USE: 'KUllan', FACTORY_RESET: 'Fabrika ayarına dönme', - SYSTEM_FACTORY_TEXT: 'Cihaz fabrika ayarlarına döndü ve şimdi yendiden başlatılacak', SYSTEM_FACTORY_TEXT_DIALOG: 'Cihazı fabrika ayarlarına döndürmek istediğinize emin misiniz?', AVAILABLE_VERSION: 'En son kullanılabilir sürümler', STABLE: 'Kararlı', @@ -255,9 +247,7 @@ const tr: Translation = { NETWORK_SCAN: 'Kablosuz Ağları Tara', IDLE: 'Serbest', LOST: 'Kayıp', - SCANNING: 'Tarıyor', SCAN_AGAIN: 'Tekrar tara', - NETWORK_SCANNER: 'Ağ Tarayıcısı', NETWORK_NO_WIFI: 'Hiçbir Kablosuz Ağ bulunamadı', NETWORK_BLANK_BSSID: 'sadece SSID kullanmak için boş bırakın', TX_POWER: 'Aktarım gücü', @@ -292,9 +282,6 @@ const tr: Translation = { ONCHANGE: 'Değişimde', CONDITION: 'Durum', SCHEDULE_UPDATED: 'Zamanlama güncellendi', - SCHEDULE_TIMER_1: 'Başlangıçta', - SCHEDULE_TIMER_2: 'her dakikada', - SCHEDULE_TIMER_3: 'her saatte', CUSTOM_ENTITIES: 'Özel Varlıklar', ENTITIES_HELP_1: 'Özel varlıkları EMS hattından alın', ENTITIES_UPDATED: 'Varlıklar güncellendi', @@ -310,9 +297,7 @@ const tr: Translation = { ACTIVELOW: 'Aktif Düşük', UNCHANGED: 'Değiştirilmedi', ALWAYS: 'Her zaman', - ACTIVITY: 'Faaliyet', CONFIGURE: 'Yapılandır {0}', - SYSTEM_MEMORY: 'Sistem Belleği', APPLICATION_SETTINGS_1: 'EMS-ESP Uygulama Ayarlarını Değiştir', SECURITY_1: 'Kullanıcıları ekle veya kaldır', DOWNLOAD_UPLOAD_1: 'Ayarları ve firmware dosyasını indir ve yükle', @@ -324,7 +309,6 @@ const tr: Translation = { RENAME: 'Yeniden Adlandır', ENABLE_MODBUS: 'Modbus\'ı etkinleştir', VIEW_LOG: 'Sorunu tanımlamak için günlüğü görüntüleyin', - UPLOAD_DRAG: 'Bir dosya buraya sürükleyip bırakın veya seçmek için tıklayın', SERVICES: 'Hizmetler', ALLVALUES: 'Tüm Değerler', SPECIAL_FUNCTIONS: 'Özel Fonksiyonlar', @@ -352,7 +336,6 @@ const tr: Translation = { RELEASE_TYPE: 'Sürüm Tipi', SWITCH_RELEASE_TYPE: '{0} sürümüne geç', FIRMWARE_VERSION_INFO: 'Firmware Sürüm Bilgisi', - NO_DATA: 'Hiçbir veri yok', USER_PROFILE: 'Kullanıcı Profili', STORED_VERSIONS: 'Kaydedilmiş Sürümler', ONLINE_HELP: 'online yardım', @@ -363,7 +346,6 @@ const tr: Translation = { TEST_EMAIL_SUCCESSFUL: 'Test email başarıyla gönderildi', SYSTEM_NAME: 'Sistem Adı', COMMANDS: 'Komutlar', - COMMANDS_UPDATED: 'Komutlar güncellendi', COMMANDS_HELP_1: 'Özel komutları EMS hattına tanımlayın', COMMAND_SENT: 'Komut gönderildi', RUN: 'Komutu çalıştır', From 015da730bf51d4c6f9636fbc30a38913afc386b1 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 23 Aug 2026 13:01:49 +0200 Subject: [PATCH 22/31] move factory reset button to the left --- interface/src/app/settings/Version.tsx | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/interface/src/app/settings/Version.tsx b/interface/src/app/settings/Version.tsx index c21c9eff6..4531ed2b1 100644 --- a/interface/src/app/settings/Version.tsx +++ b/interface/src/app/settings/Version.tsx @@ -911,20 +911,13 @@ const Version = () => { sx={{ mt: 2, display: 'flex', - justifyContent: 'flex-end', + justifyContent: 'space-between', + alignItems: 'center', flexWrap: 'nowrap', whiteSpace: 'nowrap', gap: 1 }} > - {!data.disable_reset && ( )} + )} From 5aed5961401f7dd8d55b7ff294e306931ca9870a Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 23 Aug 2026 22:18:42 +0200 Subject: [PATCH 23/31] RESTART button is green --- interface/src/app/settings/Version.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/app/settings/Version.tsx b/interface/src/app/settings/Version.tsx index 4531ed2b1..464bfd818 100644 --- a/interface/src/app/settings/Version.tsx +++ b/interface/src/app/settings/Version.tsx @@ -900,7 +900,7 @@ const Version = () => { startIcon={} variant="outlined" onClick={doRestart} - color="error" + color="success" > {LL.RESTART()} From badd8f2241e6aa3aa1195bcfda2e956ae2cf72e0 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 23 Aug 2026 22:18:51 +0200 Subject: [PATCH 24/31] pkg update --- interface/package.json | 2 +- mock-api/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/package.json b/interface/package.json index fddd449fc..91e3f5afd 100644 --- a/interface/package.json +++ b/interface/package.json @@ -58,5 +58,5 @@ "vite": "^8.2.2", "vite-plugin-imagemin": "^0.6.1" }, - "packageManager": "pnpm@11.22.0+sha512.1ff870c4c6133dfd88fb2afc46dd13d47f09c9794b438c6fdb47ca98caf3bc16381ee0be93a091b8e3824cf01f889f46d7d9e20910fb0be1ab0fb5baa80dd621" + "packageManager": "pnpm@11.23.0+sha512.f00082e5b283a199b74e079da28d155c008fe232f44c8a06ea7ddfa014ecf719fc362f790ecc67b28106ddac2afb24c49a9a079159da560b2ce7d1e98efd11af" } diff --git a/mock-api/package.json b/mock-api/package.json index 402ca22aa..987616c42 100644 --- a/mock-api/package.json +++ b/mock-api/package.json @@ -18,5 +18,5 @@ "@trivago/prettier-plugin-sort-imports": "^6.0.2", "prettier": "^3.9.6" }, - "packageManager": "pnpm@11.22.0+sha512.1ff870c4c6133dfd88fb2afc46dd13d47f09c9794b438c6fdb47ca98caf3bc16381ee0be93a091b8e3824cf01f889f46d7d9e20910fb0be1ab0fb5baa80dd621" + "packageManager": "pnpm@11.23.0+sha512.f00082e5b283a199b74e079da28d155c008fe232f44c8a06ea7ddfa014ecf719fc362f790ecc67b28106ddac2afb24c49a9a079159da560b2ce7d1e98efd11af" } From bcb47912c0234e1029938f729c74fabdadb90019 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 23 Aug 2026 22:19:09 +0200 Subject: [PATCH 25/31] refactor mqtt disconnect reason --- src/core/mqtt.cpp | 44 +++++++++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/src/core/mqtt.cpp b/src/core/mqtt.cpp index defc7f7d6..c58952318 100644 --- a/src/core/mqtt.cpp +++ b/src/core/mqtt.cpp @@ -472,25 +472,39 @@ bool Mqtt::get_publish_onchange(uint8_t device_type) { } return false; } + +// human-readable cause for a MQTT disconnect reason, nullptr if not recognized +static const char * mqtt_disconnect_cause(espMqttClientTypes::DisconnectReason reason) { + using espMqttClientTypes::DisconnectReason; + + switch (reason) { + case DisconnectReason::TCP_DISCONNECTED: + return "TCP"; + case DisconnectReason::MQTT_UNACCEPTABLE_PROTOCOL_VERSION: + return "Unaccepted protocol version"; + case DisconnectReason::MQTT_IDENTIFIER_REJECTED: + return "Identifier Rejected"; + case DisconnectReason::MQTT_SERVER_UNAVAILABLE: + return "Server unavailable"; + case DisconnectReason::MQTT_MALFORMED_CREDENTIALS: + return "Malformed credentials"; + case DisconnectReason::MQTT_NOT_AUTHORIZED: + return "Not authorized"; + case DisconnectReason::TLS_BAD_FINGERPRINT: + return "Server fingerprint invalid"; + default: + return nullptr; + } +} + void Mqtt::on_disconnect(espMqttClientTypes::DisconnectReason reason) { connected_ = false; - if (reason == espMqttClientTypes::DisconnectReason::TCP_DISCONNECTED) { - LOG_ERROR("MQTT connection failure: TCP"); - } else if (reason == espMqttClientTypes::DisconnectReason::MQTT_UNACCEPTABLE_PROTOCOL_VERSION) { - LOG_ERROR("MQTT connection failure: Unaccepted protocol version"); - } else if (reason == espMqttClientTypes::DisconnectReason::MQTT_IDENTIFIER_REJECTED) { - LOG_ERROR("MQTT connection failure: Identifier Rejected"); - } else if (reason == espMqttClientTypes::DisconnectReason::MQTT_SERVER_UNAVAILABLE) { - LOG_ERROR("MQTT connection failure: Server unavailable"); - } else if (reason == espMqttClientTypes::DisconnectReason::MQTT_MALFORMED_CREDENTIALS) { - LOG_ERROR("MQTT connection failure: Malformed credentials"); - } else if (reason == espMqttClientTypes::DisconnectReason::MQTT_NOT_AUTHORIZED) { - LOG_ERROR("MQTT connection failure: Not authorized"); - } else if (reason == espMqttClientTypes::DisconnectReason::TLS_BAD_FINGERPRINT) { - LOG_ERROR("MQTT connection failure: Server fingerprint invalid"); + const char * cause = mqtt_disconnect_cause(reason); + if (cause) { + LOG_ERROR("MQTT connection failure: %s. Retrying...", cause); } else { - LOG_ERROR("MQTT connection failure: code %d", reason); + LOG_ERROR("MQTT connection failure: code %d. Retrying...", static_cast(reason)); } mqttClient_->clearQueue(true); From 97af64c53bbec55b2c42f4d83957c7ade1d363b9 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 23 Aug 2026 22:19:16 +0200 Subject: [PATCH 26/31] text change --- 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 2debad3be..a4e595dd3 100644 --- a/src/core/system.cpp +++ b/src/core/system.cpp @@ -2922,7 +2922,7 @@ bool System::command_restart(const char * value, const int8_t id) { return true; } - LOG_INFO("Restarting system immediately"); + LOG_INFO("Restarting system..."); // restart will be handled by the main loop EMSESP::system_.systemStatus(SYSTEM_STATUS::SYSTEM_STATUS_RESTART_REQUESTED); return true; From cdade5f9999e194d7179c2e7e2bde11a90e03812 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 23 Aug 2026 22:19:58 +0200 Subject: [PATCH 27/31] show 'Starting MQTT Service' only once, and connection failure errors after --- src/ESP32React/MqttSettingsService.cpp | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/ESP32React/MqttSettingsService.cpp b/src/ESP32React/MqttSettingsService.cpp index 008934bd5..fdd6b51c6 100644 --- a/src/ESP32React/MqttSettingsService.cpp +++ b/src/ESP32React/MqttSettingsService.cpp @@ -41,6 +41,7 @@ void MqttSettingsService::startClient() { delete _mqttClient; _mqttClient = nullptr; } + if (_state.enableTLS) { isSecure = true; if (emsesp::EMSESP::system_.PSram() == 0) { @@ -82,7 +83,10 @@ void MqttSettingsService::loop() { _mqttClient->disconnect(true); } if (_reconfigureMqtt || (_disconnectedAt && static_cast(uuid::get_uptime() - _disconnectedAt) >= MQTT_RECONNECTION_DELAY)) { - // reconfigure MQTT client + // configure MQTT client + if (_reconfigureMqtt) { + emsesp::EMSESP::logger().info("Starting MQTT service"); + } _disconnectedAt = configureMqtt() ? 0 : uuid::get_uptime(); _reconfigureMqtt = false; } @@ -186,11 +190,7 @@ bool MqttSettingsService::configureMqtt() { static_cast(_mqttClient)->setKeepAlive(_state.keepAlive); static_cast(_mqttClient)->setCleanSession(_state.cleanSession); static_cast(_mqttClient)->setWill(will_topic, 1, true, "offline"); // QOS 1, retain - if (_mqttClient->connect()) { - emsesp::EMSESP::logger().info("Starting MQTT service"); - return true; - } - return false; + return (_mqttClient->connect()); } static_cast(_mqttClient)->setServer(_state.host.c_str(), _state.port); if (_state.username.length() > 0) { @@ -200,10 +200,7 @@ bool MqttSettingsService::configureMqtt() { static_cast(_mqttClient)->setKeepAlive(_state.keepAlive); static_cast(_mqttClient)->setCleanSession(_state.cleanSession); static_cast(_mqttClient)->setWill(will_topic, 1, true, "offline"); // QOS 1, retain - if (_mqttClient->connect()) { - emsesp::EMSESP::logger().info("Starting MQTT service"); - return true; - } + return (_mqttClient->connect()); } return false; From 69b6af406941c490f001a4e9d38276a61247d13e Mon Sep 17 00:00:00 2001 From: proddy Date: Tue, 25 Aug 2026 18:26:06 +0200 Subject: [PATCH 28/31] pkg update --- interface/package.json | 4 ++-- interface/pnpm-lock.yaml | 38 +++++++++++++++++++------------------- mock-api/package.json | 2 +- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/interface/package.json b/interface/package.json index 91e3f5afd..c9742f664 100644 --- a/interface/package.json +++ b/interface/package.json @@ -44,7 +44,7 @@ "@trivago/prettier-plugin-sort-imports": "^6.0.2", "@types/node": "^26.2.0", "@types/react": "^19.2.18", - "@types/react-dom": "^19.2.4", + "@types/react-dom": "^19.2.5", "concurrently": "^10.0.5", "eslint": "^10.9.0", "eslint-config-prettier": "^10.1.8", @@ -58,5 +58,5 @@ "vite": "^8.2.2", "vite-plugin-imagemin": "^0.6.1" }, - "packageManager": "pnpm@11.23.0+sha512.f00082e5b283a199b74e079da28d155c008fe232f44c8a06ea7ddfa014ecf719fc362f790ecc67b28106ddac2afb24c49a9a079159da560b2ce7d1e98efd11af" + "packageManager": "pnpm@11.24.0+sha512.bd27e345e976dcb0be0b7a1228217b049a817e21b1f355c90dbe7dc46671895a8bc1e6d06c24554505ea93ea0b45f489a27ec1bfbc8de6a9659fca0f16fa0000" } diff --git a/interface/pnpm-lock.yaml b/interface/pnpm-lock.yaml index ab3dd13dc..9b8a4423f 100644 --- a/interface/pnpm-lock.yaml +++ b/interface/pnpm-lock.yaml @@ -67,8 +67,8 @@ importers: specifier: ^19.2.18 version: 19.2.18 '@types/react-dom': - specifier: ^19.2.4 - version: 19.2.4(@types/react@19.2.18) + specifier: ^19.2.5 + version: 19.2.5(@types/react@19.2.18) concurrently: specifier: ^10.0.5 version: 10.0.5 @@ -677,8 +677,8 @@ packages: '@types/prop-types@15.7.15': resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} - '@types/react-dom@19.2.4': - resolution: {integrity: sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==} + '@types/react-dom@19.2.5': + resolution: {integrity: sha512-fMPwH9v7r/pp43yUd2/Mbiex5KouJwwR3dzHkhLREUC6764VyDsqxhAxv6OFEYR1RhjOyD1naqba8ECDBe7ZQg==} peerDependencies: '@types/react': ^19.2.0 @@ -2313,8 +2313,8 @@ packages: resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} - picomatch@4.0.5: - resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} engines: {node: '>=12'} pify@2.3.0: @@ -2733,8 +2733,8 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - svgo@2.8.3: - resolution: {integrity: sha512-5EZD0pafXX6PphdwOGCiVLDSaV1xyuQao2blHajHLsPxr07q4mmEjdtXEWgG07ae2mIz8Ex2CDXNCTiXhy3Khw==} + svgo@2.8.4: + resolution: {integrity: sha512-2GJ4h3rl13qYTdwllaK6QlL8tG+UrM8626V2Ylcd/yBUv2Y/EwLsYisVV6UDCRmlk+C74G8nMpxJCk0RWPdDCw==} engines: {node: '>=10.13.0'} hasBin: true @@ -3489,7 +3489,7 @@ snapshots: dependencies: '@types/estree': 1.0.9 estree-walker: 2.0.2 - picomatch: 4.0.5 + picomatch: 4.0.7 '@sindresorhus/is@0.7.0': {} @@ -3576,7 +3576,7 @@ snapshots: '@types/prop-types@15.7.15': {} - '@types/react-dom@19.2.4(@types/react@19.2.18)': + '@types/react-dom@19.2.5(@types/react@19.2.18)': dependencies: '@types/react': 19.2.18 @@ -4444,9 +4444,9 @@ snapshots: dependencies: pend: 1.2.0 - fdir@6.5.0(picomatch@4.0.5): + fdir@6.5.0(picomatch@4.0.7): optionalDependencies: - picomatch: 4.0.5 + picomatch: 4.0.7 figures@1.7.0: dependencies: @@ -4744,7 +4744,7 @@ snapshots: imagemin-svgo@9.0.0: dependencies: is-svg: 4.4.0 - svgo: 2.8.3 + svgo: 2.8.4 imagemin-webp@6.1.0: dependencies: @@ -5267,7 +5267,7 @@ snapshots: picomatch@2.3.2: {} - picomatch@4.0.5: {} + picomatch@4.0.7: {} pify@2.3.0: {} @@ -5456,7 +5456,7 @@ snapshots: rollup-plugin-visualizer@7.1.1(rolldown@1.2.5): dependencies: open: 11.0.1 - picomatch: 4.0.5 + picomatch: 4.0.7 source-map: 0.8.0 yargs: 18.1.0 optionalDependencies: @@ -5637,7 +5637,7 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svgo@2.8.3: + svgo@2.8.4: dependencies: commander: 7.2.0 css-select: 4.3.0 @@ -5677,8 +5677,8 @@ snapshots: tinyglobby@0.2.17: dependencies: - fdir: 6.5.0(picomatch@4.0.5) - picomatch: 4.0.5 + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 to-buffer@1.2.2: dependencies: @@ -5817,7 +5817,7 @@ snapshots: vite@8.2.2(@types/node@26.2.0)(terser@5.50.0): dependencies: lightningcss: 1.33.0 - picomatch: 4.0.5 + picomatch: 4.0.7 postcss: 8.5.26 rolldown: 1.2.5 tinyglobby: 0.2.17 diff --git a/mock-api/package.json b/mock-api/package.json index 987616c42..66cc57780 100644 --- a/mock-api/package.json +++ b/mock-api/package.json @@ -18,5 +18,5 @@ "@trivago/prettier-plugin-sort-imports": "^6.0.2", "prettier": "^3.9.6" }, - "packageManager": "pnpm@11.23.0+sha512.f00082e5b283a199b74e079da28d155c008fe232f44c8a06ea7ddfa014ecf719fc362f790ecc67b28106ddac2afb24c49a9a079159da560b2ce7d1e98efd11af" + "packageManager": "pnpm@11.24.0+sha512.bd27e345e976dcb0be0b7a1228217b049a817e21b1f355c90dbe7dc46671895a8bc1e6d06c24554505ea93ea0b45f489a27ec1bfbc8de6a9659fca0f16fa0000" } From 5fcd9bfd2deaaf6a83050e56c38cdc77602ed587 Mon Sep 17 00:00:00 2001 From: proddy Date: Tue, 25 Aug 2026 18:26:33 +0200 Subject: [PATCH 29/31] 3.9.0-dev.5 --- CHANGELOG_LATEST.md | 1 + src/emsesp_version.h | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index f4bdff292..41ca8ec4e 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -34,4 +34,5 @@ This release is based on the latest Espressif/Arduino core version 3. It brings - remove devices without entities not listed in 0x07 telegram - changes to the Dialogs in Dashboard page, removed the run icon in the Commands page. Renamed Execute to Run. - set `None` for undefined values in HA `val_tpl` +- changes in WebUI - remove multiple calls systemInfo endpoint, Vewrsion pages checks for internet connection [#3195](https://github.com/emsesp/EMS-ESP32/pull/3195) diff --git a/src/emsesp_version.h b/src/emsesp_version.h index 929ebedf7..19dbf2a47 100644 --- a/src/emsesp_version.h +++ b/src/emsesp_version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.9.0-dev.4" +#define EMSESP_APP_VERSION "3.9.0-dev.5" From be224265f912370597932f3fd5a775a35427ba5e Mon Sep 17 00:00:00 2001 From: proddy Date: Tue, 25 Aug 2026 18:59:25 +0200 Subject: [PATCH 30/31] show mqtt disconnect once --- src/ESP32React/MqttSettingsService.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/ESP32React/MqttSettingsService.cpp b/src/ESP32React/MqttSettingsService.cpp index fdd6b51c6..5b369d987 100644 --- a/src/ESP32React/MqttSettingsService.cpp +++ b/src/ESP32React/MqttSettingsService.cpp @@ -7,7 +7,7 @@ MqttSettingsService::MqttSettingsService(AsyncWebServer * server, FS * fs, Secur , _fsPersistence(MqttSettings::read, MqttSettings::update, this, fs, MQTT_SETTINGS_FILE) , _reconfigureMqtt(false) , _disconnectedAt(0) - , _disconnectReason(espMqttClientTypes::DisconnectReason::TCP_DISCONNECTED) + , _disconnectReason(espMqttClientTypes::DisconnectReason::USER_OK) , _mqttClient(nullptr) { addUpdateHandler([this] { onConfigUpdated(); }, false); } @@ -133,11 +133,14 @@ void MqttSettingsService::onMqttConnect(bool sessionPresent) { } void MqttSettingsService::onMqttDisconnect(espMqttClientTypes::DisconnectReason reason) { - _disconnectReason = reason; + if (reason != _disconnectReason) { + emsesp::EMSESP::mqtt_.on_disconnect(reason); + _disconnectReason = reason; + } + if (!_disconnectedAt) { _disconnectedAt = uuid::get_uptime(); } - emsesp::EMSESP::mqtt_.on_disconnect(reason); } void MqttSettingsService::onConfigUpdated() { From fe972db8c5fd5f576720386cf29407bc0d05e38f Mon Sep 17 00:00:00 2001 From: proddy Date: Tue, 25 Aug 2026 21:28:06 +0200 Subject: [PATCH 31/31] pkg update --- interface/package.json | 4 +- interface/pnpm-lock.yaml | 168 +++++++++++++++++++-------------------- 2 files changed, 86 insertions(+), 86 deletions(-) diff --git a/interface/package.json b/interface/package.json index c9742f664..c9ee5fffb 100644 --- a/interface/package.json +++ b/interface/package.json @@ -46,7 +46,7 @@ "@types/react": "^19.2.18", "@types/react-dom": "^19.2.5", "concurrently": "^10.0.5", - "eslint": "^10.9.0", + "eslint": "^10.9.1", "eslint-config-prettier": "^10.1.8", "etag": "^1.8.1", "mime-types": "^3.0.2", @@ -54,7 +54,7 @@ "rollup-plugin-visualizer": "^7.1.1", "terser": "^5.50.0", "typescript": "^6.0.3", - "typescript-eslint": "^8.67.0", + "typescript-eslint": "^8.68.0", "vite": "^8.2.2", "vite-plugin-imagemin": "^0.6.1" }, diff --git a/interface/pnpm-lock.yaml b/interface/pnpm-lock.yaml index 9b8a4423f..5c4fcccab 100644 --- a/interface/pnpm-lock.yaml +++ b/interface/pnpm-lock.yaml @@ -53,7 +53,7 @@ importers: devDependencies: '@eslint/js': specifier: ^10.0.1 - version: 10.0.1(eslint@10.9.0(supports-color@10.2.2)) + version: 10.0.1(eslint@10.9.1(supports-color@10.2.2)) '@preact/preset-vite': specifier: ^2.10.6 version: 2.10.6(@babel/core@7.29.7(supports-color@10.2.2))(preact@10.29.8)(supports-color@10.2.2)(vite@8.2.2(@types/node@26.2.0)(terser@5.50.0)) @@ -73,11 +73,11 @@ importers: specifier: ^10.0.5 version: 10.0.5 eslint: - specifier: ^10.9.0 - version: 10.9.0(supports-color@10.2.2) + specifier: ^10.9.1 + version: 10.9.1(supports-color@10.2.2) eslint-config-prettier: specifier: ^10.1.8 - version: 10.1.8(eslint@10.9.0(supports-color@10.2.2)) + version: 10.1.8(eslint@10.9.1(supports-color@10.2.2)) etag: specifier: ^1.8.1 version: 1.8.1 @@ -97,8 +97,8 @@ importers: specifier: ^6.0.3 version: 6.0.3 typescript-eslint: - specifier: ^8.67.0 - version: 8.67.0(eslint@10.9.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) + specifier: ^8.68.0 + version: 8.68.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) vite: specifier: ^8.2.2 version: 8.2.2(@types/node@26.2.0)(terser@5.50.0) @@ -696,63 +696,63 @@ packages: '@types/svgo@2.6.4': resolution: {integrity: sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==} - '@typescript-eslint/eslint-plugin@8.67.0': - resolution: {integrity: sha512-Un7Heoyj65NREbKAyIrFxeM143NZpExWmy1Nep4DLeQOeLlTeumPjoNKnBrU5D5moWXbPJgRa5Uwcdu0faVNGQ==} + '@typescript-eslint/eslint-plugin@8.68.0': + resolution: {integrity: sha512-WASHDpCm6qO5jj9g1a+8NiW5+GCkAyLReR56/4VruYmNgfUmqpxOfZ2Yfb8xGfJPWv5Qi6LSD8sXdces3vbp/Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.67.0 + '@typescript-eslint/parser': ^8.68.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.67.0': - resolution: {integrity: sha512-fUBfTuuEulWqX6V8+O3PtScV01tzYYRUDTAirHFKoRAt7nOzoGiPt0M/bB47wWNy0coOOcgEwAMUtBpykMxl6w==} + '@typescript-eslint/parser@8.68.0': + resolution: {integrity: sha512-fHq2VC1kpyYfvEcbiMjOpySY4WS7voEp89yAThrHRX5sm9j2lzYppCb2umFMEed4fWcyeLjHxrz0mpjNBaBxMQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.67.0': - resolution: {integrity: sha512-cvE8c7ulYeXN9fYuszhCeCsbzyVEXuhrRCybnBre7TUmqb5nRmBfQAwCj0O3WJFDeyAZt4VYv51vMCC9LHSdYw==} + '@typescript-eslint/project-service@8.68.0': + resolution: {integrity: sha512-5GQtWZCXFcFYux955pvoS02WLc49pXNlvIxocKjS0clvwo3in1RdlzVKyiqQH9vE5AKWFLTaUgeQkOrTS+0Qxw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.67.0': - resolution: {integrity: sha512-EgvsleTwS4E+WzzSvem8fAUubLwatMNF1B5hHSLQxcvs7q2dtRhGyujHwLJSYlG41niJ7GP24Aha2+0mb1b2kg==} + '@typescript-eslint/scope-manager@8.68.0': + resolution: {integrity: sha512-T5eXpcaJNg8bhjHJ8Rjp68Vq/QBteYtTKY8TZqVNPaUbuz0f6jI9t6aDkylwvalpAB9XTTFeFOjrjXAZ3YvmVA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.67.0': - resolution: {integrity: sha512-vV+LUSv5njUWsknE71fqKTlXUva+R76SaeORd6Zojcunk/6DvKFXONU3BrAs2H49mbygUXt6gbYunzwqNwlhdg==} + '@typescript-eslint/tsconfig-utils@8.68.0': + resolution: {integrity: sha512-F7zrGQfiJHojPwi8vhxZQC1tWtJzvL74cK/nqri2lk8YUXvYaYwl263xOJ69jDWPUk1hmcdoayFwk9lX09npVw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.67.0': - resolution: {integrity: sha512-aVWDXbRmdXO9siTfX4ditQI1T9+zVcNazT48EJCD0v40/9RIFoUgZ05CmGEq9H2gixRpjUn/iplwvlcvutJW/Q==} + '@typescript-eslint/type-utils@8.68.0': + resolution: {integrity: sha512-X77zqoY1EjeWGs/0JNxeaMfp5C5lIz4Tw8y66F1Ne8Faq6g424sBNYM6xBAqElfGZPLpWS+CZAp0DXyKDzWiHg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.67.0': - resolution: {integrity: sha512-sBtgslww8nsMYUjhdPBiSyUqSzT8uR6g93A2QXnQC8+cGdjz0CyaOdqHDRJb1AtORbZCNUJBBeFA/tNR2uQmww==} + '@typescript-eslint/types@8.68.0': + resolution: {integrity: sha512-9RnpsGJjrAllCMefGVVsImJM24YurhC0Q1h4UbvivtvOqXmR/vEJge2OoE++z9m6hyg8T1Q8t5SNT6tHSbrxcg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.67.0': - resolution: {integrity: sha512-EKQBCE9yNlRJYm7jdTW5AhDacDUmSwQb0FAJAmK2EKYrNXIsa2vxcSZx6PvJ/dEdI6lS+Y9W+EXckLj0iPFGcw==} + '@typescript-eslint/typescript-estree@8.68.0': + resolution: {integrity: sha512-OKKsD0tYmoNiU5PW2zehO1yO56jYOm1ShYlxon/Z0SJNidAkdVg86eg9ruRuoXf8xfnuWZGbwDsStkoXbZtIIA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.67.0': - resolution: {integrity: sha512-U9D1FdwEWBwok3hxxSdhclMb0twvt9QnjIQ0VfQ1AiX2epnpSgv2ubVDsayOFyY8K6FX+AQ7E0FKWVG3iKsj1A==} + '@typescript-eslint/utils@8.68.0': + resolution: {integrity: sha512-PB5gJMMOg0Q5P1tsgWtEAqQacJXq0qEqRHDX/YJ4FaTMLfZPpHB3gjl2EJuiZyPABxmj4ZQYiY9m1bdAJ5y7tQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.67.0': - resolution: {integrity: sha512-fkv8dHRDqfGtTHuJeebdrQ7cX6Ad4WAS00rgHh9UGvMycF1mjBfsxry1XsLIFhWZ6Judlh6UdzK+TYlbpCXgnA==} + '@typescript-eslint/visitor-keys@8.68.0': + resolution: {integrity: sha512-YR65gGdGvTUAWLldC3xLOvOzamdGzB4A5/N8rehEaHs3Zvoe39BhgY+u0SPch1OvrVTfLcc55wsSgK2NcnTS/A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} acorn-jsx@5.3.2: @@ -1347,8 +1347,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.9.0: - resolution: {integrity: sha512-5KeEOJZBfEVA47boFiBsf+6MmmJpffM7qEBg4pLla2e4nlKgdKlqCW0oSLOGsT8Wl5uCGJptLV1bkaiShj90Gw==} + eslint@10.9.1: + resolution: {integrity: sha512-9VaAkDURekixUQJy0oJYl2DcN6oKMfxay7XzaGYAWQwsb6qfKf+x76R2k1L8kb1boc+FyCAaTA9GmiKaaiaF+A==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -2816,8 +2816,8 @@ packages: peerDependencies: typescript: '>=3.5.1' - typescript-eslint@8.67.0: - resolution: {integrity: sha512-S2udFs8tCKEKffuJ4TB1idGUZiXdCPGi3IPBGWXarbLQ5UPXORV8QEVzJ4gCRduURMb5EkpNCdjbk0eDIuI8Yg==} + typescript-eslint@8.68.0: + resolution: {integrity: sha512-MHy0Y0ynqeEbx/S45+i/bBssdy3X6KNBfmJAP35GrgtNxu2TQ5K5xsFDhAnmsq1jvpdoZOPG1LGtJo0HWqYCrQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -3217,9 +3217,9 @@ snapshots: '@esbuild/linux-loong64@0.14.54': optional: true - '@eslint-community/eslint-utils@4.10.1(eslint@10.9.0(supports-color@10.2.2))': + '@eslint-community/eslint-utils@4.10.1(eslint@10.9.1(supports-color@10.2.2))': dependencies: - eslint: 10.9.0(supports-color@10.2.2) + eslint: 10.9.1(supports-color@10.2.2) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -3240,9 +3240,9 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/js@10.0.1(eslint@10.9.0(supports-color@10.2.2))': + '@eslint/js@10.0.1(eslint@10.9.1(supports-color@10.2.2))': optionalDependencies: - eslint: 10.9.0(supports-color@10.2.2) + eslint: 10.9.1(supports-color@10.2.2) '@eslint/object-schema@3.0.5': {} @@ -3596,15 +3596,15 @@ snapshots: dependencies: '@types/node': 26.2.0 - '@typescript-eslint/eslint-plugin@8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.9.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3))(eslint@10.9.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.68.0(@typescript-eslint/parser@8.68.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3))(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.67.0(eslint@10.9.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.67.0 - '@typescript-eslint/type-utils': 8.67.0(eslint@10.9.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) - '@typescript-eslint/utils': 8.67.0(eslint@10.9.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.67.0 - eslint: 10.9.0(supports-color@10.2.2) + '@typescript-eslint/parser': 8.68.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.68.0 + '@typescript-eslint/type-utils': 8.68.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) + '@typescript-eslint/utils': 8.68.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.68.0 + eslint: 10.9.1(supports-color@10.2.2) ignore: 7.0.6 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@6.0.3) @@ -3612,56 +3612,56 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.67.0(eslint@10.9.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)': + '@typescript-eslint/parser@8.68.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)': dependencies: - '@typescript-eslint/scope-manager': 8.67.0 - '@typescript-eslint/types': 8.67.0 - '@typescript-eslint/typescript-estree': 8.67.0(supports-color@10.2.2)(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.67.0 + '@typescript-eslint/scope-manager': 8.68.0 + '@typescript-eslint/types': 8.68.0 + '@typescript-eslint/typescript-estree': 8.68.0(supports-color@10.2.2)(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.68.0 debug: 4.4.3(supports-color@10.2.2) - eslint: 10.9.0(supports-color@10.2.2) + eslint: 10.9.1(supports-color@10.2.2) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.67.0(supports-color@10.2.2)(typescript@6.0.3)': + '@typescript-eslint/project-service@8.68.0(supports-color@10.2.2)(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.67.0(typescript@6.0.3) - '@typescript-eslint/types': 8.67.0 + '@typescript-eslint/tsconfig-utils': 8.68.0(typescript@6.0.3) + '@typescript-eslint/types': 8.68.0 debug: 4.4.3(supports-color@10.2.2) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.67.0': + '@typescript-eslint/scope-manager@8.68.0': dependencies: - '@typescript-eslint/types': 8.67.0 - '@typescript-eslint/visitor-keys': 8.67.0 + '@typescript-eslint/types': 8.68.0 + '@typescript-eslint/visitor-keys': 8.68.0 - '@typescript-eslint/tsconfig-utils@8.67.0(typescript@6.0.3)': + '@typescript-eslint/tsconfig-utils@8.68.0(typescript@6.0.3)': dependencies: typescript: 6.0.3 - '@typescript-eslint/type-utils@8.67.0(eslint@10.9.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.68.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.67.0 - '@typescript-eslint/typescript-estree': 8.67.0(supports-color@10.2.2)(typescript@6.0.3) - '@typescript-eslint/utils': 8.67.0(eslint@10.9.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) + '@typescript-eslint/types': 8.68.0 + '@typescript-eslint/typescript-estree': 8.68.0(supports-color@10.2.2)(typescript@6.0.3) + '@typescript-eslint/utils': 8.68.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) debug: 4.4.3(supports-color@10.2.2) - eslint: 10.9.0(supports-color@10.2.2) + eslint: 10.9.1(supports-color@10.2.2) ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.67.0': {} + '@typescript-eslint/types@8.68.0': {} - '@typescript-eslint/typescript-estree@8.67.0(supports-color@10.2.2)(typescript@6.0.3)': + '@typescript-eslint/typescript-estree@8.68.0(supports-color@10.2.2)(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.67.0(supports-color@10.2.2)(typescript@6.0.3) - '@typescript-eslint/tsconfig-utils': 8.67.0(typescript@6.0.3) - '@typescript-eslint/types': 8.67.0 - '@typescript-eslint/visitor-keys': 8.67.0 + '@typescript-eslint/project-service': 8.68.0(supports-color@10.2.2)(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.68.0(typescript@6.0.3) + '@typescript-eslint/types': 8.68.0 + '@typescript-eslint/visitor-keys': 8.68.0 debug: 4.4.3(supports-color@10.2.2) minimatch: 10.2.6 semver: 7.8.5 @@ -3671,20 +3671,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.67.0(eslint@10.9.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)': + '@typescript-eslint/utils@8.68.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)': dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.9.0(supports-color@10.2.2)) - '@typescript-eslint/scope-manager': 8.67.0 - '@typescript-eslint/types': 8.67.0 - '@typescript-eslint/typescript-estree': 8.67.0(supports-color@10.2.2)(typescript@6.0.3) - eslint: 10.9.0(supports-color@10.2.2) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.9.1(supports-color@10.2.2)) + '@typescript-eslint/scope-manager': 8.68.0 + '@typescript-eslint/types': 8.68.0 + '@typescript-eslint/typescript-estree': 8.68.0(supports-color@10.2.2)(typescript@6.0.3) + eslint: 10.9.1(supports-color@10.2.2) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.67.0': + '@typescript-eslint/visitor-keys@8.68.0': dependencies: - '@typescript-eslint/types': 8.67.0 + '@typescript-eslint/types': 8.68.0 eslint-visitor-keys: 5.0.1 acorn-jsx@5.3.2(acorn@8.18.0): @@ -4281,9 +4281,9 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-prettier@10.1.8(eslint@10.9.0(supports-color@10.2.2)): + eslint-config-prettier@10.1.8(eslint@10.9.1(supports-color@10.2.2)): dependencies: - eslint: 10.9.0(supports-color@10.2.2) + eslint: 10.9.1(supports-color@10.2.2) eslint-scope@9.1.2: dependencies: @@ -4296,9 +4296,9 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.9.0(supports-color@10.2.2): + eslint@10.9.1(supports-color@10.2.2): dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.9.0(supports-color@10.2.2)) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.9.1(supports-color@10.2.2)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.5(supports-color@10.2.2) '@eslint/config-helpers': 0.7.0 @@ -5724,13 +5724,13 @@ snapshots: dependencies: typescript: 6.0.3 - typescript-eslint@8.67.0(eslint@10.9.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3): + typescript-eslint@8.68.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.9.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3))(eslint@10.9.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) - '@typescript-eslint/parser': 8.67.0(eslint@10.9.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) - '@typescript-eslint/typescript-estree': 8.67.0(supports-color@10.2.2)(typescript@6.0.3) - '@typescript-eslint/utils': 8.67.0(eslint@10.9.0(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) - eslint: 10.9.0(supports-color@10.2.2) + '@typescript-eslint/eslint-plugin': 8.68.0(@typescript-eslint/parser@8.68.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3))(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) + '@typescript-eslint/parser': 8.68.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.68.0(supports-color@10.2.2)(typescript@6.0.3) + '@typescript-eslint/utils': 8.68.0(eslint@10.9.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) + eslint: 10.9.1(supports-color@10.2.2) typescript: 6.0.3 transitivePeerDependencies: - supports-color