From a85eb3065979bc176cf9b0bb002e4301b54decce Mon Sep 17 00:00:00 2001 From: "suks.ae" Date: Fri, 31 Jul 2026 12:10:16 +0200 Subject: [PATCH] escape characters instead of angle brackets --- src/_P037_MQTTImport.ino | 14 +++++--------- src/src/Helpers/StringParser.cpp | 11 +++++++++++ src/src/Helpers/StringParser.h | 2 ++ 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/_P037_MQTTImport.ino b/src/_P037_MQTTImport.ino index f1aaf51a5..d355fe267 100644 --- a/src/_P037_MQTTImport.ino +++ b/src/_P037_MQTTImport.ino @@ -632,8 +632,6 @@ boolean Plugin_037(uint8_t function, struct EventStruct *event, String& string) } UserVar.setFloat(event->TaskIndex, x, doublePayload); // Save the new value - - // Generate event for rules processing - proposed by TridentTD if (Settings.UseRules && P037_SEND_EVENTS) { @@ -661,11 +659,10 @@ boolean Plugin_037(uint8_t function, struct EventStruct *event, String& string) } P037_addEventToQueue(event, RuleEvent); } - else - { // Generate event of all non-json topic/payloads + else // Generate event of all non-json topic/payloads + { String tmp = unparsedPayload; - tmp.replace('}', '>'); // Replace curly braces by angle brackets to avoid problems with string processing in rules - tmp.replace('{', '<'); + addEscapeCharacters(tmp); // Add escape characters to avoid problems with rules processing if a JSON message is received String RuleEvent = strformat(F("%s#%s=%s"), getTaskDeviceName(event->TaskIndex).c_str(), @@ -697,9 +694,8 @@ boolean Plugin_037(uint8_t function, struct EventStruct *event, String& string) RuleEvent += toString(doublePayload, ExtraTaskSettings.TaskDeviceValueDecimals[x]); } else { String tmp = Payload; - tmp.replace('}', '>'); // Replace curly braces by angle brackets to avoid problems with - tmp.replace('{', '<'); // string processing in rules if a JSON message is received - + addEscapeCharacters(tmp); // Add escape characters to avoid problems with rules processing if a JSON message is received + RuleEvent += wrapWithQuotesIfContainsParameterSeparatorChar(tmp); } P037_addEventToQueue(event, RuleEvent); diff --git a/src/src/Helpers/StringParser.cpp b/src/src/Helpers/StringParser.cpp index d0e487d4d..ccf985cf7 100644 --- a/src/src/Helpers/StringParser.cpp +++ b/src/src/Helpers/StringParser.cpp @@ -46,6 +46,17 @@ void stripEscapeCharacters(String& str) } } +void addEscapeCharacters(String& str) +{ + const char braces[] = { '%', '[', ']', '{', '}', '(', ')' }; + constexpr uint8_t nrbraces = NR_ELEMENTS(braces); + + for (uint8_t i = 0; i < nrbraces; ++i) { + const String s(concat(F("\\"), braces[i])); + str.replace(s.substring(1), s); + } +} + #if FEATURE_STRING_VARIABLES String parseTemplateAndCalculate(String& tmpString) { stripEscapeCharacters(tmpString); diff --git a/src/src/Helpers/StringParser.h b/src/src/Helpers/StringParser.h index 939a6d718..25406e881 100644 --- a/src/src/Helpers/StringParser.h +++ b/src/src/Helpers/StringParser.h @@ -15,6 +15,8 @@ bool hasEscapedCharacter(String& str, const char EscapeChar); // So far \\% \\[ \\] \\{ \\} \\( and \\) are used (all with single backslash!) void stripEscapeCharacters(String& str); +void addEscapeCharacters(String& str); + #if FEATURE_STRING_VARIABLES String parseTemplateAndCalculate(String& tmpString); uint8_t getDerivedValueCountForTask(taskIndex_t taskIndex);