mirror of
https://github.com/emsesp/EMS-ESP32.git
synced 2025-12-06 15:59:52 +03:00
Merge pull request #1825 from MichaelDvP/dev
Scheduler fixes and additions
This commit is contained in:
@@ -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',
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user