From e68a3a0d3a24bdf7c61a9cba82957eb2b23c924b Mon Sep 17 00:00:00 2001 From: proddy Date: Mon, 17 Nov 2025 12:23:30 +0100 Subject: [PATCH 1/5] update --- interface/pnpm-lock.yaml | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/interface/pnpm-lock.yaml b/interface/pnpm-lock.yaml index 22cd316b2..4f337eee2 100644 --- a/interface/pnpm-lock.yaml +++ b/interface/pnpm-lock.yaml @@ -1117,8 +1117,8 @@ packages: resolution: {integrity: sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==} engines: {node: '>=0.10.0'} - caniuse-lite@1.0.30001754: - resolution: {integrity: sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==} + caniuse-lite@1.0.30001755: + resolution: {integrity: sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA==} caw@2.0.1: resolution: {integrity: sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==} @@ -1225,8 +1225,8 @@ packages: resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} engines: {node: '>=8.0.0'} - csstype@3.2.1: - resolution: {integrity: sha512-98XGutrXoh75MlgLihlNxAGbUuFQc7l1cqcnEZlLNKc0UrVdPndgmaDmYTDDh929VS/eqTZV0rozmhu2qqT1/g==} + csstype@3.2.2: + resolution: {integrity: sha512-D80T+tiqkd/8B0xNlbstWDG4x6aqVfO52+OlSUNIdkTvmNw0uQpJLeos2J/2XvpyidAFuTPmpad+tUxLndwj6g==} currently-unhandled@0.4.1: resolution: {integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==} @@ -1337,8 +1337,8 @@ packages: duplexer3@0.1.5: resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} - electron-to-chromium@1.5.253: - resolution: {integrity: sha512-O0tpQ/35rrgdiGQ0/OFWhy1itmd9A6TY9uQzlqj3hKSu/aYpe7UIn5d7CU2N9myH6biZiWF3VMZVuup8pw5U9w==} + electron-to-chromium@1.5.254: + resolution: {integrity: sha512-DcUsWpVhv9svsKRxnSCZ86SjD+sp32SGidNB37KpqXJncp1mfUgKbHvBomE89WJDbfVKw1mdv5+ikrvd43r+Bg==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -3290,7 +3290,7 @@ snapshots: '@emotion/memoize': 0.9.0 '@emotion/unitless': 0.10.0 '@emotion/utils': 1.4.2 - csstype: 3.2.1 + csstype: 3.2.2 '@emotion/sheet@1.4.0': {} @@ -3507,7 +3507,7 @@ snapshots: '@popperjs/core': 2.11.8 '@types/react-transition-group': 4.4.12(@types/react@19.2.5) clsx: 2.1.1 - csstype: 3.2.1 + csstype: 3.2.2 prop-types: 15.8.1 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) @@ -3533,7 +3533,7 @@ snapshots: '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 '@emotion/sheet': 1.4.0 - csstype: 3.2.1 + csstype: 3.2.2 prop-types: 15.8.1 react: 19.2.0 optionalDependencies: @@ -3548,7 +3548,7 @@ snapshots: '@mui/types': 7.4.8(@types/react@19.2.5) '@mui/utils': 7.3.5(@types/react@19.2.5)(react@19.2.0) clsx: 2.1.1 - csstype: 3.2.1 + csstype: 3.2.2 prop-types: 15.8.1 react: 19.2.0 optionalDependencies: @@ -3796,7 +3796,7 @@ snapshots: '@types/react@19.2.5': dependencies: - csstype: 3.2.1 + csstype: 3.2.2 '@types/responselike@1.0.3': dependencies: @@ -4021,8 +4021,8 @@ snapshots: browserslist@4.28.0: dependencies: baseline-browser-mapping: 2.8.28 - caniuse-lite: 1.0.30001754 - electron-to-chromium: 1.5.253 + caniuse-lite: 1.0.30001755 + electron-to-chromium: 1.5.254 node-releases: 2.0.27 update-browserslist-db: 1.1.4(browserslist@4.28.0) @@ -4080,7 +4080,7 @@ snapshots: camelcase@2.1.1: {} - caniuse-lite@1.0.30001754: {} + caniuse-lite@1.0.30001755: {} caw@2.0.1: dependencies: @@ -4211,7 +4211,7 @@ snapshots: dependencies: css-tree: 1.1.3 - csstype@3.2.1: {} + csstype@3.2.2: {} currently-unhandled@0.4.1: dependencies: @@ -4294,7 +4294,7 @@ snapshots: dom-helpers@5.2.1: dependencies: '@babel/runtime': 7.28.4 - csstype: 3.2.1 + csstype: 3.2.2 dom-serializer@1.4.1: dependencies: @@ -4367,7 +4367,7 @@ snapshots: duplexer3@0.1.5: {} - electron-to-chromium@1.5.253: {} + electron-to-chromium@1.5.254: {} emoji-regex@8.0.0: {} From e31ebab12b265b19b2c2dcefa9f5858b4d5f6d6e Mon Sep 17 00:00:00 2001 From: proddy Date: Mon, 17 Nov 2025 12:24:58 +0100 Subject: [PATCH 2/5] grey out label if disabled (for system sensors) --- .../src/components/inputs/ValidatedTextField.tsx | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/interface/src/components/inputs/ValidatedTextField.tsx b/interface/src/components/inputs/ValidatedTextField.tsx index ad1b87f37..f29f4525d 100644 --- a/interface/src/components/inputs/ValidatedTextField.tsx +++ b/interface/src/components/inputs/ValidatedTextField.tsx @@ -21,7 +21,16 @@ const ValidatedTextField: FC = ({ return ( <> - + {errors?.map((e) => ( {e.message} From 9669a044ba292bc2eb16c214a5506453f4694449 Mon Sep 17 00:00:00 2001 From: proddy Date: Mon, 17 Nov 2025 12:25:20 +0100 Subject: [PATCH 3/5] comment out log msg --- src/ESP32React/MqttSettingsService.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ESP32React/MqttSettingsService.cpp b/src/ESP32React/MqttSettingsService.cpp index fc1c065a3..7550262cf 100644 --- a/src/ESP32React/MqttSettingsService.cpp +++ b/src/ESP32React/MqttSettingsService.cpp @@ -167,7 +167,7 @@ void MqttSettingsService::WiFiEvent(WiFiEvent_t event) { bool MqttSettingsService::configureMqtt() { // disconnect if already connected if (_mqttClient->connected()) { - emsesp::EMSESP::logger().info("Disconnecting to configure"); + // emsesp::EMSESP::logger().info("Disconnecting to configure"); _mqttClient->disconnect(true); } From 88afd3f453a2e80547ff9a7dcdf3e0b631918d15 Mon Sep 17 00:00:00 2001 From: proddy Date: Mon, 17 Nov 2025 12:25:52 +0100 Subject: [PATCH 4/5] use ValidatedTextField --- .../src/app/main/SensorsAnalogDialog.tsx | 54 ++++++++----------- 1 file changed, 21 insertions(+), 33 deletions(-) diff --git a/interface/src/app/main/SensorsAnalogDialog.tsx b/interface/src/app/main/SensorsAnalogDialog.tsx index 618c92846..c9d99c42c 100644 --- a/interface/src/app/main/SensorsAnalogDialog.tsx +++ b/interface/src/app/main/SensorsAnalogDialog.tsx @@ -14,7 +14,6 @@ import { Grid, InputAdornment, MenuItem, - TextField, Typography } from '@mui/material'; @@ -193,12 +192,11 @@ const SensorsAnalogDialog = ({ label={LL.NAME(0)} value={editItem.n} fullWidth - variant="outlined" onChange={updateFormValue} /> - {analogTypeMenuItems} - + {(isCounterOrRate || isFreqType) && ( - {uomMenuItems} - + )} {editItem.t === AnalogType.ADC && ( - - - - @@ -302,13 +296,12 @@ const SensorsAnalogDialog = ({ )} {isCounterOrRate && ( - - - {LL.OFF()} {LL.ON()} - + - {LL.ACTIVEHIGH()} {LL.ACTIVELOW()} - + - {LL.ALWAYS()} {LL.ON()} - + )} {isPWM && ( <> - - - {LL.ACTIVEHIGH()} {LL.ACTIVELOW()} - + - Date: Mon, 17 Nov 2025 12:26:14 +0100 Subject: [PATCH 5/5] new action resetMQTT, called from MQTT Settings page --- interface/src/app/settings/MqttSettings.tsx | 47 ++++++++++++++++----- mock-api/restServer.ts | 4 ++ src/core/mqtt.cpp | 6 ++- src/web/WebStatusService.cpp | 3 ++ 4 files changed, 49 insertions(+), 11 deletions(-) diff --git a/interface/src/app/settings/MqttSettings.tsx b/interface/src/app/settings/MqttSettings.tsx index eca71a19c..f03d906a0 100644 --- a/interface/src/app/settings/MqttSettings.tsx +++ b/interface/src/app/settings/MqttSettings.tsx @@ -1,8 +1,11 @@ import { useCallback, useMemo, useState } from 'react'; +import { toast } from 'react-toastify'; import CancelIcon from '@mui/icons-material/Cancel'; +import SettingsBackupRestoreIcon from '@mui/icons-material/SettingsBackupRestore'; import WarningIcon from '@mui/icons-material/Warning'; import { + Box, Button, Checkbox, Grid, @@ -30,6 +33,8 @@ import type { MqttSettingsType } from 'types'; import { numberValue, updateValueDirty, useRest } from 'utils'; import { createMqttSettingsValidator, validate } from 'validators'; +import { callAction } from '../../api/app'; + const MqttSettings = () => { const { loadData, @@ -52,6 +57,16 @@ const MqttSettings = () => { const [fieldErrors, setFieldErrors] = useState(); + const sendResetMQTT = useCallback(() => { + void callAction({ action: 'resetMQTT' }) + .then(() => { + toast.success('MQTT ' + LL.REFRESH() + ' successful'); + }) + .catch((error) => { + toast.error(String(error.error?.message || 'An error occurred')); + }); + }, []); + const updateFormValue = useMemo( () => updateValueDirty( @@ -114,16 +129,28 @@ const MqttSettings = () => { {blocker ? : null} <> - - } - label={LL.ENABLE_MQTT()} - /> + + + } + label={LL.ENABLE_MQTT()} + /> + {data.enabled && ( + + )} +