Fixed device state service
This commit is contained in:
parent
42a15097c6
commit
e18582f912
@ -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<DeviceStateData> fetchDeviceState(Device device) {
|
||||
ListenableFuture<List<AttributeKvEntry>> attributes = attributesService.find(TenantId.SYS_TENANT_ID, device.getId(), DataConstants.SERVER_SCOPE, PERSISTENT_ATTRIBUTES);
|
||||
return Futures.transform(attributes, new Function<List<AttributeKvEntry>, DeviceStateData>() {
|
||||
if (persistToTelemetry) {
|
||||
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
|
||||
@Override
|
||||
public DeviceStateData apply(@Nullable List<AttributeKvEntry> 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<T> 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<AttributeKvEntry> attributes, String attributeName, long defaultValue) {
|
||||
for (AttributeKvEntry attribute : attributes) {
|
||||
private long getAttributeValue(List<? extends KvEntry> attributes, String attributeName, long defaultValue) {
|
||||
for (KvEntry attribute : attributes) {
|
||||
if (attribute.getKey().equals(attributeName)) {
|
||||
return attribute.getLongValue().orElse(defaultValue);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user