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) { void ResponseClear(void) {
// Reset string length to zero
TasmotaGlobal.mqtt_data[0] = '\0'; TasmotaGlobal.mqtt_data[0] = '\0';
} }
void ResponseJsonStart(void) { void ResponseJsonStart(void) {
// Insert a JSON start bracket {
TasmotaGlobal.mqtt_data[0] = '{'; TasmotaGlobal.mqtt_data[0] = '{';
} }

View File

@ -305,18 +305,6 @@ void CommandHandler(char* topicBuf, char* dataBuf, uint32_t data_len)
} }
if (ResponseLength()) { 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); MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_STAT, type);
} }
TasmotaGlobal.fallback_topic_flag = false; 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 #ifndef MQTT_MAX_PACKET_SIZE
#define MQTT_MAX_PACKET_SIZE 1200 // Bytes #define MQTT_MAX_PACKET_SIZE 1200 // Bytes
//#define MQTT_MAX_PACKET_SIZE 2048 // Bytes
#endif #endif
#ifndef MQTT_KEEPALIVE #ifndef MQTT_KEEPALIVE
#define MQTT_KEEPALIVE 30 // Seconds #define MQTT_KEEPALIVE 30 // Seconds
@ -288,6 +289,8 @@ const uint16_t LOG_BUFFER_SIZE = 4000; // Max number of characters in lo
#ifndef MESSZ #ifndef MESSZ
//#define MESSZ 1040 // Max number of characters in JSON message string (Hass discovery and nice MQTT_MAX_PACKET_SIZE = 1200) //#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 -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 #endif
#ifndef USE_DEVICE_GROUPS #ifndef USE_DEVICE_GROUPS

View File

@ -259,8 +259,7 @@ void CmndFileUpload(void) {
/* /*
The upload chunk size is the data size of the payload. 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 contains
The PubSubClient upload buffer with length MQTT_MAX_PACKET_SIZE (1200) contains
- Header of 5 bytes (MQTT_MAX_HEADER_SIZE) - Header of 5 bytes (MQTT_MAX_HEADER_SIZE)
- Topic string terminated with a zero (stat/demo/FILEUPLOAD<null>) - Topic string terminated with a zero (stat/demo/FILEUPLOAD<null>)
- Payload ({"Id":116,"Data":"<base64 encoded chunk_size>"}<null>) or (<binary data>) - 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_buffer) {
if (FMqtt.file_pos < FMqtt.file_size) { 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; 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; uint32_t write_bytes = (bytes_left < chunk_size) ? bytes_left : chunk_size;
uint8_t* buffer = FMqtt.file_buffer + FMqtt.file_pos; uint8_t* buffer = FMqtt.file_buffer + FMqtt.file_pos;
FMqtt.md5.add(buffer, write_bytes); FMqtt.md5.add(buffer, write_bytes);
FMqtt.file_pos += write_bytes; FMqtt.file_pos += write_bytes;
if (FMqtt.file_binary) { if (FMqtt.file_binary) {
// Binary data up to 4k
MqttPublishPayloadPrefixTopic_P(STAT, XdrvMailbox.command, (const char*)buffer, write_bytes); MqttPublishPayloadPrefixTopic_P(STAT, XdrvMailbox.command, (const char*)buffer, write_bytes);
} else { } else {
// {"Id":117,"Data":"CRJcTQ9fYGF ... OT1BRUlNUVVZXWFk="} // {"Id":117,"Data":"CRJcTQ9fYGF ... OT1BRUlNUVVZXWFk="}
Response_P(PSTR("{\"Id\":%d,\"Data\":\""), FMqtt.file_id); // FileTransferHeaderSize char* base64_data = (char*)malloc(encode_base64_length(write_bytes) +2);
char base64_data[encode_base64_length(write_bytes)]; if (base64_data) {
encode_base64((unsigned char*)buffer, write_bytes, (unsigned char*)base64_data); Response_P(PSTR("{\"Id\":%d,\"Data\":\""), FMqtt.file_id); // FileTransferHeaderSize
ResponseAppend_P(base64_data); encode_base64((unsigned char*)buffer, write_bytes, (unsigned char*)base64_data);
ResponseAppend_P("\"}"); ResponseAppend_P(base64_data);
MqttPublishPrefixTopic_P(STAT, XdrvMailbox.command); ResponseAppend_P("\"}");
MqttPublishPrefixTopic_P(STAT, XdrvMailbox.command);
free(base64_data);
} else {
XdrvMailbox.payload = 0; // Abort
}
} }
ResponseClear(); ResponseClear();
return; if (XdrvMailbox.payload != 0) { return; } // No error
} else { } else {
FMqtt.md5.calculate(); 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); // 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]; char topic[TOPSZ];
#ifdef USE_MQTT_AZURE_IOT #ifdef USE_MQTT_AZURE_IOT
// for Azure, we read the topic from the property of the message // 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)); strlcpy(topic, mqtt_topic, sizeof(topic));
#endif // USE_MQTT_AZURE_IOT #endif // USE_MQTT_AZURE_IOT
mqtt_data[data_len] = 0; mqtt_data[data_len] = 0;
char data[data_len +1];
memcpy(data, mqtt_data, sizeof(data));
if (Mqtt.disable_logging) { if (Mqtt.disable_logging) {
TasmotaGlobal.masterlog_level = LOG_LEVEL_DEBUG_MORE; // Hide 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.index = strlen(topic);
XdrvMailbox.data_len = data_len; XdrvMailbox.data_len = data_len;
XdrvMailbox.topic = topic; XdrvMailbox.topic = topic;
XdrvMailbox.data = (char*)data; XdrvMailbox.data = (char*)mqtt_data;
if (XdrvCall(FUNC_MQTT_DATA)) { return; } if (XdrvCall(FUNC_MQTT_DATA)) { return; }
ShowSource(SRC_MQTT); ShowSource(SRC_MQTT);
CommandHandler(topic, data, data_len); CommandHandler(topic, (char*)mqtt_data, data_len);
if (Mqtt.disable_logging) { if (Mqtt.disable_logging) {
TasmotaGlobal.masterlog_level = LOG_LEVEL_NONE; // Enable logging TasmotaGlobal.masterlog_level = LOG_LEVEL_NONE; // Enable logging
@ -608,7 +605,7 @@ void MqttPublishLoggingAsync(bool refresh) {
char stopic[TOPSZ]; char stopic[TOPSZ];
GetTopic_P(stopic, STAT, TasmotaGlobal.mqtt_topic, PSTR("LOGGING")); GetTopic_P(stopic, STAT, TasmotaGlobal.mqtt_topic, PSTR("LOGGING"));
// strlcpy(TasmotaGlobal.mqtt_data, line, len); // No JSON and ugly!! // 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); 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 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} XsnsNextCall(FUNC_JSON_APPEND, xsns_index); // ,"INA219":{"Voltage":4.494,"Current":0.020,"Power":0.089}
TasmotaGlobal.tele_period = tele_period_save; TasmotaGlobal.tele_period = tele_period_save;
if (strlen(TasmotaGlobal.mqtt_data)) { if (ResponseLength()) {
ResponseJsonStart(); // {"INA219":{"Voltage":4.494,"Current":0.020,"Power":0.089} ResponseJsonStart(); // {"INA219":{"Voltage":4.494,"Current":0.020,"Power":0.089}
ResponseJsonEnd(); ResponseJsonEnd();
RulesProcessEvent(TasmotaGlobal.mqtt_data); RulesProcessEvent(TasmotaGlobal.mqtt_data);

View File

@ -2424,9 +2424,9 @@ chknext:
} }
} else { } else {
// preserve mqtt_data // preserve mqtt_data
char *mqd = (char*)malloc(MESSZ+2); char *mqd = (char*)malloc(ResponseSize()+2);
if (mqd) { if (mqd) {
strlcpy(mqd, TasmotaGlobal.mqtt_data, MESSZ); strlcpy(mqd, TasmotaGlobal.mqtt_data, ResponseSize());
wd = mqd; wd = mqd;
char *lwd = wd; char *lwd = wd;
while (index) { while (index) {
@ -7703,7 +7703,7 @@ int32_t http_req(char *host, char *request) {
} }
#ifdef USE_WEBSEND_RESPONSE #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); //AddLog(LOG_LEVEL_INFO, PSTR("HTTP RESULT %s"), TasmotaGlobal.mqtt_data);
Run_Scripter(">E", 2, TasmotaGlobal.mqtt_data); Run_Scripter(">E", 2, TasmotaGlobal.mqtt_data);
glob_script_mem.glob_error = 0; 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 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} XsnsNextCall(FUNC_JSON_APPEND, hass_xsns_index); // ,"INA219":{"Voltage":4.494,"Current":0.020,"Power":0.089}
TasmotaGlobal.tele_period = tele_period_save; 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 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 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) { void DisplayDTVarsTeleperiod(void) {
ResponseClear(); ResponseClear();
MqttShowState(); MqttShowState();
uint32_t jlen = strlen(TasmotaGlobal.mqtt_data); uint32_t jlen = ResponseLength();
if (jlen < DTV_JSON_SIZE) { if (jlen < DTV_JSON_SIZE) {
char *json = (char*)malloc(jlen + 2); char *json = (char*)malloc(jlen + 2);

View File

@ -393,7 +393,7 @@ void PIDRun(void) {
// `%topic%/PID {"power":"0.000"}` // `%topic%/PID {"power":"0.000"}`
char str_buf[FLOATSZ]; char str_buf[FLOATSZ];
dtostrfd(power, 3, str_buf); 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"); MqttPublishPrefixTopicRulesProcess_P(TELE, "PID");
#endif // PID_DONT_USE_PID_TOPIC #endif // PID_DONT_USE_PID_TOPIC

View File

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

View File

@ -512,10 +512,10 @@ void CmndCfgPoke(void)
void CmndCfgXor(void) void CmndCfgXor(void)
{ {
if (XdrvMailbox.data_len > 0) { if (XdrvMailbox.data_len > 0) {
Web.config_xor_on_set = XdrvMailbox.payload; config_xor_on_set = XdrvMailbox.payload;
} }
char temp[10]; 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); ResponseCmndChar(temp);
} }
#endif // USE_WEBSERVER #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]); 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){ if((!MINRF.mode.triggeredTele && !MINRF.option.minimalSummary)||MINRF.mode.triggeredTele){
bool tempHumSended = false; 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("}")); ResponseAppend_P(PSTR("}"));
TasmotaGlobal.mqtt_data[_positionCurlyBracket] = '{'; TasmotaGlobal.mqtt_data[_positionCurlyBracket] = '{';
MIBLEsensors[i].eventType.raw = 0; MIBLEsensors[i].eventType.raw = 0;

View File

@ -459,7 +459,7 @@ void HM10_ReverseMAC(uint8_t _mac[]){
*/ */
void HM10nullifyEndOfMQTT_DATA(){ void HM10nullifyEndOfMQTT_DATA(){
char *p = TasmotaGlobal.mqtt_data + strlen(TasmotaGlobal.mqtt_data); char *p = TasmotaGlobal.mqtt_data + ResponseLength();
while(true){ while(true){
*p--; *p--;
if(p[0]==':'){ if(p[0]==':'){
@ -1052,12 +1052,14 @@ void HM10addBeacon(uint8_t index, char* data){
void HM10showScanResults(){ void HM10showScanResults(){
size_t _size = MIBLEscanResult.size(); size_t _size = MIBLEscanResult.size();
ResponseAppend_P(PSTR(",\"BLEScan\":{\"Found\":%u,\"Devices\":["), _size); ResponseAppend_P(PSTR(",\"BLEScan\":{\"Found\":%u,\"Devices\":["), _size);
bool add_comma = false;
for(auto _scanResult : MIBLEscanResult){ for(auto _scanResult : MIBLEscanResult){
char _MAC[18]; char _MAC[18];
ToHex_P(_scanResult.MAC,6,_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("]}")); ResponseAppend_P(PSTR("]}"));
MIBLEscanResult.clear(); MIBLEscanResult.clear();
HM10.mode.shallShowScanResult = 0; HM10.mode.shallShowScanResult = 0;
@ -1065,12 +1067,13 @@ void HM10showScanResults(){
void HM10showBlockList(){ void HM10showBlockList(){
ResponseAppend_P(PSTR(",\"Block\":[")); ResponseAppend_P(PSTR(",\"Block\":["));
bool add_comma = false;
for(auto _scanResult : MIBLEBlockList){ for(auto _scanResult : MIBLEBlockList){
char _MAC[18]; char _MAC[18];
ToHex_P(_scanResult.buf,6,_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("]")); ResponseAppend_P(PSTR("]"));
HM10.mode.shallShowBlockList = 0; HM10.mode.shallShowBlockList = 0;
} }
@ -1782,7 +1785,7 @@ void HM10Show(bool json)
kHM10DeviceType[MIBLEsensors[i].type-1], kHM10DeviceType[MIBLEsensors[i].type-1],
MIBLEsensors[i].MAC[3], MIBLEsensors[i].MAC[4], MIBLEsensors[i].MAC[5]); 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){ if((!HM10.mode.triggeredTele && !HM10.option.minimalSummary)||HM10.mode.triggeredTele){
bool tempHumSended = false; bool tempHumSended = false;
@ -1910,7 +1913,7 @@ void HM10Show(bool json)
if (HM10.option.showRSSI) ResponseAppend_P(PSTR(",\"RSSI\":%d"), MIBLEsensors[i].rssi); 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("}")); ResponseAppend_P(PSTR("}"));
TasmotaGlobal.mqtt_data[_positionCurlyBracket] = '{'; TasmotaGlobal.mqtt_data[_positionCurlyBracket] = '{';
MIBLEsensors[i].eventType.raw = 0; 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(){ void MI32nullifyEndOfMQTT_DATA(){
char *p = TasmotaGlobal.mqtt_data + strlen(TasmotaGlobal.mqtt_data); char *p = TasmotaGlobal.mqtt_data + ResponseLength();
while(true){ while(true){
*p--; *p--;
if(p[0]==':'){ if(p[0]==':'){
@ -1598,12 +1598,14 @@ void MI32addBeacon(uint8_t index, char* data){
void MI32showScanResults(){ void MI32showScanResults(){
size_t _size = MIBLEscanResult.size(); size_t _size = MIBLEscanResult.size();
ResponseAppend_P(PSTR(",\"BLEScan\":{\"Found\":%u,\"Devices\":["), _size); ResponseAppend_P(PSTR(",\"BLEScan\":{\"Found\":%u,\"Devices\":["), _size);
bool add_comma = false;
for(auto _scanResult : MIBLEscanResult){ for(auto _scanResult : MIBLEscanResult){
char _MAC[18]; char _MAC[18];
ToHex_P(_scanResult.MAC,6,_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("]}")); ResponseAppend_P(PSTR("]}"));
MIBLEscanResult.clear(); MIBLEscanResult.clear();
MI32.mode.shallShowScanResult = 0; MI32.mode.shallShowScanResult = 0;
@ -1611,12 +1613,13 @@ void MI32showScanResults(){
void MI32showBlockList(){ void MI32showBlockList(){
ResponseAppend_P(PSTR(",\"Block\":[")); ResponseAppend_P(PSTR(",\"Block\":["));
bool add_comma = false;
for(auto _scanResult : MIBLEBlockList){ for(auto _scanResult : MIBLEBlockList){
char _MAC[18]; char _MAC[18];
ToHex_P(_scanResult.buf,6,_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("]")); ResponseAppend_P(PSTR("]"));
MI32.mode.shallShowBlockList = 0; MI32.mode.shallShowBlockList = 0;
} }
@ -2027,7 +2030,7 @@ void MI32Show(bool json)
kMI32DeviceType[MIBLEsensors[i].type-1], kMI32DeviceType[MIBLEsensors[i].type-1],
MIBLEsensors[i].MAC[3], MIBLEsensors[i].MAC[4], MIBLEsensors[i].MAC[5]); 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){ if((!MI32.mode.triggeredTele && !MI32.option.minimalSummary)||MI32.mode.triggeredTele){
bool tempHumSended = false; bool tempHumSended = false;
@ -2158,7 +2161,7 @@ void MI32Show(bool json)
} }
if (MI32.option.showRSSI) ResponseAppend_P(PSTR(",\"RSSI\":%d"), MIBLEsensors[i].RSSI); 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("}")); ResponseAppend_P(PSTR("}"));
TasmotaGlobal.mqtt_data[_positionCurlyBracket] = '{'; TasmotaGlobal.mqtt_data[_positionCurlyBracket] = '{';
MIBLEsensors[i].eventType.raw = 0; 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(){ void MI32nullifyEndOfMQTT_DATA(){
char *p = TasmotaGlobal.mqtt_data + strlen(TasmotaGlobal.mqtt_data); char *p = TasmotaGlobal.mqtt_data + ResponseLength();
while(true){ while(true){
*p--; *p--;
if(p[0]==':'){ if(p[0]==':'){

View File

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