diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationCalculatedFieldState.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationCalculatedFieldState.java index 5e45b97f9a..af7912da46 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationCalculatedFieldState.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationCalculatedFieldState.java @@ -20,6 +20,7 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import org.thingsboard.common.util.JacksonUtil; +import org.thingsboard.script.api.tbel.TbUtils; import org.thingsboard.server.actors.TbActorRef; import org.thingsboard.server.common.data.cf.CalculatedFieldType; import org.thingsboard.server.common.data.cf.configuration.Output; @@ -89,11 +90,11 @@ public class EntityAggregationCalculatedFieldState extends BaseCalculatedFieldSt }); removeExpiredIntervals(expiredIntervals); - ArrayNode result = toResult(results); + Output output = ctx.getOutput(); + ArrayNode result = toResult(results, output.getDecimalsByDefault()); if (result.isEmpty()) { return Futures.immediateFuture(TelemetryCalculatedFieldResult.EMPTY); } - Output output = ctx.getOutput(); return Futures.immediateFuture(TelemetryCalculatedFieldResult.builder() .type(output.getType()) .scope(output.getScope()) @@ -227,7 +228,7 @@ public class EntityAggregationCalculatedFieldState extends BaseCalculatedFieldSt .orElse(null); } - protected ArrayNode toResult(Map> results) { + protected ArrayNode toResult(Map> results, Integer precision) { ArrayNode result = JacksonUtil.newArrayNode(); results.forEach((interval, args) -> { ObjectNode metricsNode = JacksonUtil.newObjectNode(); @@ -235,7 +236,10 @@ public class EntityAggregationCalculatedFieldState extends BaseCalculatedFieldSt String metricName = entry.getKey(); ArgumentEntry argumentEntry = entry.getValue(); if (!argumentEntry.isEmpty()) { - metricsNode.put(metricName, JacksonUtil.toString(argumentEntry.getValue())); + Object resultValue = argumentEntry.getValue() instanceof Number number + ? TbUtils.roundResult(number.doubleValue(), precision) + : argumentEntry.getValue(); + metricsNode.put(metricName, JacksonUtil.toString(resultValue)); } } ObjectNode resultNode = JacksonUtil.newObjectNode(); diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/validator/CalculatedFieldDataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/validator/CalculatedFieldDataValidator.java index 7813a244e1..087640eda5 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/validator/CalculatedFieldDataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/validator/CalculatedFieldDataValidator.java @@ -134,7 +134,7 @@ public class CalculatedFieldDataValidator extends DataValidator if (minAggregationIntervalInSec <= 0) { return; } - if (aggConfiguration.getInterval().getIntervalDurationMillis() > TimeUnit.SECONDS.toMillis(minAggregationIntervalInSec)) { + if (aggConfiguration.getInterval().getIntervalDurationMillis() < TimeUnit.SECONDS.toMillis(minAggregationIntervalInSec)) { throw new IllegalArgumentException("Aggregation interval duration is less than configured " + "minimum allowed aggregation interval in tenant profile: " + minAggregationIntervalInSec + " sec."); }