diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/EntityDataMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/EntityDataMsgConstructor.java index 2c4694d25d..07f7ffb02a 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/EntityDataMsgConstructor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/EntityDataMsgConstructor.java @@ -15,6 +15,8 @@ */ package org.thingsboard.server.service.edge.rpc.constructor; +import com.google.gson.Gson; +import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import lombok.extern.slf4j.Slf4j; @@ -22,8 +24,11 @@ import org.springframework.stereotype.Component; import org.thingsboard.server.common.data.audit.ActionType; import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.transport.adaptor.JsonConverter; +import org.thingsboard.server.gen.edge.AttributeDeleteMsg; import org.thingsboard.server.gen.edge.EntityDataProto; +import java.util.List; + @Component @Slf4j public class EntityDataMsgConstructor { @@ -50,8 +55,19 @@ public class EntityDataMsgConstructor { log.warn("Can't convert to attributes proto, entityData [{}]", entityData, e); } break; - // TODO: voba - add support for attribute delete - // case ATTRIBUTES_DELETED: + case ATTRIBUTES_DELETED: + try { + AttributeDeleteMsg.Builder attributeDeleteMsg = AttributeDeleteMsg.newBuilder(); + attributeDeleteMsg.setScope(entityData.getAsJsonObject().getAsJsonPrimitive("scope").getAsString()); + JsonArray jsonArray = entityData.getAsJsonObject().getAsJsonArray("keys"); + List keys = new Gson().fromJson(jsonArray.toString(), List.class); + attributeDeleteMsg.addAllAttributeNames(keys); + attributeDeleteMsg.build(); + builder.setAttributeDeleteMsg(attributeDeleteMsg); + } catch (Exception e) { + log.warn("Can't convert to AttributeDeleteMsg proto, entityData [{}]", entityData, e); + } + break; } return builder.build(); } diff --git a/common/edge-api/src/main/proto/edge.proto b/common/edge-api/src/main/proto/edge.proto index 9713cd754f..181ebff531 100644 --- a/common/edge-api/src/main/proto/edge.proto +++ b/common/edge-api/src/main/proto/edge.proto @@ -110,9 +110,15 @@ message EntityDataProto { transport.PostTelemetryMsg postTelemetryMsg = 4; transport.PostAttributeMsg postAttributesMsg = 5; string postAttributeScope = 6; + AttributeDeleteMsg attributeDeleteMsg = 7; // transport.ToDeviceRpcRequestMsg ??? } +message AttributeDeleteMsg { + string scope = 1; + repeated string attributeNames = 2; +} + message RuleChainUpdateMsg { UpdateMsgType msgType = 1; int64 idMSB = 2; diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/edge/TbMsgPushToEdgeNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/edge/TbMsgPushToEdgeNode.java index b383ae0a1a..f1134078c1 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/edge/TbMsgPushToEdgeNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/edge/TbMsgPushToEdgeNode.java @@ -139,17 +139,15 @@ public class TbMsgPushToEdgeNode implements TbNode { if (edgeEventTypeByEntityType == null) { return null; } + ActionType actionType = getActionTypeByMsgType(msg.getType()); JsonNode entityBody = null; JsonNode data = json.readTree(msg.getData()); - if (SessionMsgType.POST_ATTRIBUTES_REQUEST.name().equals(msg.getType())) { - Map entityData = new HashMap<>(); - entityData.put("kv", data); - entityData.put("scope", msg.getMetaData().getData().get("scope")); - entityBody = json.valueToTree(entityData); + if (actionType.equals(ActionType.ATTRIBUTES_UPDATED) || actionType.equals(ActionType.ATTRIBUTES_DELETED)) { + entityBody = getAttributeEntityBody(actionType, data, msg.getMetaData().getData()); } else { entityBody = data; } - return buildEdgeEvent(ctx.getTenantId(), getActionTypeByMsgType(msg.getType()), msg.getOriginator().getId(), edgeEventTypeByEntityType, entityBody); + return buildEdgeEvent(ctx.getTenantId(), actionType, msg.getOriginator().getId(), edgeEventTypeByEntityType, entityBody); } } @@ -163,6 +161,21 @@ public class TbMsgPushToEdgeNode implements TbNode { return edgeEvent; } + private JsonNode getAttributeEntityBody(ActionType actionType, JsonNode data, Map metadata) throws JsonProcessingException { + Map entityData = new HashMap<>(); + switch (actionType) { + case ATTRIBUTES_UPDATED: + entityData.put("kv", data); + break; + case ATTRIBUTES_DELETED: + List keys = json.treeToValue(data.get("attributes"), List.class); + entityData.put("keys", keys); + break; + } + entityData.put("scope", metadata.get("scope")); + return json.valueToTree(entityData); + } + private UUID getUUIDFromMsgData(TbMsg msg) throws JsonProcessingException { JsonNode data = json.readTree(msg.getData()).get("id"); String id = json.treeToValue(data.get("id"), String.class);