diff --git a/lib/framework/MqttPubSub.h b/lib/framework/MqttPubSub.h index c3ed3f14..795c30f2 100644 --- a/lib/framework/MqttPubSub.h +++ b/lib/framework/MqttPubSub.h @@ -33,16 +33,34 @@ class MqttPub : virtual public MqttConnector { StatefulService* statefulService, AsyncMqttClient* mqttClient, const String& pubTopic = "", - size_t bufferSize = DEFAULT_BUFFER_SIZE) : - MqttConnector(statefulService, mqttClient, bufferSize), _stateReader(stateReader), _pubTopic(pubTopic) { + size_t bufferSize = DEFAULT_BUFFER_SIZE, + const bool retain = false) : + MqttConnector(statefulService, mqttClient, bufferSize), + _stateReader(stateReader), + _pubTopic(pubTopic), + _retain(retain) { MqttConnector::_statefulService->addUpdateHandler([&](const String& originId) { publish(); }, false); } + void setRetain(bool retain) { + _retain = retain; + } + void setPubTopic(const String& pubTopic) { _pubTopic = pubTopic; publish(); } + void publish(const char* topic, const char* payload){ + MqttConnector::_mqttClient->publish(topic, 0, _retain, payload); + } + void publish(const char* topic, const char* payload, bool retain){ + MqttConnector::_mqttClient->publish(topic, 0, retain, payload); + } + void publish(const char* topic, const char* payload, bool retain, uint8_t qos){ + MqttConnector::_mqttClient->publish(topic, qos, retain, payload); + } + protected: virtual void onConnect() { publish(); @@ -51,6 +69,7 @@ class MqttPub : virtual public MqttConnector { private: JsonStateReader _stateReader; String _pubTopic; + bool _retain; void publish() { if (_pubTopic.length() > 0 && MqttConnector::_mqttClient->connected()) { @@ -64,7 +83,7 @@ class MqttPub : virtual public MqttConnector { serializeJson(json, payload); // publish the payload - MqttConnector::_mqttClient->publish(_pubTopic.c_str(), 0, false, payload.c_str()); + MqttConnector::_mqttClient->publish(_pubTopic.c_str(), 0, _retain, payload.c_str()); } } }; @@ -145,17 +164,44 @@ class MqttPubSub : public MqttPub, public MqttSub { AsyncMqttClient* mqttClient, const String& pubTopic = "", const String& subTopic = "", - size_t bufferSize = DEFAULT_BUFFER_SIZE) : + size_t bufferSize = DEFAULT_BUFFER_SIZE, + const bool retain = false) : MqttConnector(statefulService, mqttClient, bufferSize), - MqttPub(stateReader, statefulService, mqttClient, pubTopic, bufferSize), + MqttPub(stateReader, statefulService, mqttClient, pubTopic, bufferSize, retain), MqttSub(stateUpdater, statefulService, mqttClient, subTopic, bufferSize) { } + MqttPubSub(JsonStateReader stateReader, + JsonStateUpdater stateUpdater, + StatefulService* statefulService, + AsyncMqttClient* mqttClient, + const bool retain = false) : + MqttConnector(statefulService, mqttClient, DEFAULT_BUFFER_SIZE), + MqttPub(stateReader, statefulService, mqttClient, "", DEFAULT_BUFFER_SIZE, retain), + MqttSub(stateUpdater, statefulService, mqttClient, "", DEFAULT_BUFFER_SIZE) { + } public: void configureTopics(const String& pubTopic, const String& subTopic) { MqttSub::setSubTopic(subTopic); MqttPub::setPubTopic(pubTopic); } + void configureTopics(const String& pubTopic, const String& subTopic, const bool retain) { + MqttSub::setSubTopic(subTopic); + MqttPub::setPubTopic(pubTopic); + MqttPub::setRetain(retain); + } + void configureRetain(bool retain) { + MqttPub::setRetain(retain); + } + void publish(const char* topic, const char* payload) { + MqttPub::publish(topic, payload); + } + void publish(const char* topic, const char* payload, bool retain) { + MqttPub::publish(topic, payload, retain); + } + void publish(const char* topic, const char* payload, bool retain, uint8_t qos) { + MqttPub::publish(topic, payload, retain, qos); + } protected: void onConnect() { diff --git a/src/LightStateService.cpp b/src/LightStateService.cpp index 81696222..99d0d47b 100644 --- a/src/LightStateService.cpp +++ b/src/LightStateService.cpp @@ -11,7 +11,7 @@ LightStateService::LightStateService(AsyncWebServer* server, LIGHT_SETTINGS_ENDPOINT_PATH, securityManager, AuthenticationPredicates::IS_AUTHENTICATED), - _mqttPubSub(LightState::haRead, LightState::haUpdate, this, mqttClient), + _mqttPubSub(LightState::haRead, LightState::haUpdate, this, mqttClient, true), _webSocket(LightState::read, LightState::update, this, @@ -67,7 +67,8 @@ void LightStateService::registerConfig() { String payload; serializeJson(doc, payload); - _mqttClient->publish(configTopic.c_str(), 0, false, payload.c_str()); + + _mqttPubSub.publish(configTopic.c_str(), payload.c_str()); _mqttPubSub.configureTopics(pubTopic, subTopic); }