Persistent nodename

This commit is contained in:
fvanroie 2020-03-07 21:07:42 +01:00
parent c74e5ed5ac
commit 906ba1122d
3 changed files with 59 additions and 45 deletions

View File

@ -13,6 +13,7 @@ const char F_CONFIG_PAGES[] PROGMEM = "pages";
const char F_CONFIG_ENABLE[] PROGMEM = "enable"; const char F_CONFIG_ENABLE[] PROGMEM = "enable";
const char F_CONFIG_HOST[] PROGMEM = "host"; const char F_CONFIG_HOST[] PROGMEM = "host";
const char F_CONFIG_PORT[] PROGMEM = "port"; const char F_CONFIG_PORT[] PROGMEM = "port";
const char F_CONFIG_NAME[] PROGMEM = "name";
const char F_CONFIG_USER[] PROGMEM = "user"; const char F_CONFIG_USER[] PROGMEM = "user";
const char F_CONFIG_PASS[] PROGMEM = "pass"; const char F_CONFIG_PASS[] PROGMEM = "pass";
const char F_CONFIG_SSID[] PROGMEM = "ssid"; const char F_CONFIG_SSID[] PROGMEM = "ssid";

View File

@ -39,6 +39,18 @@ String mqttLightBrightCommandTopic; // MQTT topic for incoming panel backlight d
String mqttLightBrightStateTopic; // MQTT topic for outgoing panel backlight dimmer state String mqttLightBrightStateTopic; // MQTT topic for outgoing panel backlight dimmer state
// String mqttMotionStateTopic; // MQTT topic for outgoing motion sensor state // String mqttMotionStateTopic; // MQTT topic for outgoing motion sensor state
#ifdef MQTT_NODENAME
char mqttNodeName[16] = MQTT_NODENAME;
#else
char mqttNodeName[16] = "";
#endif
#ifdef MQTT_GROUPNAME
char mqttGroupName[16] = MQTT_GROUPNAME;
#else
char mqttGroupName[16] = "";
#endif
String mqttClientId((char *)0); // Auto-generated MQTT ClientID String mqttClientId((char *)0); // Auto-generated MQTT ClientID
String mqttNodeTopic((char *)0); String mqttNodeTopic((char *)0);
String mqttGroupTopic((char *)0); String mqttGroupTopic((char *)0);
@ -47,34 +59,33 @@ bool mqttEnabled;
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
// These defaults may be overwritten with values saved by the web interface // These defaults may be overwritten with values saved by the web interface
#ifdef MQTT_HOST #ifdef MQTT_HOST
std::string mqttServer = MQTT_HOST; char mqttServer[16] = MQTT_HOST;
#else #else
std::string mqttServer = ""; char mqttServer[16] = "";
#endif #endif
#ifdef MQTT_PORT #ifdef MQTT_PORT
uint16_t mqttPort = MQTT_PORT; uint16_t mqttPort = MQTT_PORT;
#else #else
uint16_t mqttPort = 1883; uint16_t mqttPort = 1883;
#endif #endif
#ifdef MQTT_USER #ifdef MQTT_USER
std::string mqttUser = MQTT_USER; char mqttUser[23] = MQTT_USER;
#else #else
std::string mqttUser = ""; char mqttUser[23] = "";
#endif #endif
#ifdef MQTT_PASSW #ifdef MQTT_PASSW
std::string mqttPassword = MQTT_PASSW; char mqttPassword[32] = MQTT_PASSW;
#else #else
std::string mqttPassword = ""; char mqttPassword[32] = "";
#endif #endif
std::string mqttGroupName = "plates";
/* /*
const String mqttLightSubscription = "hasp/" + String(haspGetNodename()) + "/light/#"; const String mqttLightSubscription = "hasp/" + String(haspGetNodename()) + "/light/#";
const String mqttLightBrightSubscription = "hasp/" + String(haspGetNodename()) + "/brightness/#"; const String mqttLightBrightSubscription = "hasp/" + String(haspGetNodename()) + "/brightness/#";
*/ */
WiFiClient wifiClient; WiFiClient mqttWifiClient;
PubSubClient mqttClient(wifiClient); PubSubClient mqttClient(mqttWifiClient);
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Send changed values OUT // Send changed values OUT
@ -294,20 +305,19 @@ void mqttReconnect()
mqttClientId += wifiGetMacAddress(3, ""); mqttClientId += wifiGetMacAddress(3, "");
WiFi.macAddress(); WiFi.macAddress();
snprintf_P(topicBuffer, sizeof(topicBuffer), PSTR("hasp/%s/"), nodeName.c_str()); snprintf_P(topicBuffer, sizeof(topicBuffer), PSTR("hasp/%s/"), mqttNodeName);
mqttNodeTopic = topicBuffer; mqttNodeTopic = topicBuffer;
snprintf_P(topicBuffer, sizeof(topicBuffer), PSTR("hasp/%s/"), mqttGroupName.c_str()); snprintf_P(topicBuffer, sizeof(topicBuffer), PSTR("hasp/%s/"), mqttGroupName);
mqttGroupTopic = topicBuffer; mqttGroupTopic = topicBuffer;
// haspSetPage(0); // haspSetPage(0);
snprintf_P(topicBuffer, sizeof(topicBuffer), PSTR("MQTT: Attempting connection to broker %s as clientID %s"), snprintf_P(topicBuffer, sizeof(topicBuffer), PSTR("MQTT: Attempting connection to broker %s as clientID %s"),
mqttServer.c_str(), mqttClientId.c_str()); mqttServer, mqttClientId.c_str());
debugPrintln(topicBuffer); debugPrintln(topicBuffer);
// Attempt to connect and set LWT and Clean Session // Attempt to connect and set LWT and Clean Session
snprintf_P(topicBuffer, sizeof(topicBuffer), PSTR("%sstatus"), mqttNodeTopic.c_str()); snprintf_P(topicBuffer, sizeof(topicBuffer), PSTR("%sstatus"), mqttNodeTopic.c_str());
if(!mqttClient.connect(mqttClientId.c_str(), mqttUser.c_str(), mqttPassword.c_str(), topicBuffer, 0, false, "OFF", if(!mqttClient.connect(mqttClientId.c_str(), mqttUser, mqttPassword, topicBuffer, 0, false, "OFF", true)) {
true)) {
// Retry until we give up and restart after connectTimeout seconds // Retry until we give up and restart after connectTimeout seconds
mqttReconnectCount++; mqttReconnectCount++;
@ -397,10 +407,10 @@ void mqttSetup(const JsonObject & settings)
mqttSetConfig(settings); mqttSetConfig(settings);
mqttEnabled = mqttServer != "" && mqttPort > 0; mqttEnabled = strcmp(mqttServer, "") != 0 && mqttPort > 0;
if(!mqttEnabled) return; if(!mqttEnabled) return;
mqttClient.setServer(mqttServer.c_str(), 1883); mqttClient.setServer(mqttServer, 1883);
mqttClient.setCallback(mqttCallback); mqttClient.setCallback(mqttCallback);
} }
@ -414,6 +424,11 @@ void mqttLoop(bool wifiIsConnected)
mqttClient.loop(); mqttClient.loop();
} }
String mqttGetNodename()
{
return mqttNodeName;
}
bool mqttIsConnected() bool mqttIsConnected()
{ {
return mqttClient.connected(); return mqttClient.connected();
@ -437,11 +452,12 @@ void mqttStop()
bool mqttGetConfig(const JsonObject & settings) bool mqttGetConfig(const JsonObject & settings)
{ {
settings[FPSTR(F_CONFIG_GROUP)] = String(mqttGroupName.c_str()); settings[FPSTR(F_CONFIG_NAME)] = mqttNodeName;
settings[FPSTR(F_CONFIG_HOST)] = String(mqttServer.c_str()); settings[FPSTR(F_CONFIG_GROUP)] = mqttGroupName;
settings[FPSTR(F_CONFIG_HOST)] = mqttServer;
settings[FPSTR(F_CONFIG_PORT)] = mqttPort; settings[FPSTR(F_CONFIG_PORT)] = mqttPort;
settings[FPSTR(F_CONFIG_USER)] = String(mqttUser.c_str()); settings[FPSTR(F_CONFIG_USER)] = mqttUser;
settings[FPSTR(F_CONFIG_PASS)] = String(mqttPassword.c_str()); settings[FPSTR(F_CONFIG_PASS)] = mqttPassword;
configOutput(settings); configOutput(settings);
return true; return true;
@ -456,41 +472,36 @@ bool mqttSetConfig(const JsonObject & settings)
changed |= configSet(mqttPort, settings[FPSTR(F_CONFIG_PORT)], PSTR("mqttPort")); changed |= configSet(mqttPort, settings[FPSTR(F_CONFIG_PORT)], PSTR("mqttPort"));
if(!settings[FPSTR(F_CONFIG_GROUP)].isNull()) { if(!settings[FPSTR(F_CONFIG_NAME)].isNull()) {
if(mqttGroupName != settings[FPSTR(F_CONFIG_GROUP)].as<String>().c_str()) { changed |= strcmp(mqttNodeName, settings[FPSTR(F_CONFIG_NAME)]) != 0;
debugPrintln(F("mqttGroupName set")); strncpy(mqttNodeName, settings[FPSTR(F_CONFIG_NAME)], sizeof(mqttNodeName));
} }
changed |= mqttGroupName != settings[FPSTR(F_CONFIG_GROUP)].as<String>().c_str(); // Prefill node name
if(strlen(mqttNodeName) == 0) {
String mac = wifiGetMacAddress(3, "");
mac.toLowerCase();
snprintf_P(mqttNodeName, sizeof(mqttNodeName), PSTR("plate_%s"), mac.c_str());
}
mqttGroupName = settings[FPSTR(F_CONFIG_GROUP)].as<String>().c_str(); if(!settings[FPSTR(F_CONFIG_GROUP)].isNull()) {
changed |= strcmp(mqttGroupName, settings[FPSTR(F_CONFIG_GROUP)]) != 0;
strncpy(mqttGroupName, settings[FPSTR(F_CONFIG_GROUP)], sizeof(mqttGroupName));
} }
if(!settings[FPSTR(F_CONFIG_HOST)].isNull()) { if(!settings[FPSTR(F_CONFIG_HOST)].isNull()) {
if(mqttServer != settings[FPSTR(F_CONFIG_HOST)].as<String>().c_str()) { changed |= strcmp(mqttServer, settings[FPSTR(F_CONFIG_HOST)]) != 0;
debugPrintln(F("mqttServer set")); strncpy(mqttServer, settings[FPSTR(F_CONFIG_HOST)], sizeof(mqttServer));
}
changed |= mqttServer != settings[FPSTR(F_CONFIG_HOST)].as<String>().c_str();
mqttServer = settings[FPSTR(F_CONFIG_HOST)].as<String>().c_str();
} }
if(!settings[FPSTR(F_CONFIG_USER)].isNull()) { if(!settings[FPSTR(F_CONFIG_USER)].isNull()) {
if(mqttUser != settings[FPSTR(F_CONFIG_USER)].as<String>().c_str()) { changed |= strcmp(mqttUser, settings[FPSTR(F_CONFIG_USER)]) != 0;
debugPrintln(F("mqttUser set")); strncpy(mqttUser, settings[FPSTR(F_CONFIG_USER)], sizeof(mqttUser));
}
changed |= mqttUser != settings[FPSTR(F_CONFIG_USER)].as<String>().c_str();
mqttUser = settings[FPSTR(F_CONFIG_USER)].as<String>().c_str();
} }
if(!settings[FPSTR(F_CONFIG_PASS)].isNull() && if(!settings[FPSTR(F_CONFIG_PASS)].isNull() &&
settings[FPSTR(F_CONFIG_PASS)].as<String>() != String(FPSTR("********"))) { settings[FPSTR(F_CONFIG_PASS)].as<String>() != String(FPSTR("********"))) {
if(mqttPassword != settings[FPSTR(F_CONFIG_PASS)].as<String>().c_str()) { changed |= strcmp(mqttPassword, settings[FPSTR(F_CONFIG_PASS)]) != 0;
debugPrintln(F("mqttPassword set")); strncpy(mqttPassword, settings[FPSTR(F_CONFIG_PASS)], sizeof(mqttPassword));
}
changed |= mqttPassword != settings[FPSTR(F_CONFIG_PASS)].as<String>().c_str();
mqttPassword = settings[FPSTR(F_CONFIG_PASS)].as<String>().c_str();
} }
return changed; return changed;

View File

@ -19,4 +19,6 @@ bool mqttIsConnected(void);
bool mqttGetConfig(const JsonObject & settings); bool mqttGetConfig(const JsonObject & settings);
bool mqttSetConfig(const JsonObject & settings); bool mqttSetConfig(const JsonObject & settings);
String mqttGetNodename(void);
#endif #endif