diff --git a/src/cmnds/cmd_if.c b/src/cmnds/cmd_if.c index 9c70bb505..ec84611a2 100644 --- a/src/cmnds/cmd_if.c +++ b/src/cmnds/cmd_if.c @@ -662,7 +662,7 @@ void SIM_GenerateChannelStatesDesc(char *o, int outLen) { } } } - +#endif const char *CMD_ExpandConstantString(const char *s, const char *stop, char *out, int outLen) { int idx; const char *ret; @@ -750,7 +750,6 @@ const char *CMD_ExpandConstantString(const char *s, const char *stop, char *out, } return false; } -#endif const char* CMD_ExpandConstantToString(const char* constant, char* out, char* stop) { diff --git a/src/cmnds/cmd_public.h b/src/cmnds/cmd_public.h index 363828f8a..09e8c06d8 100644 --- a/src/cmnds/cmd_public.h +++ b/src/cmnds/cmd_public.h @@ -330,6 +330,7 @@ void SVM_RunThreads(int deltaMS); void CMD_InitScripting(); void SVM_RunStartupCommandAsScript(); byte* LFS_ReadFile(const char* fname); +byte* LFS_ReadFileExpanding(const char* fname); int LFS_WriteFile(const char *fname, const byte *data, int len, bool bAppend); commandResult_t CMD_ClearAllHandlers(const void* context, const char* cmd, const char* args, int cmdFlags); diff --git a/src/cmnds/cmd_tasmota.c b/src/cmnds/cmd_tasmota.c index 7e604fe86..0ca27128f 100644 --- a/src/cmnds/cmd_tasmota.c +++ b/src/cmnds/cmd_tasmota.c @@ -270,6 +270,19 @@ byte *LFS_ReadFile(const char *fname) { #endif return 0; } +byte* LFS_ReadFileExpanding(const char* fname) { + byte *d = LFS_ReadFile(fname); + if (d == 0) + return; + const char *s = (const char *)d; + int vars = CMD_CountVarsInString(s); + if (vars == 0) { + return d; + } + char *r = CMD_ExpandingStrdup(s); + free(d); + return (byte*)r; +} int LFS_WriteFile(const char *fname, const byte *data, int len, bool bAppend) { #if ENABLE_LITTLEFS init_lfs(1); diff --git a/src/mqtt/new_mqtt.c b/src/mqtt/new_mqtt.c index 3b8c14ac8..c3c089307 100644 --- a/src/mqtt/new_mqtt.c +++ b/src/mqtt/new_mqtt.c @@ -1555,7 +1555,7 @@ commandResult_t MQTT_PublishFile(const void* context, const char* cmd, const cha int flags = 0; byte*data; - Tokenizer_TokenizeString(args, TOKENIZER_ALLOW_QUOTES | TOKENIZER_ALLOW_ESCAPING_QUOTATIONS); + Tokenizer_TokenizeString(args, TOKENIZER_ALLOW_QUOTES | TOKENIZER_ALLOW_ESCAPING_QUOTATIONS | TOKENIZER_EXPAND_EARLY); if (Tokenizer_GetArgsCount() < 2) { addLogAdv(LOG_INFO, LOG_FEATURE_MQTT, "Publish command requires two arguments (topic and value)"); @@ -1567,7 +1567,7 @@ commandResult_t MQTT_PublishFile(const void* context, const char* cmd, const cha if (Tokenizer_GetArgIntegerDefault(2, 0) != 0) { flags = OBK_PUBLISH_FLAG_RAW_TOPIC_NAME; } - data = LFS_ReadFile(fname); + data = LFS_ReadFileExpanding(fname); if (data) { ret = MQTT_PublishMain_StringString(topic, (const char*)data, flags); free(data); diff --git a/src/selftest/selftest_mqtt.c b/src/selftest/selftest_mqtt.c index 8eb7dec5d..aea5b1ef4 100644 --- a/src/selftest/selftest_mqtt.c +++ b/src/selftest/selftest_mqtt.c @@ -544,6 +544,32 @@ void Test_MQTT_Misc() { SELFTEST_ASSERT_HAD_MQTT_PUBLISH_STR("homeassistant/cover/miscDevice/config", "{\"name\":\"miscDevice\",\"uniq_id\":\"miscDevice\",\"~\":\"miscDevice\",\"dev_cla\":\"shutter\",\"cmd_t\":\"~/backlog\",\"stat_t\":\"~/shutterState/get\",\"pl_open\":\"OPEN\",\"pl_cls\":\"CLOSE\",\"pl_stop\":\"STOP\",\"stat_o\":\"open\",\"stat_c\":\"closed\"}", false); SIM_ClearMQTTHistory(); + + CMD_ExecuteCommand("lfs_format", 0); + // send file content as POST to REST interface + Test_FakeHTTPClientPacket_POST("api/lfs/unitTestFile.txt", "filetext"); + // get this file + CMD_ExecuteCommand("publishFile homeassistant/cover/$mqtt_client/config unitTestFile.txt 1", 0); + SELFTEST_ASSERT_HAD_MQTT_PUBLISH_STR("homeassistant/cover/miscDevice/config", "filetext", false); + SIM_ClearMQTTHistory(); + + CMD_ExecuteCommand("lfs_format", 0); + // send file content as POST to REST interface + Test_FakeHTTPClientPacket_POST("api/lfs/unitTestFile.txt", "My name is $mqtt_client"); + // get this file + CMD_ExecuteCommand("publishFile homeassistant/cover/$mqtt_client/config unitTestFile.txt 1", 0); + SELFTEST_ASSERT_HAD_MQTT_PUBLISH_STR("homeassistant/cover/miscDevice/config", "My name is miscDevice", false); + SIM_ClearMQTTHistory(); + + CMD_ExecuteCommand("lfs_format", 0); + CMD_ExecuteCommand("SetChannel 5 123", 0); + // send file content as POST to REST interface + Test_FakeHTTPClientPacket_POST("api/lfs/unitTestFile.txt", "My name is $mqtt_client $CH5"); + // get this file + CMD_ExecuteCommand("publishFile homeassistant/cover/$mqtt_client/config unitTestFile.txt 1", 0); + SELFTEST_ASSERT_HAD_MQTT_PUBLISH_STR("homeassistant/cover/miscDevice/config", "My name is miscDevice 123", false); + SIM_ClearMQTTHistory(); + CMD_ExecuteCommand("addEventHandler OnChannelChange 5 publish myMagicResult $CH5", 0); // set channel 5 to 50 and see what we get SIM_SendFakeMQTTAndRunSimFrame_CMND("setChannel", "5 50");