mirror of
https://github.com/HASwitchPlate/openHASP.git
synced 2025-07-24 11:46:34 +00:00
Add HASP_TOPIC_COMMAND and HASP_USE_BROADCAST
This commit is contained in:
parent
90a6299279
commit
75f76a7f3e
@ -43,6 +43,10 @@
|
||||
#define HASP_USE_MQTT (HASP_HAS_NETWORK)
|
||||
#endif
|
||||
|
||||
#ifndef HASP_USE_BROADCAST
|
||||
#define HASP_USE_BROADCAST 1
|
||||
#endif
|
||||
|
||||
#ifndef MQTT_NODENAME
|
||||
#define MQTT_NODENAME "plate"
|
||||
#endif
|
||||
|
@ -39,6 +39,8 @@ bool mqttGetConfig(const JsonObject& settings);
|
||||
bool mqttSetConfig(const JsonObject& settings);
|
||||
#endif
|
||||
|
||||
#define HASP_TOPIC_COMMAND "command"
|
||||
|
||||
// #ifndef WINDOWS
|
||||
// String mqttGetNodename(void);
|
||||
// #endif
|
||||
|
@ -187,13 +187,13 @@ void mqtt_ha_register_backlight()
|
||||
|
||||
// start from static keys and values that do not change
|
||||
deserializeJson(doc, F("{"
|
||||
"\"cmd_t\":\"~command/light\","
|
||||
"\"cmd_t\":\"~" HASP_TOPIC_COMMAND "/light\","
|
||||
"\"stat_t\":\"~state/light\","
|
||||
"\"pl_on\":\"on\","
|
||||
"\"pl_off\":\"off\","
|
||||
"\"avty_t\":\"~LWT\","
|
||||
"\"bri_stat_t\":\"~state/dim\","
|
||||
"\"bri_cmd_t\":\"~command/dim\","
|
||||
"\"bri_cmd_t\":\"~" HASP_TOPIC_COMMAND "/dim\","
|
||||
"\"bri_scl\":100}"));
|
||||
mqtt_ha_add_device_ids(doc);
|
||||
mqtt_ha_add_unique_id(doc, item);
|
||||
@ -215,7 +215,7 @@ void mqtt_ha_register_moodlight()
|
||||
|
||||
// start from static keys and values that do not change
|
||||
deserializeJson(doc, F("{"
|
||||
"\"cmd_t\":\"~command/moodlight\","
|
||||
"\"cmd_t\":\"~" HASP_TOPIC_COMMAND "/moodlight\","
|
||||
"\"stat_t\":\"~state/moodlight\","
|
||||
"\"platform\":\"mqtt\","
|
||||
"\"schema\":\"json\","
|
||||
@ -273,7 +273,8 @@ void mqtt_ha_register_activepage()
|
||||
snprintf_P(item, sizeof(item), PSTR("page"));
|
||||
|
||||
// start from static keys and values that do not change
|
||||
deserializeJson(doc, F("{\"cmd_t\":\"~command/page\",\"stat_t\":\"~state/page\",\"avty_t\":\"~LWT\"}"));
|
||||
deserializeJson(doc,
|
||||
F("{\"cmd_t\":\"~" HASP_TOPIC_COMMAND "/page\",\"stat_t\":\"~state/page\",\"avty_t\":\"~LWT\"}"));
|
||||
mqtt_ha_add_device_ids(doc);
|
||||
mqtt_ha_add_unique_id(doc, item);
|
||||
|
||||
|
@ -254,8 +254,8 @@ void onConnect(void* context, MQTTAsync_successData* response)
|
||||
|
||||
printf("Successful connection\n");
|
||||
|
||||
mqtt_subscribe(context, TOPIC "command/#");
|
||||
mqtt_subscribe(context, TOPIC "command");
|
||||
mqtt_subscribe(context, TOPIC HASP_TOPIC_COMMAND "/#");
|
||||
mqtt_subscribe(context, TOPIC HASP_TOPIC_COMMAND);
|
||||
mqtt_subscribe(context, TOPIC "light");
|
||||
mqtt_subscribe(context, TOPIC "dim");
|
||||
|
||||
|
@ -139,9 +139,18 @@ static void mqtt_message_cb(char* topic, char* payload, size_t length)
|
||||
|
||||
// Group topic
|
||||
topic += mqttGroupTopic.length(); // shorten topic
|
||||
dispatch_topic_payload(topic, (const char*)payload);
|
||||
dispatch_topic_payload(topic, (const char*)payload, length > 0);
|
||||
return;
|
||||
|
||||
#ifdef HASP_USE_BROADCAST
|
||||
} else if(topic == strstr_P(topic, PSTR(MQTT_PREFIX "/broadcast/"))) { // broadcast discovery topic
|
||||
|
||||
// broadcast topic
|
||||
topic += strlen(MQTT_PREFIX "/broadcast/"); // shorten topic
|
||||
dispatch_topic_payload(topic, (const char*)payload, length > 0);
|
||||
return;
|
||||
#endif
|
||||
|
||||
#ifdef HASP_USE_HA
|
||||
} else if(topic == strstr_P(topic, PSTR("homeassistant/status"))) { // HA discovery topic
|
||||
if(mqttHAautodiscover && !strcasecmp_P((char*)payload, PSTR("online"))) {
|
||||
@ -170,7 +179,7 @@ static void mqtt_message_cb(char* topic, char* payload, size_t length)
|
||||
// LOG_TRACE(TAG_MQTT, F("ignoring LWT = online"));
|
||||
}
|
||||
} else {
|
||||
dispatch_topic_payload(topic, (const char*)payload);
|
||||
dispatch_topic_payload(topic, (const char*)payload, length > 0);
|
||||
}
|
||||
}
|
||||
|
||||
@ -269,10 +278,10 @@ static void onConnect(void* context)
|
||||
|
||||
LOG_VERBOSE(TAG_MQTT, D_MQTT_CONNECTED, mqttServer.c_str(), haspDevice.get_hostname());
|
||||
|
||||
topic = mqttGroupTopic + "command/#";
|
||||
topic = mqttGroupTopic + HASP_TOPIC_COMMAND "/#";
|
||||
mqtt_subscribe(mqtt_client, topic.c_str());
|
||||
|
||||
topic = mqttNodeTopic + "command/#";
|
||||
topic = mqttNodeTopic + HASP_TOPIC_COMMAND "/#";
|
||||
mqtt_subscribe(mqtt_client, topic.c_str());
|
||||
|
||||
topic = mqttGroupTopic + "config/#";
|
||||
@ -281,6 +290,11 @@ static void onConnect(void* context)
|
||||
topic = mqttNodeTopic + "config/#";
|
||||
mqtt_subscribe(mqtt_client, topic.c_str());
|
||||
|
||||
#ifdef HASP_USE_BROADCAST
|
||||
topic = MQTT_PREFIX "/broadcast/" HASP_TOPIC_COMMAND "/#";
|
||||
mqtt_subscribe(mqtt_client, topic.c_str());
|
||||
#endif
|
||||
|
||||
/* Home Assistant auto-configuration */
|
||||
#ifdef HASP_USE_HA
|
||||
topic = "homeassistant/status";
|
||||
|
@ -184,9 +184,18 @@ static void mqtt_message_cb(char* topic, byte* payload, unsigned int length)
|
||||
|
||||
// Group topic
|
||||
topic += strlen(mqttGroupTopic); // shorten topic
|
||||
dispatch_topic_payload(topic, (const char*)payload);
|
||||
dispatch_topic_payload(topic, (const char*)payload, length > 0);
|
||||
return;
|
||||
|
||||
#ifdef HASP_USE_BROADCAST
|
||||
} else if(topic == strstr_P(topic, PSTR(MQTT_PREFIX "/broadcast/"))) { // broadcast discovery topic
|
||||
|
||||
// Broadcast topic
|
||||
topic += strlen_P(PSTR(MQTT_PREFIX "/broadcast/")); // shorten topic
|
||||
dispatch_topic_payload(topic, (const char*)payload, length > 0);
|
||||
return;
|
||||
#endif
|
||||
|
||||
#ifdef HASP_USE_HA
|
||||
} else if(topic == strstr_P(topic, PSTR("homeassistant/status"))) { // HA discovery topic
|
||||
if(mqttHAautodiscover && !strcasecmp_P((char*)payload, PSTR("online"))) {
|
||||
@ -203,34 +212,36 @@ static void mqtt_message_cb(char* topic, byte* payload, unsigned int length)
|
||||
}
|
||||
|
||||
// catch a dangling LWT from a previous connection if it appears
|
||||
if(!strcmp_P(topic, PSTR(LWT_TOPIC))) { // endsWith LWT
|
||||
if(!strcasecmp_P((char*)payload, PSTR("offline"))) {
|
||||
{
|
||||
char msg[8];
|
||||
char tmp_topic[strlen(mqttNodeTopic) + 8];
|
||||
snprintf_P(tmp_topic, sizeof(tmp_topic), PSTR("%s" LWT_TOPIC), mqttNodeTopic);
|
||||
snprintf_P(msg, sizeof(msg), PSTR("online"));
|
||||
/* if(!strcmp_P(topic, PSTR(LWT_TOPIC))) { // endsWith LWT
|
||||
if(!strcasecmp_P((char*)payload, PSTR("offline"))) {
|
||||
{
|
||||
char msg[8];
|
||||
char tmp_topic[strlen(mqttNodeTopic) + 8];
|
||||
snprintf_P(tmp_topic, sizeof(tmp_topic), PSTR("%s" LWT_TOPIC), mqttNodeTopic);
|
||||
snprintf_P(msg, sizeof(msg), PSTR("online"));
|
||||
|
||||
// /*bool res =*/mqttClient.publish(tmp_topic, msg, true);
|
||||
mqttPublish(tmp_topic, msg, true);
|
||||
}
|
||||
|
||||
} else {
|
||||
// LOG_TRACE(TAG_MQTT, F("ignoring LWT = online"));
|
||||
}
|
||||
} else {
|
||||
dispatch_topic_payload(topic, (const char*)payload);
|
||||
// bool res =
|
||||
mqttClient.publish(tmp_topic, msg, true);
|
||||
mqttPublish(tmp_topic, msg, true);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// LOG_TRACE(TAG_MQTT, F("ignoring LWT = online"));
|
||||
}
|
||||
}
|
||||
else */
|
||||
{
|
||||
dispatch_topic_payload(topic, (const char*)payload, length > 0);
|
||||
}
|
||||
}
|
||||
|
||||
static void mqttSubscribeTo(const __FlashStringHelper* format, const char* data)
|
||||
static void mqttSubscribeTo(const char* topic)
|
||||
{
|
||||
char tmp_topic[strlen_P((PGM_P)format) + 2 + strlen(data)];
|
||||
snprintf_P(tmp_topic, sizeof(tmp_topic), (PGM_P)format, data);
|
||||
if(mqttClient.subscribe(tmp_topic)) {
|
||||
LOG_VERBOSE(TAG_MQTT, F(D_BULLET D_MQTT_SUBSCRIBED), tmp_topic);
|
||||
if(mqttClient.subscribe(topic)) {
|
||||
LOG_VERBOSE(TAG_MQTT, F(D_BULLET D_MQTT_SUBSCRIBED), topic);
|
||||
} else {
|
||||
LOG_ERROR(TAG_MQTT, F(D_MQTT_NOT_SUBSCRIBED), tmp_topic);
|
||||
LOG_ERROR(TAG_MQTT, F(D_MQTT_NOT_SUBSCRIBED), topic);
|
||||
}
|
||||
}
|
||||
|
||||
@ -308,17 +319,20 @@ void mqttStart()
|
||||
LOG_INFO(TAG_MQTT, F(D_MQTT_CONNECTED), mqttServer, mqttClientId);
|
||||
|
||||
// Subscribe to our incoming topics
|
||||
const __FlashStringHelper* F_topic;
|
||||
F_topic = F("%scommand/#");
|
||||
mqttSubscribeTo(F_topic, mqttGroupTopic);
|
||||
mqttSubscribeTo(F_topic, mqttNodeTopic);
|
||||
char topic[64];
|
||||
snprintf_P(topic, sizeof(topic), PSTR("%s" HASP_TOPIC_COMMAND "/#"), mqttGroupTopic);
|
||||
mqttSubscribeTo(topic);
|
||||
snprintf_P(topic, sizeof(topic), PSTR("%s" HASP_TOPIC_COMMAND "/#"), mqttNodeTopic);
|
||||
mqttSubscribeTo(topic);
|
||||
// F_topic = F("%sconfig/#");
|
||||
// mqttSubscribeTo(F_topic, mqttGroupTopic);
|
||||
// mqttSubscribeTo(F_topic, mqttNodeTopic);
|
||||
// mqttSubscribeTo(F("%slight/#"), mqttNodeTopic);
|
||||
// mqttSubscribeTo(F("%sbrightness/#"), mqttNodeTopic);
|
||||
// mqttSubscribeTo(F("%s"LWT_TOPIC), mqttNodeTopic);
|
||||
|
||||
#ifdef HASP_USE_BROADCAST
|
||||
snprintf_P(topic, sizeof(topic), PSTR(MQTT_PREFIX "/broadcast/" HASP_TOPIC_COMMAND "/#"));
|
||||
mqttSubscribeTo(topic);
|
||||
#endif
|
||||
|
||||
/* Home Assistant auto-configuration */
|
||||
#ifdef HASP_USE_HA
|
||||
if(mqttHAautodiscover) mqttSubscribeTo(F("hass/status"), mqttClientId);
|
||||
|
Loading…
x
Reference in New Issue
Block a user