diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/CalculateDeltaNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/CalculateDeltaNode.java
index 291c2cf316..71038e934f 100644
--- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/CalculateDeltaNode.java
+++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/CalculateDeltaNode.java
@@ -48,10 +48,10 @@ import static org.thingsboard.common.util.DonAsynchron.withCallback;
name = "calculate delta", relationTypes = {"Success", "Failure", "Other"},
configClazz = CalculateDeltaNodeConfiguration.class,
nodeDescription = "Calculates and adds 'delta' value into message based on the incoming and previous value",
- nodeDetails = "Calculates delta and period based on the previous time-series reading and current data. " +
- "Delta calculation is done in scope of the message originator, e.g. device, asset or customer. " +
- "If there is input key, the output relation will be 'Success' unless delta is negative and corresponding configuration parameter is set. " +
- "If there is no input value key in the incoming message, the output relation will be 'Other'.",
+ nodeDetails = "Calculates delta and period based on the previous timeseries reading and current data. " +
+ "Delta calculation is done in scope of the message originator, e.g. device, asset or customer.
" +
+ "If there is input key, the output relation will be Success unless delta is negative and corresponding configuration parameter is set.
" +
+ "If there is no input value key in the incoming message, the output relation will be Other.",
uiResources = {"static/rulenode/rulenode-core-config.js"},
configDirective = "tbEnrichmentNodeCalculateDeltaConfig")
public class CalculateDeltaNode implements TbNode {
diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbAbstractGetEntityDataNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbAbstractGetEntityDataNode.java
index 5615147fd0..4550a4f3f8 100644
--- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbAbstractGetEntityDataNode.java
+++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbAbstractGetEntityDataNode.java
@@ -30,10 +30,13 @@ import static org.thingsboard.common.util.DonAsynchron.withCallback;
@Slf4j
public abstract class TbAbstractGetEntityDataNode extends TbAbstractGetMappedDataNode {
- protected final static String DATA_TO_FETCH_PROPERTY_NAME = "dataToFetch";
- protected static final String OLD_DATA_TO_FETCH_PROPERTY_NAME = "telemetry";
- protected final static String DATA_MAPPING_PROPERTY_NAME = "dataMapping";
- protected static final String OLD_DATA_MAPPING_PROPERTY_NAME = "attrMapping";
+ private final static String DATA_TO_FETCH_PROPERTY_NAME = "dataToFetch";
+ private static final String OLD_DATA_TO_FETCH_PROPERTY_NAME = "telemetry";
+ private final static String DATA_MAPPING_PROPERTY_NAME = "dataMapping";
+ private static final String OLD_DATA_MAPPING_PROPERTY_NAME = "attrMapping";
+
+ private static final String DATA_TO_FETCH_VALIDATION_MSG = "DataToFetch property has invalid value: %s." +
+ " Only ATTRIBUTES and LATEST_TELEMETRY values supported!";
@Override
public void onMsg(TbContext ctx, TbMsg msg) {
@@ -45,7 +48,11 @@ public abstract class TbAbstractGetEntityDataNode extends Tb
protected abstract ListenableFuture findEntityAsync(TbContext ctx, EntityId originator);
- protected abstract void checkDataToFetchSupportedOrElseThrow(DataToFetch dataToFetch) throws TbNodeException;
+ protected void checkDataToFetchSupportedOrElseThrow(DataToFetch dataToFetch) throws TbNodeException {
+ if (dataToFetch == null || dataToFetch.equals(DataToFetch.FIELDS)) {
+ throw new TbNodeException(String.format(DATA_TO_FETCH_VALIDATION_MSG, dataToFetch));
+ }
+ }
protected void processDataAndTell(TbContext ctx, TbMsg msg, T entityId, ObjectNode msgDataAsJsonNode) {
DataToFetch dataToFetch = config.getDataToFetch();
diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbFetchDeviceCredentialsNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbFetchDeviceCredentialsNode.java
index ec21706ff1..e044dcbae6 100644
--- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbFetchDeviceCredentialsNode.java
+++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbFetchDeviceCredentialsNode.java
@@ -37,11 +37,10 @@ import java.util.concurrent.ExecutionException;
type = ComponentType.ENRICHMENT,
name = "fetch device credentials",
configClazz = TbFetchDeviceCredentialsNodeConfiguration.class,
- nodeDescription = "Enrich the message body or metadata with the device credentials",
- nodeDetails = "Adds credentialsType and credentials properties to the message metadata if the " +
- "configuration parameter fetchToMetadata is set to true, otherwise, adds properties " +
- "to the message data. If originator type is not DEVICE or rule node failed to get device credentials " +
- "- send Message via Failure chain, otherwise Success chain is used.",
+ nodeDescription = "Adds device credentials to the message or message metadata",
+ nodeDetails = "if message originator type is Device and device credentials was successfully fetched, " +
+ "rule node enriches message or message metadata with credentialsType and credentials properties " +
+ "and send message via Success chain. Otherwise message will be forwarded via Failure chain.",
uiResources = {"static/rulenode/rulenode-core-config.js"},
configDirective = "tbEnrichmentNodeFetchDeviceCredentialsConfig")
public class TbFetchDeviceCredentialsNode extends TbAbstractNodeWithFetchTo {
diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetAttributesNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetAttributesNode.java
index 2d1f02acf8..42b0633cb2 100644
--- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetAttributesNode.java
+++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetAttributesNode.java
@@ -36,11 +36,13 @@ import org.thingsboard.server.common.msg.TbMsg;
@RuleNode(type = ComponentType.ENRICHMENT,
name = "originator attributes",
configClazz = TbGetAttributesNodeConfiguration.class,
- nodeDescription = "Enrich the message body or metadata with the originator attributes and/or timeseries data",
- nodeDetails = "If Attributes enrichment configured, CLIENT/SHARED/SERVER attributes are added into Message data/metadata " +
- "with specific prefix: cs/shared/ss. Latest telemetry value added into Message data/metadata without prefix. " +
- "To access those attributes in other nodes this template can be used " +
- "metadata.cs_temperature or metadata.shared_limit ",
+ nodeDescription = "Adds originator attributes and/or latest timeseries data for the message originator to the message or message metadata",
+ nodeDetails = "If attributes enrichment configured, CLIENT/SHARED/SERVER attributes are added into message or message metadata " +
+ "with specific prefix: cs/shared/ss. Latest telemetry value adds without prefix.
" +
+ "See the following examples of accessing those attributes in other nodes:
" +
+ "metadata.cs_serialNumber - to access client side attribute 'serialNumber' that was fetched to message metadata.
" +
+ "metadata.shared_limit - to access shared side attribute 'limit' that was fetched to message metadata.
" +
+ "msg.temperature - to access latest telemetry 'temperature' that was fetched to message.
",
uiResources = {"static/rulenode/rulenode-core-config.js"},
configDirective = "tbEnrichmentNodeOriginatorAttributesConfig")
public class TbGetAttributesNode extends TbAbstractGetAttributesNode {
diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetCustomerAttributeNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetCustomerAttributeNode.java
index e693dab684..1deae1f5fb 100644
--- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetCustomerAttributeNode.java
+++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetCustomerAttributeNode.java
@@ -35,16 +35,17 @@ import org.thingsboard.server.common.data.util.TbPair;
type = ComponentType.ENRICHMENT,
name = "customer attributes",
configClazz = TbGetEntityDataNodeConfiguration.class,
- nodeDescription = "Add Originators Customer Attributes or Latest Telemetry into Message or Metadata",
- nodeDetails = "Enrich the Message or Metadata with the corresponding customer's latest attributes or telemetry value. " +
- "The customer is selected based on the originator of the message: device, asset, etc. " +
- "" +
+ nodeDescription = "Adds message originator customer attributes or latest telemetry into message or message metadata",
+ nodeDetails = "Enriches incoming message or message metadata with the customer's attributes or latest telemetry values.
" +
+ "The customer is selected based on the originator of the message. " +
+ "Supported originator types:
" +
+ "Customer, User, Asset, Device.
" +
"Useful when you store some parameters on the customer level and would like to use them for message processing.",
uiResources = {"static/rulenode/rulenode-core-config.js"},
configDirective = "tbEnrichmentNodeCustomerAttributesConfig")
public class TbGetCustomerAttributeNode extends TbAbstractGetEntityDataNode {
- private static final String CUSTOMER_NOT_FOUND_MESSAGE = "Failed to find customer for entity with id %s and type %s";
+ private static final String CUSTOMER_NOT_FOUND_MESSAGE = "Failed to find customer for entity with id: %s and type: %s";
@Override
protected TbGetEntityDataNodeConfiguration loadNodeConfiguration(TbNodeConfiguration configuration) throws TbNodeException {
@@ -54,14 +55,6 @@ public class TbGetCustomerAttributeNode extends TbAbstractGetEntityDataNode findEntityAsync(TbContext ctx, EntityId originator) {
return Futures.transformAsync(EntitiesCustomerIdAsyncLoader.findEntityIdAsync(ctx, originator),
diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetCustomerDetailsNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetCustomerDetailsNode.java
index c31f9cbcef..a86aed66d5 100644
--- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetCustomerDetailsNode.java
+++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetCustomerDetailsNode.java
@@ -44,10 +44,13 @@ import java.util.NoSuchElementException;
@RuleNode(type = ComponentType.ENRICHMENT,
name = "customer details",
configClazz = TbGetCustomerDetailsNodeConfiguration.class,
- nodeDescription = "Enrich the message body or metadata with the corresponding customer details: title, address, email, phone, etc.",
- nodeDetails = "If checkbox: Add selected details to the message metadata is selected, existing fields will be added to the message metadata instead of message data.
" +
- "Note: only Device, Asset, and Entity View type are allowed.
" +
- "If the originator of the message is not assigned to Customer, or originator type is not supported - Message will be forwarded to Failure chain, otherwise, Success chain will be used.",
+ nodeDescription = "Adds originator customer details into message or message metadata",
+ nodeDetails = "Enriches incoming message or message metadata with the corresponding customer details. " +
+ "Selected details adds to the message with predefined prefix: customer_. Examples: customer_title, customer_address, etc.
" +
+ "The customer is selected based on the originator of the message. Supported originator types:
" +
+ "Device, Asset, Entity view, User, Edge.
" +
+ "If message originator is not assigned to customer, or originator is not supported - " +
+ "message will be forwarded via Failure chain, otherwise, Success chain will be used.",
uiResources = {"static/rulenode/rulenode-core-config.js"},
configDirective = "tbEnrichmentNodeEntityDetailsConfig")
public class TbGetCustomerDetailsNode extends TbAbstractGetEntityDetailsNode {
@@ -96,9 +99,9 @@ public class TbGetCustomerDetailsNode extends TbAbstractGetEntityDetailsNodecs/shared/ss. Latest telemetry value added into Message data/metadata without prefix. " +
- "To access those attributes in other nodes this template can be used " +
- "metadata.cs_temperature or metadata.shared_limit ",
+ nodeDescription = "Add originators related device attributes and latest telemetry values into message or message metadata",
+ nodeDetails = "Related device lookup based on the configured relation query. " +
+ "If multiple related devices are found, only first device is used for message enrichment, other entities are discarded.
" +
+ "If Attributes enrichment configured, CLIENT/SHARED/SERVER attributes are added into message or message metadata " +
+ "with specific prefix: cs/shared/ss. Latest telemetry value adds into message or message metadata without prefix.
" +
+ "See the following examples of accessing those attributes in other nodes:
" +
+ "metadata.cs_serialNumber - to access client side attribute 'serialNumber' that was fetched to message metadata.
" +
+ "metadata.shared_limit - to access shared side attribute 'limit' that was fetched to message metadata.
" +
+ "msg.temperature - to access latest telemetry 'temperature' that was fetched to message.
",
uiResources = {"static/rulenode/rulenode-core-config.js"},
configDirective = "tbEnrichmentNodeDeviceAttributesConfig")
public class TbGetDeviceAttrNode extends TbAbstractGetAttributesNode {
diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetOriginatorFieldsNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetOriginatorFieldsNode.java
index f777d98bcb..b0a282af1f 100644
--- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetOriginatorFieldsNode.java
+++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetOriginatorFieldsNode.java
@@ -37,9 +37,12 @@ import java.util.concurrent.ExecutionException;
@RuleNode(type = ComponentType.ENRICHMENT,
name = "originator fields",
configClazz = TbGetOriginatorFieldsConfiguration.class,
- nodeDescription = "Add Message Originator fields values into Message Metadata or Message Data",
- nodeDetails = "Will fetch fields values specified in mapping. If specified field is not part of originator fields it will be ignored. " +
- "This node supports only following originator types: TENANT, CUSTOMER, USER, ASSET, DEVICE, ALARM, RULE_CHAIN, ENTITY_VIEW.",
+ nodeDescription = "Adds message originator fields values into message or message metadata",
+ nodeDetails = "Fetches fields values specified in the mapping. If specified field is not part of originator fields it will be ignored. " +
+ "Supported originator types:
" +
+ "Tenant, Customer, User, Asset, Device, Alarm, Rule chain, Entity view.
" +
+ "If message originator is not supported - message will be forwarded via Failure chain, " +
+ "otherwise, Success chain will be used.",
uiResources = {"static/rulenode/rulenode-core-config.js"},
configDirective = "tbEnrichmentNodeOriginatorFieldsConfig")
public class TbGetOriginatorFieldsNode extends TbAbstractGetMappedDataNode {
diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetRelatedAttributeNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetRelatedAttributeNode.java
index 3c508bda14..109c47dcac 100644
--- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetRelatedAttributeNode.java
+++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetRelatedAttributeNode.java
@@ -34,15 +34,18 @@ import java.util.Arrays;
@Slf4j
@RuleNode(
type = ComponentType.ENRICHMENT,
- name = "related attributes",
+ name = "related entity data",
configClazz = TbGetRelatedDataNodeConfiguration.class,
- nodeDescription = "Add Originators Related Entity Attributes or Latest Telemetry into Message Metadata/Data",
- nodeDetails = "Related Entity found using configured relation direction and Relation Type. " +
- "If multiple Related Entities are found, only first Entity is used for attributes enrichment, other entities are discarded. " +
- "If Attributes enrichment configured, server scope attributes are added into Message Metadata/Data. " +
- "If Latest Telemetry enrichment configured, latest telemetry added into Metadata/Data. " +
- "To access those attributes in other nodes this template can be used " +
- "metadata.temperature.",
+ nodeDescription = "Adds originators related entity data into message or message metadata",
+ nodeDetails = "Related entity lookup based on the configured relation query. " +
+ "If multiple related entities are found, only first entity is used for message enrichment, other entities are discarded.
" +
+ "Data to fetch configuration:
" +
+ "Attributes - rule node fetches server scope attributes configured in mapping and adds them into message or message metadata. " +
+ "Access example in other nodes: metadata.serialNumber, msg.serialNumber.
" +
+ "Latest telemetry - rule node fetches latest telemetry configured in mapping and adds them into message or message metadata. " +
+ "Access example in other nodes: metadata.temperature, msg.temperature.
" +
+ "Fields - rule node fetches fields configured in mapping and adds them into message or message metadata. " +
+ "Access example in other nodes: metadata.entityName, msg.entityName.",
uiResources = {"static/rulenode/rulenode-core-config.js"},
configDirective = "tbEnrichmentNodeRelatedAttributesConfig")
public class TbGetRelatedAttributeNode extends TbAbstractGetEntityDataNode {
diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryNode.java
index b43aeb4e4b..97f08ce8fd 100644
--- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryNode.java
+++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryNode.java
@@ -54,13 +54,17 @@ import static org.thingsboard.rule.engine.metadata.TbGetTelemetryNodeConfigurati
@RuleNode(type = ComponentType.ENRICHMENT,
name = "originator telemetry",
configClazz = TbGetTelemetryNodeConfiguration.class,
- nodeDescription = "Add Message Originator Telemetry for selected time range into Message Metadata\n",
- nodeDetails = "The node allows you to select fetch mode: FIRST/LAST/ALL to fetch telemetry of certain time range that are added into Message metadata without any prefix. " +
- "If selected fetch mode ALL Telemetry will be added like array into Message Metadata where key is Timestamp and value is value of Telemetry." +
- "If selected fetch mode FIRST or LAST Telemetry will be added like string without Timestamp." +
- "Also, the rule node allows you to select telemetry sampling order: ASC or DESC. " +
- "Aggregation feature allows you to fetch aggregated telemetry as a single value by AVG, COUNT, SUM, MIN, MAX, NONE. " +
- "Note: The maximum size of the fetched array is 1000 records.\n ",
+ nodeDescription = "Adds message originator telemetry for selected time range into message metadata",
+ nodeDetails = "The node allows you to configure fetch interval and fetch strategy. Fetch strategy section allows you to select fetch mode: First/Last/All
" +
+ "If selected fetch mode First rule node will retrieve the closest telemetry to the fetch interval's start.
" +
+ "If selected fetch mode Last rule node will retrieve the closest telemetry to the fetch interval's end.
" +
+ "If selected fetch mode All rule node will retrieve telemetry from the fetch interval with configurable query parameters.
" +
+ "Query parameters:
" +
+ "Data aggregation function: Min/Max/Average/Sum/Count/None. " +
+ "If selected aggregation function None rule node allows you to configure additional query parameters:
" +
+ "Order by timestamp: Ascending/Descending
" +
+ "Limit: Min value - 2, max value - 1000.
" +
+ "Other data aggregation functions useful when you need to get the aggregated telemetry data as a single value for the configured fetch interval.",
uiResources = {"static/rulenode/rulenode-core-config.js"},
configDirective = "tbEnrichmentNodeGetTelemetryFromDatabase")
public class TbGetTelemetryNode implements TbNode {
diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTenantAttributeNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTenantAttributeNode.java
index aac8d8d3bf..df1ae1b371 100644
--- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTenantAttributeNode.java
+++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTenantAttributeNode.java
@@ -34,11 +34,9 @@ import org.thingsboard.server.common.data.util.TbPair;
type = ComponentType.ENRICHMENT,
name = "tenant attributes",
configClazz = TbGetEntityDataNodeConfiguration.class,
- nodeDescription = "Add Originators Tenant Attributes or Latest Telemetry into Message Metadata/Data",
- nodeDetails = "If Attributes enrichment configured, server scope attributes are added into Message Metadata/Data. " +
- "If Latest Telemetry enrichment configured, latest telemetry added into Metadata/Data. " +
- "To access those attributes in other nodes this template can be used " +
- "metadata.temperature.",
+ nodeDescription = "Adds message originator tenant attributes or latest telemetry into message or message metadata",
+ nodeDetails = "Enriches incoming message or message metadata with the tenant's attributes or latest telemetry values. " +
+ "Useful when you store some parameters on the tenant level and would like to use them for message processing.",
uiResources = {"static/rulenode/rulenode-core-config.js"},
configDirective = "tbEnrichmentNodeTenantAttributesConfig")
public class TbGetTenantAttributeNode extends TbAbstractGetEntityDataNode {
@@ -56,14 +54,6 @@ public class TbGetTenantAttributeNode extends TbAbstractGetEntityDataNode upgrade(int fromVersion, JsonNode oldConfiguration) throws TbNodeException {
return fromVersion == 0 ? upgradeToUseFetchToAndDataToFetch(oldConfiguration) : new TbPair<>(false, oldConfiguration);
diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTenantDetailsNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTenantDetailsNode.java
index 759a91785c..e6433b541e 100644
--- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTenantDetailsNode.java
+++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTenantDetailsNode.java
@@ -33,10 +33,9 @@ import org.thingsboard.server.common.msg.TbMsg;
@RuleNode(type = ComponentType.ENRICHMENT,
name = "tenant details",
configClazz = TbGetTenantDetailsNodeConfiguration.class,
- nodeDescription = "Adds fields from Tenant details to the message body or metadata",
- nodeDetails = "If checkbox: Add selected details to the message metadata is selected, existing fields will be added to the message metadata instead of message data.
" +
- "Note: only Device, Asset, and Entity View type are allowed.
" +
- "If the originator of the message is not assigned to Tenant, or originator type is not supported - Message will be forwarded to Failure chain, otherwise, Success chain will be used.",
+ nodeDescription = "Adds originator tenant details into message or message metadata",
+ nodeDetails = "Enriches incoming message or message metadata with the corresponding tenant details. " +
+ "Selected details adds to the message with predefined prefix: tenant_, Examples: tenant_title or tenant_address, etc.",
uiResources = {"static/rulenode/rulenode-core-config.js"},
configDirective = "tbEnrichmentNodeEntityDetailsConfig")
public class TbGetTenantDetailsNode extends TbAbstractGetEntityDetailsNode {
diff --git a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetCustomerAttributeNodeTest.java b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetCustomerAttributeNodeTest.java
index 54e2f3bd4b..e1b799552c 100644
--- a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetCustomerAttributeNodeTest.java
+++ b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetCustomerAttributeNodeTest.java
@@ -262,7 +262,7 @@ public class TbGetCustomerAttributeNodeTest {
var actualException = actualExceptionCaptor.getValue();
var expectedExceptionMessage = String.format(
- "Failed to find customer for entity with id %s and type %s",
+ "Failed to find customer for entity with id: %s and type: %s",
userId.getId(), userId.getEntityType().getNormalName());
assertEquals(msg, actualMessage);
diff --git a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetCustomerDetailsNodeTest.java b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetCustomerDetailsNodeTest.java
index 901172d344..bfbfd83051 100644
--- a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetCustomerDetailsNodeTest.java
+++ b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetCustomerDetailsNodeTest.java
@@ -385,7 +385,7 @@ public class TbGetCustomerDetailsNodeTest {
assertThat(actualMsg.getMetaData()).isEqualTo(msg.getMetaData());
assertThat(actualException).isInstanceOf(RuntimeException.class);
- assertThat(actualException.getMessage()).isEqualTo("Device with name 'Thermostat' is not assigned to Customer.");
+ assertThat(actualException.getMessage()).isEqualTo("Device with name 'Thermostat' is not assigned to Customer!");
}
@Test