diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/init/DefaultSyncEdgeService.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/init/DefaultSyncEdgeService.java index 8576f96152..1a2a3d3177 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/init/DefaultSyncEdgeService.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/init/DefaultSyncEdgeService.java @@ -71,7 +71,9 @@ import org.thingsboard.server.gen.edge.UserCredentialsRequestMsg; import org.thingsboard.server.service.executors.DbCallbackExecutorService; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.UUID; @Service @@ -289,25 +291,29 @@ public class DefaultSyncEdgeService implements SyncEdgeService { public void onSuccess(@Nullable List ssAttributes) { if (ssAttributes != null && !ssAttributes.isEmpty()) { try { - ObjectNode entityNode = mapper.createObjectNode(); + Map entityData = new HashMap<>(); + ObjectNode attributes = mapper.createObjectNode(); for (AttributeKvEntry attr : ssAttributes) { if (attr.getDataType() == DataType.BOOLEAN && attr.getBooleanValue().isPresent()) { - entityNode.put(attr.getKey(), attr.getBooleanValue().get()); + attributes.put(attr.getKey(), attr.getBooleanValue().get()); } else if (attr.getDataType() == DataType.DOUBLE && attr.getDoubleValue().isPresent()) { - entityNode.put(attr.getKey(), attr.getDoubleValue().get()); + attributes.put(attr.getKey(), attr.getDoubleValue().get()); } else if (attr.getDataType() == DataType.LONG && attr.getLongValue().isPresent()) { - entityNode.put(attr.getKey(), attr.getLongValue().get()); + attributes.put(attr.getKey(), attr.getLongValue().get()); } else { - entityNode.put(attr.getKey(), attr.getValueAsString()); + attributes.put(attr.getKey(), attr.getValueAsString()); } } - log.debug("Sending attributes data msg, entityId [{}], attributes [{}]", entityId, entityNode); + entityData.put("kv", attributes); + entityData.put("scope", DataConstants.SERVER_SCOPE); + JsonNode entityBody = mapper.valueToTree(entityData); + log.debug("Sending attributes data msg, entityId [{}], attributes [{}]", entityId, entityBody); saveEdgeEvent(edge.getTenantId(), edge.getId(), edgeEventType, ActionType.ATTRIBUTES_UPDATED, entityId, - entityNode); + entityBody); } catch (Exception e) { log.error("[{}] Failed to send attribute updates to the edge", edge.getName(), e); } diff --git a/common/queue/src/main/proto/queue.proto b/common/queue/src/main/proto/queue.proto index 921a096df0..c302a30b8c 100644 --- a/common/queue/src/main/proto/queue.proto +++ b/common/queue/src/main/proto/queue.proto @@ -115,6 +115,7 @@ message PostTelemetryMsg { message PostAttributeMsg { repeated KeyValueProto kv = 1; + string scope = 2; } message GetAttributeRequestMsg { diff --git a/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/adaptor/JsonConverter.java b/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/adaptor/JsonConverter.java index 8375b84ffa..2836f05164 100644 --- a/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/adaptor/JsonConverter.java +++ b/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/adaptor/JsonConverter.java @@ -136,8 +136,9 @@ public class JsonConverter { public static PostAttributeMsg convertToAttributesProto(JsonElement jsonObject) throws JsonSyntaxException { if (jsonObject.isJsonObject()) { PostAttributeMsg.Builder result = PostAttributeMsg.newBuilder(); - List keyValueList = parseProtoValues(jsonObject.getAsJsonObject()); + List keyValueList = parseProtoValues(jsonObject.getAsJsonObject().getAsJsonObject("kv")); result.addAllKv(keyValueList); + result.setScope(jsonObject.getAsJsonObject().getAsJsonPrimitive("scope").getAsString()); return result.build(); } else { throw new JsonSyntaxException(CAN_T_PARSE_VALUE + jsonObject);