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) #define HASP_USE_MQTT (HASP_HAS_NETWORK)
#endif #endif
#ifndef HASP_USE_BROADCAST
#define HASP_USE_BROADCAST 1
#endif
#ifndef MQTT_NODENAME #ifndef MQTT_NODENAME
#define MQTT_NODENAME "plate" #define MQTT_NODENAME "plate"
#endif #endif

View File

@ -39,6 +39,8 @@ bool mqttGetConfig(const JsonObject& settings);
bool mqttSetConfig(const JsonObject& settings); bool mqttSetConfig(const JsonObject& settings);
#endif #endif
#define HASP_TOPIC_COMMAND "command"
// #ifndef WINDOWS // #ifndef WINDOWS
// String mqttGetNodename(void); // String mqttGetNodename(void);
// #endif // #endif

View File

@ -187,13 +187,13 @@ void mqtt_ha_register_backlight()
// start from static keys and values that do not change // start from static keys and values that do not change
deserializeJson(doc, F("{" deserializeJson(doc, F("{"
"\"cmd_t\":\"~command/light\"," "\"cmd_t\":\"~" HASP_TOPIC_COMMAND "/light\","
"\"stat_t\":\"~state/light\"," "\"stat_t\":\"~state/light\","
"\"pl_on\":\"on\"," "\"pl_on\":\"on\","
"\"pl_off\":\"off\"," "\"pl_off\":\"off\","
"\"avty_t\":\"~LWT\"," "\"avty_t\":\"~LWT\","
"\"bri_stat_t\":\"~state/dim\"," "\"bri_stat_t\":\"~state/dim\","
"\"bri_cmd_t\":\"~command/dim\"," "\"bri_cmd_t\":\"~" HASP_TOPIC_COMMAND "/dim\","
"\"bri_scl\":100}")); "\"bri_scl\":100}"));
mqtt_ha_add_device_ids(doc); mqtt_ha_add_device_ids(doc);
mqtt_ha_add_unique_id(doc, item); 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 // start from static keys and values that do not change
deserializeJson(doc, F("{" deserializeJson(doc, F("{"
"\"cmd_t\":\"~command/moodlight\"," "\"cmd_t\":\"~" HASP_TOPIC_COMMAND "/moodlight\","
"\"stat_t\":\"~state/moodlight\"," "\"stat_t\":\"~state/moodlight\","
"\"platform\":\"mqtt\"," "\"platform\":\"mqtt\","
"\"schema\":\"json\"," "\"schema\":\"json\","
@ -273,7 +273,8 @@ void mqtt_ha_register_activepage()
snprintf_P(item, sizeof(item), PSTR("page")); snprintf_P(item, sizeof(item), PSTR("page"));
// start from static keys and values that do not change // 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_device_ids(doc);
mqtt_ha_add_unique_id(doc, item); mqtt_ha_add_unique_id(doc, item);

View File

@ -254,8 +254,8 @@ void onConnect(void* context, MQTTAsync_successData* response)
printf("Successful connection\n"); printf("Successful connection\n");
mqtt_subscribe(context, TOPIC "command/#"); mqtt_subscribe(context, TOPIC HASP_TOPIC_COMMAND "/#");
mqtt_subscribe(context, TOPIC "command"); mqtt_subscribe(context, TOPIC HASP_TOPIC_COMMAND);
mqtt_subscribe(context, TOPIC "light"); mqtt_subscribe(context, TOPIC "light");
mqtt_subscribe(context, TOPIC "dim"); 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 // Group topic
topic += mqttGroupTopic.length(); // shorten topic topic += mqttGroupTopic.length(); // shorten topic
dispatch_topic_payload(topic, (const char*)payload); dispatch_topic_payload(topic, (const char*)payload, length > 0);
return; 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 #ifdef HASP_USE_HA
} else if(topic == strstr_P(topic, PSTR("homeassistant/status"))) { // HA discovery topic } else if(topic == strstr_P(topic, PSTR("homeassistant/status"))) { // HA discovery topic
if(mqttHAautodiscover && !strcasecmp_P((char*)payload, PSTR("online"))) { 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")); // LOG_TRACE(TAG_MQTT, F("ignoring LWT = online"));
} }
} else { } 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()); 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()); mqtt_subscribe(mqtt_client, topic.c_str());
topic = mqttNodeTopic + "command/#"; topic = mqttNodeTopic + HASP_TOPIC_COMMAND "/#";
mqtt_subscribe(mqtt_client, topic.c_str()); mqtt_subscribe(mqtt_client, topic.c_str());
topic = mqttGroupTopic + "config/#"; topic = mqttGroupTopic + "config/#";
@ -281,6 +290,11 @@ static void onConnect(void* context)
topic = mqttNodeTopic + "config/#"; topic = mqttNodeTopic + "config/#";
mqtt_subscribe(mqtt_client, topic.c_str()); 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 */ /* Home Assistant auto-configuration */
#ifdef HASP_USE_HA #ifdef HASP_USE_HA
topic = "homeassistant/status"; topic = "homeassistant/status";

View File

@ -184,9 +184,18 @@ static void mqtt_message_cb(char* topic, byte* payload, unsigned int length)
// Group topic // Group topic
topic += strlen(mqttGroupTopic); // shorten topic topic += strlen(mqttGroupTopic); // shorten topic
dispatch_topic_payload(topic, (const char*)payload); dispatch_topic_payload(topic, (const char*)payload, length > 0);
return; 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 #ifdef HASP_USE_HA
} else if(topic == strstr_P(topic, PSTR("homeassistant/status"))) { // HA discovery topic } else if(topic == strstr_P(topic, PSTR("homeassistant/status"))) { // HA discovery topic
if(mqttHAautodiscover && !strcasecmp_P((char*)payload, PSTR("online"))) { 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 // catch a dangling LWT from a previous connection if it appears
if(!strcmp_P(topic, PSTR(LWT_TOPIC))) { // endsWith LWT /* if(!strcmp_P(topic, PSTR(LWT_TOPIC))) { // endsWith LWT
if(!strcasecmp_P((char*)payload, PSTR("offline"))) { if(!strcasecmp_P((char*)payload, PSTR("offline"))) {
{ {
char msg[8]; char msg[8];
char tmp_topic[strlen(mqttNodeTopic) + 8]; char tmp_topic[strlen(mqttNodeTopic) + 8];
snprintf_P(tmp_topic, sizeof(tmp_topic), PSTR("%s" LWT_TOPIC), mqttNodeTopic); snprintf_P(tmp_topic, sizeof(tmp_topic), PSTR("%s" LWT_TOPIC), mqttNodeTopic);
snprintf_P(msg, sizeof(msg), PSTR("online")); snprintf_P(msg, sizeof(msg), PSTR("online"));
// /*bool res =*/mqttClient.publish(tmp_topic, msg, true); // bool res =
mqttPublish(tmp_topic, msg, true); mqttClient.publish(tmp_topic, msg, true);
} mqttPublish(tmp_topic, msg, true);
}
} else { }
// LOG_TRACE(TAG_MQTT, F("ignoring LWT = online")); else
} {
} else { // LOG_TRACE(TAG_MQTT, F("ignoring LWT = online"));
dispatch_topic_payload(topic, (const char*)payload); }
}
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)]; if(mqttClient.subscribe(topic)) {
snprintf_P(tmp_topic, sizeof(tmp_topic), (PGM_P)format, data); LOG_VERBOSE(TAG_MQTT, F(D_BULLET D_MQTT_SUBSCRIBED), topic);
if(mqttClient.subscribe(tmp_topic)) {
LOG_VERBOSE(TAG_MQTT, F(D_BULLET D_MQTT_SUBSCRIBED), tmp_topic);
} else { } 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); LOG_INFO(TAG_MQTT, F(D_MQTT_CONNECTED), mqttServer, mqttClientId);
// Subscribe to our incoming topics // Subscribe to our incoming topics
const __FlashStringHelper* F_topic; char topic[64];
F_topic = F("%scommand/#"); snprintf_P(topic, sizeof(topic), PSTR("%s" HASP_TOPIC_COMMAND "/#"), mqttGroupTopic);
mqttSubscribeTo(F_topic, mqttGroupTopic); mqttSubscribeTo(topic);
mqttSubscribeTo(F_topic, mqttNodeTopic); snprintf_P(topic, sizeof(topic), PSTR("%s" HASP_TOPIC_COMMAND "/#"), mqttNodeTopic);
mqttSubscribeTo(topic);
// F_topic = F("%sconfig/#"); // F_topic = F("%sconfig/#");
// mqttSubscribeTo(F_topic, mqttGroupTopic); // mqttSubscribeTo(F_topic, mqttGroupTopic);
// mqttSubscribeTo(F_topic, mqttNodeTopic);
// mqttSubscribeTo(F("%slight/#"), mqttNodeTopic);
// mqttSubscribeTo(F("%sbrightness/#"), mqttNodeTopic);
// mqttSubscribeTo(F("%s"LWT_TOPIC), 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 */ /* Home Assistant auto-configuration */
#ifdef HASP_USE_HA #ifdef HASP_USE_HA
if(mqttHAautodiscover) mqttSubscribeTo(F("hass/status"), mqttClientId); if(mqttHAautodiscover) mqttSubscribeTo(F("hass/status"), mqttClientId);