thingsboard-aplcache

Details

diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbClearAlarmNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbClearAlarmNode.java
index ed54c62..f2523c3 100644
--- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbClearAlarmNode.java
+++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbClearAlarmNode.java
@@ -39,9 +39,9 @@ import org.thingsboard.server.common.msg.TbMsg;
         nodeDetails =
                 "Details - JS function that creates JSON object based on incoming message. This object will be added into Alarm.details field.\n" +
                         "Node output:\n" +
-                        "If alarm was not cleared, original message is returned. Otherwise new Message returned with type 'ALARM', Alarm object in 'msg' property and 'matadata' will contains 'isClearedAlarm' property " +
-                        "Message payload can be accessed via <code>msg</code> property. For example <code>'temperature = ' + msg.temperature ;</code>" +
-                        "Message metadata can be accessed via <code>metadata</code> property. For example <code>'name = ' + metadata.customerName;</code>",
+                        "If alarm was not cleared, original message is returned. Otherwise new Message returned with type 'ALARM', Alarm object in 'msg' property and 'matadata' will contains 'isClearedAlarm' property. " +
+                        "Message payload can be accessed via <code>msg</code> property. For example <code>'temperature = ' + msg.temperature ;</code>. " +
+                        "Message metadata can be accessed via <code>metadata</code> property. For example <code>'name = ' + metadata.customerName;</code>.",
         uiResources = {"static/rulenode/rulenode-core-config.js"},
         configDirective = "tbActionNodeClearAlarmConfig",
         icon = "notifications_off"
diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbCreateAlarmNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbCreateAlarmNode.java
index dcf9068..a81b744 100644
--- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbCreateAlarmNode.java
+++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbCreateAlarmNode.java
@@ -41,9 +41,9 @@ import org.thingsboard.server.common.msg.TbMsg;
         nodeDetails =
                 "Details - JS function that creates JSON object based on incoming message. This object will be added into Alarm.details field.\n" +
                 "Node output:\n" +
-                "If alarm was not created, original message is returned. Otherwise new Message returned with type 'ALARM', Alarm object in 'msg' property and 'matadata' will contains one of those properties 'isNewAlarm/isExistingAlarm' " +
-                "Message payload can be accessed via <code>msg</code> property. For example <code>'temperature = ' + msg.temperature ;</code>" +
-                "Message metadata can be accessed via <code>metadata</code> property. For example <code>'name = ' + metadata.customerName;</code>",
+                "If alarm was not created, original message is returned. Otherwise new Message returned with type 'ALARM', Alarm object in 'msg' property and 'matadata' will contains one of those properties 'isNewAlarm/isExistingAlarm'. " +
+                "Message payload can be accessed via <code>msg</code> property. For example <code>'temperature = ' + msg.temperature ;</code>. " +
+                "Message metadata can be accessed via <code>metadata</code> property. For example <code>'name = ' + metadata.customerName;</code>.",
         uiResources = {"static/rulenode/rulenode-core-config.js"},
         configDirective = "tbActionNodeCreateAlarmConfig",
         icon = "notifications_active"
diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbLogNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbLogNode.java
index 895862e..33ac5ed 100644
--- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbLogNode.java
+++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbLogNode.java
@@ -31,8 +31,8 @@ import static org.thingsboard.rule.engine.api.TbRelationTypes.SUCCESS;
         configClazz = TbLogNodeConfiguration.class,
         nodeDescription = "Log incoming messages using JS script for transformation Message into String",
         nodeDetails = "Transform incoming Message with configured JS function to String and log final value into Thingsboard log file. " +
-                "Message payload can be accessed via <code>msg</code> property. For example <code>'temperature = ' + msg.temperature ;</code>" +
-                "Message metadata can be accessed via <code>metadata</code> property. For example <code>'name = ' + metadata.customerName;</code>",
+                "Message payload can be accessed via <code>msg</code> property. For example <code>'temperature = ' + msg.temperature ;</code>. " +
+                "Message metadata can be accessed via <code>metadata</code> property. For example <code>'name = ' + metadata.customerName;</code>.",
         uiResources = {"static/rulenode/rulenode-core-config.js"},
         configDirective = "tbActionNodeLogConfig",
         icon = "menu"
diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/debug/TbMsgGeneratorNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/debug/TbMsgGeneratorNode.java
index faea63a..2bd770b 100644
--- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/debug/TbMsgGeneratorNode.java
+++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/debug/TbMsgGeneratorNode.java
@@ -38,7 +38,7 @@ import static org.thingsboard.rule.engine.api.TbRelationTypes.SUCCESS;
         name = "generator",
         configClazz = TbMsgGeneratorNodeConfiguration.class,
         nodeDescription = "Periodically generates messages",
-        nodeDetails = "Generates messages with configurable period. Javascript function used fore message generation.",
+        nodeDetails = "Generates messages with configurable period. Javascript function used for message generation.",
         inEnabled = false,
         uiResources = {"static/rulenode/rulenode-core-config.js", "static/rulenode/rulenode-core-config.css"},
         configDirective = "tbActionNodeGeneratorConfig",
diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/mail/TbMsgToEmailNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/mail/TbMsgToEmailNode.java
index 62bbbf9..5da4f8c 100644
--- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/mail/TbMsgToEmailNode.java
+++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/mail/TbMsgToEmailNode.java
@@ -35,9 +35,9 @@ import static org.thingsboard.rule.engine.mail.TbSendEmailNode.SEND_EMAIL_TYPE;
         type = ComponentType.TRANSFORMATION,
         name = "to email",
         configClazz = TbMsgToEmailNodeConfiguration.class,
-        nodeDescription = "Change Message Originator To Tenant/Customer/Related Entity",
-        nodeDetails = "Related Entity found using configured relation direction and Relation Type. " +
-                "If multiple Related Entities are found, only first Entity is used as new Originator, other entities are discarded. ",
+        nodeDescription = "Transforms message to email message",
+        nodeDetails = "Transforms message to email message by populating email fields using values derived from message metadata. " +
+                      "Set 'SEND_EMAIL' output message type.",
         uiResources = {"static/rulenode/rulenode-core-config.js"},
         configDirective = "tbTransformationNodeToEmailConfig",
         icon = "email"
diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/mail/TbSendEmailNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/mail/TbSendEmailNode.java
index c31f912..e6c8ca0 100644
--- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/mail/TbSendEmailNode.java
+++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/mail/TbSendEmailNode.java
@@ -37,10 +37,9 @@ import static org.thingsboard.rule.engine.api.TbRelationTypes.SUCCESS;
         type = ComponentType.EXTERNAL,
         name = "send email",
         configClazz = TbSendEmailNodeConfiguration.class,
-        nodeDescription = "Log incoming messages using JS script for transformation Message into String",
-        nodeDetails = "Transform incoming Message with configured JS condition to String and log final value. " +
-                "Message payload can be accessed via <code>msg</code> property. For example <code>'temperature = ' + msg.temperature ;</code>" +
-                "Message metadata can be accessed via <code>metadata</code> property. For example <code>'name = ' + metadata.customerName;</code>",
+        nodeDescription = "Sends email message via SMTP server",
+        nodeDetails = "Expects messages with 'SEND_EMAIL' message type, usually processed by 'to email' node. " +
+                "Will send email message via configured SMTP server.",
         uiResources = {"static/rulenode/rulenode-core-config.js"},
         configDirective = "tbActionNodeSendEmailConfig",
         icon = "send"
diff --git a/ui/src/app/help/help-links.constant.js b/ui/src/app/help/help-links.constant.js
index 9b1f84f..f22328a 100644
--- a/ui/src/app/help/help-links.constant.js
+++ b/ui/src/app/help/help-links.constant.js
@@ -13,36 +13,36 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-var pluginClazzHelpLinkMap = {
-    'org.thingsboard.server.extensions.core.plugin.messaging.DeviceMessagingPlugin': 'pluginDeviceMessaging',
-    'org.thingsboard.server.extensions.core.plugin.telemetry.TelemetryStoragePlugin': 'pluginTelemetryStorage',
-    'org.thingsboard.server.extensions.core.plugin.rpc.RpcPlugin': 'pluginRpcPlugin',
-    'org.thingsboard.server.extensions.core.plugin.mail.MailPlugin': 'pluginMailPlugin',
-    'org.thingsboard.server.extensions.rest.plugin.RestApiCallPlugin': 'pluginRestApiCallPlugin',
-    'org.thingsboard.server.extensions.core.plugin.time.TimePlugin': 'pluginTimePlugin',
-    'org.thingsboard.server.extensions.kafka.plugin.KafkaPlugin': 'pluginKafkaPlugin',
-    'org.thingsboard.server.extensions.rabbitmq.plugin.RabbitMqPlugin': 'pluginRabbitMqPlugin'
 
-};
-
-var filterClazzHelpLinkMap = {
-    'org.thingsboard.server.extensions.core.filter.MsgTypeFilter': 'filterMsgType',
-    'org.thingsboard.server.extensions.core.filter.DeviceTelemetryFilter': 'filterDeviceTelemetry',
-    'org.thingsboard.server.extensions.core.filter.MethodNameFilter': 'filterMethodName',
-    'org.thingsboard.server.extensions.core.filter.DeviceAttributesFilter': 'filterDeviceAttributes'
-};
-
-var processorClazzHelpLinkMap = {
-    'org.thingsboard.server.extensions.core.processor.AlarmDeduplicationProcessor': 'processorAlarmDeduplication'
-};
-
-var pluginActionsClazzHelpLinkMap = {
-    'org.thingsboard.server.extensions.core.action.rpc.RpcPluginAction': 'pluginActionRpc',
-    'org.thingsboard.server.extensions.core.action.mail.SendMailAction': 'pluginActionSendMail',
-    'org.thingsboard.server.extensions.core.action.telemetry.TelemetryPluginAction': 'pluginActionTelemetry',
-    'org.thingsboard.server.extensions.kafka.action.KafkaPluginAction': 'pluginActionKafka',
-    'org.thingsboard.server.extensions.rabbitmq.action.RabbitMqPluginAction': 'pluginActionRabbitMq',
-    'org.thingsboard.server.extensions.rest.action.RestApiCallPluginAction': 'pluginActionRestApiCall'
+var ruleNodeClazzHelpLinkMap = {
+    'org.thingsboard.rule.engine.filter.TbJsFilterNode': 'ruleNodeJsFilter',
+    'org.thingsboard.rule.engine.filter.TbJsSwitchNode': 'ruleNodeJsSwitch',
+    'org.thingsboard.rule.engine.filter.TbMsgTypeFilterNode': 'ruleNodeMessageTypeFilter',
+    'org.thingsboard.rule.engine.filter.TbMsgTypeSwitchNode': 'ruleNodeMessageTypeSwitch',
+    'org.thingsboard.rule.engine.metadata.TbGetAttributesNode': 'ruleNodeOriginatorAttributes',
+    'org.thingsboard.rule.engine.metadata.TbGetCustomerAttributeNode': 'ruleNodeCustomerAttributes',
+    'org.thingsboard.rule.engine.metadata.TbGetDeviceAttrNode': 'ruleNodeDeviceAttributes',
+    'org.thingsboard.rule.engine.metadata.TbGetRelatedAttributeNode': 'ruleNodeRelatedAttributes',
+    'org.thingsboard.rule.engine.metadata.TbGetTenantAttributeNode': 'ruleNodeTenantAttributes',
+    'org.thingsboard.rule.engine.transform.TbChangeOriginatorNode': 'ruleNodeChangeOriginator',
+    'org.thingsboard.rule.engine.transform.TbTransformMsgNode': 'ruleNodeTransformMsg',
+    'org.thingsboard.rule.engine.mail.TbMsgToEmailNode': 'ruleNodeMsgToEmail',
+    'org.thingsboard.rule.engine.action.TbClearAlarmNode': 'ruleNodeClearAlarm',
+    'org.thingsboard.rule.engine.action.TbCreateAlarmNode': 'ruleNodeCrateAlarm',
+    'org.thingsboard.rule.engine.debug.TbMsgGeneratorNode': 'ruleNodeMsgGenerator',
+    'org.thingsboard.rule.engine.action.TbLogNode': 'ruleNodeLog',
+    'org.thingsboard.rule.engine.rpc.TbSendRPCReplyNode': 'ruleNodeRpcCallReply',
+    'org.thingsboard.rule.engine.rpc.TbSendRPCRequestNode': 'ruleNodeRpcCallRequest',
+    'org.thingsboard.rule.engine.telemetry.TbMsgAttributesNode': 'ruleNodeSaveAttributes',
+    'org.thingsboard.rule.engine.telemetry.TbMsgTimeseriesNode': 'ruleNodeSaveTimeseries',
+    'tb.internal.RuleChain': 'ruleNodeRuleChain',
+    'org.thingsboard.rule.engine.aws.sns.TbSnsNode': 'ruleNodeAwsSns',
+    'org.thingsboard.rule.engine.aws.sqs.TbSqsNode': 'ruleNodeAwsSqs',
+    'org.thingsboard.rule.engine.kafka.TbKafkaNode': 'ruleNodeKafka',
+    'org.thingsboard.rule.engine.mqtt.TbMqttNode': 'ruleNodeMqtt',
+    'org.thingsboard.rule.engine.rabbitmq.TbRabbitMqNode': 'ruleNodeRabbitMq',
+    'org.thingsboard.rule.engine.rest.TbRestApiCallNode': 'ruleNodeRestApiCall',
+    'org.thingsboard.rule.engine.mail.TbSendEmailNode': 'ruleNodeSendEmail'
 };
 
 var helpBaseUrl = "https://thingsboard.io";
@@ -52,30 +52,36 @@ export default angular.module('thingsboard.help', [])
         {
             linksMap: {
                 outgoingMailSettings: helpBaseUrl + "/docs/user-guide/ui/mail-settings",
-                plugins: helpBaseUrl + "/docs/user-guide/rule-engine/#plugins",
-                pluginDeviceMessaging: helpBaseUrl + "/docs/reference/plugins/messaging/",
-                pluginTelemetryStorage: helpBaseUrl + "/docs/reference/plugins/telemetry/",
-                pluginRpcPlugin: helpBaseUrl + "/docs/reference/plugins/rpc/",
-                pluginMailPlugin: helpBaseUrl + "/docs/reference/plugins/mail/",
-                pluginRestApiCallPlugin: helpBaseUrl + "/docs/reference/plugins/rest/",
-                pluginTimePlugin: helpBaseUrl + "/docs/reference/plugins/time/",
-                pluginKafkaPlugin: helpBaseUrl + "/docs/reference/plugins/kafka/",
-                pluginRabbitMqPlugin: helpBaseUrl + "/docs/reference/plugins/rabbitmq/",
-                rules: helpBaseUrl + "/docs/user-guide/rule-engine/#rules",
-                filters: helpBaseUrl + "/docs/user-guide/rule-engine/#filters",
-                filterMsgType: helpBaseUrl + "/docs/reference/filters/message-type-filter",
-                filterDeviceTelemetry: helpBaseUrl + "/docs/reference/filters/device-telemetry-filter",
-                filterMethodName: helpBaseUrl + "/docs/reference/filters/method-name-filter/",
-                filterDeviceAttributes: helpBaseUrl + "/docs/reference/filters/device-attributes-filter",
-                processors: helpBaseUrl + "/docs/user-guide/rule-engine/#processors",
-                processorAlarmDeduplication: "http://thingsboard.io/docs/#q=processorAlarmDeduplication",
-                pluginActions: helpBaseUrl + "/docs/user-guide/rule-engine/#actions",
-                pluginActionRpc: helpBaseUrl + "/docs/reference/actions/rpc-plugin-action",
-                pluginActionSendMail: helpBaseUrl + "/docs/reference/actions/send-mail-action",
-                pluginActionTelemetry: helpBaseUrl + "/docs/reference/actions/telemetry-plugin-action/",
-                pluginActionKafka: helpBaseUrl + "/docs/reference/actions/kafka-plugin-action",
-                pluginActionRabbitMq: helpBaseUrl + "/docs/reference/actions/rabbitmq-plugin-action",
-                pluginActionRestApiCall: helpBaseUrl + "/docs/reference/actions/rest-api-call-plugin-action",
+                ruleEngine: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/overview/",
+                ruleNodeJsFilter: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/filter-nodes/#script-filter-node",
+                ruleNodeJsSwitch: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/filter-nodes/#switch-node",
+                ruleNodeMessageTypeFilter: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/filter-nodes/#message-type-filter-node",
+                ruleNodeMessageTypeSwitch: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/filter-nodes/#message-type-switch-node",
+                ruleNodeOriginatorAttributes: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/enrichment-nodes/#originator-attributes",
+                ruleNodeCustomerAttributes: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/enrichment-nodes/#customer-attributes",
+                ruleNodeDeviceAttributes: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/enrichment-nodes/#device-attributes",
+                ruleNodeRelatedAttributes: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/enrichment-nodes/#related-attributes",
+                ruleNodeTenantAttributes: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/enrichment-nodes/#tenant-attributes",
+                ruleNodeChangeOriginator: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/transformation-nodes/#change-originator",
+                ruleNodeTransformMsg: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/transformation-nodes/#script-transformation-node",
+                ruleNodeMsgToEmail: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/transformation-nodes/#to-email-node",
+                ruleNodeClearAlarm: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/action-nodes/#clear-alarm-node",
+                ruleNodeCrateAlarm: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/action-nodes/#create-alarm-node",
+                ruleNodeMsgGenerator: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/action-nodes/#generator-node",
+                ruleNodeLog: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/action-nodes/#log-node",
+                ruleNodeRpcCallReply: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/action-nodes/#rpc-call-reply-node",
+                ruleNodeRpcCallRequest: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/action-nodes/#rpc-call-request-node",
+                ruleNodeSaveAttributes: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/action-nodes/#save-attributes-node",
+                ruleNodeSaveTimeseries: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/action-nodes/#save-timeseries-node",
+                ruleNodeRuleChain: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/rule-chains/",
+                ruleNodeAwsSns: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/external-nodes/#aws-sns-node",
+                ruleNodeAwsSqs: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/external-nodes/#aws-sqs-node",
+                ruleNodeKafka: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/external-nodes/#kafka-node",
+                ruleNodeMqtt: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/external-nodes/#mqtt-node",
+                ruleNodeRabbitMq: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/external-nodes/#rabbitmq-node",
+                ruleNodeRestApiCall: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/external-nodes/#rest-api-call-node",
+                ruleNodeSendEmail: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/external-nodes/#send-email-node",
+                rulechains: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/rule-chains/",
                 tenants: helpBaseUrl + "/docs/user-guide/ui/tenants",
                 customers: helpBaseUrl + "/docs/user-guide/ui/customers",
                 assets: helpBaseUrl + "/docs/user-guide/ui/assets",
@@ -90,38 +96,11 @@ export default angular.module('thingsboard.help', [])
                 widgetsConfigAlarm: helpBaseUrl +  "/docs/user-guide/ui/dashboards#alarm",
                 widgetsConfigStatic: helpBaseUrl +  "/docs/user-guide/ui/dashboards#static",
             },
-            getPluginLink: function(plugin) {
-                var link = 'plugins';
-                if (plugin && plugin.clazz) {
-                    if (pluginClazzHelpLinkMap[plugin.clazz]) {
-                        link = pluginClazzHelpLinkMap[plugin.clazz];
-                    }
-                }
-                return link;
-            },
-            getFilterLink: function(filter) {
-                var link = 'filters';
-                if (filter && filter.clazz) {
-                    if (filterClazzHelpLinkMap[filter.clazz]) {
-                        link = filterClazzHelpLinkMap[filter.clazz];
-                    }
-                }
-                return link;
-            },
-            getProcessorLink: function(processor) {
-                var link = 'processors';
-                if (processor && processor.clazz) {
-                    if (processorClazzHelpLinkMap[processor.clazz]) {
-                        link = processorClazzHelpLinkMap[processor.clazz];
-                    }
-                }
-                return link;
-            },
-            getPluginActionLink: function(pluginAction) {
-                var link = 'pluginActions';
-                if (pluginAction && pluginAction.clazz) {
-                    if (pluginActionsClazzHelpLinkMap[pluginAction.clazz]) {
-                        link = pluginActionsClazzHelpLinkMap[pluginAction.clazz];
+            getRuleNodeLink: function(ruleNode) {
+                var link = 'ruleEngine';
+                if (ruleNode && ruleNode.component && ruleNode.component.clazz) {
+                    if (ruleNodeClazzHelpLinkMap[ruleNode.component.clazz]) {
+                        link = ruleNodeClazzHelpLinkMap[ruleNode.component.clazz];
                     }
                 }
                 return link;
diff --git a/ui/src/app/rulechain/add-link.tpl.html b/ui/src/app/rulechain/add-link.tpl.html
index 42c0777..0a21104 100644
--- a/ui/src/app/rulechain/add-link.tpl.html
+++ b/ui/src/app/rulechain/add-link.tpl.html
@@ -15,7 +15,7 @@
     limitations under the License.
 
 -->
-<md-dialog aria-label="{{ 'rulenode.add-link' | translate }}" tb-help="'rulechains'" help-container-id="help-container">
+<md-dialog aria-label="{{ 'rulenode.add-link' | translate }}" tb-help="'ruleEngine'" help-container-id="help-container">
     <form name="theForm" ng-submit="vm.add()">
         <md-toolbar>
             <div class="md-toolbar-tools">
diff --git a/ui/src/app/rulechain/add-rulenode.tpl.html b/ui/src/app/rulechain/add-rulenode.tpl.html
index c36b43b..c572915 100644
--- a/ui/src/app/rulechain/add-rulenode.tpl.html
+++ b/ui/src/app/rulechain/add-rulenode.tpl.html
@@ -15,7 +15,7 @@
     limitations under the License.
 
 -->
-<md-dialog aria-label="{{ 'rulenode.add' | translate }}" tb-help="'rulechains'" help-container-id="help-container" style="min-width: 650px;">
+<md-dialog aria-label="{{ 'rulenode.add' | translate }}" tb-help="vm.helpLinks.getRuleNodeLink(vm.ruleNode)" help-container-id="help-container" style="min-width: 650px;">
     <form name="theForm" ng-submit="vm.add()">
         <md-toolbar>
             <div class="md-toolbar-tools">
diff --git a/ui/src/app/rulechain/rulechain.controller.js b/ui/src/app/rulechain/rulechain.controller.js
index d15cf74..7050ec5 100644
--- a/ui/src/app/rulechain/rulechain.controller.js
+++ b/ui/src/app/rulechain/rulechain.controller.js
@@ -30,7 +30,7 @@ import addRuleNodeLinkTemplate from './add-link.tpl.html';
 /*@ngInject*/
 export function RuleChainController($state, $scope, $compile, $q, $mdUtil, $timeout, $mdExpansionPanel, $window, $document, $mdDialog,
                                     $filter, $translate, hotkeys, types, ruleChainService, itembuffer, Modelfactory, flowchartConstants,
-                                    ruleChain, ruleChainMetaData, ruleNodeComponents) {
+                                    ruleChain, ruleChainMetaData, ruleNodeComponents, helpLinks) {
 
     var vm = this;
 
@@ -113,6 +113,8 @@ export function RuleChainController($state, $scope, $compile, $q, $mdUtil, $time
 
     vm.openRuleChainContextMenu = openRuleChainContextMenu;
 
+    vm.helpLinkIdForRuleNodeType = helpLinkIdForRuleNodeType;
+
     initHotKeys();
 
     function openRuleChainContextMenu($event, $mdOpenMousepointMenu) {
@@ -473,6 +475,10 @@ export function RuleChainController($state, $scope, $compile, $q, $mdUtil, $time
 
     vm.destroyTooltips = destroyTooltips;
 
+    function helpLinkIdForRuleNodeType() {
+        return helpLinks.getRuleNodeLink(vm.editingRuleNode);
+    }
+
     function destroyTooltips() {
         if (vm.tooltipTimeout) {
             $timeout.cancel(vm.tooltipTimeout);
diff --git a/ui/src/app/rulechain/rulechain.tpl.html b/ui/src/app/rulechain/rulechain.tpl.html
index 4ba967d..a84df90 100644
--- a/ui/src/app/rulechain/rulechain.tpl.html
+++ b/ui/src/app/rulechain/rulechain.tpl.html
@@ -202,7 +202,7 @@
                             on-toggle-details-edit-mode="vm.onRevertRuleNodeLinkEdit(vm.ruleNodeLinkForm)"
                             on-apply-details="vm.saveRuleNodeLink(vm.ruleNodeLinkForm)"
                             the-form="vm.ruleNodeLinkForm">
-            <details-buttons tb-help="vm.helpLinkIdForRuleNodeLink()" help-container-id="link-help-container">
+            <details-buttons tb-help="'ruleEngine'" help-container-id="link-help-container">
                 <div id="link-help-container"></div>
             </details-buttons>
             <form name="vm.ruleNodeLinkForm" ng-if="vm.isEditingRuleNodeLink">