#include LightStateService::LightStateService(AsyncWebServer* server, SecurityManager* securityManager, AsyncMqttClient* mqttClient, LightMqttSettingsService* lightMqttSettingsService) : _httpEndpoint(LightState::read, LightState::update, this, server, LIGHT_SETTINGS_ENDPOINT_PATH, securityManager, AuthenticationPredicates::IS_AUTHENTICATED), _mqttPubSub(LightState::haRead, LightState::haUpdate, this, mqttClient), _webSocket(LightState::read, LightState::update, this, server, LIGHT_SETTINGS_SOCKET_PATH, securityManager, AuthenticationPredicates::IS_AUTHENTICATED), _mqttClient(mqttClient), _lightMqttSettingsService(lightMqttSettingsService) { // configure led to be output pinMode(LED_PIN, OUTPUT); // configure MQTT callback _mqttClient->onConnect(std::bind(&LightStateService::registerConfig, this)); // configure update handler for when the light settings change _lightMqttSettingsService->addUpdateHandler([&](const String& originId) { registerConfig(); }, false); // configure settings service update handler to update LED state addUpdateHandler([&](const String& originId) { onConfigUpdated(); }, false); } void LightStateService::begin() { _state.ledOn = DEFAULT_LED_STATE; onConfigUpdated(); } void LightStateService::onConfigUpdated() { digitalWrite(LED_PIN, _state.ledOn ? LED_ON : LED_OFF); } void LightStateService::registerConfig() { if (!_mqttClient->connected()) { return; } String configTopic; String subTopic; String pubTopic; DynamicJsonDocument doc(256); _lightMqttSettingsService->read([&](LightMqttSettings& settings) { configTopic = settings.mqttPath + "/config"; subTopic = settings.mqttPath + "/set"; pubTopic = settings.mqttPath + "/state"; doc["~"] = settings.mqttPath; doc["name"] = settings.name; doc["unique_id"] = settings.uniqueId; }); doc["cmd_t"] = "~/set"; doc["stat_t"] = "~/state"; doc["schema"] = "json"; doc["brightness"] = false; String payload; serializeJson(doc, payload); _mqttClient->publish(configTopic.c_str(), 0, false, payload.c_str()); _mqttPubSub.configureTopics(pubTopic, subTopic); }