Node-RED软网关使用手册-最佳实践(BACnet接入示例)

一、准备工作:

1、安装BACnet模拟器【Yabe】

📎SetupYabe_v1.1.9.zip

2、启动模拟器【Room Control Simulator】

Node-RED软网关使用手册-最佳实践(BACnet接入示例)
Node-RED软网关使用手册-最佳实践(BACnet接入示例)

二、在AIoTedge中BACnet读写【固定值实现】

1、读写AnalogValue【模拟值】示例【单个参数】

PS:导入示例代码

示例代码:

[{"id":"863b5c82.8792c","type":"debug","z":"b387cb.56722838","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":730,"y":320,"wires":[]},{"id":"34f61fc019d1a72e","type":"BACnet-Write","z":"b387cb.56722838","name":"写AV-1","objectType":"2","instance":"ef226397.1987f","valueTag":"4","valueValue":"25.59","propertyId":"85","priority":"16","device":"7adbdd83.bce224","server":"e0bf099a.ee8468","multipleWrite":false,"x":490,"y":340,"wires":[["863b5c82.8792c"]]},{"id":"c7ec07f506bade9d","type":"inject","z":"b387cb.56722838","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":270,"y":340,"wires":[["34f61fc019d1a72e"]]},{"id":"78bc17d80fea8272","type":"inject","z":"b387cb.56722838","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":270,"y":280,"wires":[["289cff1e8c6a2b04"]]},{"id":"289cff1e8c6a2b04","type":"BACnet-Read","z":"b387cb.56722838","name":"读 AV-1","objectType":"2","instance":"ef226397.1987f","propertyId":"85","device":"7adbdd83.bce224","server":"e0bf099a.ee8468","multipleRead":false,"x":500,"y":280,"wires":[["863b5c82.8792c"]]},{"id":"45f1cc2759460290","type":"comment","z":"b387cb.56722838","name":"单个读写AV","info":"","x":290,"y":220,"wires":[]},{"id":"ef226397.1987f","type":"BACnet-Instance","name":"Temperature Water-1","instanceAddress":"1"},{"id":"7adbdd83.bce224","type":"BACnet-Device","name":"Windows VM","deviceAddress":"192.168.1.5"},{"id":"e0bf099a.ee8468","type":"BACnet-Client","name":"Client-47","adpuTimeout":"3000","port":"47808","interface":"192.168.1.47","broadcastAddress":"192.168.1.255"}]

2、详细介绍读写节点

2-1、BACnet-Read节点介绍

Node-RED软网关使用手册-最佳实践(BACnet接入示例)

type】——BACnet寄存器类型

下列为:常用寄存器类型:

寄存器类型行业简写组件中数字替换
ANALOG_INPUTAI用【数字0】代表
ANALOG_OUTPUTAO用【数字1】代表
ANALOG_VALUEAV用【数字2】代表
BINARY_INPUTBI用【数字3】代表
BINARY_OUTPUTBO用【数字4】代表
BINARY_VALUEBV用【数字5】代表
MULTI_STATE_INPUTMSI用【数字13】代表
MULTI_STATE_OUTPUTMSO用【数字14】代表
MULTI_STATE_VALUEMSV用【数字19】代表

【Instance】——BACnet寄存器地址

【Property Id】——BAC指定对象的属性ID

常用ID: 用数字【85】代表【PRESENT_VALUE

【其他对象的属性ID】:

数字代表BAC指定对象的属性ID【含义】
0【ACKED_TRANSITIONS】
1【ACK_REQUIRED】
2【ACTION】
3【ACTION_TEXT】
4【ACTIVE_TEXT】
5【ACTIVE_VT_SESSIONS】
6【ALARM_VALUE】
7【ALARM_VALUES】
8【ALL】
9【ALL_WRITES_SUCCESSFUL】
10【APU_SEGMENT_TIMEOUT】
…………
85【PRESENT_VALUE】

【Device】——代表访问的BACnet设备

Node-RED软网关使用手册-最佳实践(BACnet接入示例)

【Client】——客户端,即自己

Node-RED软网关使用手册-最佳实践(BACnet接入示例)

2-2、BACnet-Write节点介绍

Node-RED软网关使用手册-最佳实践(BACnet接入示例)

type】——BACnet寄存器类型【同上】

【Instance】——BACnet寄存器地址【同上】

【App-Tag】写入数据类型

数字代表写入数据类型
0代表NULL
1代表BOOLEAN
2代表UNSIGNED_INTEGER
3代表SIGNED_INTEGER
4代表REAL
5代表DOUBLE
6代表OCTET_STRING
7代表CHARACTER_STRING
8代表BIT_STRING
9代表ENUMERATED
10代表DATE
11代表TIME

【Value】写入数据值

【Property Id】——BAC指定对象的属性ID【同上】

【Priority】优先权等级,常用16

数字代表优先权等级名称
1manual-life-safety
2automatic-life-safety
3available-3
4available-4
5cnitical-equipment-control
6minimum-on/off
7available-7
8manual-operator
9available-9
10available-10
11available-11
12available-12
13available-13
14external-value
15algorithm-value
16available-16

3、读写效果图

3-1、第一次读取效果

Node-RED软网关使用手册-最佳实践(BACnet接入示例)

3-2、修改写入参数,并执行

Node-RED软网关使用手册-最佳实践(BACnet接入示例)

执行写入

注意:修改节点的写入值,需要单击【部署】按钮,方可生效。

Node-RED软网关使用手册-最佳实践(BACnet接入示例)

3-3、第二次读取效果

Node-RED软网关使用手册-最佳实践(BACnet接入示例)

三、BACnet读写单个【动态数据实现】

效果图如下:

Node-RED软网关使用手册-最佳实践(BACnet接入示例)
Node-RED软网关使用手册-最佳实践(BACnet接入示例)

示例代码如下:

[{"id":"e796f1095da2016c","type":"group","z":"c0df05c4edaff7ac","style":{"stroke":"#bbbbbb","stroke-opacity":"1","fill":"#f3f3f3","fill-opacity":"0.5","label":true,"label-position":"nw","color":"#555555"},"nodes":["351ab70ba4608e64","ec34d15c93f39eea","652ef61d49d7a2d5","55edefcac90f2a25","54f36b55694a1008","850808d0198ed7f4","c4fd8db46d51c3a5","5addca8f66dc9104","66507a1fa997813b","6adbd8cdaa7c5d33","ac589a606b3acf4f"],"x":14,"y":179,"w":872,"h":262},{"id":"351ab70ba4608e64","type":"inject","z":"c0df05c4edaff7ac","g":"e796f1095da2016c","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":110,"y":260,"wires":[["55edefcac90f2a25"]]},{"id":"ec34d15c93f39eea","type":"BACnet-Read","z":"c0df05c4edaff7ac","g":"e796f1095da2016c","name":"BACnet读 AV-1","objectType":"2","instance":"ef226397.1987f","propertyId":"85","device":"7adbdd83.bce224","server":"e0bf099a.ee8468","multipleRead":false,"x":460,"y":260,"wires":[["54f36b55694a1008"]]},{"id":"652ef61d49d7a2d5","type":"comment","z":"c0df05c4edaff7ac","g":"e796f1095da2016c","name":"通过传递配置数据,单个读写AnalogValue-1","info":"","x":210,"y":220,"wires":[]},{"id":"55edefcac90f2a25","type":"function","z":"c0df05c4edaff7ac","g":"e796f1095da2016c","name":"读取单个【AV-1】","func":"msg.payload = { requestArray: [] }\n\n//AV-1\nmsg.payload.requestArray = [\n    //AV--type=2\n    {\n        objectId: { type: 2, instance: 1 },//type代表寄存器类型,instance代表寄存器地址\n        properties: [{ id: 85 }]\n    }\n    \n]\n\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":270,"y":260,"wires":[["ec34d15c93f39eea"]]},{"id":"54f36b55694a1008","type":"function","z":"c0df05c4edaff7ac","g":"e796f1095da2016c","name":"处理数据","func":"var array = msg.payload.values;\nlet jsonObject = {};\n\n//1、判断是否有查询结果\nif(array.length>0){            \n    //定义name\n    let newKey = \"Setpoint1\";//填写您的标识符,如:shidu,wendu……\n    //定义value\n    let newValue = array[0].value;\n    if (newValue+\"\".indexOf(\".\") != -1){ \n        //为真,作用保留2位小数\n        newValue = newValue.toFixed(2);\n    }\n    jsonObject[newKey] = newValue;\n}\n\nmsg.payload = jsonObject;\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":620,"y":260,"wires":[["850808d0198ed7f4"]]},{"id":"850808d0198ed7f4","type":"debug","z":"c0df05c4edaff7ac","g":"e796f1095da2016c","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":770,"y":260,"wires":[]},{"id":"c4fd8db46d51c3a5","type":"inject","z":"c0df05c4edaff7ac","g":"e796f1095da2016c","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"11.11","payloadType":"num","x":110,"y":360,"wires":[["5addca8f66dc9104"]]},{"id":"5addca8f66dc9104","type":"function","z":"c0df05c4edaff7ac","g":"e796f1095da2016c","name":"函数处理","func":"//将上一个节点传递过来的payload值,push到节点的values中\nlet values = {type:4,value:msg.payload}\nmsg.payload = { propertyId:85,values:[]}\nmsg.payload.values.push(values)\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":280,"y":380,"wires":[["6adbd8cdaa7c5d33"]]},{"id":"66507a1fa997813b","type":"inject","z":"c0df05c4edaff7ac","g":"e796f1095da2016c","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"12.12","payloadType":"num","x":110,"y":400,"wires":[["5addca8f66dc9104"]]},{"id":"6adbd8cdaa7c5d33","type":"BACnet-Write","z":"c0df05c4edaff7ac","g":"e796f1095da2016c","name":"BACnet写 AV-1","objectType":"2","instance":"ef226397.1987f","valueTag":"4","valueValue":"","propertyId":"85","priority":"","device":"7adbdd83.bce224","server":"e0bf099a.ee8468","multipleWrite":false,"x":460,"y":380,"wires":[["ac589a606b3acf4f"]]},{"id":"ac589a606b3acf4f","type":"debug","z":"c0df05c4edaff7ac","g":"e796f1095da2016c","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":770,"y":380,"wires":[]},{"id":"ef226397.1987f","type":"BACnet-Instance","name":"SetPoint-1","instanceAddress":"1"},{"id":"7adbdd83.bce224","type":"BACnet-Device","name":"Windows VM","deviceAddress":"192.168.1.5"},{"id":"e0bf099a.ee8468","type":"BACnet-Client","name":"Client-47","adpuTimeout":"3000","port":"47808","interface":"192.168.1.47","broadcastAddress":"192.168.1.255"}]

四、BACnet读多个【通过数据传递实现】

效果图如下:

Node-RED软网关使用手册-最佳实践(BACnet接入示例)

代码如下:

[{"id":"6a698d10f0260490","type":"group","z":"f217c08a9f80deb4","style":{"stroke":"#bbbbbb","stroke-opacity":"1","fill":"#f3f3f3","fill-opacity":"0.5","label":true,"label-position":"nw","color":"#555555"},"nodes":["f9637ba082d051f0","ca7dcc1fbb0777cd","7639ecced9ebb4d5","3c07ea56c14a9820","2b387417cc39df87","06171f3e81fb9933"],"x":54,"y":239,"w":812,"h":142},{"id":"f9637ba082d051f0","type":"function","z":"f217c08a9f80deb4","g":"6a698d10f0260490","name":"读取多个","func":"msg.payload = { requestArray: [] }\n//AI-0\n//AI-1\n//AI-2\n//AV-0\n//AV-1\nmsg.payload.requestArray = [\n    //AI--type=0\n    {\n        objectId: { type: 0, instance: 0 },\n        properties: [{ id: 85 }]\n    },\n    {\n        objectId: { type: 0, instance: 1 },\n        properties: [{ id: 85 }]\n    },\n    {\n        objectId: { type: 0, instance: 2 },\n        properties: [{ id: 85 }]\n    },\n    //AV--type=2\n    {\n        objectId: { type: 2, instance: 0 },\n        properties: [{ id: 85 }]\n    },\n    {\n        objectId: { type: 2, instance: 1 },\n        properties: [{ id: 85 }]\n    },\n    {\n        objectId: { type: 2, instance: 2 },\n        properties: [{ id: 85 }]\n    }\n]\n\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":280,"y":340,"wires":[["7639ecced9ebb4d5"]]},{"id":"ca7dcc1fbb0777cd","type":"comment","z":"f217c08a9f80deb4","g":"6a698d10f0260490","name":"读取多个对象","info":"","x":150,"y":280,"wires":[]},{"id":"7639ecced9ebb4d5","type":"BACnet-Read","z":"f217c08a9f80deb4","g":"6a698d10f0260490","name":"","objectType":"8","instance":"ef226397.1987f","propertyId":"85","device":"7adbdd83.bce224","server":"e0bf099a.ee8468","multipleRead":true,"x":440,"y":340,"wires":[["06171f3e81fb9933"]]},{"id":"3c07ea56c14a9820","type":"debug","z":"f217c08a9f80deb4","g":"6a698d10f0260490","name":"debug 3","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":760,"y":340,"wires":[]},{"id":"2b387417cc39df87","type":"inject","z":"f217c08a9f80deb4","g":"6a698d10f0260490","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":150,"y":340,"wires":[["f9637ba082d051f0"]]},{"id":"06171f3e81fb9933","type":"function","z":"f217c08a9f80deb4","g":"6a698d10f0260490","name":"处理数据","func":"var array = msg.payload.values;\nlet jsonObject = {};\n\n// AI——type: 0\t    【0,1,2】\n// AV——type: 2\t    【0,1, 2】\n\n//定义查询对象\nvar selectDataArray = [\n{ type: 0, instance: 0, name: \"室内温度\" },\n{ type: 0, instance: 1, name: \"水箱温度\" },\n{ type: 0, instance: 2, name: \"室外温度\" },\n\n{ type: 2, instance: 0, name: \"设定值\" },\n{ type: 2, instance: 1, name: \"设定值1\" },\n{ type: 2, instance: 2, name: \"设定值2\" }];\n\n//1、遍历查询出来的结果\nfor(let i =0;i< array.length;i++){\n    var obj = array[i];\n\n    //2、遍历所需查询对象\n    for (let j = 0; j < selectDataArray.length; j++) {\n        var json = selectDataArray[j];\n        if (obj.objectId.type == json.type && obj.objectId.instance == json.instance) {\n            //定义key\n            let newKey = json.name;\n            //定义value\n            let newValue = obj.values[0].value[0].value;\n            if (newValue+\"\".indexOf(\".\") != -1){ \n                //为真\n                newValue = newValue.toFixed(2);\n            }\n            jsonObject[newKey] = newValue;\n        }\n    }    \n}\n\nmsg.payload = jsonObject;\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":600,"y":340,"wires":[["3c07ea56c14a9820"]]},{"id":"ef226397.1987f","type":"BACnet-Instance","name":"SetPoint-1","instanceAddress":"1"},{"id":"7adbdd83.bce224","type":"BACnet-Device","name":"Windows VM","deviceAddress":"192.168.1.5"},{"id":"e0bf099a.ee8468","type":"BACnet-Client","name":"Client-47","adpuTimeout":"3000","port":"47808","interface":"192.168.1.47","broadcastAddress":"192.168.1.255"}]