diff --git a/application/src/main/java/org/thingsboard/server/service/state/DefaultDeviceStateService.java b/application/src/main/java/org/thingsboard/server/service/state/DefaultDeviceStateService.java index 094bab1e0d..7f8ebf5057 100644 --- a/application/src/main/java/org/thingsboard/server/service/state/DefaultDeviceStateService.java +++ b/application/src/main/java/org/thingsboard/server/service/state/DefaultDeviceStateService.java @@ -39,7 +39,9 @@ import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.kv.AttributeKvEntry; import org.thingsboard.server.common.data.kv.BasicTsKvEntry; import org.thingsboard.server.common.data.kv.BooleanDataEntry; +import org.thingsboard.server.common.data.kv.KvEntry; import org.thingsboard.server.common.data.kv.LongDataEntry; +import org.thingsboard.server.common.data.kv.TsKvEntry; import org.thingsboard.server.common.data.page.TextPageData; import org.thingsboard.server.common.data.page.TextPageLink; import org.thingsboard.server.common.msg.TbMsg; @@ -51,6 +53,7 @@ import org.thingsboard.server.common.msg.system.ServiceToRuleEngineMsg; import org.thingsboard.server.dao.attributes.AttributesService; import org.thingsboard.server.dao.device.DeviceService; import org.thingsboard.server.dao.tenant.TenantService; +import org.thingsboard.server.dao.timeseries.TimeseriesService; import org.thingsboard.server.gen.cluster.ClusterAPIProtos; import org.thingsboard.server.service.cluster.routing.ClusterRoutingService; import org.thingsboard.server.service.cluster.rpc.ClusterRpcService; @@ -106,6 +109,9 @@ public class DefaultDeviceStateService implements DeviceStateService { @Autowired private AttributesService attributesService; + @Autowired + private TimeseriesService tsService; + @Autowired @Lazy private ActorService actorService; @@ -436,19 +442,28 @@ public class DefaultDeviceStateService implements DeviceStateService { } private ListenableFuture fetchDeviceState(Device device) { - ListenableFuture> attributes = attributesService.find(TenantId.SYS_TENANT_ID, device.getId(), DataConstants.SERVER_SCOPE, PERSISTENT_ATTRIBUTES); - return Futures.transform(attributes, new Function, DeviceStateData>() { + if (persistToTelemetry) { + ListenableFuture> tsData = tsService.findLatest(TenantId.SYS_TENANT_ID, device.getId(), PERSISTENT_ATTRIBUTES); + return Futures.transform(tsData, extractDeviceStateData(device)); + } else { + ListenableFuture> attrData = attributesService.find(TenantId.SYS_TENANT_ID, device.getId(), DataConstants.SERVER_SCOPE, PERSISTENT_ATTRIBUTES); + return Futures.transform(attrData, extractDeviceStateData(device)); + } + } + + private Function, DeviceStateData> extractDeviceStateData(Device device) { + return new Function, DeviceStateData>() { @Nullable @Override - public DeviceStateData apply(@Nullable List attributes) { - long lastActivityTime = getAttributeValue(attributes, LAST_ACTIVITY_TIME, 0L); - long inactivityAlarmTime = getAttributeValue(attributes, INACTIVITY_ALARM_TIME, 0L); - long inactivityTimeout = getAttributeValue(attributes, INACTIVITY_TIMEOUT, TimeUnit.SECONDS.toMillis(defaultInactivityTimeoutInSec)); + public DeviceStateData apply(@Nullable List data) { + long lastActivityTime = getAttributeValue(data, LAST_ACTIVITY_TIME, 0L); + long inactivityAlarmTime = getAttributeValue(data, INACTIVITY_ALARM_TIME, 0L); + long inactivityTimeout = getAttributeValue(data, INACTIVITY_TIMEOUT, TimeUnit.SECONDS.toMillis(defaultInactivityTimeoutInSec)); boolean active = System.currentTimeMillis() < lastActivityTime + inactivityTimeout; DeviceState deviceState = DeviceState.builder() .active(active) - .lastConnectTime(getAttributeValue(attributes, LAST_CONNECT_TIME, 0L)) - .lastDisconnectTime(getAttributeValue(attributes, LAST_DISCONNECT_TIME, 0L)) + .lastConnectTime(getAttributeValue(data, LAST_CONNECT_TIME, 0L)) + .lastDisconnectTime(getAttributeValue(data, LAST_DISCONNECT_TIME, 0L)) .lastActivityTime(lastActivityTime) .lastInactivityAlarmTime(inactivityAlarmTime) .inactivityTimeout(inactivityTimeout) @@ -462,11 +477,11 @@ public class DefaultDeviceStateService implements DeviceStateService { .metaData(md) .state(deviceState).build(); } - }); + }; } - private long getAttributeValue(List attributes, String attributeName, long defaultValue) { - for (AttributeKvEntry attribute : attributes) { + private long getAttributeValue(List attributes, String attributeName, long defaultValue) { + for (KvEntry attribute : attributes) { if (attribute.getKey().equals(attributeName)) { return attribute.getLongValue().orElse(defaultValue); }