From 75f76a7f3e30f59b4cc52212757e1b87c825bd70 Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Fri, 7 May 2021 00:37:42 +0200 Subject: [PATCH] Add HASP_TOPIC_COMMAND and HASP_USE_BROADCAST --- include/hasp_conf.h | 4 ++ src/mqtt/hasp_mqtt.h | 2 + src/mqtt/hasp_mqtt_ha.cpp | 9 ++-- src/mqtt/hasp_mqtt_paho_async.cpp | 4 +- src/mqtt/hasp_mqtt_paho_single.cpp | 22 +++++++-- src/mqtt/hasp_mqtt_pubsubclient.cpp | 74 +++++++++++++++++------------ 6 files changed, 75 insertions(+), 40 deletions(-) diff --git a/include/hasp_conf.h b/include/hasp_conf.h index af8c8473..ba16d3b4 100644 --- a/include/hasp_conf.h +++ b/include/hasp_conf.h @@ -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 diff --git a/src/mqtt/hasp_mqtt.h b/src/mqtt/hasp_mqtt.h index 5c8b6f37..c341d9b4 100644 --- a/src/mqtt/hasp_mqtt.h +++ b/src/mqtt/hasp_mqtt.h @@ -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 diff --git a/src/mqtt/hasp_mqtt_ha.cpp b/src/mqtt/hasp_mqtt_ha.cpp index 35e035a1..02793e3c 100644 --- a/src/mqtt/hasp_mqtt_ha.cpp +++ b/src/mqtt/hasp_mqtt_ha.cpp @@ -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); diff --git a/src/mqtt/hasp_mqtt_paho_async.cpp b/src/mqtt/hasp_mqtt_paho_async.cpp index 323cb80d..e50f6df0 100644 --- a/src/mqtt/hasp_mqtt_paho_async.cpp +++ b/src/mqtt/hasp_mqtt_paho_async.cpp @@ -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"); diff --git a/src/mqtt/hasp_mqtt_paho_single.cpp b/src/mqtt/hasp_mqtt_paho_single.cpp index a05ae1a8..46069000 100644 --- a/src/mqtt/hasp_mqtt_paho_single.cpp +++ b/src/mqtt/hasp_mqtt_paho_single.cpp @@ -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"; diff --git a/src/mqtt/hasp_mqtt_pubsubclient.cpp b/src/mqtt/hasp_mqtt_pubsubclient.cpp index eb096a87..4b24efae 100644 --- a/src/mqtt/hasp_mqtt_pubsubclient.cpp +++ b/src/mqtt/hasp_mqtt_pubsubclient.cpp @@ -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);