Node-RED是一个基于流的开发工具,用于连接物联网设备、API和在线服务。通过Node-RED,可以轻松接入BACnet协议设备,实现数据的读取、控制和监控。BACnet(Building Automation and Control Networks)是一种为建筑自动化和控制系统设计的通信协议。利用Node-RED的BACnet节点,开发者可以构建可视化的流程图,以实现对BACnet设备的高效管理和操作。本文演示采用AIoTedge物联网边缘计算平台集成的NodeRED软网关进行演示,所有演示节点和内容,都可以导入到你的NodeRED环境中。

01. 模拟器准备

02. BACnet Read节点介绍

【type】——BACnet寄存器类型
下列为:常用寄存器类型:
寄存器类型 | 行业简写 | 组件中数字替换 |
ANALOG_INPUT | AI | 用【数字0】代表 |
ANALOG_OUTPUT | AO | 用【数字1】代表 |
ANALOG_VALUE | AV | 用【数字2】代表 |
BINARY_INPUT | BI | 用【数字3】代表 |
BINARY_OUTPUT | BO | 用【数字4】代表 |
BINARY_VALUE | BV | 用【数字5】代表 |
MULTI_STATE_INPUT | MSI | 用【数字13】代表 |
MULTI_STATE_OUTPUT | MSO | 用【数字14】代表 |
MULTI_STATE_VALUE | MSV | 用【数字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设备

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

03. BACnet Write节点介绍

【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
数字代表 | 优先权等级名称 |
1 | manual-life-safety |
2 | automatic-life-safety |
3 | available-3 |
4 | available-4 |
5 | cnitical-equipment-control |
6 | minimum-on/off |
7 | available-7 |
8 | manual-operator |
9 | available-9 |
10 | available-10 |
11 | available-11 |
12 | available-12 |
13 | available-13 |
14 | external-value |
15 | algorithm-value |
16 | available-16 |
04. 读写效果与节点代码分享
示例1:第一次读取效果

示例2:修改写入参数,并执行

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

示例3:第二次读取效果

示例代码:
[{"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"}]