From 179005f4cec55f67124ac06f3712acecefce6ef2 Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Wed, 4 Dec 2024 23:17:06 +0100 Subject: [PATCH] Extend Homeassistant discovery with button for flow start (#3415) * feat(homeassistant discovery): Add button for flow start * Update * Update * Allow Flow Start MQTT topic to have a zero-length payload * remove unused payload --------- Co-authored-by: Slider0007 --- code/components/jomjol_mqtt/interface_mqtt.cpp | 8 +------- code/components/jomjol_mqtt/server_mqtt.cpp | 13 ++++++++++--- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/code/components/jomjol_mqtt/interface_mqtt.cpp b/code/components/jomjol_mqtt/interface_mqtt.cpp index ced320f2..e970ac50 100644 --- a/code/components/jomjol_mqtt/interface_mqtt.cpp +++ b/code/components/jomjol_mqtt/interface_mqtt.cpp @@ -389,13 +389,7 @@ bool mqtt_handler_flow_start(std::string _topic, char* _data, int _data_len) { ESP_LOGD(TAG, "Handler called: topic %s, data %.*s", _topic.c_str(), _data_len, _data); - if (_data_len > 0) { - MQTTCtrlFlowStart(_topic); - } - else { - LogFile.WriteToFile(ESP_LOG_WARN, TAG, "handler_flow_start: handler called, but no data"); - } - + MQTTCtrlFlowStart(_topic); return ESP_OK; } diff --git a/code/components/jomjol_mqtt/server_mqtt.cpp b/code/components/jomjol_mqtt/server_mqtt.cpp index cf4b970e..d20c102c 100644 --- a/code/components/jomjol_mqtt/server_mqtt.cpp +++ b/code/components/jomjol_mqtt/server_mqtt.cpp @@ -86,9 +86,12 @@ bool sendHomeAssistantDiscoveryTopic(std::string group, std::string field, * This means a maintopic "home/test/watermeter" is transformed to the discovery topic "homeassistant/sensor/watermeter/..." */ std::string node_id = createNodeId(maintopic); - if (field == "problem") { // Special binary sensor which is based on error topic + if (field == "problem") { // Special case: Binary sensor which is based on error topic topicFull = "homeassistant/binary_sensor/" + node_id + "/" + configTopic + "/config"; } + else if (field == "flowstart") { // Special case: Button + topicFull = "homeassistant/button/" + node_id + "/" + configTopic + "/config"; + } else { topicFull = "homeassistant/sensor/" + node_id + "/" + configTopic + "/config"; } @@ -102,7 +105,7 @@ bool sendHomeAssistantDiscoveryTopic(std::string group, std::string field, "\"icon\": \"mdi:" + icon + "\","; if (group != "") { - if (field == "problem") { // Special binary sensor which is based on error topic + if (field == "problem") { // Special case: Binary sensor which is based on error topic payload += "\"state_topic\": \"~/" + group + "/error\","; payload += "\"value_template\": \"{{ 'OFF' if 'no error' in value else 'ON'}}\","; } @@ -111,10 +114,13 @@ bool sendHomeAssistantDiscoveryTopic(std::string group, std::string field, } } else { - if (field == "problem") { // Special binary sensor which is based on error topic + if (field == "problem") { // Special case: Binary sensor which is based on error topic payload += "\"state_topic\": \"~/error\","; payload += "\"value_template\": \"{{ 'OFF' if 'no error' in value else 'ON'}}\","; } + else if (field == "flowstart") { // Special case: Button + payload += "\"cmd_t\":\"~/ctrl/flow_start\","; // Add command topic + } else { payload += "\"state_topic\": \"~/" + field + "\","; } @@ -177,6 +183,7 @@ bool MQTThomeassistantDiscovery(int qos) { allSendsSuccessed |= sendHomeAssistantDiscoveryTopic("", "interval", "Interval", "clock-time-eight-outline", "min", "" , "measurement", "diagnostic", qos); allSendsSuccessed |= sendHomeAssistantDiscoveryTopic("", "IP", "IP", "network-outline", "", "", "", "diagnostic", qos); allSendsSuccessed |= sendHomeAssistantDiscoveryTopic("", "status", "Status", "list-status", "", "", "", "diagnostic", qos); + allSendsSuccessed |= sendHomeAssistantDiscoveryTopic("", "flowstart", "Manual Flow Start", "timer-play-outline", "", "", "", "", qos); for (int i = 0; i < (*NUMBERS).size(); ++i) {