Allow Home Assistant to discover the blinds
This commit is contained in:
68
src/main.cpp
68
src/main.cpp
@@ -46,9 +46,12 @@ void startFetchingPosition(uint16_t shadeID, int8_t targetPosition);
|
|||||||
void publishPosition(const String& shadeName, const uint8_t position);
|
void publishPosition(const String& shadeName, const uint8_t position);
|
||||||
void publishState(const String& shadeName, const String& state);
|
void publishState(const String& shadeName, const String& state);
|
||||||
|
|
||||||
|
void publishDiscoveryTopics();
|
||||||
|
|
||||||
struct Shade {
|
struct Shade {
|
||||||
uint16_t ID;
|
uint16_t ID;
|
||||||
String name;
|
String name;
|
||||||
|
String friendlyName;
|
||||||
int8_t lastTargetPosition;
|
int8_t lastTargetPosition;
|
||||||
int8_t lastPosition;
|
int8_t lastPosition;
|
||||||
uint8_t samePositionCount;
|
uint8_t samePositionCount;
|
||||||
@@ -63,21 +66,21 @@ void setup() {
|
|||||||
|
|
||||||
Serial.println("Starting up");
|
Serial.println("Starting up");
|
||||||
|
|
||||||
shades.push_back(Shade{0x4EF1, "study_blind", -1, -1, 0, 0, nullptr});
|
shades.push_back(Shade{0x4EF1, "study_blind", "Study Blind", -1, -1, 0, 0, nullptr});
|
||||||
shades.push_back(Shade{0xA51F, "studio_blockout_left_blind", -1, -1, 0, 0, nullptr});
|
shades.push_back(Shade{0xA51F, "studio_blockout_left_blind", "Studio Blockout Left Blind", -1, -1, 0, 0, nullptr});
|
||||||
shades.push_back(Shade{0xDAEF, "studio_blockout_right_blind", -1, -1, 0, 0, nullptr});
|
shades.push_back(Shade{0xDAEF, "studio_blockout_right_blind", "Studio Blockout Right Blind", -1, -1, 0, 0, nullptr});
|
||||||
shades.push_back(Shade{0x7687, "studio_left_blind", -1, -1, 0, 0, nullptr});
|
shades.push_back(Shade{0x7687, "studio_left_blind", "Studio Left Blind", -1, -1, 0, 0, nullptr});
|
||||||
shades.push_back(Shade{0xB0DE, "studio_right_blind", -1, -1, 0, 0, nullptr});
|
shades.push_back(Shade{0xB0DE, "studio_right_blind", "Studio Right Blind", -1, -1, 0, 0, nullptr});
|
||||||
shades.push_back(Shade{0xB451, "bedroom_door_blockout_blind", -1, -1, 0, 0, nullptr});
|
shades.push_back(Shade{0xB451, "bedroom_door_blockout_blind", "Bedroom Door Blockout Blind", -1, -1, 0, 0, nullptr});
|
||||||
shades.push_back(Shade{0x48A6, "bedroom_window_blockout_blind", -1, -1, 0, 0, nullptr});
|
shades.push_back(Shade{0x48A6, "bedroom_window_blockout_blind", "Bedroom Window Blockout Blind", -1, -1, 0, 0, nullptr});
|
||||||
shades.push_back(Shade{0x9E14, "bedroom_door_blind", -1, -1, 0, 0, nullptr});
|
shades.push_back(Shade{0x9E14, "bedroom_door_blind", "Bedroom Door Blind", -1, -1, 0, 0, nullptr});
|
||||||
shades.push_back(Shade{0x061C, "bedroom_window_blind", -1, -1, 0, 0, nullptr});
|
shades.push_back(Shade{0x061C, "bedroom_window_blind", "Bedroom Window Blind", -1, -1, 0, 0, nullptr});
|
||||||
shades.push_back(Shade{0x2959, "bathroom_blind", -1, -1, 0, 0, nullptr});
|
shades.push_back(Shade{0x2959, "bathroom_blind", "Bathroom Blind", -1, -1, 0, 0, nullptr});
|
||||||
shades.push_back(Shade{0x6FAD, "kitchen_door_blind", -1, -1, 0, 0, nullptr});
|
shades.push_back(Shade{0x6FAD, "kitchen_door_blind", "Kitchen Door Blind", -1, -1, 0, 0, nullptr});
|
||||||
shades.push_back(Shade{0xFB21, "kitchen_window_blind", -1, -1, 0, 0, nullptr});
|
shades.push_back(Shade{0xFB21, "kitchen_window_blind", "Kitchen Window Blind", -1, -1, 0, 0, nullptr});
|
||||||
shades.push_back(Shade{0x8B10, "living_room_big_window_blind", -1, -1, 0, 0, nullptr});
|
shades.push_back(Shade{0x8B10, "living_room_big_window_blind", "Living Room Big Window Blind", -1, -1, 0, 0, nullptr});
|
||||||
shades.push_back(Shade{0x3EB8, "living_room_door_blind", -1, -1, 0, 0, nullptr});
|
shades.push_back(Shade{0x3EB8, "living_room_door_blind", "Living Room Door Blind", -1, -1, 0, 0, nullptr});
|
||||||
shades.push_back(Shade{0x5463, "living_room_window_blind", -1, -1, 0, 0, nullptr});
|
shades.push_back(Shade{0x5463, "living_room_window_blind", "Living Room Window Blind", -1, -1, 0, 0, nullptr});
|
||||||
|
|
||||||
powerView.setPacketCallback(processPacket);
|
powerView.setPacketCallback(processPacket);
|
||||||
if (!powerView.begin()) {
|
if (!powerView.begin()) {
|
||||||
@@ -88,6 +91,7 @@ void setup() {
|
|||||||
client.setKeepAlive(10);
|
client.setKeepAlive(10);
|
||||||
client.enableLastWillMessage("hotdog/availability", "offline", true);
|
client.enableLastWillMessage("hotdog/availability", "offline", true);
|
||||||
client.enableDebuggingMessages();
|
client.enableDebuggingMessages();
|
||||||
|
client.setMaxPacketSize(2048);
|
||||||
|
|
||||||
delay(100);
|
delay(100);
|
||||||
Serial.println("Ready");
|
Serial.println("Ready");
|
||||||
@@ -140,6 +144,14 @@ void onConnectionEstablished() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
client.publish("hotdog/availability", "online", true);
|
client.publish("hotdog/availability", "online", true);
|
||||||
|
|
||||||
|
publishDiscoveryTopics();
|
||||||
|
|
||||||
|
client.subscribe("homeassistant/status", [] (const String& topic, const String& message) {
|
||||||
|
if (message == "online") {
|
||||||
|
publishDiscoveryTopics();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
bool sendOpenPacket(uint16_t destination) {
|
bool sendOpenPacket(uint16_t destination) {
|
||||||
@@ -317,3 +329,29 @@ void publishState(const String& shadeName, const String& state) {
|
|||||||
void publishPosition(const String& shadeName, const uint8_t position) {
|
void publishPosition(const String& shadeName, const uint8_t position) {
|
||||||
client.publish("hotdog/" + shadeName + "/position", String(position), true);
|
client.publish("hotdog/" + shadeName + "/position", String(position), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void publishDiscoveryTopics() {
|
||||||
|
char buffer[1024];
|
||||||
|
|
||||||
|
for (size_t i = 0; i < shades.size(); i++) {
|
||||||
|
Shade shade = shades[i];
|
||||||
|
String objectID = String(shade.ID, HEX);
|
||||||
|
|
||||||
|
JsonDocument doc;
|
||||||
|
|
||||||
|
doc["name"] = shade.friendlyName;
|
||||||
|
doc["unique_id"] = objectID;
|
||||||
|
doc["availability_topic"] = "hotdog/availability";
|
||||||
|
doc["state_topic"] = "hotdog/" + shade.name + "/state";
|
||||||
|
doc["command_topic"] = "hotdog/" + shade.name + "/set";
|
||||||
|
doc["position_topic"] = "hotdog/" + shade.name + "/position";
|
||||||
|
doc["set_position_topic"] = "hotdog/" + shade.name + "/set_position";
|
||||||
|
doc["position_open"] = 100;
|
||||||
|
doc["position_closed"] = 0;
|
||||||
|
doc["optimistic"] = false;
|
||||||
|
|
||||||
|
serializeJson(doc, buffer);
|
||||||
|
|
||||||
|
client.publish("homeassistant/cover/" + objectID + "/config", buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user