Search in sources :

Example 6 with TbMsg

use of org.thingsboard.server.common.msg.TbMsg in project thingsboard by thingsboard.

the class TbMsgToEmailNode method onMsg.

@Override
public void onMsg(TbContext ctx, TbMsg msg) {
    try {
        TbEmail email = convert(msg);
        TbMsg emailMsg = buildEmailMsg(ctx, msg, email);
        ctx.tellNext(emailMsg, SUCCESS);
    } catch (Exception ex) {
        log.warn("Can not convert message to email " + ex.getMessage());
        ctx.tellFailure(msg, ex);
    }
}
Also used : TbEmail(org.thingsboard.rule.engine.api.TbEmail) TbMsg(org.thingsboard.server.common.msg.TbMsg) JsonProcessingException(com.fasterxml.jackson.core.JsonProcessingException) IOException(java.io.IOException) TbNodeException(org.thingsboard.rule.engine.api.TbNodeException)

Example 7 with TbMsg

use of org.thingsboard.server.common.msg.TbMsg in project thingsboard by thingsboard.

the class AlarmState method pushMsg.

public void pushMsg(TbContext ctx, TbMsg msg, TbAlarmResult alarmResult, AlarmRuleState ruleState) {
    JsonNode jsonNodes = JacksonUtil.valueToTree(alarmResult.getAlarm());
    String data = jsonNodes.toString();
    TbMsgMetaData metaData = lastMsgMetaData != null ? lastMsgMetaData.copy() : new TbMsgMetaData();
    String relationType;
    if (alarmResult.isCreated()) {
        relationType = "Alarm Created";
        metaData.putValue(DataConstants.IS_NEW_ALARM, Boolean.TRUE.toString());
    } else if (alarmResult.isUpdated()) {
        relationType = "Alarm Updated";
        metaData.putValue(DataConstants.IS_EXISTING_ALARM, Boolean.TRUE.toString());
    } else if (alarmResult.isSeverityUpdated()) {
        relationType = "Alarm Severity Updated";
        metaData.putValue(DataConstants.IS_EXISTING_ALARM, Boolean.TRUE.toString());
        metaData.putValue(DataConstants.IS_SEVERITY_UPDATED_ALARM, Boolean.TRUE.toString());
    } else {
        relationType = "Alarm Cleared";
        metaData.putValue(DataConstants.IS_CLEARED_ALARM, Boolean.TRUE.toString());
    }
    setAlarmConditionMetadata(ruleState, metaData);
    TbMsg newMsg = ctx.newMsg(lastMsgQueueName != null ? lastMsgQueueName : ServiceQueue.MAIN, "ALARM", originator, msg != null ? msg.getCustomerId() : null, metaData, data);
    ctx.enqueueForTellNext(newMsg, relationType);
}
Also used : JsonNode(com.fasterxml.jackson.databind.JsonNode) TbMsgMetaData(org.thingsboard.server.common.msg.TbMsgMetaData) TbMsg(org.thingsboard.server.common.msg.TbMsg)

Example 8 with TbMsg

use of org.thingsboard.server.common.msg.TbMsg in project thingsboard by thingsboard.

the class AlarmState method createOrClearAlarms.

public <T> boolean createOrClearAlarms(TbContext ctx, TbMsg msg, T data, SnapshotUpdate update, BiFunction<AlarmRuleState, T, AlarmEvalResult> evalFunction) {
    boolean stateUpdate = false;
    AlarmRuleState resultState = null;
    log.debug("[{}] processing update: {}", alarmDefinition.getId(), data);
    for (AlarmRuleState state : createRulesSortedBySeverityDesc) {
        if (!validateUpdate(update, state)) {
            log.debug("[{}][{}] Update is not valid for current rule state", alarmDefinition.getId(), state.getSeverity());
            continue;
        }
        AlarmEvalResult evalResult = evalFunction.apply(state, data);
        stateUpdate |= state.checkUpdate();
        if (AlarmEvalResult.TRUE.equals(evalResult)) {
            resultState = state;
            break;
        } else if (AlarmEvalResult.FALSE.equals(evalResult)) {
            stateUpdate = clearAlarmState(stateUpdate, state);
        }
    }
    if (resultState != null) {
        TbAlarmResult result = calculateAlarmResult(ctx, resultState);
        if (result != null) {
            pushMsg(ctx, msg, result, resultState);
        }
        stateUpdate = clearAlarmState(stateUpdate, clearState);
    } else if (currentAlarm != null && clearState != null) {
        if (!validateUpdate(update, clearState)) {
            log.debug("[{}] Update is not valid for current clear state", alarmDefinition.getId());
            return stateUpdate;
        }
        AlarmEvalResult evalResult = evalFunction.apply(clearState, data);
        if (AlarmEvalResult.TRUE.equals(evalResult)) {
            stateUpdate = clearAlarmState(stateUpdate, clearState);
            for (AlarmRuleState state : createRulesSortedBySeverityDesc) {
                stateUpdate = clearAlarmState(stateUpdate, state);
            }
            ListenableFuture<AlarmOperationResult> alarmClearOperationResult = ctx.getAlarmService().clearAlarmForResult(ctx.getTenantId(), currentAlarm.getId(), createDetails(clearState), System.currentTimeMillis());
            DonAsynchron.withCallback(alarmClearOperationResult, result -> {
                pushMsg(ctx, msg, new TbAlarmResult(false, false, true, result.getAlarm()), clearState);
            }, throwable -> {
                throw new RuntimeException(throwable);
            });
            currentAlarm = null;
        } else if (AlarmEvalResult.FALSE.equals(evalResult)) {
            stateUpdate = clearAlarmState(stateUpdate, clearState);
        }
    }
    return stateUpdate;
}
Also used : AlarmSeverity(org.thingsboard.server.common.data.alarm.AlarmSeverity) ListenableFuture(com.google.common.util.concurrent.ListenableFuture) TbMsg(org.thingsboard.server.common.msg.TbMsg) BiFunction(java.util.function.BiFunction) JacksonUtil(org.thingsboard.common.util.JacksonUtil) DonAsynchron(org.thingsboard.common.util.DonAsynchron) TbAlarmResult(org.thingsboard.rule.engine.action.TbAlarmResult) AlarmConditionKeyType(org.thingsboard.server.common.data.device.profile.AlarmConditionKeyType) TbContext(org.thingsboard.rule.engine.api.TbContext) StringUtils(org.apache.commons.lang3.StringUtils) ObjectNode(com.fasterxml.jackson.databind.node.ObjectNode) TbMsgMetaData(org.thingsboard.server.common.msg.TbMsgMetaData) ArrayList(java.util.ArrayList) DeviceProfileAlarm(org.thingsboard.server.common.data.device.profile.DeviceProfileAlarm) EntityId(org.thingsboard.server.common.data.id.EntityId) JsonNode(com.fasterxml.jackson.databind.JsonNode) AlarmStatus(org.thingsboard.server.common.data.alarm.AlarmStatus) PersistedAlarmRuleState(org.thingsboard.rule.engine.profile.state.PersistedAlarmRuleState) DashboardId(org.thingsboard.server.common.data.id.DashboardId) DataConstants(org.thingsboard.server.common.data.DataConstants) PersistedAlarmState(org.thingsboard.rule.engine.profile.state.PersistedAlarmState) AlarmOperationResult(org.thingsboard.server.dao.alarm.AlarmOperationResult) Alarm(org.thingsboard.server.common.data.alarm.Alarm) ExecutionException(java.util.concurrent.ExecutionException) Slf4j(lombok.extern.slf4j.Slf4j) ServiceQueue(org.thingsboard.server.common.msg.queue.ServiceQueue) List(java.util.List) Data(lombok.Data) AlarmConditionSpecType(org.thingsboard.server.common.data.device.profile.AlarmConditionSpecType) Comparator(java.util.Comparator) ListenableFuture(com.google.common.util.concurrent.ListenableFuture) TbAlarmResult(org.thingsboard.rule.engine.action.TbAlarmResult) PersistedAlarmRuleState(org.thingsboard.rule.engine.profile.state.PersistedAlarmRuleState)

Example 9 with TbMsg

use of org.thingsboard.server.common.msg.TbMsg in project thingsboard by thingsboard.

the class DeviceProvisionServiceImpl method pushDeviceCreatedEventToRuleEngine.

private void pushDeviceCreatedEventToRuleEngine(Device device) {
    try {
        ObjectNode entityNode = JacksonUtil.OBJECT_MAPPER.valueToTree(device);
        TbMsg msg = TbMsg.newMsg(DataConstants.ENTITY_CREATED, device.getId(), device.getCustomerId(), createTbMsgMetaData(device), JacksonUtil.OBJECT_MAPPER.writeValueAsString(entityNode));
        sendToRuleEngine(device.getTenantId(), msg, null);
    } catch (JsonProcessingException | IllegalArgumentException e) {
        log.warn("[{}] Failed to push device action to rule engine: {}", device.getId(), DataConstants.ENTITY_CREATED, e);
    }
}
Also used : ObjectNode(com.fasterxml.jackson.databind.node.ObjectNode) JsonProcessingException(com.fasterxml.jackson.core.JsonProcessingException) TbMsg(org.thingsboard.server.common.msg.TbMsg)

Example 10 with TbMsg

use of org.thingsboard.server.common.msg.TbMsg in project thingsboard by thingsboard.

the class AbstractRuleEngineFlowIntegrationTest method testRuleChainWithTwoRules.

@Test
public void testRuleChainWithTwoRules() throws Exception {
    // Creating Rule Chain
    RuleChain ruleChain = new RuleChain();
    ruleChain.setName("Simple Rule Chain");
    ruleChain.setTenantId(savedTenant.getId());
    ruleChain.setRoot(true);
    ruleChain.setDebugMode(true);
    ruleChain = saveRuleChain(ruleChain);
    Assert.assertNull(ruleChain.getFirstRuleNodeId());
    RuleChainMetaData metaData = new RuleChainMetaData();
    metaData.setRuleChainId(ruleChain.getId());
    RuleNode ruleNode1 = new RuleNode();
    ruleNode1.setName("Simple Rule Node 1");
    ruleNode1.setType(org.thingsboard.rule.engine.metadata.TbGetAttributesNode.class.getName());
    ruleNode1.setDebugMode(true);
    TbGetAttributesNodeConfiguration configuration1 = new TbGetAttributesNodeConfiguration();
    configuration1.setServerAttributeNames(Collections.singletonList("serverAttributeKey1"));
    ruleNode1.setConfiguration(mapper.valueToTree(configuration1));
    RuleNode ruleNode2 = new RuleNode();
    ruleNode2.setName("Simple Rule Node 2");
    ruleNode2.setType(org.thingsboard.rule.engine.metadata.TbGetAttributesNode.class.getName());
    ruleNode2.setDebugMode(true);
    TbGetAttributesNodeConfiguration configuration2 = new TbGetAttributesNodeConfiguration();
    configuration2.setServerAttributeNames(Collections.singletonList("serverAttributeKey2"));
    ruleNode2.setConfiguration(mapper.valueToTree(configuration2));
    metaData.setNodes(Arrays.asList(ruleNode1, ruleNode2));
    metaData.setFirstNodeIndex(0);
    metaData.addConnectionInfo(0, 1, "Success");
    metaData = saveRuleChainMetaData(metaData);
    Assert.assertNotNull(metaData);
    ruleChain = getRuleChain(ruleChain.getId());
    Assert.assertNotNull(ruleChain.getFirstRuleNodeId());
    // Saving the device
    Device device = new Device();
    device.setName("My device");
    device.setType("default");
    device = doPost("/api/device", device, Device.class);
    attributesService.save(device.getTenantId(), device.getId(), DataConstants.SERVER_SCOPE, Collections.singletonList(new BaseAttributeKvEntry(new StringDataEntry("serverAttributeKey1", "serverAttributeValue1"), System.currentTimeMillis()))).get();
    attributesService.save(device.getTenantId(), device.getId(), DataConstants.SERVER_SCOPE, Collections.singletonList(new BaseAttributeKvEntry(new StringDataEntry("serverAttributeKey2", "serverAttributeValue2"), System.currentTimeMillis()))).get();
    TbMsgCallback tbMsgCallback = Mockito.mock(TbMsgCallback.class);
    Mockito.when(tbMsgCallback.isMsgValid()).thenReturn(true);
    TbMsg tbMsg = TbMsg.newMsg("CUSTOM", device.getId(), new TbMsgMetaData(), "{}", tbMsgCallback);
    QueueToRuleEngineMsg qMsg = new QueueToRuleEngineMsg(savedTenant.getId(), tbMsg, null, null);
    // Pushing Message to the system
    actorSystem.tell(qMsg);
    Mockito.verify(tbMsgCallback, Mockito.timeout(10000)).onSuccess();
    PageData<Event> eventsPage = getDebugEvents(savedTenant.getId(), ruleChain.getFirstRuleNodeId(), 1000);
    List<Event> events = eventsPage.getData().stream().filter(filterByCustomEvent()).collect(Collectors.toList());
    Assert.assertEquals(2, events.size());
    Event inEvent = events.stream().filter(e -> e.getBody().get("type").asText().equals(DataConstants.IN)).findFirst().get();
    Assert.assertEquals(ruleChain.getFirstRuleNodeId(), inEvent.getEntityId());
    Assert.assertEquals(device.getId().getId().toString(), inEvent.getBody().get("entityId").asText());
    Event outEvent = events.stream().filter(e -> e.getBody().get("type").asText().equals(DataConstants.OUT)).findFirst().get();
    Assert.assertEquals(ruleChain.getFirstRuleNodeId(), outEvent.getEntityId());
    Assert.assertEquals(device.getId().getId().toString(), outEvent.getBody().get("entityId").asText());
    Assert.assertEquals("serverAttributeValue1", getMetadata(outEvent).get("ss_serverAttributeKey1").asText());
    RuleChain finalRuleChain = ruleChain;
    RuleNode lastRuleNode = metaData.getNodes().stream().filter(node -> !node.getId().equals(finalRuleChain.getFirstRuleNodeId())).findFirst().get();
    eventsPage = getDebugEvents(savedTenant.getId(), lastRuleNode.getId(), 1000);
    events = eventsPage.getData().stream().filter(filterByCustomEvent()).collect(Collectors.toList());
    Assert.assertEquals(2, events.size());
    inEvent = events.stream().filter(e -> e.getBody().get("type").asText().equals(DataConstants.IN)).findFirst().get();
    Assert.assertEquals(lastRuleNode.getId(), inEvent.getEntityId());
    Assert.assertEquals(device.getId().getId().toString(), inEvent.getBody().get("entityId").asText());
    outEvent = events.stream().filter(e -> e.getBody().get("type").asText().equals(DataConstants.OUT)).findFirst().get();
    Assert.assertEquals(lastRuleNode.getId(), outEvent.getEntityId());
    Assert.assertEquals(device.getId().getId().toString(), outEvent.getBody().get("entityId").asText());
    Assert.assertEquals("serverAttributeValue1", getMetadata(outEvent).get("ss_serverAttributeKey1").asText());
    Assert.assertEquals("serverAttributeValue2", getMetadata(outEvent).get("ss_serverAttributeKey2").asText());
}
Also used : Event(org.thingsboard.server.common.data.Event) Arrays(java.util.Arrays) ListenableFuture(com.google.common.util.concurrent.ListenableFuture) TbMsg(org.thingsboard.server.common.msg.TbMsg) Device(org.thingsboard.server.common.data.Device) RuleChainMetaData(org.thingsboard.server.common.data.rule.RuleChainMetaData) Autowired(org.springframework.beans.factory.annotation.Autowired) Tenant(org.thingsboard.server.common.data.Tenant) Mockito.spy(org.mockito.Mockito.spy) TbMsgMetaData(org.thingsboard.server.common.msg.TbMsgMetaData) Answer(org.mockito.stubbing.Answer) User(org.thingsboard.server.common.data.User) MockMvcResultMatchers.status(org.springframework.test.web.servlet.result.MockMvcResultMatchers.status) ActorSystemContext(org.thingsboard.server.actors.ActorSystemContext) QueueToRuleEngineMsg(org.thingsboard.server.common.msg.queue.QueueToRuleEngineMsg) After(org.junit.After) TbRuleChainInputNodeConfiguration(org.thingsboard.rule.engine.flow.TbRuleChainInputNodeConfiguration) AbstractRuleEngineControllerTest(org.thingsboard.server.controller.AbstractRuleEngineControllerTest) AttributesService(org.thingsboard.server.dao.attributes.AttributesService) Before(org.junit.Before) TbMsgCallback(org.thingsboard.server.common.msg.queue.TbMsgCallback) DataConstants(org.thingsboard.server.common.data.DataConstants) RuleNode(org.thingsboard.server.common.data.rule.RuleNode) TbGetAttributesNodeConfiguration(org.thingsboard.rule.engine.metadata.TbGetAttributesNodeConfiguration) ReflectionTestUtils(org.springframework.test.util.ReflectionTestUtils) Test(org.junit.Test) BaseAttributeKvEntry(org.thingsboard.server.common.data.kv.BaseAttributeKvEntry) Authority(org.thingsboard.server.common.data.security.Authority) Collectors(java.util.stream.Collectors) Mockito(org.mockito.Mockito) Slf4j(lombok.extern.slf4j.Slf4j) EventService(org.thingsboard.server.dao.event.EventService) List(java.util.List) PageData(org.thingsboard.server.common.data.page.PageData) RuleChain(org.thingsboard.server.common.data.rule.RuleChain) Assert(org.junit.Assert) NodeConnectionInfo(org.thingsboard.server.common.data.rule.NodeConnectionInfo) Collections(java.util.Collections) StringDataEntry(org.thingsboard.server.common.data.kv.StringDataEntry) QueueToRuleEngineMsg(org.thingsboard.server.common.msg.queue.QueueToRuleEngineMsg) Device(org.thingsboard.server.common.data.Device) RuleNode(org.thingsboard.server.common.data.rule.RuleNode) TbMsgMetaData(org.thingsboard.server.common.msg.TbMsgMetaData) TbGetAttributesNodeConfiguration(org.thingsboard.rule.engine.metadata.TbGetAttributesNodeConfiguration) RuleChain(org.thingsboard.server.common.data.rule.RuleChain) StringDataEntry(org.thingsboard.server.common.data.kv.StringDataEntry) RuleChainMetaData(org.thingsboard.server.common.data.rule.RuleChainMetaData) BaseAttributeKvEntry(org.thingsboard.server.common.data.kv.BaseAttributeKvEntry) Event(org.thingsboard.server.common.data.Event) TbMsgCallback(org.thingsboard.server.common.msg.queue.TbMsgCallback) TbMsg(org.thingsboard.server.common.msg.TbMsg) AbstractRuleEngineControllerTest(org.thingsboard.server.controller.AbstractRuleEngineControllerTest) Test(org.junit.Test)

Aggregations

TbMsg (org.thingsboard.server.common.msg.TbMsg)88 TbMsgMetaData (org.thingsboard.server.common.msg.TbMsgMetaData)57 Test (org.junit.Test)46 ObjectNode (com.fasterxml.jackson.databind.node.ObjectNode)29 List (java.util.List)19 DeviceProfile (org.thingsboard.server.common.data.DeviceProfile)18 RuleChainId (org.thingsboard.server.common.data.id.RuleChainId)17 DeviceProfileData (org.thingsboard.server.common.data.device.profile.DeviceProfileData)16 EntityId (org.thingsboard.server.common.data.id.EntityId)16 AttributeKvEntry (org.thingsboard.server.common.data.kv.AttributeKvEntry)16 Device (org.thingsboard.server.common.data.Device)15 DeviceProfileAlarm (org.thingsboard.server.common.data.device.profile.DeviceProfileAlarm)15 JsonNode (com.fasterxml.jackson.databind.JsonNode)14 AlarmCondition (org.thingsboard.server.common.data.device.profile.AlarmCondition)14 AlarmConditionFilter (org.thingsboard.server.common.data.device.profile.AlarmConditionFilter)14 AlarmConditionFilterKey (org.thingsboard.server.common.data.device.profile.AlarmConditionFilterKey)14 AlarmRule (org.thingsboard.server.common.data.device.profile.AlarmRule)14 NumericFilterPredicate (org.thingsboard.server.common.data.query.NumericFilterPredicate)14 RuleNodeId (org.thingsboard.server.common.data.id.RuleNodeId)13 DynamicValue (org.thingsboard.server.common.data.query.DynamicValue)13