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: {} 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()} - + - { 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 && ( + + )} + = ({ return ( <> - + {errors?.map((e) => ( {e.message} diff --git a/mock-api/restServer.ts b/mock-api/restServer.ts index 360e36275..1268aeb1f 100644 --- a/mock-api/restServer.ts +++ b/mock-api/restServer.ts @@ -5106,6 +5106,10 @@ router // upload URL console.log('upload File from URL', content.param); return status(200); + } else if (action === 'resetMQTT') { + // reset MQTT + console.log('resetting MQTT...'); + return status(200); } } return status(404); // cmd not found 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); } diff --git a/src/core/mqtt.cpp b/src/core/mqtt.cpp index b3afc6a5d..5efe52e2d 100644 --- a/src/core/mqtt.cpp +++ b/src/core/mqtt.cpp @@ -321,8 +321,12 @@ void Mqtt::on_publish(uint16_t packetId) const { LOG_DEBUG("Packet %d sent successful", packetId); } -// called when MQTT settings have changed via the Web forms +// called when MQTT settings have changed via the MQTT Settings or Application Settings Web pages void Mqtt::reset_mqtt() { + if (!enabled()) { + return; + } + if (!mqttClient_) { return; } diff --git a/src/web/WebStatusService.cpp b/src/web/WebStatusService.cpp index a13d99303..16efe4609 100644 --- a/src/web/WebStatusService.cpp +++ b/src/web/WebStatusService.cpp @@ -195,6 +195,9 @@ void WebStatusService::action(AsyncWebServerRequest * request, JsonVariant json) ok = uploadURL(param.c_str()); } else if (action == "systemStatus" && is_admin) { ok = setSystemStatus(param.c_str()); + } else if (action == "resetMQTT" && is_admin) { + emsesp::EMSESP::mqtt_.reset_mqtt(); + ok = true; } #if defined(EMSESP_STANDALONE) && !defined(EMSESP_UNITY)