Extract Home Assistant discovery logic
This commit is contained in:
101
lib/ha_discovery/HADiscovery.cpp
Normal file
101
lib/ha_discovery/HADiscovery.cpp
Normal file
@@ -0,0 +1,101 @@
|
||||
#include "HADiscovery.h"
|
||||
#include <sstream>
|
||||
|
||||
HADiscovery::HADiscovery(const char *topic_prefix, std::function<void(const char*, const char*)> 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<JsonObject>();
|
||||
device["name"] = shade.friendlyName;
|
||||
JsonArray identifiers = device["identifiers"].to<JsonArray>();
|
||||
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);
|
||||
}
|
||||
Reference in New Issue
Block a user