mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-23 10:46:31 +00:00
Prep virtual mqtt_data prt3
This commit is contained in:
parent
7222716470
commit
cea58d66c8
@ -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] = '{';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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();
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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]==':'){
|
||||||
|
@ -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());
|
||||||
|
Loading…
x
Reference in New Issue
Block a user