#pragma once #include #include #include "ha.h" #define MQTT_HOST IPAddress(192, 168, 5, 11) #define MQTT_PORT 1883 namespace Mqtt { AsyncMqttClient client; void publishInit(); void publishBme280(); void disconnect(); Task tReConnect(5 * TASK_MINUTE, TASK_FOREVER, []() { Serial.println("Connecting to MQTT..."); client.connect(); }, &ts); Task tPublishInit(TASK_IMMEDIATE, TASK_ONCE, publishInit, &ts); const char* mainTopic = "homeassistant/+/rc-gateway/#"; void disconnect() { client.unsubscribe(mainTopic); client.disconnect(); } uint16_t publish(const char* topic, const char* message) { return client.publish(topic, 0, true, message); } Ha::Sensor* sensors[] = { // new Ha::TemperatureSensor{"Temperature", "temperature"}, // new Ha::HumiditySensor{"Humidity", "humidity"}, // new Ha::PressureSensor{"Pressure", "pressure"}, // new Ha::AltitudeSensor{"Altitude", "altitude"} }; Ha::Button* buttons[] = { new Ha::Button{"Restart", "restart", [](const char* msg) { if (String { "PRESS" }.equals(msg)) ESP.restart(); } } }; Ha::Switch* switches[] = { (new Ha::PollinSwitch{"Meeting sensor", "00001", 1})->withArea("Dining room")->withStateTopic(), (new Ha::PollinSwitch{"Fire Tv", "00001", 2})->withArea("Living room")->withStateTopic(), (new Ha::PollinSwitch{"Diningroom player", "00001", 3})->withArea("Dining room")->withStateTopic(), (new Ha::PollinSwitch{"Train", "11111", 4})->withArea("Playroom")->withStateTopic(), (new Ha::EasyHomeSwitch{"FritzBox", "easy_home_a", (unsigned long[4]) { 4483136, 4626800, 4661552, 4819632 }, (unsigned long[4]) { 4326544, 4537104, 4767520, 4972704 }})->withArea("Basement")->withStateTopic(), (new Ha::EasyHomeSwitch{"Outside", "easy_home_b", (unsigned long[4]) { 4483140, 4626804, 4661556, 4819636 }, (unsigned long[4]) { 4326548, 4537108, 4767524, 4972708 }})->withArea("Basement")->withStateTopic() }; void publishComponentConfig(Ha::Component& component) { StaticJsonDocument jsonDoc; component.buildConfig(jsonDoc); char message[JSON_SIZE]; serializeJson(jsonDoc, message); publish(component.configTopic, message); } void publishInit() { // for (Ha::Component* cmp : sensors) { // publishComponentConfig(*cmp); // } Ha::publisher = publish; for (Ha::Component* cmp : buttons) { publishComponentConfig(*cmp); } for (Ha::Switch* cmp : switches) { cmp->addToMap(); publishComponentConfig(*cmp); } ts.deleteTask(tPublishInit); } void publishBme280() { // StaticJsonDocument<255> jsonDoc; // jsonDoc["temperature"] = Bme::data.temp; // jsonDoc["humidity"] = Bme::data.humidity; // jsonDoc["pressure"] = Bme::data.pressure; // jsonDoc["altitude"] = Bme::data.altitude; // char message[255]; // serializeJson(jsonDoc, message); // publish(Ha::Sensor::stateTopic, message); } void onMessage(char* topic, char* payload, AsyncMqttClientMessageProperties properties, size_t len, size_t index, size_t total) { char msg[len + 1]; memcpy(msg, payload, len); msg[len] = 0; for (Ha::Button* cmd : buttons) { if (String{ cmd->commandTopic }.equals(topic) && cmd->f != nullptr) { cmd->f(msg); return; } } for (Ha::Switch* cmd : switches) { if (String{ cmd->commandTopic }.equals(topic)) { cmd->onCommand(msg); return; } } } void setup() { client.onConnect([](bool sessionPresent) { tPublishInit.enable(); client.subscribe(mainTopic, 0); tReConnect.disable(); Serial.println("Connected to MQTT"); }); client.onDisconnect([](AsyncMqttClientDisconnectReason reason) { tReConnect.enableDelayed(); Serial.println("Disconnected from MQTT"); }); client.onMessage(onMessage); client.setServer(MQTT_HOST, MQTT_PORT); } }