2018-09-28 23:53:51 +02:00
|
|
|
/*
|
|
|
|
* MQTT communication protocol for home automation
|
|
|
|
*/
|
|
|
|
|
2018-09-30 20:24:57 +02:00
|
|
|
void parseMQTTBriPayload(char* payload)
|
|
|
|
{
|
2019-04-14 19:31:25 +02:00
|
|
|
if (strstr(payload, "ON") || strstr(payload, "on") || strstr(payload, "true")) {bri = briLast; colorUpdated(1);}
|
2019-03-27 21:31:59 +01:00
|
|
|
else if (strstr(payload, "T" ) || strstr(payload, "t" )) {toggleOnOff(); colorUpdated(1);}
|
2018-09-30 20:24:57 +02:00
|
|
|
else {
|
|
|
|
uint8_t in = strtoul(payload, NULL, 10);
|
|
|
|
if (in == 0 && bri > 0) briLast = bri;
|
|
|
|
bri = in;
|
2018-09-28 23:53:51 +02:00
|
|
|
colorUpdated(1);
|
|
|
|
}
|
2018-09-30 20:24:57 +02:00
|
|
|
}
|
|
|
|
|
2018-11-09 17:00:36 +01:00
|
|
|
|
2019-02-17 19:21:09 +01:00
|
|
|
void onMqttConnect(bool sessionPresent)
|
|
|
|
{
|
|
|
|
//(re)subscribe to required topics
|
|
|
|
char subuf[38];
|
2019-08-17 12:27:06 +02:00
|
|
|
|
2019-02-17 19:21:09 +01:00
|
|
|
if (mqttDeviceTopic[0] != 0)
|
|
|
|
{
|
|
|
|
strcpy(subuf, mqttDeviceTopic);
|
|
|
|
mqtt->subscribe(subuf, 0);
|
|
|
|
strcat(subuf, "/col");
|
|
|
|
mqtt->subscribe(subuf, 0);
|
|
|
|
strcpy(subuf, mqttDeviceTopic);
|
|
|
|
strcat(subuf, "/api");
|
|
|
|
mqtt->subscribe(subuf, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (mqttGroupTopic[0] != 0)
|
|
|
|
{
|
|
|
|
strcpy(subuf, mqttGroupTopic);
|
|
|
|
mqtt->subscribe(subuf, 0);
|
|
|
|
strcat(subuf, "/col");
|
|
|
|
mqtt->subscribe(subuf, 0);
|
|
|
|
strcpy(subuf, mqttGroupTopic);
|
|
|
|
strcat(subuf, "/api");
|
|
|
|
mqtt->subscribe(subuf, 0);
|
|
|
|
}
|
2019-03-18 17:23:39 +01:00
|
|
|
|
2019-10-25 00:14:58 +02:00
|
|
|
doPublishMqtt = true;
|
2019-10-18 23:47:11 +02:00
|
|
|
DEBUG_PRINTLN("MQTT ready");
|
2019-02-17 19:21:09 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void onMqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties properties, size_t len, size_t index, size_t total) {
|
2018-09-30 20:24:57 +02:00
|
|
|
|
2019-10-20 17:38:25 +02:00
|
|
|
DEBUG_PRINT("MQTT msg: ");
|
2018-09-30 20:24:57 +02:00
|
|
|
DEBUG_PRINTLN(topic);
|
2019-02-17 19:21:09 +01:00
|
|
|
DEBUG_PRINTLN(payload);
|
2018-09-30 20:24:57 +02:00
|
|
|
|
|
|
|
//no need to check the topic because we only get topics we are subscribed to
|
|
|
|
|
|
|
|
if (strstr(topic, "/col"))
|
2018-09-28 23:53:51 +02:00
|
|
|
{
|
2019-02-05 21:53:39 +01:00
|
|
|
colorFromDecOrHexString(col, (char*)payload);
|
2018-09-28 23:53:51 +02:00
|
|
|
colorUpdated(1);
|
2018-09-30 20:24:57 +02:00
|
|
|
} else if (strstr(topic, "/api"))
|
2018-09-28 23:53:51 +02:00
|
|
|
{
|
2018-10-04 16:50:12 +02:00
|
|
|
String apireq = "win&";
|
2018-10-04 18:17:01 +02:00
|
|
|
apireq += (char*)payload;
|
2019-02-16 00:21:22 +01:00
|
|
|
handleSet(nullptr, apireq);
|
2019-02-17 19:21:09 +01:00
|
|
|
} else parseMQTTBriPayload(payload);
|
2018-09-28 23:53:51 +02:00
|
|
|
}
|
|
|
|
|
2018-11-09 17:00:36 +01:00
|
|
|
|
2019-02-17 19:21:09 +01:00
|
|
|
void publishMqtt()
|
2018-09-28 23:53:51 +02:00
|
|
|
{
|
2019-10-20 17:38:25 +02:00
|
|
|
doPublishMqtt = false;
|
2019-10-18 23:47:11 +02:00
|
|
|
if (mqtt == nullptr || !mqtt->connected()) return;
|
2018-09-30 20:24:57 +02:00
|
|
|
DEBUG_PRINTLN("Publish MQTT");
|
2018-09-28 23:53:51 +02:00
|
|
|
|
2018-10-04 16:50:12 +02:00
|
|
|
char s[10];
|
|
|
|
char subuf[38];
|
2019-08-17 12:27:06 +02:00
|
|
|
|
2018-10-04 16:50:12 +02:00
|
|
|
sprintf(s, "%ld", bri);
|
|
|
|
strcpy(subuf, mqttDeviceTopic);
|
|
|
|
strcat(subuf, "/g");
|
2019-02-17 19:21:09 +01:00
|
|
|
mqtt->publish(subuf, 0, true, s);
|
2018-10-04 16:50:12 +02:00
|
|
|
|
2019-11-18 12:29:36 +01:00
|
|
|
sprintf(s, "#%06X", (col[3] << 24) | (col[0] << 16) | (col[1] << 8) | (col[2]));
|
2018-10-04 16:50:12 +02:00
|
|
|
strcpy(subuf, mqttDeviceTopic);
|
|
|
|
strcat(subuf, "/c");
|
2019-02-17 19:21:09 +01:00
|
|
|
mqtt->publish(subuf, 0, true, s);
|
2018-10-04 16:50:12 +02:00
|
|
|
|
2019-11-10 22:13:07 +01:00
|
|
|
strcpy(subuf, mqttDeviceTopic);
|
|
|
|
strcat(subuf, "/status");
|
|
|
|
mqtt->publish(subuf, 0, true, "online");
|
|
|
|
|
2019-03-16 02:09:37 +01:00
|
|
|
char apires[1024];
|
2019-12-04 02:01:47 +01:00
|
|
|
XML_response(nullptr, apires);
|
2018-10-04 16:50:12 +02:00
|
|
|
strcpy(subuf, mqttDeviceTopic);
|
|
|
|
strcat(subuf, "/v");
|
2019-03-16 02:09:37 +01:00
|
|
|
mqtt->publish(subuf, 0, true, apires);
|
2018-09-28 23:53:51 +02:00
|
|
|
}
|
|
|
|
|
2019-03-24 00:49:26 +01:00
|
|
|
|
2019-12-04 02:01:47 +01:00
|
|
|
//HA autodiscovery was removed in favor of the native integration in HA v0.102.0
|
2018-11-09 17:00:36 +01:00
|
|
|
|
2019-02-17 19:21:09 +01:00
|
|
|
bool initMqtt()
|
2018-09-28 23:53:51 +02:00
|
|
|
{
|
2019-10-18 23:47:11 +02:00
|
|
|
lastMqttReconnectAttempt = millis();
|
2019-10-18 14:06:07 +02:00
|
|
|
if (mqttServer[0] == 0 || !WLED_CONNECTED) return false;
|
|
|
|
|
2019-10-20 12:48:29 +02:00
|
|
|
if (mqtt == nullptr) {
|
|
|
|
mqtt = new AsyncMqttClient();
|
|
|
|
mqtt->onMessage(onMqttMessage);
|
|
|
|
mqtt->onConnect(onMqttConnect);
|
|
|
|
}
|
2019-05-21 18:50:56 +02:00
|
|
|
if (mqtt->connected()) return true;
|
2019-08-17 12:27:06 +02:00
|
|
|
|
2019-10-18 23:47:11 +02:00
|
|
|
DEBUG_PRINTLN("Reconnecting MQTT");
|
2018-09-28 23:53:51 +02:00
|
|
|
IPAddress mqttIP;
|
|
|
|
if (mqttIP.fromString(mqttServer)) //see if server is IP or domain
|
|
|
|
{
|
2019-08-18 18:14:17 +02:00
|
|
|
mqtt->setServer(mqttIP, mqttPort);
|
2018-09-28 23:53:51 +02:00
|
|
|
} else {
|
2019-08-18 18:14:17 +02:00
|
|
|
mqtt->setServer(mqttServer, mqttPort);
|
2018-09-28 23:53:51 +02:00
|
|
|
}
|
2019-08-17 12:27:06 +02:00
|
|
|
mqtt->setClientId(mqttClientID);
|
2019-10-18 23:47:11 +02:00
|
|
|
if (mqttUser[0] && mqttPass[0]) mqtt->setCredentials(mqttUser, mqttPass);
|
2019-11-10 22:13:07 +01:00
|
|
|
|
|
|
|
strcpy(mqttStatusTopic, mqttDeviceTopic);
|
|
|
|
strcat(mqttStatusTopic, "/status");
|
|
|
|
mqtt->setWill(mqttStatusTopic, 0, true, "offline");
|
2019-02-17 19:21:09 +01:00
|
|
|
mqtt->connect();
|
2018-09-28 23:53:51 +02:00
|
|
|
return true;
|
|
|
|
}
|