diff --git a/interface/src/i18n/de/index.ts b/interface/src/i18n/de/index.ts index bb9f80493..b04338932 100644 --- a/interface/src/i18n/de/index.ts +++ b/interface/src/i18n/de/index.ts @@ -53,7 +53,7 @@ const de: Translation = { UPDATE_OF: '{0} Aktualisieren', REMOVED_OF: '{0} Entfernt', DELETION_OF: '{0} Löschung', - OFFSET: 'Addition', + OFFSET: 'Position', FACTOR: 'Faktor', FREQ: 'Frequenz', DUTY_CYCLE: 'Duty Cycle', diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index e78bbf567..14fcd8789 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -1079,7 +1079,7 @@ void Boiler::check_active() { b = ((boilerState_ & 0x09) == 0x09); val = b ? EMS_VALUE_BOOL_ON : EMS_VALUE_BOOL_OFF; if (heatingActive_ != val) { - heatingActive_ = val; + has_update(heatingActive_, val); char s[12]; 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; if (tapwaterActive_ != val) { - tapwaterActive_ = val; + has_update(tapwaterActive_, val); char s[12]; Mqtt::queue_publish(F_(tapwater_active), Helpers::render_boolean(s, b)); // if (flowsensor) { diff --git a/src/web/WebSchedulerService.cpp b/src/web/WebSchedulerService.cpp index 1a0a86c6e..fb03487cb 100644 --- a/src/web/WebSchedulerService.cpp +++ b/src/web/WebSchedulerService.cpp @@ -371,16 +371,17 @@ bool WebSchedulerService::command(const char * cmd, const char * data) { #include "shuntingYard.hpp" bool WebSchedulerService::onChange(const char * cmd) { + bool cmd_ok = false; for (const ScheduleItem & scheduleItem : *scheduleItems_) { if (scheduleItem.active && scheduleItem.flags == SCHEDULEFLAG_SCHEDULE_ONCHANGE && Helpers::toLower(scheduleItem.time).find(Helpers::toLower(cmd)) != std::string::npos) { #ifdef EMESESP_DEBUG // emsesp::EMSESP::logger().debug(scheduleItem.cmd.c_str()); #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() { diff --git a/src/web/shuntingYard.hpp b/src/web/shuntingYard.hpp index 208297878..83a44bdf2 100644 --- a/src/web/shuntingYard.hpp +++ b/src/web/shuntingYard.hpp @@ -558,16 +558,33 @@ std::string calculate(const std::string & expr) { } return stack.back(); } -// check for ? : + +// check for multiple instances of ? : std::string compute(const std::string & expr) { - auto q = expr.find_first_of("?"); - auto p = expr.find_first_of(":", q); - if (p != std::string::npos && q != std::string::npos) { - if (calculate(expr.substr(0, q))[0] == '1') { - return calculate(expr.substr(q + 1, p - q - 1)); - } else { - return calculate(expr.substr(p + 1)); + auto expr_new = expr; + // positions: q-questionmark, c-colon + auto q = expr_new.find_first_of("?"); + while (q != std::string::npos) { + // find corresponding colon + auto c1 = expr_new.find_first_of(":", q + 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); }