mirror of
https://github.com/xoseperez/espurna.git
synced 2026-03-15 04:37:07 +01:00
#13 Custom setter and getter sufixes on MQTT topics
This commit is contained in:
@@ -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
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user