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.ALWAYS()} {LL.ON()}
-
+
>
)}
{isPWM && (
<>
-
-
-
-
+
- {
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 && (
+ }
+ color="secondary"
+ variant="outlined"
+ onClick={sendResetMQTT}
+ >
+ {LL.REFRESH() + ' MQTT'}
+
+ )}
+
= ({
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)