Added alarm push from edge to cloud
This commit is contained in:
parent
acfaf68042
commit
44377d56ca
@ -186,14 +186,25 @@ class DefaultTbContext implements TbContext {
|
||||
}
|
||||
|
||||
public TbMsg alarmCreatedMsg(Alarm alarm, RuleNodeId ruleNodeId) {
|
||||
try {
|
||||
ObjectNode entityNode = mapper.valueToTree(alarm);
|
||||
return new TbMsg(UUIDs.timeBased(), DataConstants.ENTITY_CREATED, alarm.getId(), getActionMetaData(ruleNodeId), mapper.writeValueAsString(entityNode), null, null, 0L);
|
||||
} catch (JsonProcessingException | IllegalArgumentException e) {
|
||||
throw new RuntimeException("Failed to process alarm created msg: " + e);
|
||||
}
|
||||
return alarmMsg(alarm, ruleNodeId, DataConstants.ENTITY_CREATED);
|
||||
}
|
||||
|
||||
public TbMsg alarmUpdatedMsg(Alarm alarm, RuleNodeId ruleNodeId) {
|
||||
return alarmMsg(alarm, ruleNodeId, DataConstants.ENTITY_UPDATED);
|
||||
}
|
||||
|
||||
public TbMsg alarmClearedMsg(Alarm alarm, RuleNodeId ruleNodeId) {
|
||||
return alarmMsg(alarm, ruleNodeId, DataConstants.ALARM_CLEAR);
|
||||
}
|
||||
|
||||
private TbMsg alarmMsg(Alarm alarm, RuleNodeId ruleNodeId, String type) {
|
||||
try {
|
||||
ObjectNode entityNode = mapper.valueToTree(alarm);
|
||||
return new TbMsg(UUIDs.timeBased(), type, alarm.getId(), getActionMetaData(ruleNodeId), mapper.writeValueAsString(entityNode), null, null, 0L);
|
||||
} catch (JsonProcessingException | IllegalArgumentException e) {
|
||||
throw new RuntimeException("Failed to process alarm created, updated or cleared msg: " + e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public RuleNodeId getSelfId() {
|
||||
|
||||
@ -20,6 +20,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.thingsboard.server.actors.service.ActorService;
|
||||
import org.thingsboard.server.dao.alarm.AlarmService;
|
||||
import org.thingsboard.server.dao.asset.AssetService;
|
||||
import org.thingsboard.server.dao.attributes.AttributesService;
|
||||
import org.thingsboard.server.dao.customer.CustomerService;
|
||||
@ -60,6 +61,10 @@ public class EdgeContextComponent {
|
||||
@Autowired
|
||||
private RelationService relationService;
|
||||
|
||||
@Lazy
|
||||
@Autowired
|
||||
private AlarmService alarmService;
|
||||
|
||||
@Lazy
|
||||
@Autowired
|
||||
private ActorService actorService;
|
||||
|
||||
@ -32,6 +32,8 @@ import org.thingsboard.server.common.data.EntityType;
|
||||
import org.thingsboard.server.common.data.EntityView;
|
||||
import org.thingsboard.server.common.data.Event;
|
||||
import org.thingsboard.server.common.data.alarm.Alarm;
|
||||
import org.thingsboard.server.common.data.alarm.AlarmSeverity;
|
||||
import org.thingsboard.server.common.data.alarm.AlarmStatus;
|
||||
import org.thingsboard.server.common.data.asset.Asset;
|
||||
import org.thingsboard.server.common.data.edge.Edge;
|
||||
import org.thingsboard.server.common.data.edge.EdgeQueueEntry;
|
||||
@ -180,7 +182,7 @@ public final class EdgeGrpcSession implements Cloneable {
|
||||
case ENTITY_UPDATED_RPC_MESSAGE:
|
||||
case ENTITY_CREATED_RPC_MESSAGE:
|
||||
case ALARM_ACK_RPC_MESSAGE:
|
||||
case ALARM_CLEARK_RPC_MESSAGE:
|
||||
case ALARM_CLEAR_RPC_MESSAGE:
|
||||
processEntityCRUDMessage(entry, msgType);
|
||||
break;
|
||||
case RULE_CHAIN_CUSTOM_MESSAGE:
|
||||
@ -379,7 +381,7 @@ public final class EdgeGrpcSession implements Cloneable {
|
||||
AlarmUpdateMsg.Builder builder = AlarmUpdateMsg.newBuilder()
|
||||
.setMsgType(msgType)
|
||||
.setName(alarm.getName())
|
||||
.setType(alarm.getName())
|
||||
.setType(alarm.getType())
|
||||
.setOriginatorName(entityName)
|
||||
.setOriginatorType(alarm.getOriginator().getEntityType().name())
|
||||
.setSeverity(alarm.getSeverity().name())
|
||||
@ -409,6 +411,10 @@ public final class EdgeGrpcSession implements Cloneable {
|
||||
case DataConstants.ENTITY_DELETED:
|
||||
case DataConstants.ENTITY_UNASSIGNED_FROM_EDGE:
|
||||
return UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE;
|
||||
case DataConstants.ALARM_ACK:
|
||||
return UpdateMsgType.ALARM_ACK_RPC_MESSAGE;
|
||||
case DataConstants.ALARM_CLEAR:
|
||||
return UpdateMsgType.ALARM_CLEAR_RPC_MESSAGE;
|
||||
default:
|
||||
throw new RuntimeException("Unsupported msgType [" + msgType + "]");
|
||||
}
|
||||
@ -532,7 +538,7 @@ public final class EdgeGrpcSession implements Cloneable {
|
||||
DeviceUpdateMsg.Builder builder = DeviceUpdateMsg.newBuilder()
|
||||
.setMsgType(msgType)
|
||||
.setName(device.getName())
|
||||
.setType(device.getName());
|
||||
.setType(device.getType());
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
@ -540,7 +546,7 @@ public final class EdgeGrpcSession implements Cloneable {
|
||||
AssetUpdateMsg.Builder builder = AssetUpdateMsg.newBuilder()
|
||||
.setMsgType(msgType)
|
||||
.setName(asset.getName())
|
||||
.setType(asset.getName());
|
||||
.setType(asset.getType());
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
@ -562,7 +568,7 @@ public final class EdgeGrpcSession implements Cloneable {
|
||||
EntityViewUpdateMsg.Builder builder = EntityViewUpdateMsg.newBuilder()
|
||||
.setMsgType(msgType)
|
||||
.setName(entityView.getName())
|
||||
.setType(entityView.getName())
|
||||
.setType(entityView.getType())
|
||||
.setRelatedName(relatedName)
|
||||
.setRelatedType(relatedType)
|
||||
.setRelatedEntityType(relatedEntityType);
|
||||
@ -618,6 +624,11 @@ public final class EdgeGrpcSession implements Cloneable {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (uplinkMsg.getAlarmUpdatemsgList() != null && !uplinkMsg.getAlarmUpdatemsgList().isEmpty()) {
|
||||
for (AlarmUpdateMsg alarmUpdateMsg : uplinkMsg.getAlarmUpdatemsgList()) {
|
||||
onAlarmUpdate(alarmUpdateMsg);
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
return UplinkResponseMsg.newBuilder().setSuccess(false).setErrorMsg(e.getMessage()).build();
|
||||
}
|
||||
@ -625,6 +636,65 @@ public final class EdgeGrpcSession implements Cloneable {
|
||||
return UplinkResponseMsg.newBuilder().setSuccess(true).build();
|
||||
}
|
||||
|
||||
private EntityId getAlarmOriginator(String entityName, org.thingsboard.server.common.data.EntityType entityType) {
|
||||
switch (entityType) {
|
||||
case DEVICE:
|
||||
return ctx.getDeviceService().findDeviceByTenantIdAndName(edge.getTenantId(), entityName).getId();
|
||||
case ASSET:
|
||||
return ctx.getAssetService().findAssetByTenantIdAndName(edge.getTenantId(), entityName).getId();
|
||||
case ENTITY_VIEW:
|
||||
return ctx.getEntityViewService().findEntityViewByTenantIdAndName(edge.getTenantId(), entityName).getId();
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private void onAlarmUpdate(AlarmUpdateMsg alarmUpdateMsg) {
|
||||
EntityId originatorId = getAlarmOriginator(alarmUpdateMsg.getOriginatorName(), org.thingsboard.server.common.data.EntityType.valueOf(alarmUpdateMsg.getOriginatorType()));
|
||||
if (originatorId != null) {
|
||||
try {
|
||||
Alarm existentAlarm = ctx.getAlarmService().findLatestByOriginatorAndType(edge.getTenantId(), originatorId, alarmUpdateMsg.getType()).get();
|
||||
switch (alarmUpdateMsg.getMsgType()) {
|
||||
case ENTITY_CREATED_RPC_MESSAGE:
|
||||
case ENTITY_UPDATED_RPC_MESSAGE:
|
||||
if (existentAlarm == null) {
|
||||
existentAlarm = new Alarm();
|
||||
existentAlarm.setTenantId(edge.getTenantId());
|
||||
existentAlarm.setType(alarmUpdateMsg.getName());
|
||||
existentAlarm.setOriginator(originatorId);
|
||||
existentAlarm.setSeverity(AlarmSeverity.valueOf(alarmUpdateMsg.getSeverity()));
|
||||
existentAlarm.setStatus(AlarmStatus.valueOf(alarmUpdateMsg.getStatus()));
|
||||
existentAlarm.setStartTs(alarmUpdateMsg.getStartTs());
|
||||
existentAlarm.setAckTs(alarmUpdateMsg.getAckTs());
|
||||
existentAlarm.setClearTs(alarmUpdateMsg.getClearTs());
|
||||
existentAlarm.setPropagate(alarmUpdateMsg.getPropagate());
|
||||
}
|
||||
existentAlarm.setEndTs(alarmUpdateMsg.getEndTs());
|
||||
existentAlarm.setDetails(objectMapper.readTree(alarmUpdateMsg.getDetails()));
|
||||
ctx.getAlarmService().createOrUpdateAlarm(existentAlarm);
|
||||
break;
|
||||
case ALARM_ACK_RPC_MESSAGE:
|
||||
if (existentAlarm != null) {
|
||||
ctx.getAlarmService().ackAlarm(edge.getTenantId(), existentAlarm.getId(), alarmUpdateMsg.getAckTs());
|
||||
}
|
||||
break;
|
||||
case ALARM_CLEAR_RPC_MESSAGE:
|
||||
if (existentAlarm != null) {
|
||||
ctx.getAlarmService().clearAlarm(edge.getTenantId(), existentAlarm.getId(), objectMapper.readTree(alarmUpdateMsg.getDetails()), alarmUpdateMsg.getAckTs());
|
||||
}
|
||||
break;
|
||||
case ENTITY_DELETED_RPC_MESSAGE:
|
||||
if (existentAlarm != null) {
|
||||
ctx.getAlarmService().deleteAlarm(edge.getTenantId(), existentAlarm.getId());
|
||||
}
|
||||
break;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("Error during finding existent alarm", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Device getOrCreateDevice(String deviceName, String deviceType) {
|
||||
Device device = ctx.getDeviceService().findDeviceByTenantIdAndName(edge.getTenantId(), deviceName);
|
||||
if (device == null) {
|
||||
@ -647,6 +717,7 @@ public final class EdgeGrpcSession implements Cloneable {
|
||||
device.setTenantId(edge.getTenantId());
|
||||
device.setCustomerId(edge.getCustomerId());
|
||||
device = ctx.getDeviceService().saveDevice(device);
|
||||
device = ctx.getDeviceService().assignDeviceToEdge(edge.getTenantId(), device.getId(), edge.getId());
|
||||
createRelationFromEdge(device.getId());
|
||||
ctx.getActorService().onDeviceAdded(device);
|
||||
pushDeviceCreatedEventToRuleEngine(device);
|
||||
|
||||
@ -26,6 +26,7 @@
|
||||
</appender>
|
||||
|
||||
<logger name="org.thingsboard.server" level="INFO" />
|
||||
<logger name="org.thingsboard.server.service.edge" level="TRACE" />
|
||||
<logger name="akka" level="INFO" />
|
||||
|
||||
<root level="INFO">
|
||||
|
||||
@ -89,7 +89,7 @@ enum UpdateMsgType {
|
||||
ENTITY_UPDATED_RPC_MESSAGE = 1;
|
||||
ENTITY_DELETED_RPC_MESSAGE = 2;
|
||||
ALARM_ACK_RPC_MESSAGE = 3;
|
||||
ALARM_CLEARK_RPC_MESSAGE = 4;
|
||||
ALARM_CLEAR_RPC_MESSAGE = 4;
|
||||
RULE_CHAIN_CUSTOM_MESSAGE = 5;
|
||||
}
|
||||
|
||||
|
||||
@ -79,6 +79,10 @@ public interface TbContext {
|
||||
|
||||
TbMsg alarmCreatedMsg(Alarm alarm, RuleNodeId ruleNodeId);
|
||||
|
||||
TbMsg alarmUpdatedMsg(Alarm alarm, RuleNodeId ruleNodeId);
|
||||
|
||||
TbMsg alarmClearedMsg(Alarm alarm, RuleNodeId ruleNodeId);
|
||||
|
||||
RuleNodeId getSelfId();
|
||||
|
||||
TenantId getTenantId();
|
||||
|
||||
@ -63,8 +63,10 @@ public abstract class TbAbstractAlarmNode<C extends TbAbstractAlarmNodeConfigura
|
||||
ctx.sendTbMsgToRuleEngine(ctx.alarmCreatedMsg(alarmResult.alarm, ctx.getSelfId()));
|
||||
} else if (alarmResult.isUpdated) {
|
||||
ctx.tellNext(toAlarmMsg(ctx, alarmResult, msg), "Updated");
|
||||
ctx.sendTbMsgToRuleEngine(ctx.alarmUpdatedMsg(alarmResult.alarm, ctx.getSelfId()));
|
||||
} else if (alarmResult.isCleared) {
|
||||
ctx.tellNext(toAlarmMsg(ctx, alarmResult, msg), "Cleared");
|
||||
ctx.sendTbMsgToRuleEngine(ctx.alarmClearedMsg(alarmResult.alarm, ctx.getSelfId()));
|
||||
}
|
||||
},
|
||||
t -> ctx.tellFailure(msg, t), ctx.getDbCallbackExecutor());
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user