Thingsboard笔记

文章目录

每次在编译前习惯性的看看教程,好了解整套流程以及避免一些坑,如果你是mac m1芯片,按网上教程需要修改 com.google.protobufclassifierosx-x86_64
因为在老版本中 protobuf 不支持m1,但是现在已经支持,指定为 osx-aarch_64 ,相关话题:github
image

因为之前编译并没有对过程进行记录,所以本篇不包含编译笔记,后续有机会再记录编译过程形成笔记。

仪表盘部件

设备接入后,在控制设备之前,利用部件可以简单易懂的控制设备,同时也能了解到设备的连接状态。

新建仪表盘库

没啥好讲的,无脑操作,输入名字add就行了。
image

添加部件

这里以灯光举例,我添加一个Round switch用来控制灯光。在添加时,需要创建一个alias,同时指定你需要操作的设备。
image

设置参数

在高级-数值设定中绑定设备的操作value。示例:getValue_xxxsetValue_xxx,可以看出,一个是获取,一个是写入。然后add即可。
image

控制测试

在这里,你就可以控制开关了。
image
其他部件同理。

规则链

基本的操作就不写了,记录一些我实现的操作链

联动控制

非ThingsBoard PE版

需求示例

  • 现有设备A、B、C(设备A为摄像头,设备B、C假设为灯光、空调)
  • 当A设备识别到有人时,打开B、C设备的开关(模拟人员进入)
  • 当A设备未识别到有人时,关闭B、C设备开关(模拟人员离开)
  • PS:此处只记录A、B联动。

流程图(比较乱)

image

思路

1 摄像头识别有人,data在input节点入(这是子链,主链有分流),通过script筛选器节点分流;
2 分支1(人员进入)
2.1 通过change originator节点进行发起者转换,换成B设备
image

注意,大多数name pattern 可以使用${},用来指定元数据中的key

2.2 通过originator telemetry获取B设备当前遥测(状态)
image

2.3 通过script筛选器判断是否需要开灯,相关数据由2.2提供,例如:已经开灯就不执行开灯操作。

1
2
var newLMS = metadata.LMS0101001SWS001 == "\"1\"";
return !newLMS;

2.4 编写开灯的script变换节点

1
2
3
4
var newMsg = {};
newMsg.method = "setValue_LMS0101001SWS001";
newMsg.params = true;
return {msg: newMsg, metadata: metadata, msgType: msgType};

2.5 执行RPC动作节点,响应2.4的脚本
3 分支2(人员离开)
3.1 编写js脚本

1
return {msg: {"timestamp": Date.now()}, metadata: metadata, msgType: "POST_ATTRIBUTES_REQUEST"};

3.2 通过save attributes节点保存为属性
3.3 通过delay (deprecated)节点延时60秒(60秒后关灯)
3.4 通过originator attributes节点获取3.2保存的属性并写入元数据
image

3.5 通过change originator节点进行发起者转换,换成B设备
3.6 通过script筛选器判断时间差是否符合关灯要求(因为识别到有人会一直请求规则链,所以3.2的操作会让这个时间保存为最新时间)

1
2
3
var newTimestamp = Date.now() - msg.timestamp;
var minutes = newTimestamp / 1000 / 60; // 将差值转换为分钟
return minutes >1;

image

3.7 编写关灯的script变换节点

1
2
3
4
var newMsg = {};
newMsg.method = "setValue_LMS0101001SWS001";
newMsg.params = false;
return {msg: newMsg, metadata: metadata, msgType: msgType};

3.8 执行RPC动作节点,响应3.7的脚本

至此,就是整个联动控制实现思路,如果你有更好的办法,欢迎评论指点。

未完待续…

微信公众号
分享到: