diff --git a/application/src/main/java/org/thingsboard/server/controller/TelemetryController.java b/application/src/main/java/org/thingsboard/server/controller/TelemetryController.java index 86a2457e99..b52abf991e 100644 --- a/application/src/main/java/org/thingsboard/server/controller/TelemetryController.java +++ b/application/src/main/java/org/thingsboard/server/controller/TelemetryController.java @@ -182,11 +182,12 @@ public class TelemetryController extends BaseController { @ResponseBody public DeferredResult getLatestTimeseries( @PathVariable("entityType") String entityType, @PathVariable("entityId") String entityIdStr, - @RequestParam(name = "keys", required = false) String keysStr) throws ThingsboardException { + @RequestParam(name = "keys", required = false) String keysStr, + @RequestParam(name = "useStrictType", required = false, defaultValue = "false") Boolean useStrictType) throws ThingsboardException { SecurityUser user = getCurrentUser(); return accessValidator.validateEntityAndCallback(getCurrentUser(), Operation.READ_TELEMETRY, entityType, entityIdStr, - (result, tenantId, entityId) -> getLatestTimeseriesValuesCallback(result, user, entityId, keysStr)); + (result, tenantId, entityId) -> getLatestTimeseriesValuesCallback(result, user, entityId, keysStr, useStrictType)); } @@ -200,8 +201,8 @@ public class TelemetryController extends BaseController { @RequestParam(name = "endTs") Long endTs, @RequestParam(name = "interval", defaultValue = "0") Long interval, @RequestParam(name = "limit", defaultValue = "100") Integer limit, - @RequestParam(name = "agg", defaultValue = "NONE") String aggStr - ) throws ThingsboardException { + @RequestParam(name = "agg", defaultValue = "NONE") String aggStr, + @RequestParam(name = "useStrictType", required = false, defaultValue = "false") Boolean useStrictType) throws ThingsboardException { return accessValidator.validateEntityAndCallback(getCurrentUser(), Operation.READ_TELEMETRY, entityType, entityIdStr, (result, tenantId, entityId) -> { // If interval is 0, convert this to a NONE aggregation, which is probably what the user really wanted @@ -209,7 +210,7 @@ public class TelemetryController extends BaseController { List queries = toKeysList(keys).stream().map(key -> new BaseReadTsKvQuery(key, startTs, endTs, interval, limit, agg)) .collect(Collectors.toList()); - Futures.addCallback(tsService.findAll(tenantId, entityId, queries), getTsKvListCallback(result)); + Futures.addCallback(tsService.findAll(tenantId, entityId, queries), getTsKvListCallback(result, useStrictType)); }); } @@ -454,14 +455,14 @@ public class TelemetryController extends BaseController { }); } - private void getLatestTimeseriesValuesCallback(@Nullable DeferredResult result, SecurityUser user, EntityId entityId, String keys) { + private void getLatestTimeseriesValuesCallback(@Nullable DeferredResult result, SecurityUser user, EntityId entityId, String keys, Boolean useStrictType) { ListenableFuture> future; if (StringUtils.isEmpty(keys)) { future = tsService.findAllLatest(user.getTenantId(), entityId); } else { future = tsService.findLatest(user.getTenantId(), entityId, toKeysList(keys)); } - Futures.addCallback(future, getTsKvListCallback(result)); + Futures.addCallback(future, getTsKvListCallback(result, useStrictType)); } private void getAttributeValuesCallback(@Nullable DeferredResult result, SecurityUser user, EntityId entityId, String scope, String keys) { @@ -544,7 +545,7 @@ public class TelemetryController extends BaseController { @Override public void onSuccess(List attributes) { List values = attributes.stream().map(attribute -> - new AttributeData(attribute.getLastUpdateTs(), attribute.getKey(), getKvValue(attribute)) + new AttributeData(attribute.getLastUpdateTs(), attribute.getKey(), getKvValue(attribute)) ).collect(Collectors.toList()); logAttributesRead(user, entityId, scope, keyList, null); response.setResult(new ResponseEntity<>(values, HttpStatus.OK)); @@ -559,14 +560,14 @@ public class TelemetryController extends BaseController { }; } - private FutureCallback> getTsKvListCallback(final DeferredResult response) { + private FutureCallback> getTsKvListCallback(final DeferredResult response, Boolean useStrictType) { return new FutureCallback>() { @Override public void onSuccess(List data) { Map> result = new LinkedHashMap<>(); for (TsKvEntry entry : data) { - result.computeIfAbsent(entry.getKey(), k -> new ArrayList<>()) - .add(new TsData(entry.getTs(), entry.getValueAsString())); + Object value = useStrictType ? getKvValue(entry) : entry.getValueAsString(); + result.computeIfAbsent(entry.getKey(), k -> new ArrayList<>()).add(new TsData(entry.getTs(), value)); } response.setResult(new ResponseEntity<>(result, HttpStatus.OK)); } diff --git a/application/src/main/java/org/thingsboard/server/service/telemetry/TsData.java b/application/src/main/java/org/thingsboard/server/service/telemetry/TsData.java index 367a6a6a1d..14b579025c 100644 --- a/application/src/main/java/org/thingsboard/server/service/telemetry/TsData.java +++ b/application/src/main/java/org/thingsboard/server/service/telemetry/TsData.java @@ -18,9 +18,9 @@ package org.thingsboard.server.service.telemetry; public class TsData implements Comparable{ private final long ts; - private final String value; + private final Object value; - public TsData(long ts, String value) { + public TsData(long ts, Object value) { super(); this.ts = ts; this.value = value; @@ -30,7 +30,7 @@ public class TsData implements Comparable{ return ts; } - public String getValue() { + public Object getValue() { return value; }