Merge pull request #12924 from s-hadinger/berry_rules

Berry system events for rules
This commit is contained in:
s-hadinger 2021-08-19 14:30:37 +02:00 committed by GitHub
commit 0f49a21dd0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 16 additions and 5 deletions

View File

@ -15,6 +15,7 @@ class Timer
end end
end end
tasmota = nil
class Tasmota class Tasmota
# add `chars_in_string(s:string,c:string) -> int`` # add `chars_in_string(s:string,c:string) -> int``

View File

@ -801,6 +801,11 @@ bool RuleSetProcess(uint8_t rule_set, String &event_saved)
bool RulesProcessEvent(const char *json_event) bool RulesProcessEvent(const char *json_event)
{ {
#ifdef USE_BERRY
// events are passed to Berry before Rules engine
callBerryRule(json_event);
#endif
if (Rules.busy) { return false; } if (Rules.busy) { return false; }
Rules.busy = true; Rules.busy = true;
@ -858,7 +863,11 @@ void RulesInit(void)
void RulesEvery50ms(void) void RulesEvery50ms(void)
{ {
#ifdef USE_BERRY
if (!Rules.busy) { // Emitting Rules events is always enabled with Berry
#else
if (Settings->rule_enabled && !Rules.busy) { // Any rule enabled if (Settings->rule_enabled && !Rules.busy) { // Any rule enabled
#endif
char json_event[120]; char json_event[120];
if (-1 == Rules.new_power) { Rules.new_power = TasmotaGlobal.power; } if (-1 == Rules.new_power) { Rules.new_power = TasmotaGlobal.power; }

View File

@ -93,12 +93,13 @@ extern "C" {
\*********************************************************************************************/ \*********************************************************************************************/
// // call a function (if exists) of type void -> void // // call a function (if exists) of type void -> void
bool callBerryRule(void) { // If event == nullptr, then take XdrvMailbox.data
bool callBerryRule(const char *event) {
if (berry.rules_busy) { return false; } if (berry.rules_busy) { return false; }
berry.rules_busy = true; berry.rules_busy = true;
char * json_event = XdrvMailbox.data; char * json_event = XdrvMailbox.data;
bool serviced = false; bool serviced = false;
serviced = callBerryEventDispatcher(PSTR("rule"), nullptr, 0, XdrvMailbox.data); serviced = callBerryEventDispatcher(PSTR("rule"), nullptr, 0, event ? event : XdrvMailbox.data);
berry.rules_busy = false; berry.rules_busy = false;
return serviced; // TODO event not handled return serviced; // TODO event not handled
} }
@ -732,7 +733,7 @@ bool Xdrv52(uint8_t function)
// Berry wide commands and events // Berry wide commands and events
case FUNC_RULES_PROCESS: case FUNC_RULES_PROCESS:
result = callBerryRule(); result = callBerryRule(nullptr);
break; break;
case FUNC_MQTT_DATA: case FUNC_MQTT_DATA:
result = callBerryEventDispatcher(PSTR("mqtt_data"), XdrvMailbox.topic, 0, XdrvMailbox.data, XdrvMailbox.data_len); result = callBerryEventDispatcher(PSTR("mqtt_data"), XdrvMailbox.topic, 0, XdrvMailbox.data, XdrvMailbox.data_len);

View File

@ -1083,8 +1083,8 @@ bool XdrvRulesProcess(bool teleperiod, const char* event) {
char* data_save = XdrvMailbox.data; char* data_save = XdrvMailbox.data;
XdrvMailbox.data = (char*)event; XdrvMailbox.data = (char*)event;
bool rule_handled = XdrvCallDriver(10, (teleperiod) ? FUNC_TELEPERIOD_RULES_PROCESS : FUNC_RULES_PROCESS); bool rule_handled = XdrvCallDriver(10, (teleperiod) ? FUNC_TELEPERIOD_RULES_PROCESS : FUNC_RULES_PROCESS);
#ifdef USE_BERRY #if defined(USE_BERRY) && !defined(USE_RULES)
// events are passed to both Rules engine AND Berry engine // events are sent to Berry in Rules driver, or here if USE_RULES is not defined (only on a subset)
bool berry_handled = XdrvCallDriver(52, FUNC_RULES_PROCESS); bool berry_handled = XdrvCallDriver(52, FUNC_RULES_PROCESS);
rule_handled |= berry_handled; rule_handled |= berry_handled;
#endif #endif