diff --git a/eraser-base/src/main/jastadd/Item.jrag b/eraser-base/src/main/jastadd/Item.jrag index 3cda6928db5c7921d01d34b5bf90bd08415fccf1..0afb11fc40ea51c6220b8b285adaf9edb68daf02 100644 --- a/eraser-base/src/main/jastadd/Item.jrag +++ b/eraser-base/src/main/jastadd/Item.jrag @@ -294,7 +294,6 @@ aspect ItemHandling { * @param shouldSendState whether to send the new state (currently affects MQTT and Influx) */ protected void Item.stateUpdated(boolean shouldSendState) { - this.getStateData().afterStateChangeApplied(); if (shouldSendState) { try { // sendState() refined in MQTT and Influx aspect @@ -303,7 +302,8 @@ aspect ItemHandling { logger.catching(e); } } - if (hasItemObserver() && this.getStateData().checkStateTransitionTime()) { + if (hasItemObserver() && this.getStateData().checkStateProcessingTime()) { + this.getStateData().afterStateChangeProcessed(); getItemObserver().apply(); } } diff --git a/eraser-base/src/main/jastadd/StateData.jrag b/eraser-base/src/main/jastadd/StateData.jrag index 66b6d7248c472a8369573af1b7ed0f98242aa5ac..bfb18d6996108bb1eaa13ec58651a4ca5eb816f3 100644 --- a/eraser-base/src/main/jastadd/StateData.jrag +++ b/eraser-base/src/main/jastadd/StateData.jrag @@ -1,14 +1,17 @@ aspect StateData { - public void StateData.afterStateChangeApplied() { + public void StateData.afterStateChangeProcessed() { this.setLastChangeDate(Instant.now()); } - public boolean StateData.checkStateTransitionTime() { + public boolean StateData.checkStateProcessingTime() { if (this.getItemPerformance()==null) { return true; } double frequency = this.getItemPerformance().getEventProcessingFrequency(); Instant lastStateChange = this.getLastChangeDate(); + if (lastStateChange==null) { + return true; + } return lastStateChange.toEpochMilli() + (1/frequency)*1000 < Instant.now().toEpochMilli(); diff --git a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/util/TestUtils.java b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/util/TestUtils.java index fd6024bdfd45e2652eb4eaa118eada3dbfc75f23..3654470a6285e3424d750043b0df66cec295361b 100644 --- a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/util/TestUtils.java +++ b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/util/TestUtils.java @@ -2,6 +2,8 @@ package de.tudresden.inf.st.eraser.util; import de.tudresden.inf.st.eraser.jastadd.model.*; +import java.util.ArrayList; + /** * Helper class to create models used in tests. * @@ -35,6 +37,13 @@ public class TestUtils { return ModelAndItem.of(root.getSmartHomeEntityModel(), item); } + public static SmartHomeEntityModel createModelWithGroup() { + Root root = Root.createEmptyRoot(); + ParserUtils.createUnknownGroup(root.getSmartHomeEntityModel(),new ArrayList<>()); + + return root.getSmartHomeEntityModel(); + } + public static NumberItem addItemTo(SmartHomeEntityModel model, double initialValue) { return addItemTo(model, initialValue, false); } diff --git a/eraser-base/src/test/java/de/tudresden/inf/st/eraser/RulesTest.java b/eraser-base/src/test/java/de/tudresden/inf/st/eraser/RulesTest.java index 1a1ea62a2d4611fa00da7252510a325fe40cf41f..1c57da5fc7e16dddc2cbc22150e243469743b237 100644 --- a/eraser-base/src/test/java/de/tudresden/inf/st/eraser/RulesTest.java +++ b/eraser-base/src/test/java/de/tudresden/inf/st/eraser/RulesTest.java @@ -15,6 +15,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.StreamSupport; +import static de.tudresden.inf.st.eraser.util.TestUtils.getDefaultGroup; import static org.assertj.core.api.Assertions.fail; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -245,6 +246,11 @@ public class RulesTest { assertEquals(2, counter.get(item), "Change of item to 7 should not trigger the rule, check2 violated"); } + private static void addItemToModel(SmartHomeEntityModel model, Item item) { + getDefaultGroup(model).addItem(item); + } + + @Test public void testTwoActions() { TestUtils.ModelAndItem modelAndItem = createModelAndItem(2); @@ -662,6 +668,35 @@ public class RulesTest { assertEquals(2, counter.get(null), "Rule was not executed two times"); } + @Test + public void testItemPerformance() { + + TestUtils.ModelAndItem mai = createModelAndItem(0); + NumberItem numberItem = mai.item; + + ItemPerformance itemPerformance = new ItemPerformance(); + itemPerformance.setEventProcessingFrequency(10); + numberItem.getStateData().setItemPerformance(itemPerformance); + + Rule rule = new Rule(); + CountingAction counter = new CountingAction(); + rule.addAction(counter); + rule.activateFor(numberItem); + numberItem.setState(1); + numberItem.setState(2); + assertEquals(1, counter.get(numberItem), "Action was triggered although ItemPerformance too small"); + counter.reset(); + waitMillis(100); + numberItem.setState(3); + assertEquals(1, counter.get(numberItem), "Action wasn't triggered although frequency ItemPerformance is small enough"); + counter.reset(); + numberItem.setState(4); + numberItem.setState(5); + assertEquals(0, counter.get(numberItem), "Action was triggered although ItemPerformance too small"); + counter.reset(); + + } + private static void waitMillis(int millis) { try { Thread.sleep(millis); @@ -673,7 +708,7 @@ public class RulesTest { private StringItem addStringItem(SmartHomeEntityModel model, String initialValue) { StringItem item = new StringItem(); - Group group = TestUtils.getDefaultGroup(model); + Group group = getDefaultGroup(model); item.setID("item" + group.getNumItem()); item.setState(initialValue, false); group.addItem(item);