Prep virtual mqtt_data prt3

This commit is contained in:
Theo Arends 2021-05-24 16:52:59 +02:00
parent 7222716470
commit cea58d66c8
17 changed files with 77 additions and 79 deletions

View File

@ -1178,10 +1178,12 @@ uint32_t ResponseLength(void) {
}
void ResponseClear(void) {
// Reset string length to zero
TasmotaGlobal.mqtt_data[0] = '\0';
}
void ResponseJsonStart(void) {
// Insert a JSON start bracket {
TasmotaGlobal.mqtt_data[0] = '{';
}

View File

@ -305,18 +305,6 @@ void CommandHandler(char* topicBuf, char* dataBuf, uint32_t data_len)
}
if (ResponseLength()) {
/*
// Add "Command":"POWERONSTATE", like:
// 12:15:37 MQT: stat/wemos4/RESULT = {"Command":"POWERONSTATE","PowerOnState":3}
char json_command[TOPSZ];
snprintf_P(json_command, sizeof(json_command), PSTR("{\"" D_JSON_COMMAND "\":\"%s\","), type);
uint32_t jc_len = strlen(json_command);
uint32_t mq_len = ResponseLength() +1;
if (mq_len < ResponseSize() - jc_len) {
memmove(TasmotaGlobal.mqtt_data +jc_len -1, TasmotaGlobal.mqtt_data, mq_len);
memmove(TasmotaGlobal.mqtt_data, json_command, jc_len);
}
*/
MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_STAT, type);
}
TasmotaGlobal.fallback_topic_flag = false;

View File

@ -268,6 +268,7 @@ const uint16_t LOG_BUFFER_SIZE = 4000; // Max number of characters in lo
#ifndef MQTT_MAX_PACKET_SIZE
#define MQTT_MAX_PACKET_SIZE 1200 // Bytes
//#define MQTT_MAX_PACKET_SIZE 2048 // Bytes
#endif
#ifndef MQTT_KEEPALIVE
#define MQTT_KEEPALIVE 30 // Seconds
@ -288,6 +289,8 @@ const uint16_t LOG_BUFFER_SIZE = 4000; // Max number of characters in lo
#ifndef MESSZ
//#define MESSZ 1040 // Max number of characters in JSON message string (Hass discovery and nice MQTT_MAX_PACKET_SIZE = 1200)
#define MESSZ (MQTT_MAX_PACKET_SIZE -TOPSZ -7) // Max number of characters in JSON message string
//#define MESSZ MQTT_MAX_PACKET_SIZE // Max number of characters in JSON message string
//#define MESSZ 2048 // Max number of characters in JSON message string
#endif
#ifndef USE_DEVICE_GROUPS

View File

@ -259,8 +259,7 @@ void CmndFileUpload(void) {
/*
The upload chunk size is the data size of the payload.
It can be larger than the download chunksize which is bound by MESSZ
The PubSubClient upload buffer with length MQTT_MAX_PACKET_SIZE (1200) contains
The PubSubClient upload buffer with length MQTT_MAX_PACKET_SIZE contains
- Header of 5 bytes (MQTT_MAX_HEADER_SIZE)
- Topic string terminated with a zero (stat/demo/FILEUPLOAD<null>)
- Payload ({"Id":116,"Data":"<base64 encoded chunk_size>"}<null>) or (<binary data>)
@ -378,36 +377,40 @@ void CmndFileDownload(void) {
*/
if (FMqtt.file_buffer) {
if (FMqtt.file_pos < FMqtt.file_size) {
uint32_t chunk_size = 4096;
if (!FMqtt.file_binary) {
/*
The download chunk size is the data size before it is encoded to base64.
The download buffer contains
- Payload ({"Id":117,"Data":"<base64 encoded mqtt_file_chuck_size>"}<null>)
*/
chunk_size = (((ResponseSize() - FileTransferHeaderSize) / 4) * 3) -2;
}
uint32_t bytes_left = FMqtt.file_size - FMqtt.file_pos;
/*
The download chunk size is the data size before it is encoded to base64.
It is smaller than the upload chunksize as it is bound by MESSZ
The download buffer with length MESSZ (1042) contains
- Payload ({"Id":117,"Data":"<base64 encoded mqtt_file_chuck_size>"}<null>)
*/
const uint32_t mqtt_file_chunk_size = (((MESSZ - FileTransferHeaderSize) / 4) * 3) -2;
uint32_t chunk_size = (FMqtt.file_binary) ? 4096 : mqtt_file_chunk_size;
uint32_t write_bytes = (bytes_left < chunk_size) ? bytes_left : chunk_size;
uint8_t* buffer = FMqtt.file_buffer + FMqtt.file_pos;
FMqtt.md5.add(buffer, write_bytes);
FMqtt.file_pos += write_bytes;
if (FMqtt.file_binary) {
// Binary data up to 4k
MqttPublishPayloadPrefixTopic_P(STAT, XdrvMailbox.command, (const char*)buffer, write_bytes);
} else {
// {"Id":117,"Data":"CRJcTQ9fYGF ... OT1BRUlNUVVZXWFk="}
Response_P(PSTR("{\"Id\":%d,\"Data\":\""), FMqtt.file_id); // FileTransferHeaderSize
char base64_data[encode_base64_length(write_bytes)];
encode_base64((unsigned char*)buffer, write_bytes, (unsigned char*)base64_data);
ResponseAppend_P(base64_data);
ResponseAppend_P("\"}");
MqttPublishPrefixTopic_P(STAT, XdrvMailbox.command);
char* base64_data = (char*)malloc(encode_base64_length(write_bytes) +2);
if (base64_data) {
Response_P(PSTR("{\"Id\":%d,\"Data\":\""), FMqtt.file_id); // FileTransferHeaderSize
encode_base64((unsigned char*)buffer, write_bytes, (unsigned char*)base64_data);
ResponseAppend_P(base64_data);
ResponseAppend_P("\"}");
MqttPublishPrefixTopic_P(STAT, XdrvMailbox.command);
free(base64_data);
} else {
XdrvMailbox.payload = 0; // Abort
}
}
ResponseClear();
return;
if (XdrvMailbox.payload != 0) { return; } // No error
} else {
FMqtt.md5.calculate();

View File

@ -534,7 +534,6 @@ void MqttDataHandler(char* mqtt_topic, uint8_t* mqtt_data, unsigned int data_len
// AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_MQTT "BufferSize %d, Topic |%s|, Length %d, data_len %d"), MqttClient.getBufferSize(), mqtt_topic, strlen(mqtt_topic), data_len);
// Save MQTT data ASAP as it's data is discarded by PubSubClient with next publish as used in MQTTlog
char topic[TOPSZ];
#ifdef USE_MQTT_AZURE_IOT
// for Azure, we read the topic from the property of the message
@ -557,8 +556,6 @@ void MqttDataHandler(char* mqtt_topic, uint8_t* mqtt_data, unsigned int data_len
strlcpy(topic, mqtt_topic, sizeof(topic));
#endif // USE_MQTT_AZURE_IOT
mqtt_data[data_len] = 0;
char data[data_len +1];
memcpy(data, mqtt_data, sizeof(data));
if (Mqtt.disable_logging) {
TasmotaGlobal.masterlog_level = LOG_LEVEL_DEBUG_MORE; // Hide logging
@ -568,12 +565,12 @@ void MqttDataHandler(char* mqtt_topic, uint8_t* mqtt_data, unsigned int data_len
XdrvMailbox.index = strlen(topic);
XdrvMailbox.data_len = data_len;
XdrvMailbox.topic = topic;
XdrvMailbox.data = (char*)data;
XdrvMailbox.data = (char*)mqtt_data;
if (XdrvCall(FUNC_MQTT_DATA)) { return; }
ShowSource(SRC_MQTT);
CommandHandler(topic, data, data_len);
CommandHandler(topic, (char*)mqtt_data, data_len);
if (Mqtt.disable_logging) {
TasmotaGlobal.masterlog_level = LOG_LEVEL_NONE; // Enable logging
@ -608,7 +605,7 @@ void MqttPublishLoggingAsync(bool refresh) {
char stopic[TOPSZ];
GetTopic_P(stopic, STAT, TasmotaGlobal.mqtt_topic, PSTR("LOGGING"));
// strlcpy(TasmotaGlobal.mqtt_data, line, len); // No JSON and ugly!!
// MqttPublishLib(stopic, (const uint8_t*)TasmotaGlobal.mqtt_data, strlen(TasmotaGlobal.mqtt_data), false);
// MqttPublishLib(stopic, (const uint8_t*)TasmotaGlobal.mqtt_data, ResponseLength(), false);
MqttPublishLib(stopic, (const uint8_t*)line, len -1, false);
}
}

View File

@ -984,7 +984,7 @@ void RulesEvery100ms(void) {
TasmotaGlobal.tele_period = 2; // Do not allow HA updates during next function call
XsnsNextCall(FUNC_JSON_APPEND, xsns_index); // ,"INA219":{"Voltage":4.494,"Current":0.020,"Power":0.089}
TasmotaGlobal.tele_period = tele_period_save;
if (strlen(TasmotaGlobal.mqtt_data)) {
if (ResponseLength()) {
ResponseJsonStart(); // {"INA219":{"Voltage":4.494,"Current":0.020,"Power":0.089}
ResponseJsonEnd();
RulesProcessEvent(TasmotaGlobal.mqtt_data);

View File

@ -2424,9 +2424,9 @@ chknext:
}
} else {
// preserve mqtt_data
char *mqd = (char*)malloc(MESSZ+2);
char *mqd = (char*)malloc(ResponseSize()+2);
if (mqd) {
strlcpy(mqd, TasmotaGlobal.mqtt_data, MESSZ);
strlcpy(mqd, TasmotaGlobal.mqtt_data, ResponseSize());
wd = mqd;
char *lwd = wd;
while (index) {
@ -7703,7 +7703,7 @@ int32_t http_req(char *host, char *request) {
}
#ifdef USE_WEBSEND_RESPONSE
strlcpy(TasmotaGlobal.mqtt_data, http.getString().c_str(), MESSZ);
strlcpy(TasmotaGlobal.mqtt_data, http.getString().c_str(), ResponseSize());
//AddLog(LOG_LEVEL_INFO, PSTR("HTTP RESULT %s"), TasmotaGlobal.mqtt_data);
Run_Scripter(">E", 2, TasmotaGlobal.mqtt_data);
glob_script_mem.glob_error = 0;

View File

@ -876,7 +876,7 @@ void HAssAnnounceSensors(void)
TasmotaGlobal.tele_period = 2; // Do not allow HA updates during next function call
XsnsNextCall(FUNC_JSON_APPEND, hass_xsns_index); // ,"INA219":{"Voltage":4.494,"Current":0.020,"Power":0.089}
TasmotaGlobal.tele_period = tele_period_save;
size_t sensordata_len = strlen(TasmotaGlobal.mqtt_data);
size_t sensordata_len = ResponseLength();
char sensordata[sensordata_len+2]; // dynamically adjust the size
strcpy(sensordata, TasmotaGlobal.mqtt_data); // we can use strcpy since the buffer has the right size

View File

@ -1292,7 +1292,7 @@ void draw_dt_vars(void) {
void DisplayDTVarsTeleperiod(void) {
ResponseClear();
MqttShowState();
uint32_t jlen = strlen(TasmotaGlobal.mqtt_data);
uint32_t jlen = ResponseLength();
if (jlen < DTV_JSON_SIZE) {
char *json = (char*)malloc(jlen + 2);

View File

@ -393,7 +393,7 @@ void PIDRun(void) {
// `%topic%/PID {"power":"0.000"}`
char str_buf[FLOATSZ];
dtostrfd(power, 3, str_buf);
snprintf_P(TasmotaGlobal.mqtt_data, sizeof(TasmotaGlobal.mqtt_data), PSTR("{\"%s\":\"%s\"}"), "power", str_buf);
Response_P(PSTR("{\"%s\":\"%s\"}"), "power", str_buf);
MqttPublishPrefixTopicRulesProcess_P(TELE, "PID");
#endif // PID_DONT_USE_PID_TOPIC

View File

@ -54,7 +54,7 @@
AABBCCDDEEFF/n (n = 0..3) where n indicates the TYPE of address
most notably, if you wish to connect to a random address (n = 1), then you must specify,
else it will not connect.
e.g. to alias a random address to fred:
e.g. to alias a random address to fred:
BLEAlias fred=1234567890/1
to connect and read fred's name:
BLEName fred
@ -68,14 +68,14 @@
BLEAdv - unused
BLEOp
advanced - perform a BLE active operation
mainly for debug or unsupported devices.
mainly for debug or unsupported devices.
BLEMode
control scanning mode
control scanning mode
0 - stop BLE
1 - run BLE but manual scan
*2 - run BLE with auto scan
BLEDetails
display details of adverts
display details of adverts
BLEdetails0 - no display
BLEdetails2 <mac|alias> - display for one device
BLEdetails3 - display for ALL devices
@ -98,7 +98,7 @@
BLEDevices
display or clear the devices list
BLEDevices0 - clear list
BLEDevices1 - publish on tele
BLEDevices1 - publish on tele
BLEMaxAge
display or set the max age of a BLE address before being forgotten
BLEMaxAge - display the setting
@ -1164,8 +1164,8 @@ void setDetails(ble_advertisment_t *ad){
p += len;
maxlen -= len;
if (ad->addrtype){
*(p++) = '/';
*(p++) = 0x30+ad->addrtype;
*(p++) = '/';
*(p++) = 0x30+ad->addrtype;
}
*(p++) = '\"'; maxlen--;
@ -3145,10 +3145,9 @@ static void BLEPostMQTTSeenDevices(int type) {
nextSeenDev = 0;
memset(TasmotaGlobal.mqtt_data, 0, sizeof(TasmotaGlobal.mqtt_data));
ResponseTime_P(PSTR(""));
int timelen = strlen(TasmotaGlobal.mqtt_data);
int timelen = ResponseTime_P(PSTR(""));
char *dest = TasmotaGlobal.mqtt_data + timelen;
int maxlen = (sizeof(TasmotaGlobal.mqtt_data)-20) - timelen;
int maxlen = ResponseSize() -20 -timelen;
// if (!TasmotaGlobal.ota_state_flag){
do {
@ -3340,7 +3339,7 @@ static void mainThreadOpCallbacks() {
// always remove from here
completedOperations.erase(completedOperations.begin() + i);
// unless some callback told us not to send on MQTT, then remove from completed and
// unless some callback told us not to send on MQTT, then remove from completed and
// add to mqtt list
if (!callbackres){
addOperation(&mqttOperations, &op);
@ -3595,14 +3594,14 @@ void HandleBleConfiguration(void)
int ExtStopBLE(){
AddLog(LOG_LEVEL_INFO, PSTR("BLE: Stopping if active"));
BLE_ESP32::BLEEnableMask = 0;
BLE_ESP32::BLEEnableMask = 0;
BLE_ESP32::stopStartBLE();
return 0;
}
int ExtRestartBLEIfEnabled(){
AddLog(LOG_LEVEL_INFO, PSTR("BLE: Starting if active"));
BLE_ESP32::BLEEnableMask = 1;
BLE_ESP32::BLEEnableMask = 1;
BLE_ESP32::stopStartBLE();
return 0;
}
@ -3738,7 +3737,7 @@ void sendExample(){
#endif
}
// end #ifdef BLE_ESP32_EXAMPLES
#endif
#endif
#endif

View File

@ -512,10 +512,10 @@ void CmndCfgPoke(void)
void CmndCfgXor(void)
{
if (XdrvMailbox.data_len > 0) {
Web.config_xor_on_set = XdrvMailbox.payload;
config_xor_on_set = XdrvMailbox.payload;
}
char temp[10];
snprintf_P(temp, sizeof(temp), PSTR("0x%02X"), Web.config_xor_on_set);
snprintf_P(temp, sizeof(temp), PSTR("0x%02X"), config_xor_on_set);
ResponseCmndChar(temp);
}
#endif // USE_WEBSERVER

View File

@ -1708,7 +1708,7 @@ void MINRFShow(bool json)
ResponseAppend_P(PSTR(",\"%s-%02x%02x%02x\":"),kMINRFDeviceType[MIBLEsensors[i].type-1],MIBLEsensors[i].MAC[3],MIBLEsensors[i].MAC[4],MIBLEsensors[i].MAC[5]);
uint32_t _positionCurlyBracket = strlen(TasmotaGlobal.mqtt_data); // ... this will be a ',' first, but later be replaced
uint32_t _positionCurlyBracket = ResponseLength(); // ... this will be a ',' first, but later be replaced
if((!MINRF.mode.triggeredTele && !MINRF.option.minimalSummary)||MINRF.mode.triggeredTele){
bool tempHumSended = false;
@ -1811,7 +1811,7 @@ void MINRFShow(bool json)
}
}
}
if(_positionCurlyBracket==strlen(TasmotaGlobal.mqtt_data)) ResponseAppend_P(PSTR(",")); // write some random char, to be overwritten in the next step
if(_positionCurlyBracket==ResponseLength()) ResponseAppend_P(PSTR(",")); // write some random char, to be overwritten in the next step
ResponseAppend_P(PSTR("}"));
TasmotaGlobal.mqtt_data[_positionCurlyBracket] = '{';
MIBLEsensors[i].eventType.raw = 0;

View File

@ -459,7 +459,7 @@ void HM10_ReverseMAC(uint8_t _mac[]){
*/
void HM10nullifyEndOfMQTT_DATA(){
char *p = TasmotaGlobal.mqtt_data + strlen(TasmotaGlobal.mqtt_data);
char *p = TasmotaGlobal.mqtt_data + ResponseLength();
while(true){
*p--;
if(p[0]==':'){
@ -1052,12 +1052,14 @@ void HM10addBeacon(uint8_t index, char* data){
void HM10showScanResults(){
size_t _size = MIBLEscanResult.size();
ResponseAppend_P(PSTR(",\"BLEScan\":{\"Found\":%u,\"Devices\":["), _size);
bool add_comma = false;
for(auto _scanResult : MIBLEscanResult){
char _MAC[18];
ToHex_P(_scanResult.MAC,6,_MAC,18,':');
ResponseAppend_P(PSTR("{\"MAC\":\"%s\",\"CID\":\"0x%04x\",\"SVC\":\"0x%04x\",\"UUID\":\"0x%04x\",\"RSSI\":%d},"), _MAC, _scanResult.CID, _scanResult.SVC, _scanResult.UUID, _scanResult.RSSI);
ResponseAppend_P(PSTR("%s{\"MAC\":\"%s\",\"CID\":\"0x%04x\",\"SVC\":\"0x%04x\",\"UUID\":\"0x%04x\",\"RSSI\":%d}"),
(add_comma)?",":"", _MAC, _scanResult.CID, _scanResult.SVC, _scanResult.UUID, _scanResult.RSSI);
add_comma = true;
}
if(_size != 0)TasmotaGlobal.mqtt_data[strlen(TasmotaGlobal.mqtt_data)-1] = 0; // delete last comma
ResponseAppend_P(PSTR("]}"));
MIBLEscanResult.clear();
HM10.mode.shallShowScanResult = 0;
@ -1065,12 +1067,13 @@ void HM10showScanResults(){
void HM10showBlockList(){
ResponseAppend_P(PSTR(",\"Block\":["));
bool add_comma = false;
for(auto _scanResult : MIBLEBlockList){
char _MAC[18];
ToHex_P(_scanResult.buf,6,_MAC,18,':');
ResponseAppend_P(PSTR("\"%s\","), _MAC);
ResponseAppend_P(PSTR("%s\"%s\""), (add_comma)?",":"", _MAC);
add_comma = true;
}
if(MIBLEBlockList.size()!=0) TasmotaGlobal.mqtt_data[strlen(TasmotaGlobal.mqtt_data)-1] = 0; // delete last comma
ResponseAppend_P(PSTR("]"));
HM10.mode.shallShowBlockList = 0;
}
@ -1782,7 +1785,7 @@ void HM10Show(bool json)
kHM10DeviceType[MIBLEsensors[i].type-1],
MIBLEsensors[i].MAC[3], MIBLEsensors[i].MAC[4], MIBLEsensors[i].MAC[5]);
uint32_t _positionCurlyBracket = strlen(TasmotaGlobal.mqtt_data); // ... this will be a ',' first, but later be replaced
uint32_t _positionCurlyBracket = ResponseLength(); // ... this will be a ',' first, but later be replaced
if((!HM10.mode.triggeredTele && !HM10.option.minimalSummary)||HM10.mode.triggeredTele){
bool tempHumSended = false;
@ -1910,7 +1913,7 @@ void HM10Show(bool json)
if (HM10.option.showRSSI) ResponseAppend_P(PSTR(",\"RSSI\":%d"), MIBLEsensors[i].rssi);
if(_positionCurlyBracket==strlen(TasmotaGlobal.mqtt_data)) ResponseAppend_P(PSTR(",")); // write some random char, to be overwritten in the next step
if(_positionCurlyBracket==ResponseLength()) ResponseAppend_P(PSTR(",")); // write some random char, to be overwritten in the next step
ResponseAppend_P(PSTR("}"));
TasmotaGlobal.mqtt_data[_positionCurlyBracket] = '{';
MIBLEsensors[i].eventType.raw = 0;

View File

@ -634,7 +634,7 @@ int MI32_decryptPacket(char *_buf, uint16_t _bufSize, uint32_t _type){
*/
void MI32nullifyEndOfMQTT_DATA(){
char *p = TasmotaGlobal.mqtt_data + strlen(TasmotaGlobal.mqtt_data);
char *p = TasmotaGlobal.mqtt_data + ResponseLength();
while(true){
*p--;
if(p[0]==':'){
@ -1598,12 +1598,14 @@ void MI32addBeacon(uint8_t index, char* data){
void MI32showScanResults(){
size_t _size = MIBLEscanResult.size();
ResponseAppend_P(PSTR(",\"BLEScan\":{\"Found\":%u,\"Devices\":["), _size);
bool add_comma = false;
for(auto _scanResult : MIBLEscanResult){
char _MAC[18];
ToHex_P(_scanResult.MAC,6,_MAC,18,':');
ResponseAppend_P(PSTR("{\"MAC\":\"%s\",\"CID\":\"0x%04x\",\"SVC\":\"0x%04x\",\"UUID\":\"0x%04x\",\"RSSI\":%d},"), _MAC, _scanResult.CID, _scanResult.SVC, _scanResult.UUID, _scanResult.RSSI);
ResponseAppend_P(PSTR("%s{\"MAC\":\"%s\",\"CID\":\"0x%04x\",\"SVC\":\"0x%04x\",\"UUID\":\"0x%04x\",\"RSSI\":%d}"),
(add_comma)?",":"", _MAC, _scanResult.CID, _scanResult.SVC, _scanResult.UUID, _scanResult.RSSI);
add_comma = true;
}
if(_size != 0)TasmotaGlobal.mqtt_data[strlen(TasmotaGlobal.mqtt_data)-1] = 0; // delete last comma
ResponseAppend_P(PSTR("]}"));
MIBLEscanResult.clear();
MI32.mode.shallShowScanResult = 0;
@ -1611,12 +1613,13 @@ void MI32showScanResults(){
void MI32showBlockList(){
ResponseAppend_P(PSTR(",\"Block\":["));
bool add_comma = false;
for(auto _scanResult : MIBLEBlockList){
char _MAC[18];
ToHex_P(_scanResult.buf,6,_MAC,18,':');
ResponseAppend_P(PSTR("\"%s\","), _MAC);
ResponseAppend_P(PSTR("%s\"%s\""), (add_comma)?",":"", _MAC);
add_comma = true;
}
if(MIBLEBlockList.size()!=0) TasmotaGlobal.mqtt_data[strlen(TasmotaGlobal.mqtt_data)-1] = 0; // delete last comma
ResponseAppend_P(PSTR("]"));
MI32.mode.shallShowBlockList = 0;
}
@ -2027,7 +2030,7 @@ void MI32Show(bool json)
kMI32DeviceType[MIBLEsensors[i].type-1],
MIBLEsensors[i].MAC[3], MIBLEsensors[i].MAC[4], MIBLEsensors[i].MAC[5]);
uint32_t _positionCurlyBracket = strlen(TasmotaGlobal.mqtt_data); // ... this will be a ',' first, but later be replaced
uint32_t _positionCurlyBracket = ResponseLength(); // ... this will be a ',' first, but later be replaced
if((!MI32.mode.triggeredTele && !MI32.option.minimalSummary)||MI32.mode.triggeredTele){
bool tempHumSended = false;
@ -2158,7 +2161,7 @@ void MI32Show(bool json)
}
if (MI32.option.showRSSI) ResponseAppend_P(PSTR(",\"RSSI\":%d"), MIBLEsensors[i].RSSI);
if(_positionCurlyBracket==strlen(TasmotaGlobal.mqtt_data)) ResponseAppend_P(PSTR(",")); // write some random char, to be overwritten in the next step
if(_positionCurlyBracket==ResponseLength()) ResponseAppend_P(PSTR(",")); // write some random char, to be overwritten in the next step
ResponseAppend_P(PSTR("}"));
TasmotaGlobal.mqtt_data[_positionCurlyBracket] = '{';
MIBLEsensors[i].eventType.raw = 0;

View File

@ -1341,7 +1341,7 @@ int MIParsePacket(const uint8_t* slotmac, struct mi_beacon_data_t *parsed, const
*/
void MI32nullifyEndOfMQTT_DATA(){
char *p = TasmotaGlobal.mqtt_data + strlen(TasmotaGlobal.mqtt_data);
char *p = TasmotaGlobal.mqtt_data + ResponseLength();
while(true){
*p--;
if(p[0]==':'){

View File

@ -132,7 +132,7 @@ void HandleMetrics(void) {
ResponseClear();
MqttShowSensor(); //Pull sensor data
char json[strlen(TasmotaGlobal.mqtt_data)+1];
char json[ResponseLength()+1];
snprintf_P(json, sizeof(json), TasmotaGlobal.mqtt_data);
String jsonStr = json;
JsonParser parser((char *)jsonStr.c_str());