|
|
#include <LightStateService.h>
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); }
|