diff --git a/src/core/analogsensor.cpp b/src/core/analogsensor.cpp index c9c914a25..e2e94fb81 100644 --- a/src/core/analogsensor.cpp +++ b/src/core/analogsensor.cpp @@ -664,13 +664,18 @@ void AnalogSensor::remove_ha_topic(const int8_t type, const uint8_t gpio) const void AnalogSensor::publish_values(const bool force) { uint8_t num_sensors = sensors_.size(); - if (num_sensors == 0) { + if (!Mqtt::connected() || num_sensors == 0) { return; } - if (force && Mqtt::publish_single()) { - for (const auto & sensor : sensors_) { - publish_sensor(sensor); + if (force) { + if (Mqtt::publish_single()) { + for (const auto & sensor : sensors_) { + publish_sensor(sensor); + } + return; + } else if (!EMSESP::mqtt_.get_publish_onchange(0)) { + return; // wait for first time periode } } diff --git a/src/core/mqtt.cpp b/src/core/mqtt.cpp index f5400cc3e..4a8c6cc36 100644 --- a/src/core/mqtt.cpp +++ b/src/core/mqtt.cpp @@ -511,6 +511,11 @@ void Mqtt::on_connect() { // send initial MQTT messages for some of our services EMSESP::system_.send_heartbeat(); // send heartbeat + // for publish on change publish the initial complete list + EMSESP::webCustomEntityService.publish(true); + EMSESP::webSchedulerService.publish(true); + EMSESP::analogsensor_.publish_values(true); + EMSESP::temperaturesensor_.publish_values(true); } // Home Assistant Discovery - the main master Device called EMS-ESP diff --git a/src/core/temperaturesensor.cpp b/src/core/temperaturesensor.cpp index 0e82e5666..cc9e757eb 100644 --- a/src/core/temperaturesensor.cpp +++ b/src/core/temperaturesensor.cpp @@ -473,10 +473,15 @@ void TemperatureSensor::publish_values(const bool force) { return; } - if (force && Mqtt::publish_single()) { + if (force) { + if (Mqtt::publish_single()) { for (const auto & sensor : sensors_) { publish_sensor(sensor); } + return; + } else if (!EMSESP::mqtt_.get_publish_onchange(0)) { + return; // wait for first time periode + } } JsonDocument doc; diff --git a/src/web/WebCustomEntityService.cpp b/src/web/WebCustomEntityService.cpp index 482b021b3..ae76ae18f 100644 --- a/src/web/WebCustomEntityService.cpp +++ b/src/web/WebCustomEntityService.cpp @@ -378,10 +378,20 @@ void WebCustomEntityService::publish_single(CustomEntityItem & entity) { } // publish to Mqtt -void WebCustomEntityService::publish() { - if (!Mqtt::enabled() || customEntityItems_->empty()) { +void WebCustomEntityService::publish(const bool force) { + if (!Mqtt::connected() || customEntityItems_->empty()) { return; } + if (force) { + if (Mqtt::publish_single()) { + for (CustomEntityItem & entityItem : *customEntityItems_) { + publish_single(entityItem); + } + return; + } else if (!EMSESP::mqtt_.get_publish_onchange(0)) { + return; // wait for first time periode + } + } JsonDocument doc; JsonObject output = doc.to(); diff --git a/src/web/WebCustomEntityService.h b/src/web/WebCustomEntityService.h index 517d19c88..3302edd83 100644 --- a/src/web/WebCustomEntityService.h +++ b/src/web/WebCustomEntityService.h @@ -58,7 +58,7 @@ class WebCustomEntityService : public StatefulService { void begin(); void publish_single(CustomEntityItem & entity); - void publish(); + void publish(const bool force = false); bool command_setvalue(const char * value, const int8_t id, const char * name); bool get_value_info(JsonObject output, const char * cmd); void get_value_json(JsonObject output, CustomEntityItem const & entity); diff --git a/src/web/WebSchedulerService.cpp b/src/web/WebSchedulerService.cpp index c8af8f825..777ed9aca 100644 --- a/src/web/WebSchedulerService.cpp +++ b/src/web/WebSchedulerService.cpp @@ -105,10 +105,6 @@ StateUpdateResult WebScheduler::update(JsonObject root, WebScheduler & webSchedu CommandFlag::ADMIN_ONLY); } } - - EMSESP::webSchedulerService.ha_reset(); - EMSESP::webSchedulerService.publish(); - return StateUpdateResult::CHANGED; } @@ -217,17 +213,17 @@ void WebSchedulerService::publish_single(const char * name, const bool state) { // publish to Mqtt void WebSchedulerService::publish(const bool force) { - if (force) { - ha_configdone_ = false; - } - - if (!Mqtt::enabled() || scheduleItems_->empty()) { + if (!Mqtt::connected() || scheduleItems_->empty()) { return; } - - if (Mqtt::publish_single() && force) { - for (const ScheduleItem & scheduleItem : *scheduleItems_) { - publish_single(scheduleItem.name, scheduleItem.active); + if (force) { + if (Mqtt::publish_single()) { + for (const ScheduleItem & scheduleItem : *scheduleItems_) { + publish_single(scheduleItem.name, scheduleItem.active); + } + return; + } else if (!EMSESP::mqtt_.get_publish_onchange(0)) { + return; // wait for first time periode } }