Fixed device state service

This commit is contained in:
Andrew Shvayka 2019-11-26 13:22:52 +02:00
parent 42a15097c6
commit e18582f912

View File

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