[SYS} Improve queue performance whenb Using Ethernet and low interval between scan (#2052)
Add also a msgrcv (messages received) indicators into SYStoMQTT to measure the performances Co-authored-by: Florian <1technophile@users.noreply.github.com>
This commit is contained in:
1 parent
caea021ca9
commit
5d6f735058
3 files changed
+67
-55
No files matched your search
+2
-2
@@ -785,9 +785,9 @@ void connectMQTT();
|
|||||||
|
|
||||||
unsigned long uptime();
|
unsigned long uptime();
|
||||||
bool cmpToMainTopic(const char*, const char*);
|
bool cmpToMainTopic(const char*, const char*);
|
||||||
void pub(const char*, const char*, bool);
|
bool pub(const char*, const char*, bool);
|
||||||
// void pub(const char*, JsonObject&);
|
// void pub(const char*, JsonObject&);
|
||||||
void pub(const char*, const char*);
|
bool pub(const char*, const char*);
|
||||||
// void pub_custom_topic(const char*, JsonObject&, boolean);
|
// void pub_custom_topic(const char*, JsonObject&, boolean);
|
||||||
|
|
||||||
#if defined(ESP32)
|
#if defined(ESP32)
|
||||||
|
|||||||
@@ -681,6 +681,7 @@ void procBLETask(void* pvParameters) {
|
|||||||
updateDevicesStatus();
|
updateDevicesStatus();
|
||||||
}
|
}
|
||||||
delete (advertisedDevice);
|
delete (advertisedDevice);
|
||||||
|
vTaskDelay(10);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+64
-53
@@ -68,6 +68,7 @@ unsigned long timer_sys_checks = 0;
|
|||||||
int queueLength = 0;
|
int queueLength = 0;
|
||||||
unsigned long queueLengthSum = 0;
|
unsigned long queueLengthSum = 0;
|
||||||
unsigned long blockedMessages = 0;
|
unsigned long blockedMessages = 0;
|
||||||
|
unsigned long receivedMessages = 0;
|
||||||
int maxQueueLength = 0;
|
int maxQueueLength = 0;
|
||||||
#ifndef QueueSize
|
#ifndef QueueSize
|
||||||
# define QueueSize 18
|
# define QueueSize 18
|
||||||
@@ -378,7 +379,8 @@ void Config_update(JsonObject& data, const char* key, T& var) {
|
|||||||
* Dispatch json messages towards the communication layer
|
* Dispatch json messages towards the communication layer
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void jsonDispatch(JsonObject& data) {
|
bool jsonDispatch(JsonObject& data) {
|
||||||
|
bool res = false;
|
||||||
if (data.containsKey("origin")) {
|
if (data.containsKey("origin")) {
|
||||||
#if message_UTCtimestamp == true
|
#if message_UTCtimestamp == true
|
||||||
data["UTCtime"] = TheengsUtils::UTCtimestamp();
|
data["UTCtime"] = TheengsUtils::UTCtimestamp();
|
||||||
@@ -388,26 +390,30 @@ void jsonDispatch(JsonObject& data) {
|
|||||||
#endif
|
#endif
|
||||||
pubWebUI((char*)data["origin"].as<const char*>(), data);
|
pubWebUI((char*)data["origin"].as<const char*>(), data);
|
||||||
if (SYSConfig.mqtt && !SYSConfig.offline) {
|
if (SYSConfig.mqtt && !SYSConfig.offline) {
|
||||||
pub((char*)data["origin"].as<const char*>(), data);
|
res = pub((char*)data["origin"].as<const char*>(), data);
|
||||||
#ifdef ZgatewayBT
|
#ifdef ZgatewayBT
|
||||||
if (data.containsKey("distance")) {
|
if (data.containsKey("distance")) {
|
||||||
String topic = String(mqtt_topic) + BTConfig.presenceTopic + String(gateway_name);
|
String topic = String(mqtt_topic) + BTConfig.presenceTopic + String(gateway_name);
|
||||||
Log.trace(F("Pub HA Presence %s" CR), topic.c_str());
|
Log.trace(F("Pub HA Presence %s" CR), topic.c_str());
|
||||||
pub_custom_topic((char*)topic.c_str(), data, false);
|
res = pub_custom_topic((char*)topic.c_str(), data, false);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#ifdef ZgatewaySERIAL
|
#ifdef ZgatewaySERIAL
|
||||||
if (SYSConfig.serial)
|
if (SYSConfig.serial) {
|
||||||
XtoSERIAL("", data);
|
XtoSERIAL("", data);
|
||||||
|
res = true;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
Log.error(F("No origin in JSON filtered" CR));
|
Log.error(F("No origin in JSON filtered" CR));
|
||||||
}
|
}
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add a document to the queue
|
// Add a document to the queue
|
||||||
boolean enqueueJsonObject(const StaticJsonDocument<JSON_MSG_BUFFER>& jsonDoc, int timeout) {
|
boolean enqueueJsonObject(const StaticJsonDocument<JSON_MSG_BUFFER>& jsonDoc, int timeout) {
|
||||||
|
receivedMessages++;
|
||||||
if (jsonDoc.size() == 0) {
|
if (jsonDoc.size() == 0) {
|
||||||
Log.error(F("Empty JSON, skipping" CR));
|
Log.error(F("Empty JSON, skipping" CR));
|
||||||
return true;
|
return true;
|
||||||
@@ -525,9 +531,9 @@ void emptyQueue() {
|
|||||||
if (error) {
|
if (error) {
|
||||||
Log.error(F("deserialize jsonQueue.front() failed: %s, buffer capacity: %u" CR), error.c_str(), jsonBuffer.capacity());
|
Log.error(F("deserialize jsonQueue.front() failed: %s, buffer capacity: %u" CR), error.c_str(), jsonBuffer.capacity());
|
||||||
} else {
|
} else {
|
||||||
jsonDispatch(obj);
|
if (jsonDispatch(obj))
|
||||||
}
|
|
||||||
queueLengthSum++;
|
queueLengthSum++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -537,9 +543,9 @@ void emptyQueue() {
|
|||||||
* @param payload the message to sends
|
* @param payload the message to sends
|
||||||
* @param retainFlag true if you what a retain
|
* @param retainFlag true if you what a retain
|
||||||
*/
|
*/
|
||||||
void pub(const char* topicori, const char* payload, bool retainFlag) {
|
bool pub(const char* topicori, const char* payload, bool retainFlag) {
|
||||||
String topic = String(mqtt_topic) + String(gateway_name) + String(topicori);
|
String topic = String(mqtt_topic) + String(gateway_name) + String(topicori);
|
||||||
pubMQTT(topic.c_str(), payload, retainFlag);
|
return pubMQTT(topic.c_str(), payload, retainFlag);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -548,7 +554,8 @@ void pub(const char* topicori, const char* payload, bool retainFlag) {
|
|||||||
* @param topicori suffix to add on default MQTT Topic
|
* @param topicori suffix to add on default MQTT Topic
|
||||||
* @param data The Json Object that represents the message
|
* @param data The Json Object that represents the message
|
||||||
*/
|
*/
|
||||||
void pub(const char* topicori, JsonObject& data) {
|
bool pub(const char* topicori, JsonObject& data) {
|
||||||
|
bool res = false;
|
||||||
bool ret = sensor_Retain;
|
bool ret = sensor_Retain;
|
||||||
if (data.containsKey("retain") && data["retain"].is<bool>()) {
|
if (data.containsKey("retain") && data["retain"].is<bool>()) {
|
||||||
ret = data["retain"];
|
ret = data["retain"];
|
||||||
@@ -559,7 +566,7 @@ void pub(const char* topicori, JsonObject& data) {
|
|||||||
}
|
}
|
||||||
if (data.size() == 0) {
|
if (data.size() == 0) {
|
||||||
Log.error(F("Empty JSON, not published" CR));
|
Log.error(F("Empty JSON, not published" CR));
|
||||||
return;
|
return res;
|
||||||
}
|
}
|
||||||
String topic = String(mqtt_topic) + String(gateway_name) + String(topicori);
|
String topic = String(mqtt_topic) + String(gateway_name) + String(topicori);
|
||||||
#if valueAsATopic
|
#if valueAsATopic
|
||||||
@@ -580,7 +587,7 @@ void pub(const char* topicori, JsonObject& data) {
|
|||||||
#if jsonPublishing
|
#if jsonPublishing
|
||||||
String dataAsString = "";
|
String dataAsString = "";
|
||||||
serializeJson(data, dataAsString);
|
serializeJson(data, dataAsString);
|
||||||
pubMQTT(topic.c_str(), dataAsString.c_str(), ret);
|
res = pubMQTT(topic.c_str(), dataAsString.c_str(), ret);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if simplePublishing
|
#if simplePublishing
|
||||||
@@ -592,19 +599,20 @@ void pub(const char* topicori, JsonObject& data) {
|
|||||||
# endif
|
# endif
|
||||||
if (p.value().is<uint64_t>() && strcmp(p.key().c_str(), "rssi") != 0) { //test rssi , bypass solution due to the fact that a int is considered as an uint64_t
|
if (p.value().is<uint64_t>() && strcmp(p.key().c_str(), "rssi") != 0) { //test rssi , bypass solution due to the fact that a int is considered as an uint64_t
|
||||||
if (strcmp(p.key().c_str(), "value") == 0) { // if data is a value we don't integrate the name into the topic
|
if (strcmp(p.key().c_str(), "value") == 0) { // if data is a value we don't integrate the name into the topic
|
||||||
pubMQTT(topic, p.value().as<uint64_t>());
|
res = pubMQTT(topic, p.value().as<uint64_t>());
|
||||||
} else { // if data is not a value we integrate the name into the topic
|
} else { // if data is not a value we integrate the name into the topic
|
||||||
pubMQTT(topic + "/" + String(p.key().c_str()), p.value().as<uint64_t>());
|
res = pubMQTT(topic + "/" + String(p.key().c_str()), p.value().as<uint64_t>());
|
||||||
}
|
}
|
||||||
} else if (p.value().is<int>()) {
|
} else if (p.value().is<int>()) {
|
||||||
pubMQTT(topic + "/" + String(p.key().c_str()), p.value().as<int>());
|
res = pubMQTT(topic + "/" + String(p.key().c_str()), p.value().as<int>());
|
||||||
} else if (p.value().is<float>()) {
|
} else if (p.value().is<float>()) {
|
||||||
pubMQTT(topic + "/" + String(p.key().c_str()), p.value().as<float>());
|
res = pubMQTT(topic + "/" + String(p.key().c_str()), p.value().as<float>());
|
||||||
} else if (p.value().is<char*>()) {
|
} else if (p.value().is<char*>()) {
|
||||||
pubMQTT(topic + "/" + String(p.key().c_str()), p.value().as<const char*>());
|
res = pubMQTT(topic + "/" + String(p.key().c_str()), p.value().as<const char*>());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -613,9 +621,9 @@ void pub(const char* topicori, JsonObject& data) {
|
|||||||
* @param topicori suffix to add on default MQTT Topic
|
* @param topicori suffix to add on default MQTT Topic
|
||||||
* @param payload the message to sends
|
* @param payload the message to sends
|
||||||
*/
|
*/
|
||||||
void pub(const char* topicori, const char* payload) {
|
bool pub(const char* topicori, const char* payload) {
|
||||||
String topic = String(mqtt_topic) + String(gateway_name) + String(topicori);
|
String topic = String(mqtt_topic) + String(gateway_name) + String(topicori);
|
||||||
pubMQTT(topic, payload);
|
return pubMQTT(topic, payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -625,10 +633,10 @@ void pub(const char* topicori, const char* payload) {
|
|||||||
* @param data The Json Object that represents the message
|
* @param data The Json Object that represents the message
|
||||||
* @param retain true if you what a retain
|
* @param retain true if you what a retain
|
||||||
*/
|
*/
|
||||||
void pub_custom_topic(const char* topic, JsonObject& data, boolean retain) {
|
bool pub_custom_topic(const char* topic, JsonObject& data, boolean retain) {
|
||||||
String buffer = "";
|
String buffer = "";
|
||||||
serializeJson(data, buffer);
|
serializeJson(data, buffer);
|
||||||
pubMQTT(topic, buffer.c_str(), retain);
|
return pubMQTT(topic, buffer.c_str(), retain);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -637,8 +645,8 @@ void pub_custom_topic(const char* topic, JsonObject& data, boolean retain) {
|
|||||||
* @param topic the topic
|
* @param topic the topic
|
||||||
* @param payload the payload
|
* @param payload the payload
|
||||||
*/
|
*/
|
||||||
void pubMQTT(const char* topic, const char* payload) {
|
bool pubMQTT(const char* topic, const char* payload) {
|
||||||
pubMQTT(topic, payload, sensor_Retain);
|
return pubMQTT(topic, payload, sensor_Retain);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -648,18 +656,19 @@ void pubMQTT(const char* topic, const char* payload) {
|
|||||||
* @param payload the payload
|
* @param payload the payload
|
||||||
* @param retainFlag true if retain the retain Flag
|
* @param retainFlag true if retain the retain Flag
|
||||||
*/
|
*/
|
||||||
void pubMQTT(const char* topic, const char* payload, bool retainFlag) {
|
bool pubMQTT(const char* topic, const char* payload, bool retainFlag) {
|
||||||
|
bool res = false;
|
||||||
if (SYSConfig.mqtt && !SYSConfig.offline) {
|
if (SYSConfig.mqtt && !SYSConfig.offline) {
|
||||||
#ifdef ESP32
|
#ifdef ESP32
|
||||||
if (xSemaphoreTake(xMqttMutex, pdMS_TO_TICKS(QueueSemaphoreTimeOutTask)) == pdFALSE) {
|
if (xSemaphoreTake(xMqttMutex, pdMS_TO_TICKS(QueueSemaphoreTimeOutTask)) == pdFALSE) {
|
||||||
Log.error(F("xMqttMutex not taken" CR));
|
Log.error(F("xMqttMutex not taken" CR));
|
||||||
return;
|
return res;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (mqtt && mqtt->connected()) {
|
if (mqtt && mqtt->connected()) {
|
||||||
SendReceiveIndicatorON();
|
SendReceiveIndicatorON();
|
||||||
Log.notice(F("[ OMG->MQTT ] topic: %s msg: %s " CR), topic, payload);
|
Log.notice(F("[ OMG->MQTT ] topic: %s msg: %s " CR), topic, payload);
|
||||||
mqtt->publish(topic, payload, 0, retainFlag);
|
res = mqtt->publish(topic, payload, 0, retainFlag);
|
||||||
} else {
|
} else {
|
||||||
Log.warning(F("MQTT not connected, aborting the publication" CR));
|
Log.warning(F("MQTT not connected, aborting the publication" CR));
|
||||||
}
|
}
|
||||||
@@ -669,84 +678,85 @@ void pubMQTT(const char* topic, const char* payload, bool retainFlag) {
|
|||||||
} else {
|
} else {
|
||||||
Log.notice(F("[ OMG->MQTT deactivated or offline] topic: %s msg: %s " CR), topic, payload);
|
Log.notice(F("[ OMG->MQTT deactivated or offline] topic: %s msg: %s " CR), topic, payload);
|
||||||
}
|
}
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
void pubMQTT(String topic, const char* payload) {
|
bool pubMQTT(String topic, const char* payload) {
|
||||||
pubMQTT(topic.c_str(), payload);
|
return pubMQTT(topic.c_str(), payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
void pubMQTT(const char* topic, unsigned long payload) {
|
bool pubMQTT(const char* topic, unsigned long payload) {
|
||||||
char val[11];
|
char val[11];
|
||||||
sprintf(val, "%lu", payload);
|
sprintf(val, "%lu", payload);
|
||||||
pubMQTT(topic, val);
|
return pubMQTT(topic, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
void pubMQTT(const char* topic, unsigned long long payload) {
|
bool pubMQTT(const char* topic, unsigned long long payload) {
|
||||||
char val[21];
|
char val[21];
|
||||||
sprintf(val, "%llu", payload);
|
sprintf(val, "%llu", payload);
|
||||||
pubMQTT(topic, val);
|
return pubMQTT(topic, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
void pubMQTT(const char* topic, String payload) {
|
bool pubMQTT(const char* topic, String payload) {
|
||||||
pubMQTT(topic, payload.c_str());
|
return pubMQTT(topic, payload.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void pubMQTT(String topic, String payload) {
|
bool pubMQTT(String topic, String payload) {
|
||||||
pubMQTT(topic.c_str(), payload.c_str());
|
return pubMQTT(topic.c_str(), payload.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void pubMQTT(String topic, int payload) {
|
bool pubMQTT(String topic, int payload) {
|
||||||
char val[12];
|
char val[12];
|
||||||
sprintf(val, "%d", payload);
|
sprintf(val, "%d", payload);
|
||||||
pubMQTT(topic.c_str(), val);
|
return pubMQTT(topic.c_str(), val);
|
||||||
}
|
}
|
||||||
|
|
||||||
void pubMQTT(String topic, unsigned long long payload) {
|
bool pubMQTT(String topic, unsigned long long payload) {
|
||||||
char val[21];
|
char val[21];
|
||||||
sprintf(val, "%llu", payload);
|
sprintf(val, "%llu", payload);
|
||||||
pubMQTT(topic.c_str(), val);
|
return pubMQTT(topic.c_str(), val);
|
||||||
}
|
}
|
||||||
|
|
||||||
void pubMQTT(String topic, float payload) {
|
bool pubMQTT(String topic, float payload) {
|
||||||
char val[12];
|
char val[12];
|
||||||
dtostrf(payload, 3, 1, val);
|
dtostrf(payload, 3, 1, val);
|
||||||
pubMQTT(topic.c_str(), val);
|
return pubMQTT(topic.c_str(), val);
|
||||||
}
|
}
|
||||||
|
|
||||||
void pubMQTT(const char* topic, float payload) {
|
bool pubMQTT(const char* topic, float payload) {
|
||||||
char val[12];
|
char val[12];
|
||||||
dtostrf(payload, 3, 1, val);
|
dtostrf(payload, 3, 1, val);
|
||||||
pubMQTT(topic, val);
|
return pubMQTT(topic, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
void pubMQTT(const char* topic, int payload) {
|
bool pubMQTT(const char* topic, int payload) {
|
||||||
char val[12];
|
char val[12];
|
||||||
sprintf(val, "%d", payload);
|
sprintf(val, "%d", payload);
|
||||||
pubMQTT(topic, val);
|
return pubMQTT(topic, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
void pubMQTT(const char* topic, unsigned int payload) {
|
bool pubMQTT(const char* topic, unsigned int payload) {
|
||||||
char val[12];
|
char val[12];
|
||||||
sprintf(val, "%u", payload);
|
sprintf(val, "%u", payload);
|
||||||
pubMQTT(topic, val);
|
return pubMQTT(topic, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
void pubMQTT(const char* topic, long payload) {
|
bool pubMQTT(const char* topic, long payload) {
|
||||||
char val[11];
|
char val[11];
|
||||||
sprintf(val, "%ld", payload);
|
sprintf(val, "%ld", payload);
|
||||||
pubMQTT(topic, val);
|
return pubMQTT(topic, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
void pubMQTT(const char* topic, double payload) {
|
bool pubMQTT(const char* topic, double payload) {
|
||||||
char val[16];
|
char val[16];
|
||||||
sprintf(val, "%f", payload);
|
sprintf(val, "%f", payload);
|
||||||
pubMQTT(topic, val);
|
return pubMQTT(topic, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
void pubMQTT(String topic, unsigned long payload) {
|
bool pubMQTT(String topic, unsigned long payload) {
|
||||||
char val[11];
|
char val[11];
|
||||||
sprintf(val, "%lu", payload);
|
sprintf(val, "%lu", payload);
|
||||||
pubMQTT(topic.c_str(), val);
|
return pubMQTT(topic.c_str(), val);
|
||||||
}
|
}
|
||||||
|
|
||||||
void delayWithOTA(long waitMillis) {
|
void delayWithOTA(long waitMillis) {
|
||||||
@@ -2657,6 +2667,7 @@ String stateMeasures() {
|
|||||||
#endif
|
#endif
|
||||||
SYSdata["msgprc"] = queueLengthSum;
|
SYSdata["msgprc"] = queueLengthSum;
|
||||||
SYSdata["msgblck"] = blockedMessages;
|
SYSdata["msgblck"] = blockedMessages;
|
||||||
|
SYSdata["msgrcv"] = receivedMessages;
|
||||||
SYSdata["maxq"] = maxQueueLength;
|
SYSdata["maxq"] = maxQueueLength;
|
||||||
SYSdata["cnt_index"] = cnt_index;
|
SYSdata["cnt_index"] = cnt_index;
|
||||||
#ifdef ESP32
|
#ifdef ESP32
|
||||||
|
|||||||
Reference in new issue
Block a user