From b575405a1c7df1d1915749081c66d3f8aa940002 Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Mon, 25 Jan 2021 23:48:19 +0100 Subject: [PATCH] Fix HA mqtt status online --- src/svc/hasp_mqtt.cpp | 16 ++++-- src/svc/hasp_mqtt_ha.cpp | 103 ++++++++++++++++++++++++++++++++++----- 2 files changed, 104 insertions(+), 15 deletions(-) diff --git a/src/svc/hasp_mqtt.cpp b/src/svc/hasp_mqtt.cpp index 73ebd3a9..b7357181 100644 --- a/src/svc/hasp_mqtt.cpp +++ b/src/svc/hasp_mqtt.cpp @@ -38,7 +38,8 @@ EthernetClient mqttNetworkClient; #include "hasp_config.h" #include "../hasp/hasp_dispatch.h" - #include "../hasp/hasp.h" + #include "../hasp/hasp.h" // for hasp_sleep_state +extern uint8_t hasp_sleep_state; #ifdef USE_CONFIG_OVERRIDE #include "user_config_override.h" @@ -114,6 +115,13 @@ static bool mqttPublish(const char * topic, const char * payload, bool retain = //////////////////////////////////////////////////////////////////////////////////////////////////// // Send changed values OUT +void mqtt_send_current_states() +{ + dispatch_output_current_page(); + dispatch_output_statusupdate(NULL, NULL); + dispatch_output_idle_state(hasp_sleep_state); +} + bool IRAM_ATTR mqttIsConnected() { return mqttEnabled && mqttClient.connected(); @@ -169,8 +177,9 @@ static void mqtt_message_cb(char * topic, byte * payload, unsigned int length) dispatch_topic_payload(topic, (const char *)payload); return; - } else if(topic == strstr_P(topic, PSTR("hass/status"))) { // HA discovery topic + } else if(topic == strstr_P(topic, PSTR("homeassistant/status"))) { // HA discovery topic if(mqttHAautodiscover && !strcasecmp_P((char *)payload, PSTR("online"))) { + mqtt_send_current_states(); mqtt_ha_send_backlight(); } return; @@ -310,8 +319,7 @@ void mqttStart() haspReconnect(); haspProgressVal(255); - dispatch_output_current_page(); - dispatch_output_statusupdate(NULL, NULL); + mqtt_send_current_states(); } void mqttSetup() diff --git a/src/svc/hasp_mqtt_ha.cpp b/src/svc/hasp_mqtt_ha.cpp index 20ecb536..89574243 100644 --- a/src/svc/hasp_mqtt_ha.cpp +++ b/src/svc/hasp_mqtt_ha.cpp @@ -7,6 +7,8 @@ #include "PubSubClient.h" + #include "hasp/hasp.h" + #include "hasp_hal.h" #include "hasp_mqtt.h" #include "hasp_mqtt_ha.h" @@ -21,20 +23,33 @@ extern bool mqttHAautodiscover; char discovery_prefix[] = "homeassistant"; +void mqtt_ha_add_device(DynamicJsonDocument & doc) +{ + JsonObject device = doc.createNestedObject(F("device")); + JsonArray ids = device.createNestedArray(F("ids")); + ids.add(mqttNodeName); + ids.add(halGetMacAddress(0, "")); + + char version[32]; + haspGetVersion(version, sizeof(version)); + device[F("sw")] = version; + + device[F("name")] = mqttNodeName; + device[F("mdl")] = F(PIOENV); + device[F("mf")] = F("hasp-lvgl"); + + doc["~"] = mqttNodeTopic; +} + void mqtt_ha_register_button(uint8_t page, uint8_t id) { char buffer[128]; DynamicJsonDocument doc(512); - JsonObject device = doc.createNestedObject("device"); - device["ids"] = "plate35_0123456"; - device["name"] = "plate35"; - device["mdl"] = "Lanbon L8"; - device["sw"] = "0.3.1"; - device["mf"] = "hasp-lvgl"; + mqtt_ha_add_device(doc); snprintf_P(buffer, sizeof(buffer), PSTR("p%db%d"), page, id); doc["stype"] = buffer; // subtype = "p0b0" - snprintf_P(buffer, sizeof(buffer), PSTR("%sp%db%d"), mqttNodeTopic, page, id); + snprintf_P(buffer, sizeof(buffer), PSTR("~state/p%db%d"), page, id); doc["t"] = buffer; // topic doc["atype"] = "trigger"; // automation_type @@ -49,6 +64,57 @@ void mqtt_ha_register_button(uint8_t page, uint8_t id) mqttClient.endPublish(); } +void mqtt_ha_register_switch(uint8_t page, uint8_t id) +{ + char buffer[128]; + DynamicJsonDocument doc(512); + mqtt_ha_add_device(doc); + + snprintf_P(buffer, sizeof(buffer), PSTR("p%db%d"), page, id); + doc["stype"] = buffer; // subtype = "p0b0" + snprintf_P(buffer, sizeof(buffer), PSTR("~state/p%db%d"), page, id); + doc["t"] = buffer; // topic + + doc["atype"] = "binary_sensor"; // automation_type + doc["pl"] = "SHORT"; // payload + doc["type"] = "button_short_release"; + + snprintf_P(buffer, sizeof(buffer), PSTR("%s/device_automation/%s/p%db%d_%s/config"), discovery_prefix, mqttNodeName, + page, id, "short"); + + mqttClient.beginPublish(buffer, measureJson(doc), RETAINED); + serializeJson(doc, mqttClient); + mqttClient.endPublish(); +} + +void mqtt_ha_register_connectivity() +{ + char buffer[128]; + DynamicJsonDocument doc(512); + mqtt_ha_add_device(doc); + + doc[F("device_class")] = F("connectivity"); + + snprintf_P(buffer, sizeof(buffer), PSTR("HASP %s %s"), mqttNodeName, doc[F("device_class")].as().c_str()); + doc[F("name")] = buffer; + + doc[F("stat_t")] = F("~LWT"); + doc[F("pl_on")] = F("online"); + doc[F("pl_off")] = F("offline"); + + doc[F("json_attr_t")] = F("~state/statusupdate"); + + snprintf_P(buffer, sizeof(buffer), PSTR("%s_%s"), mqttNodeName, doc[F("device_class")].as().c_str()); + doc[F("uniq_id")] = buffer; + + snprintf_P(buffer, sizeof(buffer), PSTR("%s/binary_sensor/%s/%s/config"), discovery_prefix, mqttNodeName, + doc[F("device_class")].as().c_str()); + + mqttClient.beginPublish(buffer, measureJson(doc), RETAINED); + serializeJson(doc, mqttClient); + mqttClient.endPublish(); +} + void mqtt_ha_send_backlight() { char component[20]; @@ -82,8 +148,7 @@ void mqtt_ha_send_backlight() "\"pl_on\":\"ON\"," "\"pl_off\":\"OFF\"" "}"), - device_id, mqttNodeName, HASP_VER_MAJ, HASP_VER_MIN, HASP_VER_REV, unique_id, - mqttNodeTopic); + device_id, mqttNodeName, HASP_VER_MAJ, HASP_VER_MIN, HASP_VER_REV, unique_id, mqttNodeTopic); mqttClient.publish(configtopic, payload, RETAINED); @@ -105,17 +170,33 @@ void mqtt_ha_send_backlight() "\"json_attr_t\":\"~state/statusupdate\"," "\"val_tpl\":\"{{ value | capitalize }}\"" "}"), - device_id, mqttNodeName, HASP_VER_MAJ, HASP_VER_MIN, HASP_VER_REV, unique_id, - mqttNodeTopic); + device_id, mqttNodeName, HASP_VER_MAJ, HASP_VER_MIN, HASP_VER_REV, unique_id, mqttNodeTopic); mqttClient.publish(configtopic, payload, RETAINED); mqtt_ha_register_button(0, 1); mqtt_ha_register_button(0, 2); + mqtt_ha_register_connectivity(); } #endif /* +name: 'HASP hasptest Connectivity' +state_topic: "hasp/hasptest/LWT" +payload_on: "online" +payload_off: "offline" +device_class: connectivity +json_attributes_topic: "hasp/hasptest/state/statusupdate" +unique_id: 'hasptest_connectivity' +device: + identifiers: + - 'hasptest' + name: 'HASP Test' + model: 'hasptest' + sw_version: 'v0.3.2' + manufacturer: hasp-lvgl + + { "device": {"ids": "plate_87546c", "name": "Test Switchplate", "mdl": "Lanbon L8", "sw": "v0.3.1", "mf": "hasp-lvgl"},