Fork of the excellent esp8266-react - https://github.com/rjwats/esp8266-react
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
2.4 KiB
73 lines
2.4 KiB
#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);
|
|
}
|