了解如何配置Rule Engine以根据来自多个设备的遥测读数创建新的遥测。

用例

假设你有一个带有室内温度计和室外温度计的仓库:我们将配置ThingsBoard规则引擎以根据温度传感器的最新读数自动计算仓库内部和外部的温度变化量。
请注意这只是一个简单的理论用例用于演示平台的功能。
你可以将本教程用作更复杂场景的基础。

先决条件

我们假设你已完成以下指南并查看了以下文章:

  • 入门指南
  • 规则引擎概述

    模型定义

    我们将创建一个名称为“Warehouse A”的资产后输入“warehouse”。
    基于2个设备收集遥测数据 - 图1
    我们将创建两个名称分别为“Inside Thermometer”和“Outside Thermometer”的设备并分别使用“Inside Thermometer”和“Outside Thermometer”类型。
    基于2个设备收集遥测数据 - 图2 基于2个设备收集遥测数据 - 图3
    我们还必须在资产“Warehouse A”和设备“Inside Thermometer”之间建立关系。
    此关系将在规则链中使用以将消息的始发者从温度计更改为仓库本身以及从设备“Inside Thermometer”到设备“Outside Thermometer”的关系,以从“Outside Thermometer”获取最新温度。
    基于2个设备收集遥测数据 - 图4

注意:请查看以下文档页面以了解如何创建资产和关系。

消息流

在本节中我们将解释本教程中每个节点的用途。将涉及三个规则链:

  • “Thermometer Emulators”-可选规则链用于模拟来自两个温度传感器的数据。
  • “Root rule chain” - 规则链实际上将遥测从设备保存到数据库中并在将设备重定向到”Delta Temperature”链之前按设备类型过滤消息。
  • “Delta Temperature” - 规则链用于实际计算仓库内和室外温度计之间的温度增量。

    温度计模拟器规则链

    基于2个设备收集遥测数据 - 图5

  • 节点A和B:生成器节点

  • 两个类似的节点会定期生成一个非常简单的消息,并带有随机温度读数。
  • 节点A:室内温度计模拟器

    1. var msg = {
    2. temperature: (20 + 5 * Math.random()).toFixed(1)
    3. };
    4. return {
    5. msg: msg,
    6. metadata: {
    7. deviceType: "indoor thermometer"
    8. },
    9. msgType: "POST_TELEMETRY_REQUEST"
    10. };
  • 节点B:室外温度计模拟器

    1. var msg = {
    2. temperature: (18 + 5 * Math.random()).toFixed(1)
    3. };
    4. return {
    5. msg: msg,
    6. metadata: {
    7. deviceType: "outdoor thermometer"
    8. },
    9. msgType: "POST_TELEMETRY_REQUEST"
    10. };

    基于2个设备收集遥测数据 - 图6
    基于2个设备收集遥测数据 - 图7

注意: 在实际情况下,设备类型默认设置为消息metadata。

  • 节点C:规则链节点
    • 将所有邮件转发到默认的根规则链。

根规则链

基于2个设备收集遥测数据 - 图8

  • 节点D:规则链节点
    • 将传入消息转发到指定的规则链”Delta Temperature”。

Delta Temperature 规则链

基于2个设备收集遥测数据 - 图9

  • 节点E: Switch node.

    • 按从消息metadata中获取的deviceType路由传入消息。如果来自传入消息的deviceType是”indoor thermometer”,则通过”indoor”关系类型切换到链,否则如果来自传入消息的deviceType是”outdoor thermometer”,则通过”outdoor”关系类型切换到链。

      1. function nextRelation(metadata, msg) {
      2. if (metadata.deviceType === 'indoor thermometer') {
      3. return ['indoor'];
      4. } else if (metadata.deviceType === 'outdoor thermometer')
      5. return ['outdoor'];
      6. }
      7. return nextRelation(metadata, msg);

      基于2个设备收集遥测数据 - 图10

  • 节点F和G: Transform script nodes

    • 两个类似的节点根据来自先前节点的关系类型,将密钥名称从消息有效负载从”temperature”更改为”indoorTemperature”或”outdoorTemperature”。
    • 创建新的出站消息,并在其中放入新的遥测。
  • 节点F: 更改为Outdoor

    1. var newMsg = {};
    2. newMsg.outdoorTemperature = msg.temperature;
    3. return {
    4. msg: newMsg,
    5. metadata: metadata,
    6. msgType: msgType
    7. };
  • 节点G: 更改为Indoor

    1. var newMsg = {};
    2. newMsg.indoorTemperature = msg.temperature;
    3. return {
    4. msg: newMsg,
    5. metadata: metadata,
    6. msgType: msgType
    7. };
  • 节点H: 更改发起方节点。

    • 将发起者从”Inside Thermometer”更改为相关资产”Warehouse A”并且所提交的消息将作为来自资产的消息进行处理。

基于2个设备收集遥测数据 - 图11

  • 节点I: Save Timeseries node.
    • 将来自传入消息payload的TimeSeries数据保存到数据库中。
  • 节点J: Originator attributes node.
    • 将消息始发者的最新遥测值添加到消息metadata中。

基于2个设备收集遥测数据 - 图12

  • 节点K: Transform script node.

    • 创建新的出站消息在该消息中放入新的遥测”deltaTemperature”,其计算方式类似于消息元数据遥测值之差即”indoorTemperature”和”outdoorTemperature”之间的绝对值。

      1. var newMsg = {};
      2. newMsg.deltaTemperature = parseFloat(Math.abs(metadata.indoorTemperature - metadata.outdoorTemperature).toFixed(2));
      3. return {
      4. msg: newMsg,
      5. metadata: metadata,
      6. msgType: msgType
      7. };

      基于2个设备收集遥测数据 - 图13

  • 节点L: Save Timeseries节点.

    • 将来自传入消息payload的TimeSeries数据保存到数据库中。

配置Rule Chains

下载并导入附加的模拟器规则链文件作为新的”Thermometer Emulators”规则链, 根规则链文件作为新的”Root rule chain”和”Delta Temperature”文件。 请注意,某些节点已启用调试。

验证流程

下载并导入附加的信息中心文件作为新的”Warehouse dashboard”。
基于2个设备收集遥测数据 - 图14