espleaf/src/mqtt.cpp

79 lines
2.6 KiB
C++

#include "mqtt.h"
#include "tools.h"
#include "prototypes.h"
#include "state.h"
void connect() {
LOGln("Connecting to MQTT broker...");
if (mqtt.connect(MQTT_CLIENT_ID, MQTT_USER, MQTT_PASS, MQTT_TOPIC "available", 0, true, "offline")) {
LOGln("Connected.");
mqtt.publish(MQTT_TOPIC "available", "online", true);
char buffer[40];
snprintf(buffer, 40, "online %s", wifi.localIP().toString().c_str());
mqtt.publish(MQTT_TOPIC "available_long", buffer, true);
mqtt.subscribe(MQTT_TOPIC "cmnd");
String discovery_msg = "{"
"\"~\":\"" MQTT_TOPIC "\",\"avty_t\":\"~available\",\"cmd_t\":\"~cmnd\",\"stat_t\":\"~state\","
"\"name\":\"ESPleaf\",\"schema\":\"json\","
"\"brightness\":true,\"bri_scl\":255,"
"\"effect\":true,\"effect_list\":[\"off\",\"corners\",\"nodes\",\"flash\",\"static\"],"
"\"rgb\":true}";
mqtt.publish("homeassistant/light/" HOMEASSISTANT_OBJECT_ID "/config", discovery_msg.c_str(), true);
} else {
LOGln("Connection failed. Reason: %d", mqtt.state());
delay(1000);
}
}
void callback(char* topic, byte* pl, unsigned int length) {
pl[length] = 0;
State s;
if (pl[0]=='{') {
s.parse_json((char*)pl);
} else {
String payload((char*)pl);
// Syntax: key=value&key2=value2...
String current_part;
LOGln("Received command %s", payload.c_str());
while (payload.length() > 0) {
int offset = payload.indexOf("&");
if (offset != -1) {
current_part = payload.substring(0, offset);
payload = payload.substring(offset + 1);
} else {
current_part = payload;
payload = "";
}
offset = current_part.indexOf("=");
if (offset==-1) {
LOGln("Parameter without '=' detected: %s", current_part.c_str());
continue;
}
String key = current_part.substring(0, offset);
String value = current_part.substring(offset+1);
s.set(key, value);
}
}
s.commit();
}
void mqtt_setup() {
mqtt.setServer(MQTT_SERVER, MQTT_SERVER_PORT);
mqtt.setCallback(callback);
mqtt.setSocketTimeout(1);
mqtt.setBufferSize(400);
connect();
}
void mqtt_loop() {
if (!mqtt.connected()) {
LOGln("MQTT disconnected. Reason: %d", mqtt.state());
connect();
}
mqtt.loop();
}
void mqtt_publish_current_state(String state) {
mqtt.publish(MQTT_TOPIC "state", state.c_str(), true);
};