diff --git a/code/src/config/general.h b/code/src/config/general.h index f971ebb9..0ec313c1 100644 --- a/code/src/config/general.h +++ b/code/src/config/general.h @@ -58,7 +58,7 @@ #define MQTT_QOS 0 #define MQTT_KEEPALIVE 30 #define MQTT_RECONNECT_DELAY 10000 -#define MQTT_RELAY_TOPIC "/relay/%d" +#define MQTT_RELAY_TOPIC "/relay" #define MQTT_IP_TOPIC "/ip" #define MQTT_VERSION_TOPIC "/version" #define MQTT_FSVERSION_TOPIC "/fsversion" @@ -68,6 +68,12 @@ #define MQTT_DISCONNECT_EVENT 1 #define MQTT_MESSAGE_EVENT 2 +// Custom get and set postfixes +// Use something like "/status" or "/set", with trailing slash +#define MQTT_USE_GETTER "" +#define MQTT_USE_SETTER "" + + // ----------------------------------------------------------------------------- // NTP // ----------------------------------------------------------------------------- diff --git a/code/src/relay.ino b/code/src/relay.ino index a61ca50b..ba26001c 100644 --- a/code/src/relay.ino +++ b/code/src/relay.ino @@ -22,8 +22,9 @@ bool recursive = false; // ----------------------------------------------------------------------------- void relayMQTT(unsigned char id) { - char buffer[10]; - sprintf(buffer, MQTT_RELAY_TOPIC, id); + String mqttGetter = getSetting("mqttGetter", MQTT_USE_GETTER); + char buffer[strlen(MQTT_RELAY_TOPIC) + mqttGetter.length() + 3]; + sprintf(buffer, "%s/%d%s", MQTT_RELAY_TOPIC, id, mqttGetter.c_str()); mqttSend(buffer, (char *) (relayStatus(id) ? "1" : "0")); } @@ -169,36 +170,41 @@ void relayMQTTCallback(unsigned int type, const char * topic, const char * paylo static bool isFirstMessage = true; + String mqttSetter = getSetting("mqttSetter", MQTT_USE_SETTER); + String mqttGetter = getSetting("mqttGetter", MQTT_USE_GETTER); + bool sameSetGet = mqttGetter.compareTo(mqttSetter) == 0; + if (type == MQTT_CONNECT_EVENT) { relayMQTT(); - mqttSubscribe("/relay/#"); + char buffer[strlen(MQTT_RELAY_TOPIC) + mqttSetter.length() + 3]; + sprintf(buffer, "%s/+%s", MQTT_RELAY_TOPIC, mqttSetter.c_str()); + mqttSubscribe(buffer); } if (type == MQTT_MESSAGE_EVENT) { // Match topic - if (memcmp("/relay/", topic, 7) != 0) return; + String t = String(topic); + if (!t.startsWith(MQTT_RELAY_TOPIC)) return; + if (!t.endsWith(mqttSetter)) return; // If relayMode is not SAME avoid responding to a retained message - if (isFirstMessage) { + if (sameSetGet && isFirstMessage) { isFirstMessage = false; byte relayMode = getSetting("relayMode", RELAY_MODE).toInt(); if (relayMode != RELAY_MODE_SAME) return; } // Get relay ID - unsigned int relayID = topic[strlen(topic)-1] - '0'; + unsigned int relayID = topic[strlen(MQTT_RELAY_TOPIC)+1] - '0'; if (relayID >= relayCount()) relayID = 0; // Action to perform - if ((char)payload[0] == '0') { - relayStatus(relayID, false, false); - } - if ((char)payload[0] == '1') { - relayStatus(relayID, true, false); - } - if ((char)payload[0] == '2') { + unsigned int value = (char)payload[0] - '0'; + if (value == 2) { relayToggle(relayID); + } else { + relayStatus(relayID, value > 0, !sameSetGet); } }