diff --git a/src/hasp/hasp_dispatch.cpp b/src/hasp/hasp_dispatch.cpp index 548b37b5..efa1df6a 100644 --- a/src/hasp/hasp_dispatch.cpp +++ b/src/hasp/hasp_dispatch.cpp @@ -882,6 +882,41 @@ void dispatch_current_state() /******************************************* Command Wrapper Functions *********************************/ +// Periodically publish a JSON string indicating system status +void dispatch_send_discovery(const char*, const char*) +{ +#if HASP_USE_MQTT > 0 + + char data[512]; + { + char buffer[128]; + + haspGetVersion(buffer, sizeof(buffer)); + snprintf_P(data, sizeof(data), + PSTR("{\"node\":\"%s\",\"manufacturer\":\"" D_MANUFACTURER + "\",\"model\":\"%s\",\"hwid\":\"%s\",\"version\":\"%s\",\"numPages\":%u}"), + haspDevice.get_hostname(), haspDevice.get_model(), haspDevice.get_hardware_id(), buffer, + haspPages.count()); + } + + switch(mqtt_send_discovery(data)) { + case MQTT_ERR_OK: + LOG_TRACE(TAG_MQTT_PUB, F("discovery => %s"), data); + break; + case MQTT_ERR_PUB_FAIL: + LOG_ERROR(TAG_MQTT_PUB, F(D_MQTT_FAILED " discovery => %s"), data); + break; + case MQTT_ERR_NO_CONN: + LOG_ERROR(TAG_MQTT, F(D_MQTT_NOT_CONNECTED)); + break; + default: + LOG_ERROR(TAG_MQTT, F(D_ERROR_UNKNOWN)); + } + dispatchLastMillis = millis(); + +#endif +} + // Periodically publish a JSON string indicating system status void dispatch_output_statusupdate(const char*, const char*) { @@ -1016,6 +1051,7 @@ void dispatchEverySecond() if(dispatch_setings.teleperiod > 0 && (millis() - dispatchLastMillis) >= dispatch_setings.teleperiod * 1000) { dispatchLastMillis += dispatch_setings.teleperiod * 1000; dispatch_output_statusupdate(NULL, NULL); + dispatch_send_discovery(NULL, NULL); } } #else diff --git a/src/mqtt/hasp_mqtt.h b/src/mqtt/hasp_mqtt.h index 29fe1434..f5111f71 100644 --- a/src/mqtt/hasp_mqtt.h +++ b/src/mqtt/hasp_mqtt.h @@ -30,6 +30,7 @@ void mqttStop(); int mqtt_send_object_state(uint8_t pageid, uint8_t btnid, const char* payload); int mqtt_send_state(const char* subtopic, const char* payload); +int mqtt_send_discovery(const char* payload); int mqttPublish(const char* topic, const char* payload, size_t len, bool retain); bool mqttIsConnected(); diff --git a/src/mqtt/hasp_mqtt_pubsubclient.cpp b/src/mqtt/hasp_mqtt_pubsubclient.cpp index 17eaa93f..be4caf4c 100644 --- a/src/mqtt/hasp_mqtt_pubsubclient.cpp +++ b/src/mqtt/hasp_mqtt_pubsubclient.cpp @@ -148,6 +148,13 @@ int mqtt_send_state(const char* subtopic, const char* payload) return mqttPublish(tmp_topic, payload, false); } +int mqtt_send_discovery(const char* payload) +{ + char tmp_topic[20]; + snprintf_P(tmp_topic, sizeof(tmp_topic), PSTR(MQTT_PREFIX "/discovery")); + return mqttPublish(tmp_topic, payload, false); +} + //////////////////////////////////////////////////////////////////////////////////////////////////// // Receive incoming messages static void mqtt_message_cb(char* topic, byte* payload, unsigned int length)