mqtt custom subscribe for Devices
This commit is contained in:
parent
b87b45d22f
commit
80b3c3a0da
@ -33,4 +33,8 @@ void sensorsLoop() {
|
|||||||
greenhouseDHT22.loop();
|
greenhouseDHT22.loop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void mqttReceive(const String& topic, const String& payload) {
|
||||||
|
light.cmd(topic, payload);
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -47,13 +47,30 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void setState(const boolean newState) {
|
void setState(const boolean newState) {
|
||||||
|
if (this->state != newState) {
|
||||||
this->state = newState;
|
this->state = newState;
|
||||||
|
Log.info("State changed: name=%s, state=%s", name.c_str(), this->state ? "true" : "false");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] boolean getState() const {
|
[[nodiscard]] boolean getState() const {
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cmd(const String& topic, const String& payload) {
|
||||||
|
const String expected = String("/cmd/" + name + "/setState");
|
||||||
|
if (!topic.equals(expected)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (payload.equals("true")) {
|
||||||
|
setState(true);
|
||||||
|
} else if (payload.equals("false")) {
|
||||||
|
setState(false);
|
||||||
|
} else {
|
||||||
|
Log.error("Invalid payload for command: topic=%s, payload=%s", topic.c_str(), payload.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -17,28 +17,33 @@ unsigned long mqttFailureMillis = 0;
|
|||||||
// ReSharper disable once CppUseAuto
|
// ReSharper disable once CppUseAuto
|
||||||
const String logTopic = String("log/") + HOSTNAME;
|
const String logTopic = String("log/") + HOSTNAME;
|
||||||
|
|
||||||
// ReSharper disable once CppUseAuto
|
|
||||||
const String cmdTopic = String("cmd/") + HOSTNAME;
|
|
||||||
|
|
||||||
void mqttCallback(char* topic, const uint8_t* payload, unsigned int length) {
|
void mqttCallback(char* topic, const uint8_t* payload, unsigned int length) {
|
||||||
char message[500];
|
char message[500];
|
||||||
length = min(sizeof message - 1, length);
|
length = min(sizeof message - 1, length);
|
||||||
memcpy(message, payload, length);
|
memcpy(message, payload, length);
|
||||||
*(message + length) = 0;
|
*(message + length) = 0;
|
||||||
Log.info(R"(MQTT received: topic="%s", message="%s")", topic, message);
|
const String topicStr = String(topic);
|
||||||
if (strcmp(message, "help") == 0) {
|
const String messageStr = String(message);
|
||||||
|
Log.info(R"(MQTT received: topic="%s", message="%s")", topicStr.c_str(), messageStr.c_str());
|
||||||
|
if (topicStr.equals(String("/cmd/") + HOSTNAME)) {
|
||||||
|
if (messageStr.equals("help")) {
|
||||||
Log.info("HELP");
|
Log.info("HELP");
|
||||||
Log.info(" %s", "help");
|
Log.info(" %s", "help");
|
||||||
Log.info(" %s", "info");
|
Log.info(" %s", "info");
|
||||||
Log.info(" %s", "restart");
|
Log.info(" %s", "restart");
|
||||||
} else if (strcmp(message, "info") == 0) {
|
} else if (messageStr.equals("info")) {
|
||||||
Log.info("INFO");
|
Log.info("INFO");
|
||||||
Log.info(" %-10s %s", "SSID:", WiFi.SSID().c_str());
|
Log.info(" %-10s %s", "SSID:", WiFi.SSID().c_str());
|
||||||
Log.info(" %-10s %s", "IP:", WiFi.localIP().toString().c_str());
|
Log.info(" %-10s %s", "IP:", WiFi.localIP().toString().c_str());
|
||||||
Log.info(" %-10s %d", "RSSI:", WiFi.RSSI());
|
Log.info(" %-10s %d", "RSSI:", WiFi.RSSI());
|
||||||
Log.info(" %-10s %s", "uptime:", uptimeString().c_str());
|
Log.info(" %-10s %s", "uptime:", uptimeString().c_str());
|
||||||
} else if (strcmp(message, "restart") == 0) {
|
} else if (messageStr.equals("restart")) {
|
||||||
systemRequestRestart();
|
systemRequestRestart();
|
||||||
|
} else {
|
||||||
|
Log.warn("Unknown node command: %s", messageStr.c_str());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
mqttReceive(topicStr, messageStr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -49,7 +54,7 @@ void mqttLoop() {
|
|||||||
yield();
|
yield();
|
||||||
mqttPublish(logTopic, "connected\n");
|
mqttPublish(logTopic, "connected\n");
|
||||||
mqtt.setCallback(mqttCallback);
|
mqtt.setCallback(mqttCallback);
|
||||||
mqtt.subscribe(cmdTopic.c_str());
|
mqtt.subscribe("/cmd/#");
|
||||||
Log.info("MQTT connected as \"%s\".", HOSTNAME);
|
Log.info("MQTT connected as \"%s\".", HOSTNAME);
|
||||||
mqttFailureMillis = 0;
|
mqttFailureMillis = 0;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -50,6 +50,8 @@ void mqttPublishValue(const String& name, const String& value, const char* unit)
|
|||||||
|
|
||||||
void mqttPublish(const String& topic, const String& payload);
|
void mqttPublish(const String& topic, const String& payload);
|
||||||
|
|
||||||
|
void mqttReceive(const String& topic, const String& payload);
|
||||||
|
|
||||||
class LogClass final : public Stream {
|
class LogClass final : public Stream {
|
||||||
|
|
||||||
PubSubClient& mqtt;
|
PubSubClient& mqtt;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user