mirror of https://github.com/arendst/Tasmota.git
Refactor rules saving code space
Refactor rules saving code space
This commit is contained in:
parent
38c6254833
commit
d87181e22d
|
@ -134,28 +134,32 @@ void (* const RulesCommand[])(void) PROGMEM = {
|
||||||
LinkedList<MQTT_Subscription> subscriptions;
|
LinkedList<MQTT_Subscription> subscriptions;
|
||||||
#endif // SUPPORT_MQTT_EVENT
|
#endif // SUPPORT_MQTT_EVENT
|
||||||
|
|
||||||
String rules_event_value;
|
struct RULES {
|
||||||
unsigned long rules_timer[MAX_RULE_TIMERS] = { 0 };
|
String event_value;
|
||||||
uint8_t rules_quota = 0;
|
unsigned long timer[MAX_RULE_TIMERS] = { 0 };
|
||||||
long rules_new_power = -1;
|
uint32_t triggers[MAX_RULE_SETS] = { 0 };
|
||||||
long rules_old_power = -1;
|
uint8_t trigger_count[MAX_RULE_SETS] = { 0 };
|
||||||
long rules_old_dimm = -1;
|
|
||||||
|
|
||||||
uint32_t rules_triggers[MAX_RULE_SETS] = { 0 };
|
long new_power = -1;
|
||||||
uint16_t rules_last_minute = 60;
|
long old_power = -1;
|
||||||
uint8_t rules_trigger_count[MAX_RULE_SETS] = { 0 };
|
long old_dimm = -1;
|
||||||
uint8_t rules_teleperiod = 0;
|
|
||||||
|
uint16_t last_minute = 60;
|
||||||
|
uint16_t vars_event = 0;
|
||||||
|
uint8_t mems_event = 0;
|
||||||
|
bool teleperiod = false;
|
||||||
|
|
||||||
char event_data[100];
|
char event_data[100];
|
||||||
char vars[MAX_RULE_VARS][33] = { 0 };
|
} Rules;
|
||||||
|
|
||||||
|
char rules_vars[MAX_RULE_VARS][33] = {{ 0 }};
|
||||||
|
|
||||||
#if (MAX_RULE_VARS>16)
|
#if (MAX_RULE_VARS>16)
|
||||||
#error MAX_RULE_VARS is bigger than 16
|
#error MAX_RULE_VARS is bigger than 16
|
||||||
#endif
|
#endif
|
||||||
#if (MAX_RULE_MEMS>5)
|
#if (MAX_RULE_MEMS>5)
|
||||||
#error MAX_RULE_MEMS is bigger than 5
|
#error MAX_RULE_MEMS is bigger than 5
|
||||||
#endif
|
#endif
|
||||||
uint16_t vars_event = 0;
|
|
||||||
uint8_t mems_event = 0;
|
|
||||||
|
|
||||||
/*******************************************************************************************/
|
/*******************************************************************************************/
|
||||||
|
|
||||||
|
@ -173,7 +177,7 @@ bool RulesRuleMatch(uint8_t rule_set, String &event, String &rule)
|
||||||
if (pos == -1) { return false; } // No # sign in rule
|
if (pos == -1) { return false; } // No # sign in rule
|
||||||
|
|
||||||
String rule_task = rule.substring(0, pos); // "INA219" or "SYSTEM"
|
String rule_task = rule.substring(0, pos); // "INA219" or "SYSTEM"
|
||||||
if (rules_teleperiod) {
|
if (Rules.teleperiod) {
|
||||||
int ppos = rule_task.indexOf("TELE-"); // "TELE-INA219" or "INA219"
|
int ppos = rule_task.indexOf("TELE-"); // "TELE-INA219" or "INA219"
|
||||||
if (ppos == -1) { return false; } // No pre-amble in rule
|
if (ppos == -1) { return false; } // No pre-amble in rule
|
||||||
rule_task = rule.substring(5, pos); // "INA219" or "SYSTEM"
|
rule_task = rule.substring(5, pos); // "INA219" or "SYSTEM"
|
||||||
|
@ -198,7 +202,7 @@ bool RulesRuleMatch(uint8_t rule_set, String &event, String &rule)
|
||||||
for (uint32_t i = 0; i < MAX_RULE_VARS; i++) {
|
for (uint32_t i = 0; i < MAX_RULE_VARS; i++) {
|
||||||
snprintf_P(stemp, sizeof(stemp), PSTR("%%VAR%d%%"), i +1);
|
snprintf_P(stemp, sizeof(stemp), PSTR("%%VAR%d%%"), i +1);
|
||||||
if (rule_param.startsWith(stemp)) {
|
if (rule_param.startsWith(stemp)) {
|
||||||
rule_param = vars[i];
|
rule_param = rules_vars[i];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -252,12 +256,12 @@ bool RulesRuleMatch(uint8_t rule_set, String &event, String &rule)
|
||||||
const char* str_value = root[rule_task][rule_name];
|
const char* str_value = root[rule_task][rule_name];
|
||||||
|
|
||||||
//AddLog_P2(LOG_LEVEL_DEBUG, PSTR("RUL: Task %s, Name %s, Value |%s|, TrigCnt %d, TrigSt %d, Source %s, Json %s"),
|
//AddLog_P2(LOG_LEVEL_DEBUG, PSTR("RUL: Task %s, Name %s, Value |%s|, TrigCnt %d, TrigSt %d, Source %s, Json %s"),
|
||||||
// rule_task.c_str(), rule_name.c_str(), rule_svalue, rules_trigger_count[rule_set], bitRead(rules_triggers[rule_set], rules_trigger_count[rule_set]), event.c_str(), (str_value) ? str_value : "none");
|
// rule_task.c_str(), rule_name.c_str(), rule_svalue, Rules.trigger_count[rule_set], bitRead(Rules.triggers[rule_set], Rules.trigger_count[rule_set]), event.c_str(), (str_value) ? str_value : "none");
|
||||||
|
|
||||||
if (!root[rule_task][rule_name].success()) { return false; }
|
if (!root[rule_task][rule_name].success()) { return false; }
|
||||||
// No value but rule_name is ok
|
// No value but rule_name is ok
|
||||||
|
|
||||||
rules_event_value = str_value; // Prepare %value%
|
Rules.event_value = str_value; // Prepare %value%
|
||||||
|
|
||||||
// Step 3: Compare rule (value)
|
// Step 3: Compare rule (value)
|
||||||
if (str_value) {
|
if (str_value) {
|
||||||
|
@ -296,13 +300,13 @@ bool RulesRuleMatch(uint8_t rule_set, String &event, String &rule)
|
||||||
|
|
||||||
if (bitRead(Settings.rule_once, rule_set)) {
|
if (bitRead(Settings.rule_once, rule_set)) {
|
||||||
if (match) { // Only allow match state changes
|
if (match) { // Only allow match state changes
|
||||||
if (!bitRead(rules_triggers[rule_set], rules_trigger_count[rule_set])) {
|
if (!bitRead(Rules.triggers[rule_set], Rules.trigger_count[rule_set])) {
|
||||||
bitSet(rules_triggers[rule_set], rules_trigger_count[rule_set]);
|
bitSet(Rules.triggers[rule_set], Rules.trigger_count[rule_set]);
|
||||||
} else {
|
} else {
|
||||||
match = false;
|
match = false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
bitClear(rules_triggers[rule_set], rules_trigger_count[rule_set]);
|
bitClear(Rules.triggers[rule_set], Rules.trigger_count[rule_set]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -322,7 +326,7 @@ bool RuleSetProcess(uint8_t rule_set, String &event_saved)
|
||||||
|
|
||||||
String rules = Settings.rules[rule_set];
|
String rules = Settings.rules[rule_set];
|
||||||
|
|
||||||
rules_trigger_count[rule_set] = 0;
|
Rules.trigger_count[rule_set] = 0;
|
||||||
int plen = 0;
|
int plen = 0;
|
||||||
int plen2 = 0;
|
int plen2 = 0;
|
||||||
bool stop_all_rules = false;
|
bool stop_all_rules = false;
|
||||||
|
@ -350,7 +354,7 @@ bool RuleSetProcess(uint8_t rule_set, String &event_saved)
|
||||||
|
|
||||||
String commands = rules.substring(pevt +4, plen); // "Backlog Dimmer 10;Color 100000"
|
String commands = rules.substring(pevt +4, plen); // "Backlog Dimmer 10;Color 100000"
|
||||||
plen += 6;
|
plen += 6;
|
||||||
rules_event_value = "";
|
Rules.event_value = "";
|
||||||
String event = event_saved;
|
String event = event_saved;
|
||||||
|
|
||||||
//AddLog_P2(LOG_LEVEL_DEBUG, PSTR("RUL: Event |%s|, Rule |%s|, Command(s) |%s|"), event.c_str(), event_trigger.c_str(), commands.c_str());
|
//AddLog_P2(LOG_LEVEL_DEBUG, PSTR("RUL: Event |%s|, Rule |%s|, Command(s) |%s|"), event.c_str(), event_trigger.c_str(), commands.c_str());
|
||||||
|
@ -361,10 +365,10 @@ bool RuleSetProcess(uint8_t rule_set, String &event_saved)
|
||||||
ucommand.toUpperCase();
|
ucommand.toUpperCase();
|
||||||
// if (!ucommand.startsWith("BACKLOG")) { commands = "backlog " + commands; } // Always use Backlog to prevent power race exception
|
// if (!ucommand.startsWith("BACKLOG")) { commands = "backlog " + commands; } // Always use Backlog to prevent power race exception
|
||||||
if (ucommand.indexOf("EVENT ") != -1) { commands = "backlog " + commands; } // Always use Backlog with event to prevent rule event loop exception
|
if (ucommand.indexOf("EVENT ") != -1) { commands = "backlog " + commands; } // Always use Backlog with event to prevent rule event loop exception
|
||||||
commands.replace(F("%value%"), rules_event_value);
|
commands.replace(F("%value%"), Rules.event_value);
|
||||||
for (uint32_t i = 0; i < MAX_RULE_VARS; i++) {
|
for (uint32_t i = 0; i < MAX_RULE_VARS; i++) {
|
||||||
snprintf_P(stemp, sizeof(stemp), PSTR("%%var%d%%"), i +1);
|
snprintf_P(stemp, sizeof(stemp), PSTR("%%var%d%%"), i +1);
|
||||||
commands.replace(stemp, vars[i]);
|
commands.replace(stemp, rules_vars[i]);
|
||||||
}
|
}
|
||||||
for (uint32_t i = 0; i < MAX_RULE_MEMS; i++) {
|
for (uint32_t i = 0; i < MAX_RULE_MEMS; i++) {
|
||||||
snprintf_P(stemp, sizeof(stemp), PSTR("%%mem%d%%"), i +1);
|
snprintf_P(stemp, sizeof(stemp), PSTR("%%mem%d%%"), i +1);
|
||||||
|
@ -390,7 +394,7 @@ bool RuleSetProcess(uint8_t rule_set, String &event_saved)
|
||||||
serviced = true;
|
serviced = true;
|
||||||
if (stop_all_rules) { return serviced; } // If BREAK was used, Stop execution of this rule set
|
if (stop_all_rules) { return serviced; } // If BREAK was used, Stop execution of this rule set
|
||||||
}
|
}
|
||||||
rules_trigger_count[rule_set]++;
|
Rules.trigger_count[rule_set]++;
|
||||||
}
|
}
|
||||||
return serviced;
|
return serviced;
|
||||||
}
|
}
|
||||||
|
@ -441,7 +445,7 @@ void RulesInit(void)
|
||||||
bitWrite(Settings.rule_once, i, 0);
|
bitWrite(Settings.rule_once, i, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rules_teleperiod = 0;
|
Rules.teleperiod = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RulesEvery50ms(void)
|
void RulesEvery50ms(void)
|
||||||
|
@ -449,12 +453,12 @@ void RulesEvery50ms(void)
|
||||||
if (Settings.rule_enabled) { // Any rule enabled
|
if (Settings.rule_enabled) { // Any rule enabled
|
||||||
char json_event[120];
|
char json_event[120];
|
||||||
|
|
||||||
if (-1 == rules_new_power) { rules_new_power = power; }
|
if (-1 == Rules.new_power) { Rules.new_power = power; }
|
||||||
if (rules_new_power != rules_old_power) {
|
if (Rules.new_power != Rules.old_power) {
|
||||||
if (rules_old_power != -1) {
|
if (Rules.old_power != -1) {
|
||||||
for (uint32_t i = 0; i < devices_present; i++) {
|
for (uint32_t i = 0; i < devices_present; i++) {
|
||||||
uint8_t new_state = (rules_new_power >> i) &1;
|
uint8_t new_state = (Rules.new_power >> i) &1;
|
||||||
if (new_state != ((rules_old_power >> i) &1)) {
|
if (new_state != ((Rules.old_power >> i) &1)) {
|
||||||
snprintf_P(json_event, sizeof(json_event), PSTR("{\"Power%d\":{\"State\":%d}}"), i +1, new_state);
|
snprintf_P(json_event, sizeof(json_event), PSTR("{\"Power%d\":{\"State\":%d}}"), i +1, new_state);
|
||||||
RulesProcessEvent(json_event);
|
RulesProcessEvent(json_event);
|
||||||
}
|
}
|
||||||
|
@ -462,7 +466,7 @@ void RulesEvery50ms(void)
|
||||||
} else {
|
} else {
|
||||||
// Boot time POWER OUTPUTS (Relays) Status
|
// Boot time POWER OUTPUTS (Relays) Status
|
||||||
for (uint32_t i = 0; i < devices_present; i++) {
|
for (uint32_t i = 0; i < devices_present; i++) {
|
||||||
uint8_t new_state = (rules_new_power >> i) &1;
|
uint8_t new_state = (Rules.new_power >> i) &1;
|
||||||
snprintf_P(json_event, sizeof(json_event), PSTR("{\"Power%d\":{\"Boot\":%d}}"), i +1, new_state);
|
snprintf_P(json_event, sizeof(json_event), PSTR("{\"Power%d\":{\"Boot\":%d}}"), i +1, new_state);
|
||||||
RulesProcessEvent(json_event);
|
RulesProcessEvent(json_event);
|
||||||
}
|
}
|
||||||
|
@ -479,22 +483,22 @@ void RulesEvery50ms(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rules_old_power = rules_new_power;
|
Rules.old_power = Rules.new_power;
|
||||||
}
|
}
|
||||||
else if (rules_old_dimm != Settings.light_dimmer) {
|
else if (Rules.old_dimm != Settings.light_dimmer) {
|
||||||
if (rules_old_dimm != -1) {
|
if (Rules.old_dimm != -1) {
|
||||||
snprintf_P(json_event, sizeof(json_event), PSTR("{\"Dimmer\":{\"State\":%d}}"), Settings.light_dimmer);
|
snprintf_P(json_event, sizeof(json_event), PSTR("{\"Dimmer\":{\"State\":%d}}"), Settings.light_dimmer);
|
||||||
} else {
|
} else {
|
||||||
// Boot time DIMMER VALUE
|
// Boot time DIMMER VALUE
|
||||||
snprintf_P(json_event, sizeof(json_event), PSTR("{\"Dimmer\":{\"Boot\":%d}}"), Settings.light_dimmer);
|
snprintf_P(json_event, sizeof(json_event), PSTR("{\"Dimmer\":{\"Boot\":%d}}"), Settings.light_dimmer);
|
||||||
}
|
}
|
||||||
RulesProcessEvent(json_event);
|
RulesProcessEvent(json_event);
|
||||||
rules_old_dimm = Settings.light_dimmer;
|
Rules.old_dimm = Settings.light_dimmer;
|
||||||
}
|
}
|
||||||
else if (event_data[0]) {
|
else if (Rules.event_data[0]) {
|
||||||
char *event;
|
char *event;
|
||||||
char *parameter;
|
char *parameter;
|
||||||
event = strtok_r(event_data, "=", ¶meter); // event_data = fanspeed=10
|
event = strtok_r(Rules.event_data, "=", ¶meter); // Rules.event_data = fanspeed=10
|
||||||
if (event) {
|
if (event) {
|
||||||
event = Trim(event);
|
event = Trim(event);
|
||||||
if (parameter) {
|
if (parameter) {
|
||||||
|
@ -503,27 +507,27 @@ void RulesEvery50ms(void)
|
||||||
parameter = event + strlen(event); // '\0'
|
parameter = event + strlen(event); // '\0'
|
||||||
}
|
}
|
||||||
snprintf_P(json_event, sizeof(json_event), PSTR("{\"Event\":{\"%s\":\"%s\"}}"), event, parameter);
|
snprintf_P(json_event, sizeof(json_event), PSTR("{\"Event\":{\"%s\":\"%s\"}}"), event, parameter);
|
||||||
event_data[0] ='\0';
|
Rules.event_data[0] ='\0';
|
||||||
RulesProcessEvent(json_event);
|
RulesProcessEvent(json_event);
|
||||||
} else {
|
} else {
|
||||||
event_data[0] ='\0';
|
Rules.event_data[0] ='\0';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (vars_event || mems_event){
|
else if (Rules.vars_event || Rules.mems_event){
|
||||||
if (vars_event) {
|
if (Rules.vars_event) {
|
||||||
for (uint32_t i = 0; i < MAX_RULE_VARS; i++) {
|
for (uint32_t i = 0; i < MAX_RULE_VARS; i++) {
|
||||||
if (bitRead(vars_event, i)) {
|
if (bitRead(Rules.vars_event, i)) {
|
||||||
bitClear(vars_event, i);
|
bitClear(Rules.vars_event, i);
|
||||||
snprintf_P(json_event, sizeof(json_event), PSTR("{\"Var%d\":{\"State\":%s}}"), i+1, vars[i]);
|
snprintf_P(json_event, sizeof(json_event), PSTR("{\"Var%d\":{\"State\":%s}}"), i+1, rules_vars[i]);
|
||||||
RulesProcessEvent(json_event);
|
RulesProcessEvent(json_event);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (mems_event) {
|
if (Rules.mems_event) {
|
||||||
for (uint32_t i = 0; i < MAX_RULE_MEMS; i++) {
|
for (uint32_t i = 0; i < MAX_RULE_MEMS; i++) {
|
||||||
if (bitRead(mems_event, i)) {
|
if (bitRead(Rules.mems_event, i)) {
|
||||||
bitClear(mems_event, i);
|
bitClear(Rules.mems_event, i);
|
||||||
snprintf_P(json_event, sizeof(json_event), PSTR("{\"Mem%d\":{\"State\":%s}}"), i+1, Settings.mems[i]);
|
snprintf_P(json_event, sizeof(json_event), PSTR("{\"Mem%d\":{\"State\":%s}}"), i+1, Settings.mems[i]);
|
||||||
RulesProcessEvent(json_event);
|
RulesProcessEvent(json_event);
|
||||||
break;
|
break;
|
||||||
|
@ -582,16 +586,16 @@ void RulesEverySecond(void)
|
||||||
char json_event[120];
|
char json_event[120];
|
||||||
|
|
||||||
if (RtcTime.valid) {
|
if (RtcTime.valid) {
|
||||||
if ((uptime > 60) && (RtcTime.minute != rules_last_minute)) { // Execute from one minute after restart every minute only once
|
if ((uptime > 60) && (RtcTime.minute != Rules.last_minute)) { // Execute from one minute after restart every minute only once
|
||||||
rules_last_minute = RtcTime.minute;
|
Rules.last_minute = RtcTime.minute;
|
||||||
snprintf_P(json_event, sizeof(json_event), PSTR("{\"Time\":{\"Minute\":%d}}"), MinutesPastMidnight());
|
snprintf_P(json_event, sizeof(json_event), PSTR("{\"Time\":{\"Minute\":%d}}"), MinutesPastMidnight());
|
||||||
RulesProcessEvent(json_event);
|
RulesProcessEvent(json_event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (uint32_t i = 0; i < MAX_RULE_TIMERS; i++) {
|
for (uint32_t i = 0; i < MAX_RULE_TIMERS; i++) {
|
||||||
if (rules_timer[i] != 0L) { // Timer active?
|
if (Rules.timer[i] != 0L) { // Timer active?
|
||||||
if (TimeReached(rules_timer[i])) { // Timer finished?
|
if (TimeReached(Rules.timer[i])) { // Timer finished?
|
||||||
rules_timer[i] = 0L; // Turn off this timer
|
Rules.timer[i] = 0L; // Turn off this timer
|
||||||
snprintf_P(json_event, sizeof(json_event), PSTR("{\"Rules\":{\"Timer\":%d}}"), i +1);
|
snprintf_P(json_event, sizeof(json_event), PSTR("{\"Rules\":{\"Timer\":%d}}"), i +1);
|
||||||
RulesProcessEvent(json_event);
|
RulesProcessEvent(json_event);
|
||||||
}
|
}
|
||||||
|
@ -612,14 +616,14 @@ void RulesSaveBeforeRestart(void)
|
||||||
|
|
||||||
void RulesSetPower(void)
|
void RulesSetPower(void)
|
||||||
{
|
{
|
||||||
rules_new_power = XdrvMailbox.index;
|
Rules.new_power = XdrvMailbox.index;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RulesTeleperiod(void)
|
void RulesTeleperiod(void)
|
||||||
{
|
{
|
||||||
rules_teleperiod = 1;
|
Rules.teleperiod = true;
|
||||||
RulesProcess();
|
RulesProcess();
|
||||||
rules_teleperiod = 0;
|
Rules.teleperiod = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef SUPPORT_MQTT_EVENT
|
#ifdef SUPPORT_MQTT_EVENT
|
||||||
|
@ -673,7 +677,7 @@ bool RulesMqttData(void)
|
||||||
}
|
}
|
||||||
value.trim();
|
value.trim();
|
||||||
//Create an new event. Cannot directly call RulesProcessEvent().
|
//Create an new event. Cannot directly call RulesProcessEvent().
|
||||||
snprintf_P(event_data, sizeof(event_data), PSTR("%s=%s"), event_item.Event.c_str(), value.c_str());
|
snprintf_P(Rules.event_data, sizeof(Rules.event_data), PSTR("%s=%s"), event_item.Event.c_str(), value.c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return serviced;
|
return serviced;
|
||||||
|
@ -868,7 +872,7 @@ bool findNextVariableValue(char * &pVarname, float &value)
|
||||||
if (sVarName.startsWith(F("VAR"))) {
|
if (sVarName.startsWith(F("VAR"))) {
|
||||||
int index = sVarName.substring(3).toInt();
|
int index = sVarName.substring(3).toInt();
|
||||||
if (index > 0 && index <= MAX_RULE_VARS) {
|
if (index > 0 && index <= MAX_RULE_VARS) {
|
||||||
value = CharToFloat(vars[index -1]);
|
value = CharToFloat(rules_vars[index -1]);
|
||||||
}
|
}
|
||||||
} else if (sVarName.startsWith(F("MEM"))) {
|
} else if (sVarName.startsWith(F("MEM"))) {
|
||||||
int index = sVarName.substring(3).toInt();
|
int index = sVarName.substring(3).toInt();
|
||||||
|
@ -1156,7 +1160,7 @@ void CmndRule(void)
|
||||||
strlcpy(Settings.rules[index -1] + offset, ('"' == XdrvMailbox.data[0]) ? "" : XdrvMailbox.data, sizeof(Settings.rules[index -1]));
|
strlcpy(Settings.rules[index -1] + offset, ('"' == XdrvMailbox.data[0]) ? "" : XdrvMailbox.data, sizeof(Settings.rules[index -1]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rules_triggers[index -1] = 0; // Reset once flag
|
Rules.triggers[index -1] = 0; // Reset once flag
|
||||||
}
|
}
|
||||||
snprintf_P (mqtt_data, sizeof(mqtt_data), PSTR("{\"%s%d\":\"%s\",\"Once\":\"%s\",\"StopOnError\":\"%s\",\"Free\":%d,\"Rules\":\"%s\"}"),
|
snprintf_P (mqtt_data, sizeof(mqtt_data), PSTR("{\"%s%d\":\"%s\",\"Once\":\"%s\",\"StopOnError\":\"%s\",\"Free\":%d,\"Rules\":\"%s\"}"),
|
||||||
XdrvMailbox.command, index, GetStateText(bitRead(Settings.rule_enabled, index -1)), GetStateText(bitRead(Settings.rule_once, index -1)),
|
XdrvMailbox.command, index, GetStateText(bitRead(Settings.rule_enabled, index -1)), GetStateText(bitRead(Settings.rule_once, index -1)),
|
||||||
|
@ -1170,14 +1174,14 @@ void CmndRuleTimer(void)
|
||||||
if (XdrvMailbox.data_len > 0) {
|
if (XdrvMailbox.data_len > 0) {
|
||||||
#ifdef USE_EXPRESSION
|
#ifdef USE_EXPRESSION
|
||||||
float timer_set = evaluateExpression(XdrvMailbox.data, XdrvMailbox.data_len);
|
float timer_set = evaluateExpression(XdrvMailbox.data, XdrvMailbox.data_len);
|
||||||
rules_timer[XdrvMailbox.index -1] = (timer_set > 0) ? millis() + (1000 * timer_set) : 0;
|
Rules.timer[XdrvMailbox.index -1] = (timer_set > 0) ? millis() + (1000 * timer_set) : 0;
|
||||||
#else
|
#else
|
||||||
rules_timer[XdrvMailbox.index -1] = (XdrvMailbox.payload > 0) ? millis() + (1000 * XdrvMailbox.payload) : 0;
|
Rules.timer[XdrvMailbox.index -1] = (XdrvMailbox.payload > 0) ? millis() + (1000 * XdrvMailbox.payload) : 0;
|
||||||
#endif // USE_EXPRESSION
|
#endif // USE_EXPRESSION
|
||||||
}
|
}
|
||||||
mqtt_data[0] = '\0';
|
mqtt_data[0] = '\0';
|
||||||
for (uint32_t i = 0; i < MAX_RULE_TIMERS; i++) {
|
for (uint32_t i = 0; i < MAX_RULE_TIMERS; i++) {
|
||||||
ResponseAppend_P(PSTR("%c\"T%d\":%d"), (i) ? ',' : '{', i +1, (rules_timer[i]) ? (rules_timer[i] - millis()) / 1000 : 0);
|
ResponseAppend_P(PSTR("%c\"T%d\":%d"), (i) ? ',' : '{', i +1, (Rules.timer[i]) ? (Rules.timer[i] - millis()) / 1000 : 0);
|
||||||
}
|
}
|
||||||
ResponseJsonEnd();
|
ResponseJsonEnd();
|
||||||
}
|
}
|
||||||
|
@ -1186,7 +1190,7 @@ void CmndRuleTimer(void)
|
||||||
void CmndEvent(void)
|
void CmndEvent(void)
|
||||||
{
|
{
|
||||||
if (XdrvMailbox.data_len > 0) {
|
if (XdrvMailbox.data_len > 0) {
|
||||||
strlcpy(event_data, XdrvMailbox.data, sizeof(event_data));
|
strlcpy(Rules.event_data, XdrvMailbox.data, sizeof(Rules.event_data));
|
||||||
}
|
}
|
||||||
ResponseCmndDone();
|
ResponseCmndDone();
|
||||||
}
|
}
|
||||||
|
@ -1197,19 +1201,19 @@ void CmndVariable(void)
|
||||||
if (!XdrvMailbox.usridx) {
|
if (!XdrvMailbox.usridx) {
|
||||||
mqtt_data[0] = '\0';
|
mqtt_data[0] = '\0';
|
||||||
for (uint32_t i = 0; i < MAX_RULE_VARS; i++) {
|
for (uint32_t i = 0; i < MAX_RULE_VARS; i++) {
|
||||||
ResponseAppend_P(PSTR("%c\"Var%d\":\"%s\""), (i) ? ',' : '{', i +1, vars[i]);
|
ResponseAppend_P(PSTR("%c\"Var%d\":\"%s\""), (i) ? ',' : '{', i +1, rules_vars[i]);
|
||||||
}
|
}
|
||||||
ResponseJsonEnd();
|
ResponseJsonEnd();
|
||||||
} else {
|
} else {
|
||||||
if (XdrvMailbox.data_len > 0) {
|
if (XdrvMailbox.data_len > 0) {
|
||||||
#ifdef USE_EXPRESSION
|
#ifdef USE_EXPRESSION
|
||||||
dtostrfd(evaluateExpression(XdrvMailbox.data, XdrvMailbox.data_len), Settings.flag2.calc_resolution, vars[XdrvMailbox.index -1]);
|
dtostrfd(evaluateExpression(XdrvMailbox.data, XdrvMailbox.data_len), Settings.flag2.calc_resolution, rules_vars[XdrvMailbox.index -1]);
|
||||||
#else
|
#else
|
||||||
strlcpy(vars[XdrvMailbox.index -1], ('"' == XdrvMailbox.data[0]) ? "" : XdrvMailbox.data, sizeof(vars[XdrvMailbox.index -1]));
|
strlcpy(rules_vars[XdrvMailbox.index -1], ('"' == XdrvMailbox.data[0]) ? "" : XdrvMailbox.data, sizeof(rules_vars[XdrvMailbox.index -1]));
|
||||||
#endif // USE_EXPRESSION
|
#endif // USE_EXPRESSION
|
||||||
bitSet(vars_event, XdrvMailbox.index -1);
|
bitSet(Rules.vars_event, XdrvMailbox.index -1);
|
||||||
}
|
}
|
||||||
ResponseCmndIdxChar(vars[XdrvMailbox.index -1]);
|
ResponseCmndIdxChar(rules_vars[XdrvMailbox.index -1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1230,7 +1234,7 @@ void CmndMemory(void)
|
||||||
#else
|
#else
|
||||||
strlcpy(Settings.mems[XdrvMailbox.index -1], ('"' == XdrvMailbox.data[0]) ? "" : XdrvMailbox.data, sizeof(Settings.mems[XdrvMailbox.index -1]));
|
strlcpy(Settings.mems[XdrvMailbox.index -1], ('"' == XdrvMailbox.data[0]) ? "" : XdrvMailbox.data, sizeof(Settings.mems[XdrvMailbox.index -1]));
|
||||||
#endif // USE_EXPRESSION
|
#endif // USE_EXPRESSION
|
||||||
bitSet(mems_event, XdrvMailbox.index -1);
|
bitSet(Rules.mems_event, XdrvMailbox.index -1);
|
||||||
}
|
}
|
||||||
ResponseCmndIdxChar(Settings.mems[XdrvMailbox.index -1]);
|
ResponseCmndIdxChar(Settings.mems[XdrvMailbox.index -1]);
|
||||||
}
|
}
|
||||||
|
@ -1249,11 +1253,11 @@ void CmndAddition(void)
|
||||||
{
|
{
|
||||||
if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_RULE_VARS)) {
|
if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_RULE_VARS)) {
|
||||||
if (XdrvMailbox.data_len > 0) {
|
if (XdrvMailbox.data_len > 0) {
|
||||||
float tempvar = CharToFloat(vars[XdrvMailbox.index -1]) + CharToFloat(XdrvMailbox.data);
|
float tempvar = CharToFloat(rules_vars[XdrvMailbox.index -1]) + CharToFloat(XdrvMailbox.data);
|
||||||
dtostrfd(tempvar, Settings.flag2.calc_resolution, vars[XdrvMailbox.index -1]);
|
dtostrfd(tempvar, Settings.flag2.calc_resolution, rules_vars[XdrvMailbox.index -1]);
|
||||||
bitSet(vars_event, XdrvMailbox.index -1);
|
bitSet(Rules.vars_event, XdrvMailbox.index -1);
|
||||||
}
|
}
|
||||||
ResponseCmndIdxChar(vars[XdrvMailbox.index -1]);
|
ResponseCmndIdxChar(rules_vars[XdrvMailbox.index -1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1261,11 +1265,11 @@ void CmndSubtract(void)
|
||||||
{
|
{
|
||||||
if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_RULE_VARS)) {
|
if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_RULE_VARS)) {
|
||||||
if (XdrvMailbox.data_len > 0) {
|
if (XdrvMailbox.data_len > 0) {
|
||||||
float tempvar = CharToFloat(vars[XdrvMailbox.index -1]) - CharToFloat(XdrvMailbox.data);
|
float tempvar = CharToFloat(rules_vars[XdrvMailbox.index -1]) - CharToFloat(XdrvMailbox.data);
|
||||||
dtostrfd(tempvar, Settings.flag2.calc_resolution, vars[XdrvMailbox.index -1]);
|
dtostrfd(tempvar, Settings.flag2.calc_resolution, rules_vars[XdrvMailbox.index -1]);
|
||||||
bitSet(vars_event, XdrvMailbox.index -1);
|
bitSet(Rules.vars_event, XdrvMailbox.index -1);
|
||||||
}
|
}
|
||||||
ResponseCmndIdxChar(vars[XdrvMailbox.index -1]);
|
ResponseCmndIdxChar(rules_vars[XdrvMailbox.index -1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1273,11 +1277,11 @@ void CmndMultiply(void)
|
||||||
{
|
{
|
||||||
if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_RULE_VARS)) {
|
if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_RULE_VARS)) {
|
||||||
if (XdrvMailbox.data_len > 0) {
|
if (XdrvMailbox.data_len > 0) {
|
||||||
float tempvar = CharToFloat(vars[XdrvMailbox.index -1]) * CharToFloat(XdrvMailbox.data);
|
float tempvar = CharToFloat(rules_vars[XdrvMailbox.index -1]) * CharToFloat(XdrvMailbox.data);
|
||||||
dtostrfd(tempvar, Settings.flag2.calc_resolution, vars[XdrvMailbox.index -1]);
|
dtostrfd(tempvar, Settings.flag2.calc_resolution, rules_vars[XdrvMailbox.index -1]);
|
||||||
bitSet(vars_event, XdrvMailbox.index -1);
|
bitSet(Rules.vars_event, XdrvMailbox.index -1);
|
||||||
}
|
}
|
||||||
ResponseCmndIdxChar(vars[XdrvMailbox.index -1]);
|
ResponseCmndIdxChar(rules_vars[XdrvMailbox.index -1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1294,11 +1298,11 @@ void CmndScale(void)
|
||||||
float toLow = CharToFloat(subStr(sub_string, XdrvMailbox.data, ",", 4));
|
float toLow = CharToFloat(subStr(sub_string, XdrvMailbox.data, ",", 4));
|
||||||
float toHigh = CharToFloat(subStr(sub_string, XdrvMailbox.data, ",", 5));
|
float toHigh = CharToFloat(subStr(sub_string, XdrvMailbox.data, ",", 5));
|
||||||
float value = map_double(valueIN, fromLow, fromHigh, toLow, toHigh);
|
float value = map_double(valueIN, fromLow, fromHigh, toLow, toHigh);
|
||||||
dtostrfd(value, Settings.flag2.calc_resolution, vars[XdrvMailbox.index -1]);
|
dtostrfd(value, Settings.flag2.calc_resolution, rules_vars[XdrvMailbox.index -1]);
|
||||||
bitSet(vars_event, XdrvMailbox.index -1);
|
bitSet(Rules.vars_event, XdrvMailbox.index -1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ResponseCmndIdxChar(vars[XdrvMailbox.index -1]);
|
ResponseCmndIdxChar(rules_vars[XdrvMailbox.index -1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3332,7 +3332,7 @@ bool ScriptMqttData(void)
|
||||||
value.trim();
|
value.trim();
|
||||||
|
|
||||||
//Create an new event. Cannot directly call RulesProcessEvent().
|
//Create an new event. Cannot directly call RulesProcessEvent().
|
||||||
//snprintf_P(event_data, sizeof(event_data), PSTR("%s=%s"), event_item.Event.c_str(), value.c_str());
|
//snprintf_P(Rules.event_data, sizeof(Rules.event_data), PSTR("%s=%s"), event_item.Event.c_str(), value.c_str());
|
||||||
char sbuffer[128];
|
char sbuffer[128];
|
||||||
snprintf_P(sbuffer, sizeof(sbuffer), PSTR(">%s=\"%s\"\n"), event_item.Event.c_str(), value.c_str());
|
snprintf_P(sbuffer, sizeof(sbuffer), PSTR(">%s=\"%s\"\n"), event_item.Event.c_str(), value.c_str());
|
||||||
//toLog(sbuffer);
|
//toLog(sbuffer);
|
||||||
|
|
Loading…
Reference in New Issue