实现内容:基于BAC0库实现对一台虚拟bacnet设备的扫描、点位读取和点位数据写入。
python3.9
pip下载BAC0库
# 扫描设备
myIPAddr = '192.168.90.81/24'
bacnet = BAC0.lite(ip=myIPAddr)
devices = bacnet.whois()
print(devices) # 打印出所有bacnet设备的MAC地址/IP地址和端口号
# 遍历搜索结果,获取每个设备的IP地址
# for device in devices:
# ip_address = device[0].split('/')[0]
# print(ip_address)
# 读取数据:地址/数据类型/寄存器地址/要读的数据内容(转换为小驼峰)
ip_addr = (devices[0])[0]
data_name = bacnet.read(f'{ip_addr} analogInput 25 objectName')
data_value = bacnet.read(f'{ip_addr} analogInput 25 presentValue')
data_name1 = bacnet.read(f'{ip_addr} binaryInput 2 objectName')
data_value1 = bacnet.read(f'{ip_addr} binaryInput 2 presentValue')
print(data_name, data_value)
print(data_name1, data_value1)
# 写入数据
bacnet.write(f'{ip_addr} analogInput 25 presentValue 45.0 - 1')
bacnet.write(f'{ip_addr} binaryInput 4 presentValue active - 1')
注意:
1)对于数字量的写入,似乎只能通过active和inactive实现,尝试替换为1/0或者True/False都会报错;
2)代码中规定属性的名称按照小驼峰式命名规则(例:present-value属性,在代码中应写为presentValue)
3)lite参数中的IP表示运行代码的本机IP,并非是BACnet设备或BACnet服务器的IP。
此外,BAC0库似乎有很多未知的bug,使用起来一言难尽