Add config topics

This commit is contained in:
fvanroie 2020-04-13 17:50:45 +02:00
parent 70cc8a4f81
commit d3193ee5ef
4 changed files with 117 additions and 18 deletions

View File

@ -168,32 +168,26 @@ void configWriteConfig()
configGetConfig(doc, false);
Log.trace(F("CONF: Config LOADED first %s"), configFile.c_str());
bool writefile = false;
bool changed = false;
// Make sure we have a valid JsonObject to start from
JsonObject settings;
if(doc.as<JsonObject>().isNull()) {
settings = doc.to<JsonObject>();
settings = doc.to<JsonObject>(); // Settings are invalid, force creation of an empty JsonObject
} else {
settings = doc.as<JsonObject>();
settings = doc.as<JsonObject>(); // Settings are valid, cast as a JsonObject
}
if(settings[F("wifi")].as<JsonObject>().isNull()) settings.createNestedObject(F("wifi"));
if(settings[F("mqtt")].as<JsonObject>().isNull()) settings.createNestedObject(F("mqtt"));
if(settings[F("hasp")].as<JsonObject>().isNull()) settings.createNestedObject(F("hasp"));
if(settings[F("mdns")].as<JsonObject>().isNull()) settings.createNestedObject(F("mdns"));
if(settings[F("http")].as<JsonObject>().isNull()) settings.createNestedObject(F("http"));
if(settings[F("debug")].as<JsonObject>().isNull()) settings.createNestedObject(F("debug"));
if(settings[F("telnet")].as<JsonObject>().isNull()) settings.createNestedObject(F("telnet"));
if(settings[F("gui")].as<JsonObject>().isNull()) settings.createNestedObject(F("gui"));
bool writefile = false;
bool changed = false;
#if HASP_USE_WIFI
changed = wifiGetConfig(settings[F("wifi")].as<JsonObject>());
if(settings[F("wifi")].as<JsonObject>().isNull()) settings.createNestedObject(F("wifi"));
changed = wifiGetConfig(settings[F("wifi")]);
if(changed) {
Log.verbose(F("WIFI: Settings changed"));
writefile = true;
}
#if HASP_USE_MQTT
if(settings[F("mqtt")].as<JsonObject>().isNull()) settings.createNestedObject(F("mqtt"));
changed = mqttGetConfig(settings[F("mqtt")]);
if(changed) {
Log.verbose(F("MQTT: Settings changed"));
@ -202,6 +196,7 @@ void configWriteConfig()
}
#endif
#if HASP_USE_TELNET
if(settings[F("telnet")].as<JsonObject>().isNull()) settings.createNestedObject(F("telnet"));
changed = telnetGetConfig(settings[F("telnet")]);
if(changed) {
Log.verbose(F("TELNET: Settings changed"));
@ -210,6 +205,7 @@ void configWriteConfig()
}
#endif
#if HASP_USE_MDNS
if(settings[F("mdns")].as<JsonObject>().isNull()) settings.createNestedObject(F("mdns"));
changed = mdnsGetConfig(settings[F("mdns")]);
if(changed) {
Log.verbose(F("MDNS: Settings changed"));
@ -217,6 +213,7 @@ void configWriteConfig()
}
#endif
#if HASP_USE_HTTP
if(settings[F("http")].as<JsonObject>().isNull()) settings.createNestedObject(F("http"));
changed = httpGetConfig(settings[F("http")]);
if(changed) {
Log.verbose(F("HTTP: Settings changed"));
@ -226,18 +223,21 @@ void configWriteConfig()
#endif
#endif
if(settings[F("debug")].as<JsonObject>().isNull()) settings.createNestedObject(F("debug"));
changed = debugGetConfig(settings[F("debug")]);
if(changed) {
Log.verbose(F("DEBUG: Settings changed"));
writefile = true;
}
if(settings[F("gui")].as<JsonObject>().isNull()) settings.createNestedObject(F("gui"));
changed = guiGetConfig(settings[F("gui")]);
if(changed) {
Log.verbose(F("GUI: Settings changed"));
writefile = true;
}
if(settings[F("hasp")].as<JsonObject>().isNull()) settings.createNestedObject(F("hasp"));
changed = haspGetConfig(settings[F("hasp")]);
if(changed) {
Log.verbose(F("HASP: Settings changed"));

View File

@ -310,3 +310,93 @@ void IRAM_ATTR dispatch_obj_attribute_str(uint8_t pageid, uint8_t btnid, const c
mqtt_send_obj_attribute_str(pageid, btnid, attribute, data);
#endif
}
void dispatchConfig(const char * topic, const char * payload)
{
DynamicJsonDocument doc(128 * 2);
char buffer[128 * 2];
JsonObject settings;
bool update;
if(strlen(payload) == 0) {
// Make sure we have a valid JsonObject to start from
settings = doc.to<JsonObject>().createNestedObject(topic);
update = false;
} else {
DeserializationError jsonError = deserializeJson(doc, payload);
if(jsonError) { // Couldn't parse incoming JSON command
Log.warning(F("JSON: Failed to parse incoming JSON command with error: %s"), jsonError.c_str());
return;
}
settings = doc.as<JsonObject>();
update = true;
}
if(strcmp_P(topic, PSTR("debug")) == 0) {
if(update)
debugSetConfig(settings);
else
debugGetConfig(settings);
}
else if(strcmp_P(topic, PSTR("gui")) == 0) {
if(update)
guiSetConfig(settings);
else
guiGetConfig(settings);
}
else if(strcmp_P(topic, PSTR("hasp")) == 0) {
if(update)
haspSetConfig(settings);
else
haspGetConfig(settings);
}
#if HASP_USE_WIFI
else if(strcmp_P(topic, PSTR("wifi")) == 0) {
if(update)
wifiSetConfig(settings);
else
wifiGetConfig(settings);
}
#if HASP_USE_MQTT
else if(strcmp_P(topic, PSTR("mqtt")) == 0) {
if(update)
mqttSetConfig(settings);
else
mqttGetConfig(settings);
}
#endif
#if HASP_USE_TELNET
// else if(strcmp_P(topic, PSTR("telnet")) == 0)
// telnetGetConfig(settings[F("telnet")]);
#endif
#if HASP_USE_MDNS
else if(strcmp_P(topic, PSTR("mdns")) == 0) {
if(update)
mdnsSetConfig(settings);
else
mdnsGetConfig(settings);
}
#endif
#if HASP_USE_HTTP
else if(strcmp_P(topic, PSTR("http")) == 0) {
if(update)
httpSetConfig(settings);
else
httpGetConfig(settings);
}
#endif
#endif
// Send output
if(!update) {
settings.remove(F("pass")); // hide password in output
size_t size = serializeJson(doc, buffer, sizeof(buffer));
#if HASP_USE_MQTT
mqtt_send_state(F("config"), buffer);
#endif
}
}

View File

@ -8,6 +8,8 @@ void dispatchLoop(void);
void dispatchAttribute(String strTopic, const char * strPayload);
void dispatchCommand(String cmnd);
void dispatchConfig(const char * topic, const char * payload);
void dispatchJson(char * strPayload);
void dispatchJsonl(char * strPayload);
void dispatchJsonl(Stream & stream);

View File

@ -131,7 +131,7 @@ void IRAM_ATTR mqtt_send_state(const __FlashStringHelper * subtopic, const char
}
// Log after char buffers are cleared
Log.notice(F("MQTT OUT: %sstate/%S = %s"), mqttNodeTopic, subtopic, payload);
Log.notice(F("MQTT PUB: %sstate/%S = %s"), mqttNodeTopic, subtopic, payload);
}
void mqtt_send_input(uint8_t id, const char * payload)
@ -147,7 +147,7 @@ void mqtt_send_input(uint8_t id, const char * payload)
}
// Log after char buffers are cleared
Log.notice(F("MQTT OUT: %sstate/input%u = %s"), mqttNodeTopic, id, payload);
Log.notice(F("MQTT PUB: %sstate/input%u = %s"), mqttNodeTopic, id, payload);
}
void IRAM_ATTR mqtt_send_obj_attribute_str(uint8_t pageid, uint8_t btnid, const char * attribute, const char * data)
@ -166,7 +166,7 @@ void IRAM_ATTR mqtt_send_obj_attribute_str(uint8_t pageid, uint8_t btnid, const
}
// Log after char buffers are cleared
Log.notice(F("MQTT OUT: %sstate/json = {\"p[%u].b[%u].%s\":\"%s\"}"), mqttNodeTopic, pageid, btnid, attribute,
Log.notice(F("MQTT PUB: %sstate/json = {\"p[%u].b[%u].%s\":\"%s\"}"), mqttNodeTopic, pageid, btnid, attribute,
data);
}
@ -226,6 +226,7 @@ void mqtt_send_statusupdate()
// Receive incoming messages
static void mqtt_message_cb(char * topic_p, byte * payload, unsigned int length)
{ // Handle incoming commands from MQTT
if(length >= MQTT_MAX_PACKET_SIZE) return;
payload[length] = '\0';
// String strTopic((char *)0);
@ -247,7 +248,7 @@ static void mqtt_message_cb(char * topic_p, byte * payload, unsigned int length)
// '[...]/device/command/p[1].b[4].txt' -m '"Lights On"' = nextionSetAttr("p[1].b[4].txt", "\"Lights On\"")
char * topic = (char *)topic_p;
Log.notice(F("MQTT IN: %s = %s"), topic, (char *)payload);
Log.notice(F("MQTT RCV: %s = %s"), topic, (char *)payload);
if(topic == strstr(topic, mqttNodeTopic)) { // startsWith mqttNodeTopic
topic += strlen(mqttNodeTopic);
@ -282,6 +283,12 @@ static void mqtt_message_cb(char * topic_p, byte * payload, unsigned int length)
return;
}
if(topic == strstr_P(topic, PSTR("config/"))) { // startsWith command/
topic += 7u;
dispatchConfig(topic, (char *)payload);
return;
}
// catch a dangling LWT from a previous connection if it appears
if(!strcmp_P(topic, PSTR("status")) && !strcmp_P((char *)payload, PSTR("OFF"))) {
char topicBuffer[128];