minor refactor moving scheduler item list loading once

This commit is contained in:
proddy
2024-01-26 23:01:44 +01:00
parent e319f5e270
commit 34cafe0d4d
2 changed files with 32 additions and 20 deletions

View File

@@ -17,6 +17,7 @@
*/ */
#include "emsesp.h" #include "emsesp.h"
#include "WebSchedulerService.h"
namespace emsesp { namespace emsesp {
@@ -30,6 +31,13 @@ WebSchedulerService::WebSchedulerService(AsyncWebServer * server, FS * fs, Secur
// load the settings when the service starts // load the settings when the service starts
void WebSchedulerService::begin() { void WebSchedulerService::begin() {
_fsPersistence.readFromFS(); _fsPersistence.readFromFS();
// save a local pointer to the scheduler item list
EMSESP::webSchedulerService.read([&](WebScheduler & webScheduler) {
//
scheduleItems_ = &webScheduler.scheduleItems;
});
EMSESP::logger().info("Starting Scheduler service"); EMSESP::logger().info("Starting Scheduler service");
Mqtt::subscribe(EMSdevice::DeviceType::SCHEDULER, "scheduler/#", nullptr); // use empty function callback Mqtt::subscribe(EMSdevice::DeviceType::SCHEDULER, "scheduler/#", nullptr); // use empty function callback
} }
@@ -92,7 +100,9 @@ StateUpdateResult WebScheduler::update(JsonObject root, WebScheduler & webSchedu
} }
} }
} }
EMSESP::webSchedulerService.publish(true); EMSESP::webSchedulerService.publish(true);
return StateUpdateResult::CHANGED; return StateUpdateResult::CHANGED;
} }
@@ -103,17 +113,19 @@ bool WebSchedulerService::command_setvalue(const char * value, const std::string
return false; return false;
} }
EMSESP::webSchedulerService.read([&](WebScheduler & webScheduler) { scheduleItems = &webScheduler.scheduleItems; }); for (ScheduleItem & scheduleItem : *scheduleItems_) {
for (ScheduleItem & scheduleItem : *scheduleItems) {
if (scheduleItem.name == name) { if (scheduleItem.name == name) {
if (scheduleItem.active == v) { if (scheduleItem.active == v) {
return true; return true;
} }
scheduleItem.active = v; scheduleItem.active = v;
publish_single(name.c_str(), v); publish_single(name.c_str(), v);
if (EMSESP::mqtt_.get_publish_onchange(0)) { if (EMSESP::mqtt_.get_publish_onchange(0)) {
publish(); publish();
} }
return true; return true;
} }
} }
@@ -122,25 +134,26 @@ bool WebSchedulerService::command_setvalue(const char * value, const std::string
// process json output for info/commands and value_info // process json output for info/commands and value_info
bool WebSchedulerService::get_value_info(JsonObject output, const char * cmd) { bool WebSchedulerService::get_value_info(JsonObject output, const char * cmd) {
EMSESP::webSchedulerService.read([&](WebScheduler & webScheduler) { scheduleItems = &webScheduler.scheduleItems; });
if (Helpers::toLower(cmd) == F_(commands)) { if (Helpers::toLower(cmd) == F_(commands)) {
output[F_(info)] = Helpers::translated_word(FL_(info_cmd)); output[F_(info)] = Helpers::translated_word(FL_(info_cmd));
output[F_(commands)] = Helpers::translated_word(FL_(commands_cmd)); output[F_(commands)] = Helpers::translated_word(FL_(commands_cmd));
for (const ScheduleItem & scheduleItem : *scheduleItems) {
for (const ScheduleItem & scheduleItem : *scheduleItems_) {
if (!scheduleItem.name.empty()) { if (!scheduleItem.name.empty()) {
output[scheduleItem.name] = "activate schedule"; output[scheduleItem.name] = "activate schedule";
} }
} }
return true; return true;
} }
if (scheduleItems->size() == 0) { if (scheduleItems_->size() == 0) {
return true; return true;
} }
if (strlen(cmd) == 0 || Helpers::toLower(cmd) == F_(values) || Helpers::toLower(cmd) == F_(info)) { if (strlen(cmd) == 0 || Helpers::toLower(cmd) == F_(values) || Helpers::toLower(cmd) == F_(info)) {
// list all names // list all names
for (const ScheduleItem & scheduleItem : *scheduleItems) { for (const ScheduleItem & scheduleItem : *scheduleItems_) {
if (!scheduleItem.name.empty()) { if (!scheduleItem.name.empty()) {
if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) { if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) {
output[scheduleItem.name] = scheduleItem.active; output[scheduleItem.name] = scheduleItem.active;
@@ -152,6 +165,7 @@ bool WebSchedulerService::get_value_info(JsonObject output, const char * cmd) {
} }
} }
} }
return (output.size() > 0); return (output.size() > 0);
} }
@@ -166,7 +180,7 @@ bool WebSchedulerService::get_value_info(JsonObject output, const char * cmd) {
attribute_s = breakp + 1; attribute_s = breakp + 1;
} }
for (const ScheduleItem & scheduleItem : *scheduleItems) { for (const ScheduleItem & scheduleItem : *scheduleItems_) {
if (Helpers::toLower(scheduleItem.name) == Helpers::toLower(command_s)) { if (Helpers::toLower(scheduleItem.name) == Helpers::toLower(command_s)) {
output["name"] = scheduleItem.name; output["name"] = scheduleItem.name;
output["type"] = "boolean"; output["type"] = "boolean";
@@ -227,20 +241,19 @@ void WebSchedulerService::publish(const bool force) {
return; return;
} }
EMSESP::webSchedulerService.read([&](WebScheduler & webScheduler) { scheduleItems = &webScheduler.scheduleItems; }); if (scheduleItems_->size() == 0) {
if (scheduleItems->size() == 0) {
return; return;
} }
if (Mqtt::publish_single() && force) { if (Mqtt::publish_single() && force) {
for (const ScheduleItem & scheduleItem : *scheduleItems) { for (const ScheduleItem & scheduleItem : *scheduleItems_) {
publish_single(scheduleItem.name.c_str(), scheduleItem.active); publish_single(scheduleItem.name.c_str(), scheduleItem.active);
} }
} }
JsonDocument doc; JsonDocument doc;
bool ha_created = ha_registered_; bool ha_created = ha_registered_;
for (const ScheduleItem & scheduleItem : *scheduleItems) { for (const ScheduleItem & scheduleItem : *scheduleItems_) {
if (!scheduleItem.name.empty() && !doc.containsKey(scheduleItem.name)) { if (!scheduleItem.name.empty() && !doc.containsKey(scheduleItem.name)) {
if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) { if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) {
doc[scheduleItem.name] = scheduleItem.active; doc[scheduleItem.name] = scheduleItem.active;
@@ -303,16 +316,16 @@ void WebSchedulerService::publish(const bool force) {
} }
bool WebSchedulerService::has_commands() { bool WebSchedulerService::has_commands() {
EMSESP::webSchedulerService.read([&](WebScheduler & webScheduler) { scheduleItems = &webScheduler.scheduleItems; }); if (scheduleItems_->size() == 0) {
if (scheduleItems->size() == 0) {
return false; return false;
} }
for (const ScheduleItem & scheduleItem : *scheduleItems) { for (const ScheduleItem & scheduleItem : *scheduleItems_) {
if (!scheduleItem.name.empty()) { if (!scheduleItem.name.empty()) {
return true; return true;
} }
} }
return false; return false;
} }
@@ -364,14 +377,13 @@ void WebSchedulerService::loop() {
static uint32_t last_uptime_min = 0; static uint32_t last_uptime_min = 0;
// get list of scheduler events and exit if it's empty // get list of scheduler events and exit if it's empty
EMSESP::webSchedulerService.read([&](WebScheduler & webScheduler) { scheduleItems = &webScheduler.scheduleItems; }); if (scheduleItems_->size() == 0) {
if (scheduleItems->size() == 0) {
return; return;
} }
// check startup commands // check startup commands
if (last_tm_min == -1) { if (last_tm_min == -1) {
for (ScheduleItem & scheduleItem : *scheduleItems) { for (ScheduleItem & scheduleItem : *scheduleItems_) {
if (scheduleItem.active && scheduleItem.flags == SCHEDULEFLAG_SCHEDULE_TIMER && scheduleItem.elapsed_min == 0) { if (scheduleItem.active && scheduleItem.flags == SCHEDULEFLAG_SCHEDULE_TIMER && scheduleItem.elapsed_min == 0) {
scheduleItem.retry_cnt = command(scheduleItem.cmd.c_str(), scheduleItem.value.c_str()) ? 0xFF : 0; scheduleItem.retry_cnt = command(scheduleItem.cmd.c_str(), scheduleItem.value.c_str()) ? 0xFF : 0;
} }
@@ -382,7 +394,7 @@ void WebSchedulerService::loop() {
// check timer every minute, sync to EMS-ESP clock // check timer every minute, sync to EMS-ESP clock
uint32_t uptime_min = uuid::get_uptime_sec() / 60; uint32_t uptime_min = uuid::get_uptime_sec() / 60;
if (last_uptime_min != uptime_min) { if (last_uptime_min != uptime_min) {
for (ScheduleItem & scheduleItem : *scheduleItems) { for (ScheduleItem & scheduleItem : *scheduleItems_) {
// retry startup commands not yet executed // retry startup commands not yet executed
if (scheduleItem.active && scheduleItem.flags == SCHEDULEFLAG_SCHEDULE_TIMER && scheduleItem.elapsed_min == 0 if (scheduleItem.active && scheduleItem.flags == SCHEDULEFLAG_SCHEDULE_TIMER && scheduleItem.elapsed_min == 0
&& scheduleItem.retry_cnt < MAX_STARTUP_RETRIES) { && scheduleItem.retry_cnt < MAX_STARTUP_RETRIES) {
@@ -405,7 +417,7 @@ void WebSchedulerService::loop() {
uint8_t real_dow = 1 << tm->tm_wday; // 1 is Sunday uint8_t real_dow = 1 << tm->tm_wday; // 1 is Sunday
uint16_t real_min = tm->tm_hour * 60 + tm->tm_min; uint16_t real_min = tm->tm_hour * 60 + tm->tm_min;
for (const ScheduleItem & scheduleItem : *scheduleItems) { for (const ScheduleItem & scheduleItem : *scheduleItems_) {
if (scheduleItem.active && (real_dow & scheduleItem.flags) && real_min == scheduleItem.elapsed_min) { if (scheduleItem.active && (real_dow & scheduleItem.flags) && real_min == scheduleItem.elapsed_min) {
command(scheduleItem.cmd.c_str(), scheduleItem.value.c_str()); command(scheduleItem.cmd.c_str(), scheduleItem.value.c_str());
} }

View File

@@ -75,7 +75,7 @@ class WebSchedulerService : public StatefulService<WebScheduler> {
HttpEndpoint<WebScheduler> _httpEndpoint; HttpEndpoint<WebScheduler> _httpEndpoint;
FSPersistence<WebScheduler> _fsPersistence; FSPersistence<WebScheduler> _fsPersistence;
std::list<ScheduleItem> * scheduleItems; // pointer to the list of schedule events std::list<ScheduleItem> * scheduleItems_; // pointer to the list of schedule events
bool ha_registered_ = false; bool ha_registered_ = false;
}; };