使用内置modbus驱动采集数据并进行边缘函数计算
概述
本教程展示如何使用智能边缘完成一个简单的子设备数采和数据智能demo。
教程中会使用系统内置的modbus驱动,以及内置的modbus模拟器(模拟器仅支持容器模式),实现边缘节点采集子设备数据,并通过函数计算测点值并上报到云端。
demo具体流程为:模拟一个温度计,云端采集温度计数据,同时将函数应用部署至边缘,实时比较温度与高温报警阈值,当温度超过阈值时会触发报警,将消息推送到指定目的地。
部署子设备模拟器
demo采用系统内置的设modbus备模拟器,modbus-tcp模拟器支持linux-amd64、linux-arm64、linux-armv7平台。
创建节点选择modbus模拟器,如下图所示:
在边缘节点设备上执行边缘节点安装命令,会自动同步安装modbus模拟器,安装完毕以后在本地执行kubectl get pod -n baetyl-edge-system
,可以看到有一个baetyl-modbus-tcp-simulator的应用,如下图所示:
云端采集子设备数据
1. 创建产品
导航栏选择子设备管理,右侧通过导入产品创建产品。导入产品时上传产品-modbus-simulator.json文件。产品名为modbus-simulator,包含下图中一系列测点。
2. 创建接入模板、添加采集点、配置映射
导航栏选择子设备管理,右侧选择接入模板菜单,点击创建模板进行模板创建。关联产品选择上一步创建的modbus-simulator产品。名称我们这里填写为modbus-simulator-template,访问协议选择Modbus。
下一步点击查看进入创建的模板modbus-simulator-template,进行采集点添加和映射配置。也可以点击导入设备点表,然后上传 modbus-simulator-pointTableTemplate.csv点表文件,实现一键导入。操作完效果图如下:
3. 创建设备
导航栏选择子设备管理,右侧选择设备菜单,点击创建设备进行设备创建。产品选择之前创建的modbus-simulator,名称我们这里填写为modbus-test。下一步进入创建的modbus-test设备,可以看到如下效果:
注意: 此时还未部署驱动,测点值是空的。
4. 创建驱动,配置通道
进入创建的节点,选择子设备管理。右侧点击引入驱动,选择官方驱动modbus即可完成驱动创建。下一步点击modbus驱动的配置按钮,进行通道配置。按下图配置即可:
5. 绑定子设备,配置接入模板、通道等参数
在上一步所在页面,点击绑定子设备按钮,选择之前创建的mosbus-simulator产品,找到modbus-test设备,点击确认引入驱动关联的modbus-test子设备。接下来,点击配置按钮进行参数配置。参考下图进行配置:
6. 部署驱动
点击部署驱动按钮,bie将为您自动部署驱动。一会儿后,刷新页面,您将刚看下图效果:
7.读取设备测点值和置数
在看到上一步的设备状态在线后,点击查看即可查看设备的测点值。
测点值列出现模拟器的测点数值,针对“开关”和“高温阈值“可以进行置数和召测。如开关置数为“false”后,测点值将不在变化。
8. 订阅子设备上报数据
除了在云端读取子设备数据外,也可通过baetyl-broker读取数据。边缘驱动会将子设备数据实时的推送到baetyl-broker的thing/modbus-simulator/modbus-test/property/post
{
"kind":"deviceReport",
"meta":{
"accessTemplate":"modbus-access-template",
"device":"modbus-test",
"deviceProduct":"modbus-simulator",
"node":"modbus-gpu",
"nodeProduct":"BIE-Product"
},
"content":{
"blink":{
"reqId":"60b60c6e-b12a-4de7-8203-2564c26d79de",
"method":"thing.property.post",
"version":"1.0",
"timestamp":1682393541377,
"properties":{
"high-temperature-alarm":false,
"high-temperature-threshold":324,
"humidity":54.944695,
"switch":true,
"temperature":306.08313
}
}
}
}
边缘函数计算
本章节实现边缘数据计算,确保当温度高于高温阈值时,触发报警。
1. 增加系统应用
函数计算和消息流转需要用到baetyl-function和baetyl-rule两个系统应用。在节点详情页,进入应用部署页,添加系统应用,添加后应用会自动部署到边缘节点上。
2. 编写函数
创建一个函数配置项,比较温度与高温报警阈值,当温度高于阈值时,返回true。
python代码如下,其中event达到broker指定topic的子设备数据:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def handler(event, context):
properties = event['content']['blink']['properties']
temperature = properties['temperature']
switch = properties['switch']
vpoint1 = 1
if temperature == 100:
vpoint1 = 2
elif temperature < 100:
vpoint1 = 3
vpoint2 = 0
if switch:
vpoint2 = 1
event['content']['blink']['properties'] = {
"high-temperature-threshold": vpoint1,
"high-temperature-alarm": vpoint2
}
return event
3. 部署函数应用
创建一个新的函数应用,创建卷时选择第一步的函数配置项并挂载到容器。运行时选择python,函数名称之后在配置规则转发时会用到,函数入口填写<配置项文件名.函数名>,此处为index.handler。
创建好函数应用后将其部署到节点上。
4. 配置消息流转
通过配置baetyl-rule实现消息流转,该应用可订阅 baetyl-broker 的消息主题,发送到自身的其他消息主题,同时支持函数处理。 点击rule应用,修改rule-conf的配置项,修改conf文件内容如下。其中target可以定义为云端的任意broker,此处设置为端上的baetyl-broker
rules:
- name: modbus
source:
topic: thing/modbus-simulator/modbus-test/property/post
qos: 0
target:
topic: thing/modbus-simulator/modbus-test/property/post/calc
qos: 0
function:
name: modbus-demo
logger:
level: debug
encoding: console
验证
订阅baetyl-broker的消息,左侧为子设备上报到云端的数据测点值,右侧为测点值为原始消息及通过本地函数处理后上报的告警信息。