Add HASP_TOPIC_COMMAND and HASP_USE_BROADCAST

This commit is contained in:
fvanroie 2021-05-07 00:37:42 +02:00
parent 90a6299279
commit 75f76a7f3e
6 changed files with 75 additions and 40 deletions

View File

@ -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

View File

@ -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

View File

@ -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);

View File

@ -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");

View File

@ -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";

View File

@ -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);