mirror of
https://github.com/HASwitchPlate/openHASP.git
synced 2025-07-28 13:46:36 +00:00
Memory and speed optimizations
This commit is contained in:
parent
a67e3fc633
commit
ebea5ea17e
@ -133,12 +133,12 @@ void IRAM_ATTR mqtt_send_state(const __FlashStringHelper * subtopic, const char
|
|||||||
Log.notice(F("MQTT OUT: %sstate/%S = %s"), mqttNodeTopic, subtopic, payload);
|
Log.notice(F("MQTT OUT: %sstate/%S = %s"), mqttNodeTopic, subtopic, payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
void IRAM_ATTR mqtt_send_input(uint8_t id, const char * payload)
|
void mqtt_send_input(uint8_t id, const char * payload)
|
||||||
{
|
{
|
||||||
Log.trace(F("MQTT TST: %sstate/input%u = %s"), mqttNodeTopic, id, payload); // to be remove
|
// Log.trace(F("MQTT TST: %sstate/input%u = %s"), mqttNodeTopic, id, payload); // to be removed
|
||||||
|
|
||||||
if(mqttIsConnected()) {
|
if(mqttIsConnected()) {
|
||||||
char topic[40];
|
char topic[64];
|
||||||
snprintf_P(topic, sizeof(topic), PSTR("%sstate/input%u"), mqttNodeTopic, id);
|
snprintf_P(topic, sizeof(topic), PSTR("%sstate/input%u"), mqttNodeTopic, id);
|
||||||
mqttClient.publish(topic, payload);
|
mqttClient.publish(topic, payload);
|
||||||
} else {
|
} else {
|
||||||
@ -152,8 +152,8 @@ void IRAM_ATTR mqtt_send_input(uint8_t id, const char * payload)
|
|||||||
void IRAM_ATTR mqtt_send_obj_attribute_str(uint8_t pageid, uint8_t btnid, const char * attribute, const char * data)
|
void IRAM_ATTR mqtt_send_obj_attribute_str(uint8_t pageid, uint8_t btnid, const char * attribute, const char * data)
|
||||||
{
|
{
|
||||||
if(mqttIsConnected()) {
|
if(mqttIsConnected()) {
|
||||||
char topic[64];
|
|
||||||
char payload[128];
|
char payload[128];
|
||||||
|
char topic[64];
|
||||||
|
|
||||||
snprintf_P(topic, sizeof(topic), PSTR("%sstate/json"), mqttNodeTopic);
|
snprintf_P(topic, sizeof(topic), PSTR("%sstate/json"), mqttNodeTopic);
|
||||||
unsigned int len =
|
unsigned int len =
|
||||||
@ -169,68 +169,36 @@ void IRAM_ATTR mqtt_send_obj_attribute_str(uint8_t pageid, uint8_t btnid, const
|
|||||||
data);
|
data);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*void IRAM_ATTR mqtt_send_attribute_P(uint8_t pageid, uint8_t btnid, const char * attr, const char * data)
|
|
||||||
{
|
|
||||||
char * buffer;
|
|
||||||
buffer = (char *)malloc(strlen_P(attr) + 1);
|
|
||||||
strcpy_P(buffer, attr);
|
|
||||||
mqtt_send_attribute_str(pageid, btnid, buffer, data);
|
|
||||||
free(buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
void IRAM_ATTR mqtt_send_attribute_txt(uint8_t pageid, uint8_t btnid, const char * txt)
|
|
||||||
{
|
|
||||||
mqtt_send_attribute_P(pageid, btnid, PSTR("txt"), txt);
|
|
||||||
}
|
|
||||||
|
|
||||||
void IRAM_ATTR mqtt_send_attribute_val(uint8_t pageid, uint8_t btnid, int32_t val)
|
|
||||||
{
|
|
||||||
char data[64];
|
|
||||||
itoa(val, data, 10);
|
|
||||||
mqtt_send_attribute_P(pageid, btnid, PSTR("val"), data);
|
|
||||||
}
|
|
||||||
|
|
||||||
void IRAM_ATTR mqtt_send_attribute_event(uint8_t pageid, uint8_t btnid, const char * event)
|
|
||||||
{
|
|
||||||
mqtt_send_attribute_P(pageid, btnid, PSTR("event"), event);
|
|
||||||
}*/
|
|
||||||
|
|
||||||
void mqtt_send_statusupdate()
|
void mqtt_send_statusupdate()
|
||||||
{ // Periodically publish a JSON string indicating system status
|
{ // Periodically publish a JSON string indicating system status
|
||||||
// String mqttStatusPayload((char *)0);
|
char data[3 * 128];
|
||||||
// mqttStatusPayload.reserve(512);
|
{
|
||||||
debugLastMillis = millis();
|
char buffer[128];
|
||||||
|
|
||||||
DynamicJsonDocument doc(3 * 128);
|
snprintf_P(data, sizeof(data), PSTR("{\"status\":\"available\",\"version\":\"%s\",\"uptime\":%lu,"),
|
||||||
|
haspGetVersion().c_str(), long(millis() / 1000));
|
||||||
doc[F("status")] = F("available");
|
strcat(buffer, data);
|
||||||
|
snprintf_P(buffer, sizeof(buffer), PSTR("\"ssid\":\"%s\",\"rssi\":%i,\"ip\":\"%s\","), WiFi.SSID().c_str(),
|
||||||
doc[F("version")] = haspGetVersion();
|
WiFi.RSSI(), WiFi.localIP().toString().c_str());
|
||||||
doc[F("uptime")] = long(millis() / 1000);
|
strcat(data, buffer);
|
||||||
|
snprintf_P(buffer, sizeof(buffer), PSTR("\"heapFree\":%u,\"heapFrag\":%u,\"espCore\":\"%s\","),
|
||||||
doc[F("rssi")] = WiFi.RSSI();
|
ESP.getFreeHeap(), halGetHeapFragmentation(), halGetCoreVersion().c_str());
|
||||||
doc[F("ip")] = WiFi.localIP().toString();
|
strcat(data, buffer);
|
||||||
|
snprintf_P(buffer, sizeof(buffer), PSTR("\"espCanUpdate\":\"false\",\"page\":%u,\"numPages\":%u,"),
|
||||||
doc[F("heapFree")] = ESP.getFreeHeap();
|
haspGetPage(), (HASP_NUM_PAGES));
|
||||||
doc[F("heapFrag")] = halGetHeapFragmentation();
|
strcat(data, buffer);
|
||||||
|
|
||||||
doc[F("espCanUpdate")] = false;
|
|
||||||
doc[F("espCore")] = halGetCoreVersion();
|
|
||||||
|
|
||||||
doc[F("page")] = haspGetPage();
|
|
||||||
doc[F("numPages")] = (HASP_NUM_PAGES);
|
|
||||||
|
|
||||||
doc[F("tftDriver")] = tftDriverName();
|
|
||||||
doc[F("tftWidth")] = (TFT_WIDTH);
|
|
||||||
doc[F("tftHeight")] = (TFT_HEIGHT);
|
|
||||||
|
|
||||||
#if defined(ARDUINO_ARCH_ESP8266)
|
#if defined(ARDUINO_ARCH_ESP8266)
|
||||||
doc[F("espVcc")] = (float)ESP.getVcc() / 1000;
|
snprintf_P(buffer, sizeof(buffer), PSTR("\"espVcc\":%.2f,"), (float)ESP.getVcc() / 1000);
|
||||||
|
strcat(data, buffer);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
char buffer[2 * 128];
|
snprintf_P(buffer, sizeof(buffer), PSTR("\"tftDriver\":\"%s\",\"tftWidth\":%u,\"tftHeight\":%u}"),
|
||||||
size_t n = serializeJson(doc, buffer, sizeof(buffer));
|
tftDriverName().c_str(), (TFT_WIDTH), (TFT_HEIGHT));
|
||||||
mqtt_send_state(F("statusupdate"), buffer);
|
strcat(data, buffer);
|
||||||
|
}
|
||||||
|
mqtt_send_state(F("statusupdate"), data);
|
||||||
|
debugLastMillis = millis();
|
||||||
|
|
||||||
/* if(updateEspAvailable) {
|
/* if(updateEspAvailable) {
|
||||||
mqttStatusPayload += F("\"updateEspAvailable\":true,");
|
mqttStatusPayload += F("\"updateEspAvailable\":true,");
|
||||||
@ -346,7 +314,7 @@ static void mqtt_message_cb(char * topic_p, byte * payload, unsigned int length)
|
|||||||
|
|
||||||
void mqttSubscribeTo(const char * format, const char * data)
|
void mqttSubscribeTo(const char * format, const char * data)
|
||||||
{
|
{
|
||||||
char topic[128];
|
char topic[64];
|
||||||
snprintf_P(topic, sizeof(topic), format, data);
|
snprintf_P(topic, sizeof(topic), format, data);
|
||||||
if(mqttClient.subscribe(topic)) {
|
if(mqttClient.subscribe(topic)) {
|
||||||
Log.verbose(F("MQTT: * Subscribed to %s"), topic);
|
Log.verbose(F("MQTT: * Subscribed to %s"), topic);
|
||||||
@ -357,14 +325,16 @@ void mqttSubscribeTo(const char * format, const char * data)
|
|||||||
|
|
||||||
void mqttReconnect()
|
void mqttReconnect()
|
||||||
{
|
{
|
||||||
|
char buffer[128];
|
||||||
|
char mqttClientId[64];
|
||||||
static uint8_t mqttReconnectCount = 0;
|
static uint8_t mqttReconnectCount = 0;
|
||||||
bool mqttFirstConnect = true;
|
bool mqttFirstConnect = true;
|
||||||
char mqttClientId[128];
|
|
||||||
char buffer[128];
|
|
||||||
|
|
||||||
snprintf(mqttClientId, sizeof(mqttClientId), PSTR("%s-%s"), mqttNodeName, wifiGetMacAddress(3, "").c_str());
|
{
|
||||||
snprintf_P(mqttNodeTopic, sizeof(mqttNodeTopic), PSTR("hasp/%s/"), mqttNodeName);
|
byte mac[6];
|
||||||
snprintf_P(mqttGroupTopic, sizeof(mqttGroupTopic), PSTR("hasp/%s/"), mqttGroupName);
|
WiFi.macAddress(mac);
|
||||||
|
snprintf_P(mqttClientId, sizeof(mqttClientId), PSTR("%s-%2x%2x%2x"), mqttNodeName, mac[3], mac[4], mac[5]);
|
||||||
|
}
|
||||||
|
|
||||||
// Attempt to connect and set LWT and Clean Session
|
// Attempt to connect and set LWT and Clean Session
|
||||||
snprintf_P(buffer, sizeof(buffer), PSTR("%sstatus"), mqttNodeTopic);
|
snprintf_P(buffer, sizeof(buffer), PSTR("%sstatus"), mqttNodeTopic);
|
||||||
@ -467,29 +437,26 @@ void mqttReconnect()
|
|||||||
mqtt_send_statusupdate();
|
mqtt_send_statusupdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
void mqttSetup(const JsonObject & settings)
|
void mqttSetup()
|
||||||
{
|
{
|
||||||
// mqttSetConfig(settings);
|
|
||||||
|
|
||||||
mqttEnabled = strlen(mqttServer) > 0 && mqttPort > 0;
|
mqttEnabled = strlen(mqttServer) > 0 && mqttPort > 0;
|
||||||
if(!mqttEnabled) return Log.notice(F("MQTT: Broker not configured"));
|
if(mqttEnabled) {
|
||||||
|
mqttClient.setServer(mqttServer, 1883);
|
||||||
mqttClient.setServer(mqttServer, 1883);
|
mqttClient.setCallback(mqtt_message_cb);
|
||||||
mqttClient.setCallback(mqtt_message_cb);
|
Log.notice(F("MQTT: Setup Complete"));
|
||||||
|
} else {
|
||||||
Log.notice(F("MQTT: Setup Complete"));
|
Log.notice(F("MQTT: Broker not configured"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void mqttLoop()
|
void mqttLoop()
|
||||||
{
|
{
|
||||||
if(!mqttEnabled) return;
|
if(mqttEnabled) mqttClient.loop();
|
||||||
mqttClient.loop();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void mqttEvery5Seconds(bool wifiIsConnected)
|
void mqttEvery5Seconds(bool wifiIsConnected)
|
||||||
{
|
{
|
||||||
if(!mqttEnabled) return;
|
if(mqttEnabled && wifiIsConnected && !mqttClient.connected()) mqttReconnect();
|
||||||
if(wifiIsConnected && !mqttClient.connected()) mqttReconnect();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
String mqttGetNodename()
|
String mqttGetNodename()
|
||||||
@ -573,6 +540,9 @@ bool mqttSetConfig(const JsonObject & settings)
|
|||||||
strncpy(mqttPassword, settings[FPSTR(F_CONFIG_PASS)], sizeof(mqttPassword));
|
strncpy(mqttPassword, settings[FPSTR(F_CONFIG_PASS)], sizeof(mqttPassword));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
snprintf_P(mqttNodeTopic, sizeof(mqttNodeTopic), PSTR("hasp/%s/"), mqttNodeName);
|
||||||
|
snprintf_P(mqttGroupTopic, sizeof(mqttGroupTopic), PSTR("hasp/%s/"), mqttGroupName);
|
||||||
|
|
||||||
return changed;
|
return changed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user