#include "HADiscovery.h" #include HADiscovery::HADiscovery(const char *topic_prefix, std::function publish_callback) : topic_prefix(topic_prefix), publish_callback(publish_callback) { } void HADiscovery::publish(const Shade &shade) { publishCoverDiscoveryTopic(shade); publishBatteryDiscoveryTopic(shade); publishRefreshButtonDiscoveryTopic(shade); } void HADiscovery::addDeviceObject(JsonDocument &doc, const Shade &shade) { std::stringstream ss; ss << "hotdog-" << std::hex << shade.ID; std::string deviceID = ss.str(); JsonObject device = doc["device"].to(); device["name"] = shade.friendlyName; JsonArray identifiers = device["identifiers"].to(); identifiers.add(deviceID); device["manufacturer"] = "Hunter Douglas"; // TODO: Add fields like sw_version and model } void HADiscovery::publishCoverDiscoveryTopic(const Shade &shade) { std::stringstream ss; ss << std::hex << shade.ID; std::string objectID = ss.str(); std::string entityID = "cover-" + objectID; JsonDocument doc; doc["name"] = nullptr; doc["unique_id"] = entityID; doc["availability_topic"] = std::string(topic_prefix) + "availability"; doc["state_topic"] = std::string(topic_prefix) + shade.key + "/state"; doc["command_topic"] = std::string(topic_prefix) + shade.key + "/command"; doc["position_topic"] = std::string(topic_prefix) + shade.key + "/position"; doc["set_position_topic"] = std::string(topic_prefix) + shade.key + "/set_position"; doc["position_open"] = 100; doc["position_closed"] = 0; doc["optimistic"] = false; addDeviceObject(doc, shade); serializeJson(doc, jsonBuffer); publish_callback(("homeassistant/cover/" + objectID + "/config").c_str(), jsonBuffer); } void HADiscovery::publishBatteryDiscoveryTopic(const Shade &shade) { std::stringstream ss; ss << std::hex << shade.ID; std::string objectID = ss.str(); std::string entityID = "battery-" + objectID; JsonDocument doc; doc["name"] = "Battery"; doc["unique_id"] = entityID; doc["availability_topic"] = std::string(topic_prefix) + "availability"; doc["device_class"] = "battery"; doc["state_topic"] = std::string(topic_prefix) + shade.key + "/battery"; addDeviceObject(doc, shade); serializeJson(doc, jsonBuffer); publish_callback(("homeassistant/sensor/" + objectID + "/config").c_str(), jsonBuffer); } void HADiscovery::publishRefreshButtonDiscoveryTopic(const Shade &shade) { std::stringstream ss; ss << std::hex << shade.ID; std::string objectID = ss.str(); std::string entityID = "refresh-button-" + objectID; JsonDocument doc; doc["name"] = "Refresh"; doc["unique_id"] = entityID; doc["availability_topic"] = std::string(topic_prefix) + "availability"; doc["command_topic"] = std::string(topic_prefix) + shade.key + "/command"; doc["payload_press"] = "REFRESH"; addDeviceObject(doc, shade); serializeJson(doc, jsonBuffer); publish_callback(("homeassistant/button/" + objectID + "/config").c_str(), jsonBuffer); }