From 3ae7957a0efcc71a01ea116e6bad84183e0cb31b Mon Sep 17 00:00:00 2001 From: Andrii Shvaika Date: Mon, 12 Oct 2020 18:03:05 +0300 Subject: [PATCH] Improved scheduler logic --- .../rule/engine/profile/AlarmRuleState.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/AlarmRuleState.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/AlarmRuleState.java index 95356239f5..d9d08efbdc 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/AlarmRuleState.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/AlarmRuleState.java @@ -165,9 +165,7 @@ class AlarmRuleState { return false; } } - long startOfDay = zdt.toLocalDate().atStartOfDay(zoneId).toInstant().toEpochMilli(); - long msFromStartOfDay = eventTs - startOfDay; - return schedule.getStartsOn() <= msFromStartOfDay && schedule.getEndsOn() > msFromStartOfDay; + return isActive(eventTs, zoneId, zdt, schedule.getStartsOn(), schedule.getEndsOn()); } private boolean isActiveCustom(CustomTimeSchedule schedule, long eventTs) { @@ -177,9 +175,7 @@ class AlarmRuleState { for (CustomTimeScheduleItem item : schedule.getItems()) { if (item.getDayOfWeek() == dayOfWeek) { if (item.isEnabled()) { - long startOfDay = zdt.toLocalDate().atStartOfDay(zoneId).toInstant().toEpochMilli(); - long msFromStartOfDay = eventTs - startOfDay; - return item.getStartsOn() <= msFromStartOfDay && item.getEndsOn() > msFromStartOfDay; + return isActive(eventTs, zoneId, zdt, item.getStartsOn(), item.getEndsOn()); } else { return false; } @@ -188,6 +184,16 @@ class AlarmRuleState { return false; } + private boolean isActive(long eventTs, ZoneId zoneId, ZonedDateTime zdt, long startsOn, long endsOn) { + long startOfDay = zdt.toLocalDate().atStartOfDay(zoneId).toInstant().toEpochMilli(); + long msFromStartOfDay = eventTs - startOfDay; + if (startsOn <= endsOn) { + return startsOn <= msFromStartOfDay && endsOn > msFromStartOfDay; + } else { + return startsOn < msFromStartOfDay || (0 < msFromStartOfDay && msFromStartOfDay < endsOn); + } + } + public void clear() { if (state.getEventCount() > 0 || state.getLastEventTs() > 0 || state.getDuration() > 0) { state.setEventCount(0L);