如何使用Python的BAC0库创建告警与事件服务?
BAC0库实现BACnet告警与事件服务实操指南
前置准备
首先确认你使用的是最新版本的BAC0库,旧版本存在事件服务解析异常的问题,升级命令:pip install -U BAC0
核心实现步骤
- 第一步:初始化BACnet应用时开启事件支持
import BAC0 # 替换为你本地网卡的IP和子网掩码,device_instance需保证在BACnet网络内唯一 bacnet_app = BAC0.connect(ip="192.168.1.10/24", device_instance=1001, event_support=True)
注:event_support参数为必填项,开启后底层才会监听处理事件类BACnet报文
- 第二步:配置监控对象的告警触发规则
以监控模拟输入(AI)对象的高限告警为例:
# 连接目标BACnet设备,替换为目标设备的IP和设备实例号 target_device = BAC0.device("192.168.1.20", 2001, bacnet_app=bacnet_app) # 配置AI点的告警参数 target_device["AI_1"].high_limit = 75.0 # 高限告警触发阈值 target_device["AI_1"].notification_class = 1 # 关联通知类对象,决定告警接收端 target_device["AI_1"].time_delay = 3 # 异常持续3秒才触发告警,避免误报 target_device["AI_1"].deadband = 1.5 # 告警恢复死区,数值低于73.5才会触发告警清除
- 第三步:绑定事件回调函数处理告警
def alarm_handle(event_data): # event_data包含告警类型、触发对象、当前值、触发时间、优先级等信息 if event_data["event_state"] == "offnormal": print(f"告警触发:[{event_data['event_time']}] 对象{event_data['object_name']} 类型{event_data['event_type']} 当前值{event_data['present_value']}") elif event_data["event_state"] == "normal": print(f"告警恢复:[{event_data['event_time']}] 对象{event_data['object_name']} 当前值{event_data['present_value']}") # 注册回调到BACnet应用 bacnet_app.on_event = alarm_handle
注意事项
- 通知类(Notification Class)对象需提前配置,其中定义了告警接收地址、优先级、是否需要确认等规则,未配置的情况下告警报文不会正常上报。
- 若要接收第三方BACnet设备的主动告警,需提前将你本地BACnet设备的实例号添加到第三方设备的告警接收列表中,部分工业设备需要在其自带的组态工具中手动配置。
- 除高低限告警外,还支持变化通知、状态告警、浮点溢出告警等事件类型,只需在对应监控对象的属性中配置对应触发条件即可。
内容的提问来源于stack exchange,提问作者Ashish kashyap
相关产品推荐
相关产品推荐

