:::info 匹配版本:V3.20
页面状态:已完成
原文地址:点击跳转 :::

概述

从ThingsBoard 3.2开始,租户管理员可以使用“设备配置文件”为多个设备配置通用设置。每个设备在单个时间点上只有一个配置文件。
有经验的ThingsBoard用户可以注意到设备类型已被弃用,以支持设备配置文件。更新脚本将基于唯一的设备类型自动创建设备配置文件,并将其分配给适当的设备。
让我们一一看一下设备配置文件中的可用设置。

设备配置文件设置

规则链

默认情况下,“根规则链”处理任何设备的所有传入消息和事件。但是,设备类型越多,“根规则链”就可能变得越复杂。许多平台用户创建根规则链的唯一目的是根据设备类型将消息发送到特定规则链。
为了避免这种痛苦而平凡的活动,从ThingsBoard 3.2开始,您可以为设备指定自定义根规则链。新的规则链将接收所有遥测,设备活动(活动/不活动)和设备生命周期(创建/更新/删除)事件。此设置在“设备配置文件”向导和“设备配置文件”详细信息中可用。
设备配置文件(new) - 图1

队列名称

默认情况下,队列将用于存储来自任何设备的所有传入消息和事件。传输层将邮件提交到此队列,规则引擎将在队列中轮询是否有新邮件。但是,对于多个用例,您可能希望对不同的设备使用不同的队列。例如,您可能想隔离火灾警报/烟雾探测器传感器和其他设备的数据处理。这样,即使您的系统具有数百万水表产生的峰值负载,每当报告火灾警报时,也将立即处理该警报。队列分隔还允许您自定义不同的提交处理策略。

该设置在设备配置文件向导和设备配置文件详细信息中可用。
请注意,如果您选择使用自定义队列名称,则应在使用它之前在Thingsboard.yml文件中对其进行配置。
设备配置文件(new) - 图2

传输配置

从 ThingsBoard 3.2 开始,平台支持两种传输类型: Default和MQTT。

默认传输类型

默认传输类型旨在与早期版本向后兼容。使用默认传输类型,您可以继续使用平台的默认MQTTHTTPCoAP API连接设备。默认传输类型没有特定的配置设置。

MQTT传输类型

如果选用MQTT传输类型会启用高级MQTT传输设置。可以为时序数据和属性更新指定自定义的MQTT主题过滤器,分别对应于遥测上传API属性更新API
MQTT传输类型有以下设置项。

MQTT设备主题过滤器

自定义MQTT主题过滤器支持单个 + 和多级 # 作为通配符,几乎适用于所有使用 JSONProtobuf 格式来传递消息的基于MQTT通信的设备。例如,按照下图配置的话,可以使用以下命令上报时序数据:

  1. mosquitto_pub -h 'demo.thingsboard.io' -i 'c1' -u 't1' -P 'secret' -t '/telemetry' -m '{"humidity": 10.3}'

属性更新使用以下命令:

  1. mosquitto_pub -h 'demo.thingsboard.io' -i 'c1' -u 't1' -P 'secret' -t '/attributes' -m '{"firmwareVersion": "1.3"}'

记得将上诉命令中的设备客户端id c1 、用户名 t1 和密码 secret 这些基本 mqtt 凭据换成你自己的。
设备配置文件(new) - 图3

MQTT设备传递内容

默认情况下,平台推荐设备发送JSON格式的数据。不过,也也支持发送 Protocol Buffers 格式数据。
Protocol BuffersProtobuf 是用一种与编程语言或平台无关的方式来序列化结构化的数据。可以很方便的最大程度的压缩传输数据的大小。
在撰写本文时 (ThingsBoard 3.2) ,平台支持 遥测上传属性上传 时的自定义数据模型。我们计划在将来的版本中增加定义下行链路消息 (RPC调用和属性更新) 的模型的功能。

At the moment of writing (ThingsBoard 3.2), platform supports customizable proto schemas for telemetry upload and [attribute upload]/docs/reference/MQTT-API/#publish-attribute-update-to-the-server). We plan to the add ability to define a schema for downlink messages (RPC calls and attribute updates) in future releases.

设备配置文件(new) - 图4
ThingsBoard 动态解析 protobuf 结构,这就是为什么平台不支持一些 protobuf 特性,如 extensionsmaps
疑问点 为什么动态解析了protobuf,就不支持extensions和maps

警报规则

平台用户可以使用规则引擎来配置警报。规则引擎是一个非常强大的功能,但需要一些编程技能。从 ThingsBoard 3.2 开始,我们引入了警报规则,以简化常用警报类型的配置过程。现在,你不需要精通规则引擎即可配置处理逻辑。在后台, Rule Engine使用“设备配置文件”规则节点评估警报规则。

警报规则包含以下属性:

  • 警报类型 - 警报的类型。警报类型在设备配置文件的警报规则中必须是唯一的;
  • 创建条件 - 定义何时创建/更新警报的条件。条件由以下属性组成;
    • 严重程度 - 用于创建/更新警报。ThingsBoard 会根据创建条件按严重程度进行降序排列。例如,如果符合更高层级的的警报创建条件,平台按照此严重层级来产生警报,而忽略 “Major” 、 “Minor” 、 “Warning” 这些层级校验。每个警报规则中严重层级必须是唯一的 (例如,同一警报规则中的两个创建条件不能具有相同的严重性);
    • 键过滤器 - 针对属性或遥测值的逻辑表达式列表。例如,”(temperature < 0 OR temperature > 20) AND softwareVersion = ‘2.5.5’”;
    • 条件类型 - 根据简单逻辑、持续时间或者重复次数。例如,连续3次或在5分钟内,只要满足其中一个这种简单的条件,就会创建警报;
    • 定时计划 - 定义规则生效的时间间隔。”一直活跃” 、 “在特定时间活跃” 或 “自定义”;
    • 详情 - 警报详情模板支持用 ${attribute tename} 语法替换遥测\属性值;
  • 清除条件 -定义清除警报的条件;
  • 高级设置 - 定义警报向相关资产、客户、租户或其他实体的传播;

让我们通过示例学习如何使用警报规则。假设我们想监控有贵重物品的冰箱内部的温度。
我们还假设我们已经创建了称为 “温度传感器” 的设备配置文件,并为我们的设备提供了温度传感器和访问令牌- ACCESS_TOKEN 。下面列出的命令将温度读数上传到 demo.thingsboard.io

  1. \mosquitto_pub -d -h 'demo.thingsboard.io' -t "v1/devices/me/telemetry" -u "$ACCESS_TOKEN" -m '{"temperature": 5.3}'

例1.用简单逻辑作为警报条件

当温度超过10度时,我们想创建 严重 警报。

  • Step 1. 打开设备配置文件并切换编辑模式。

alarm-example-1-step-1.png

  • Step 2. 点击 “添加警报规则” 按钮。

alarm-example-1-step-2.png

  • Step 3. 填写警报类型,然后点击红色的 “+” 标志。

alarm-example-1-step-3.png

  • Step 4. 点击 “添加键过滤器” 按钮。

alarm-example-1-step-5.png

  • Step 5. 选择类型为 “Timeseries(时间序列)” 的键类型。填入键名称为 “temperature(温度)” 。将 “Value type(值的数据类型)” 更改为 “Numeric(数字)”。点击 “添加” 按钮。

alarm-example-1-step-5.png

  • Step 6. 选择 “greater then(大于)” 选项并输入阈值。点击 “添加”。

alarm-example-1-step-6.png

  • Step 7. 点击 “保存” 按钮。

alarm-example-1-step-7.png

  • Step 8. 最后,应用更改。

alarm-example-1-step-8.png

例2.持续时间的警报条件

假设我们想要修改示例1,并且仅当温度超过某个阈值1分钟时才发出警报。
为此,我们需要编辑警报条件,并将条件类型从 “简单” 修改为 “持续时间”。我们还应该指定持续时间的值和单位。

  • Step 1. 编辑警报条件,并将条件类型更改为 “持续时间”。指定持续时间值和单位。保存条件。

alarm-example-2-step-1.png

  • Step 2. 应用更改。

alarm-example-2-step-2.png

例3.重复警报条件

假设我们想要修改例1,在其仅在传感器连续3次上报温度超过阈值时产生警报。
为此,我们需要编辑警报条件,并将条件类型从 “简单” 修改为 “重复”。我们还应该指定 3 为 “事件计数”。

  • Step 1. 编辑警报条件,并将条件类型更改为 “重复”。将 3 指定为 “事件计数”。保存条件。

alarm-example-3-step-1.png

  • Step 2. 应用更改。

alarm-example-3-step-2.png

例4.清除报警的规则

假设如果冰箱中的温度恢复正常,我们希望自动清除警报。

  • Step 1. 打开设备配置文件并切换编辑模式。点击 “添加清除条件” 按钮。

alarm-example-4-step-1.png

  • Step 2. 点击红色的 “+” 标志。

alarm-example-4-step-2.png

  • Step 3. 添加键(属性key)过滤器。

alarm-example-4-step-3.png

  • Step 4. 最后,应用更改。

alarm-example-4-step-4.png

例5.定义警报规则调度

假设我们希望警报规则仅在我们希望的时间内生效。

  • Step 1. 编辑报警规则定时计划表

alarm-example-5-step-1.png

  • Step 2. 选择时区、天数、时间间隔,然后单击 “保存”

alarm-example-5-step-2.png

  • Step 3. 最后,应用更改

alarm-example-5-step-3.png

例6.高级阈值

假设我们希望用户可以通过界面的仪表板来覆盖预设的阈值。我们可能还希望添加标志来启用或禁用设备的某些警报。为此,我们需要在警报规则的条件中使用动态值。我们会用到两个属性,布尔类型的 temperatureAlarmFlag 和数字类型的 temperatureAlarmThreshold 。我们的希望是在 temperatureAlarmFlag = True AND temperature is greater than temperatureAlarmThreshold 时触发警报创建。

  • Step 1. 修改 temperaturekey过滤器,并将值类型更改为动态。

alarm-example-6-step-1.png

  • Step 2. 选择动态源类型并输入 temperatureAlarmThreshold ,然后单击 “更新”。

alarm-example-6-step-2.png

  • Step 3. 为 temperatureAlarmFlag 添加到另一个键过滤器,然后单击 “添加”。

alarm-example-6-step-3.png

  • Step 4. 最后,单击 “保存” 并应用更改。

alarm-example-6-step-4.png
Step 5. 通过手动或脚本的方式提供设备属性。
alarm-example-6-step-5.png

设备配置文件规则节点

设备配置文件规则节点会根据设备配置文件中定义的警报规则创建并清除警报。默认情况下,它是处理链中的第一个规则节点。规则节点正在处理所有传入的消息,并对属性和遥测值做出反应。规则节点中有两个重要设置。
报警规则的持久化状态 - 强制规则节点存储自己当前的处理状态。默认情况下禁用。如果你有持续时间或重复的条件,此设置就非常有用了。假设你有条件如 “温度在近1小时内都高于50”,并且第一个温度高于50的事件是在下午 1 点报告的。在下午 2 点,你应该会收到警报 (假设温度条件不变)。但是,如果在下午 1 点和 2 点之间要重启服务器,则规则节点需要从数据库中查找状态。基本上,如果启用此选项和 “获取警报规则状态” 选项,则规则节点依旧能生成警报。如果禁用此项,规则节点将不会生成警报。由于性能原因,我们默认禁用此设置。如果启用,当传入的消息满足警报条件之一时,会引发额外的保存状态的操作。
获取报警规则的状态 - 强制规则节点在初始化时恢复处理状态。默认情况下禁用。如果您有持续时间或重复的条件,此设置非常有用。这正常应该与 “警报规则的持续状态” 选项一起应用,但是在极少情况下,您可能希望启用 “警报规则的持久状态” 选项但禁用此设置。假设您有很多频繁发送数据的设备,则可能希望避免在初始化时从数据库加载处理状态。当来自指定设备的第一条消息到达时,规则节点会从数据库获取状态。
device-profile-rule-node.pngdevice-profile-rule-node2.png

报警通知

假设你已配置好警报规则,可能还希望在 ThingsBoard 创建或更新警报时收到通知。设备配置文件规则节点主要有三种的输出关系类型,可用类型如下: “警报创建” 、 “警报严重性更新” 和 “警报清除”。请参见下面的规则链示例。你在规则链节点中继续或新建自己的参数设置之前,请确保系统管理员已配置好 sms/email 发送程序。
你也可以参考现有的文档: 在报警时发送电子邮件~~ ~~(参考 “to email” 和 “send email” 部分的内容) 或 Telegram通知。还有, “警报更新” 这种关系类型,大多数情况应该忽略使用,以避免重复通知。
device-profile-notifications.png

设备配置

设备配置允许设备在生产过程中或生产完成后自动注册到ThingsBoard中。更多详细信息,请参阅单独的文档页面

使用备注

Device profile 配置

Transport configuration

MQTT

MQTT device topic filters MQTT 设备主题过滤器

Single [+] and multi-level [#] wildcards supported. [+] is suitable for any topic filter level. Ex.: v1/devices/+/telemetry or +/devices/+/attributes. [#] can replace the topic filter itself and must be the last symbol of the topic. Ex.: # or v1/devices/me/#.

+ 的作用是什么:
# 的作用是什么:

  1. DeviceProfile {
  2. createdTime (integer, optional),【时间戳】
  3. default (boolean, optional),【是否为默认的设备配置文件】
  4. defaultQueueName (string, optional),【默认的队列名称】
  5. defaultRuleChainId (RuleChainId, optional),【默认的规则链ID
  6. description (string, optional),【描述】
  7. id (DeviceProfileId, optional),【ID
  8. name (string, optional),【名称,不确定是否唯一,但是可选,可能是不唯一,类似label
  9. profileData (DeviceProfileData, optional),【正文】
  10. provisionDeviceKey (string, optional),【设备批量的键,猜测主要用于设备添加时的匹配】
  11. provisionType (string, optional)【设备批量的策略类型,只有三个选项 枚举】 = ['DISABLED', 'ALLOW_CREATE_NEW_DEVICES', 'CHECK_PRE_PROVISIONED_DEVICES']stringEnum:"DISABLED", "ALLOW_CREATE_NEW_DEVICES", "CHECK_PRE_PROVISIONED_DEVICES",
  12. tenantId (TenantId, optional),【租户ID,作为租户的标识】
  13. transportType (string, optional)【传输层协议,目前近支持default mqtt两种】 = ['DEFAULT', 'MQTT', 'LWM2M']stringEnum:"DEFAULT", "MQTT", "LWM2M",
  14. type (string, optional)【类型,目前在UI配置中无法配置】 = ['DEFAULT']stringEnum:"DEFAULT"
  15. } RuleChainId {
  16. id (string, optional)【规则链节点ID
  17. } DeviceProfileId {
  18. id (string, optional)【设备配置文件ID
  19. } DeviceProfileData {
  20. alarms (Array[DeviceProfileAlarm], optional),【报警配置,可以多项警报配置,可以嵌套数字】
  21. configuration (DeviceProfileConfiguration, optional),【配置为默认,但是未能看到此项】
  22. provisionConfiguration (DeviceProfileProvisionConfiguration, optional),【量产配置,】
  23. transportConfiguration (DeviceProfileTransportConfiguration, optional)【传输配置,】
  24. } TenantId {
  25. id (string, optional)
  26. } DeviceProfileAlarm {
  27. alarmType (string, optional),
  28. clearRule (AlarmRule, optional),
  29. createRules (inline_model_1, optional),
  30. id (string, optional),
  31. propagate (boolean, optional),
  32. propagateRelationTypes (Array[string], optional)
  33. } DeviceProfileConfiguration {}DeviceProfileProvisionConfiguration {
  34. provisionDeviceSecret (string, optional)
  35. } DeviceProfileTransportConfiguration {}AlarmRule {
  36. alarmDetails (string, optional),
  37. condition (AlarmCondition, optional),
  38. schedule (AlarmSchedule, optional)
  39. } inline_model_1 {}AlarmCondition {
  40. condition (Array[KeyFilter], optional),
  41. spec (AlarmConditionSpec, optional)
  42. } AlarmSchedule {
  43. type (string, optional) = ['ANY_TIME', 'SPECIFIC_TIME', 'CUSTOM']stringEnum:"ANY_TIME", "SPECIFIC_TIME", "CUSTOM"
  44. } KeyFilter {
  45. key (EntityKey, optional),
  46. predicate (KeyFilterPredicate, optional),
  47. valueType (string, optional) = ['STRING', 'NUMERIC', 'BOOLEAN', 'DATE_TIME']stringEnum:"STRING", "NUMERIC", "BOOLEAN", "DATE_TIME"
  48. } AlarmConditionSpec {}EntityKey {
  49. type (string) = ['ATTRIBUTE', 'CLIENT_ATTRIBUTE', 'SHARED_ATTRIBUTE', 'SERVER_ATTRIBUTE', 'TIME_SERIES', 'ENTITY_FIELD', 'ALARM_FIELD']stringEnum:"ATTRIBUTE", "CLIENT_ATTRIBUTE", "SHARED_ATTRIBUTE", "SERVER_ATTRIBUTE", "TIME_SERIES", "ENTITY_FIELD", "ALARM_FIELD",
  50. key (string)
  51. } KeyFilterPredicate {}
  1. {
  2. "id": {
  3. "entityType": "DEVICE_PROFILE",
  4. "id": "cf4b2b70-3b4e-11eb-bc81-cf8c2bf662c1"
  5. },
  6. "createdTime": 1607649523623,
  7. "tenantId": {
  8. "entityType": "TENANT",
  9. "id": "fd61c500-23e8-11eb-9108-7969ac838234"
  10. },
  11. "name": "test",
  12. "description": "test",
  13. "type": "DEFAULT",
  14. "transportType": "MQTT",
  15. "provisionType": "ALLOW_CREATE_NEW_DEVICES",
  16. "defaultRuleChainId": {
  17. "entityType": "RULE_CHAIN",
  18. "id": "18ce9e80-3ac3-11eb-b9e9-3d1e76d32e71"
  19. },
  20. "defaultQueueName": "HighPriority",
  21. "profileData": {
  22. "configuration": {
  23. "type": "DEFAULT"
  24. },
  25. "transportConfiguration": {
  26. "type": "MQTT",
  27. "deviceTelemetryTopic": "v1/devices/+/telemetry",
  28. "deviceAttributesTopic": "v1/devices/attributes/#",
  29. "transportPayloadTypeConfiguration": {
  30. "transportPayloadType": "JSON"
  31. }
  32. },
  33. "provisionConfiguration": {
  34. "type": "ALLOW_CREATE_NEW_DEVICES",
  35. "provisionDeviceSecret": "291767kk78ju0w75dyrl"
  36. },
  37. "alarms": [
  38. {
  39. "id": "51863307-d839-6af8-5a17-c4f76398ede2",
  40. "alarmType": "test",
  41. "createRules": {
  42. "CRITICAL": {
  43. "condition": {
  44. "condition": [
  45. {
  46. "key": {
  47. "type": "ATTRIBUTE",
  48. "key": "dddd"
  49. },
  50. "valueType": "NUMERIC",
  51. "predicate": {
  52. "type": "NUMERIC",
  53. "operation": "EQUAL",
  54. "value": {
  55. "defaultValue": 445,
  56. "userValue": null,
  57. "dynamicValue": null
  58. }
  59. }
  60. },
  61. {
  62. "key": {
  63. "type": "ATTRIBUTE",
  64. "key": "dddd"
  65. },
  66. "valueType": "NUMERIC",
  67. "predicate": {
  68. "type": "NUMERIC",
  69. "operation": "NOT_EQUAL",
  70. "value": {
  71. "defaultValue": 45455,
  72. "userValue": null,
  73. "dynamicValue": null
  74. }
  75. }
  76. },
  77. {
  78. "key": {
  79. "type": "ATTRIBUTE",
  80. "key": "dddd"
  81. },
  82. "valueType": "NUMERIC",
  83. "predicate": {
  84. "type": "NUMERIC",
  85. "operation": "GREATER",
  86. "value": {
  87. "defaultValue": 45455,
  88. "userValue": null,
  89. "dynamicValue": null
  90. }
  91. }
  92. },
  93. {
  94. "key": {
  95. "type": "ATTRIBUTE",
  96. "key": "dddd"
  97. },
  98. "valueType": "NUMERIC",
  99. "predicate": {
  100. "type": "NUMERIC",
  101. "operation": "LESS",
  102. "value": {
  103. "defaultValue": 555555,
  104. "userValue": null,
  105. "dynamicValue": null
  106. }
  107. }
  108. },
  109. {
  110. "key": {
  111. "type": "ATTRIBUTE",
  112. "key": "dddd"
  113. },
  114. "valueType": "NUMERIC",
  115. "predicate": {
  116. "type": "NUMERIC",
  117. "operation": "GREATER_OR_EQUAL",
  118. "value": {
  119. "defaultValue": 555555,
  120. "userValue": null,
  121. "dynamicValue": null
  122. }
  123. }
  124. },
  125. {
  126. "key": {
  127. "type": "ATTRIBUTE",
  128. "key": "dddd"
  129. },
  130. "valueType": "NUMERIC",
  131. "predicate": {
  132. "type": "NUMERIC",
  133. "operation": "LESS_OR_EQUAL",
  134. "value": {
  135. "defaultValue": 66666,
  136. "userValue": null,
  137. "dynamicValue": null
  138. }
  139. }
  140. }
  141. ],
  142. "spec": {
  143. "type": "SIMPLE"
  144. }
  145. },
  146. "schedule": null,
  147. "alarmDetails": "dsadsadas"
  148. }
  149. },
  150. "clearRule": null,
  151. "propagate": true,
  152. "propagateRelationTypes": null
  153. }
  154. ]
  155. },
  156. "provisionDeviceKey": "3ivr64rh0u7wirml3iqq",
  157. "default": false
  158. }