Merge pull request #1825 from MichaelDvP/dev

Scheduler fixes and additions
This commit is contained in:
Proddy
2024-06-27 08:14:34 +01:00
committed by GitHub
4 changed files with 32 additions and 14 deletions

View File

@@ -53,7 +53,7 @@ const de: Translation = {
UPDATE_OF: '{0} Aktualisieren', UPDATE_OF: '{0} Aktualisieren',
REMOVED_OF: '{0} Entfernt', REMOVED_OF: '{0} Entfernt',
DELETION_OF: '{0} Löschung', DELETION_OF: '{0} Löschung',
OFFSET: 'Addition', OFFSET: 'Position',
FACTOR: 'Faktor', FACTOR: 'Faktor',
FREQ: 'Frequenz', FREQ: 'Frequenz',
DUTY_CYCLE: 'Duty Cycle', DUTY_CYCLE: 'Duty Cycle',

View File

@@ -1079,7 +1079,7 @@ void Boiler::check_active() {
b = ((boilerState_ & 0x09) == 0x09); b = ((boilerState_ & 0x09) == 0x09);
val = b ? EMS_VALUE_BOOL_ON : EMS_VALUE_BOOL_OFF; val = b ? EMS_VALUE_BOOL_ON : EMS_VALUE_BOOL_OFF;
if (heatingActive_ != val) { if (heatingActive_ != val) {
heatingActive_ = val; has_update(heatingActive_, val);
char s[12]; char s[12];
Mqtt::queue_publish(F_(heating_active), Helpers::render_boolean(s, b)); Mqtt::queue_publish(F_(heating_active), Helpers::render_boolean(s, b));
} }
@@ -1103,7 +1103,7 @@ void Boiler::check_active() {
val = b ? EMS_VALUE_BOOL_ON : EMS_VALUE_BOOL_OFF; val = b ? EMS_VALUE_BOOL_ON : EMS_VALUE_BOOL_OFF;
if (tapwaterActive_ != val) { if (tapwaterActive_ != val) {
tapwaterActive_ = val; has_update(tapwaterActive_, val);
char s[12]; char s[12];
Mqtt::queue_publish(F_(tapwater_active), Helpers::render_boolean(s, b)); Mqtt::queue_publish(F_(tapwater_active), Helpers::render_boolean(s, b));
// if (flowsensor) { // if (flowsensor) {

View File

@@ -371,16 +371,17 @@ bool WebSchedulerService::command(const char * cmd, const char * data) {
#include "shuntingYard.hpp" #include "shuntingYard.hpp"
bool WebSchedulerService::onChange(const char * cmd) { bool WebSchedulerService::onChange(const char * cmd) {
bool cmd_ok = false;
for (const ScheduleItem & scheduleItem : *scheduleItems_) { for (const ScheduleItem & scheduleItem : *scheduleItems_) {
if (scheduleItem.active && scheduleItem.flags == SCHEDULEFLAG_SCHEDULE_ONCHANGE if (scheduleItem.active && scheduleItem.flags == SCHEDULEFLAG_SCHEDULE_ONCHANGE
&& Helpers::toLower(scheduleItem.time).find(Helpers::toLower(cmd)) != std::string::npos) { && Helpers::toLower(scheduleItem.time).find(Helpers::toLower(cmd)) != std::string::npos) {
#ifdef EMESESP_DEBUG #ifdef EMESESP_DEBUG
// emsesp::EMSESP::logger().debug(scheduleItem.cmd.c_str()); // emsesp::EMSESP::logger().debug(scheduleItem.cmd.c_str());
#endif #endif
return command(scheduleItem.cmd.c_str(), compute(scheduleItem.value).c_str()); cmd_ok |= command(scheduleItem.cmd.c_str(), compute(scheduleItem.value).c_str());
} }
} }
return false; return cmd_ok;
} }
void WebSchedulerService::condition() { void WebSchedulerService::condition() {

View File

@@ -558,16 +558,33 @@ std::string calculate(const std::string & expr) {
} }
return stack.back(); return stack.back();
} }
// check for <expr> ? <expr1> : <expr2>
// check for multiple instances of <cond> ? <expr1> : <expr2>
std::string compute(const std::string & expr) { std::string compute(const std::string & expr) {
auto q = expr.find_first_of("?"); auto expr_new = expr;
auto p = expr.find_first_of(":", q); // positions: q-questionmark, c-colon
if (p != std::string::npos && q != std::string::npos) { auto q = expr_new.find_first_of("?");
if (calculate(expr.substr(0, q))[0] == '1') { while (q != std::string::npos) {
return calculate(expr.substr(q + 1, p - q - 1)); // find corresponding colon
} else { auto c1 = expr_new.find_first_of(":", q + 1);
return calculate(expr.substr(p + 1)); auto q1 = expr_new.find_first_of("?", q + 1);
while (q1 < c1 && q1 != std::string::npos && c1 != std::string::npos) {
q1 = expr_new.find_first_of("?", q1 + 1);
c1 = expr_new.find_first_of(":", c1 + 1);
} }
if (c1 == std::string::npos) {
return ""; // error: missing colon
}
std::string cond = calculate(expr_new.substr(0, q));
if (cond[0] == '1') {
expr_new.erase(c1); // remove second expression after colon
expr_new.erase(0, q + 1); // remove condition before questionmark
} else if (cond[0] == '0') {
expr_new.erase(0, c1 + 1); // remove condition and first expression
} else {
return ""; // error
}
q = expr_new.find_first_of("?"); // search next instance
} }
return calculate(expr); return calculate(expr_new);
} }