VOLTTRON Actuator agent报自冲突故障但功能正常问题咨询
VOLTTRON 8.1.3 Actuator 自冲突报错排查
问题背景
- 运行环境:VOLTTRON 8.1.3
- 业务逻辑:每分钟通过actuator agent的
get_multiple_points方法批量读取30台BACnet传感器数据,无其他并发业务 - 读请求调用代码:
zone_setpoints_data = self.vip.rpc.call('platform.actuator', 'get_multiple_points', actuator_get_this_data).get(timeout=300)
- 调度申请代码:
# create start and end timestamps for actuator agent scheduling _now = get_aware_utc_now() str_start = format_timestamp(_now) _end = _now + td(seconds=10) str_end = format_timestamp(_end) actuator_schedule_request = [] for group in self.nested_group_map.values(): for device_address in group.values(): device = '/'.join([self.building_topic, str(device_address)]) actuator_schedule_request.append([device, str_start, str_end]) # use actuator agent to get all zone temperature setpoint data result = self.vip.rpc.call('platform.actuator', 'request_new_schedule', self.core.identity, 'my_schedule', 'HIGH', actuator_schedule_request).get(timeout=90)
- 异常现象:运行日志打印
REQUEST_CONFLICTS_WITH_SELF失败信息,但接口可正常返回全量数据,业务功能无异常
2022-06-09 19:55:21,927 (loadshedagent-0.1 2930461) __main__ DEBUG: [Simple DR Agent INFO] - ACTUATOR SCHEDULE EVENT SUCESS {'result': 'FAILURE', 'data': {}, 'info': 'REQUEST_CONFLICTS_WITH_SELF'}
风险判定
该报错无潜在业务风险,不会导致数据读取错误、设备操作异常。
触发原因是每分钟发起调度申请时,上一轮申请的10秒有效期调度窗口尚未完全过期,同一Agent身份、同一任务名my_schedule对同批设备重复提交时间窗申请时,actuator会判定请求与自身未失效的历史调度冲突,返回该错误。
读请求不受影响的核心原因是:actuator处理get_multiple_points读操作时,只要调用方在请求发起时对目标设备持有有效调度权限,就会正常执行读逻辑,新调度申请的冲突结果不会阻断已有权限下的合法操作。
调整方案
现有逻辑不需要做设备级错峰调用,td(seconds=10)的时间窗长度完全可以覆盖30个BACnet点位的读取耗时,无需调整时长,只需要解决调度重名冲突即可,推荐方案如下:
每次发起新的调度申请前,先取消上一轮同名的历史调度,再提交新申请,从根源避免自冲突,参考代码:
# 提前清理上一轮同名调度,忽略调度已过期导致的取消失败 try: self.vip.rpc.call( 'platform.actuator', 'cancel_schedule', self.core.identity, 'my_schedule' ).get(timeout=10) except Exception: pass # 原有时间窗生成、调度申请逻辑保持不变即可 _now = get_aware_utc_now() str_start = format_timestamp(_now) _end = _now + td(seconds=10) str_end = format_timestamp(_end) actuator_schedule_request = [] for group in self.nested_group_map.values(): for device_address in group.values(): device = '/'.join([self.building_topic, str(device_address)]) actuator_schedule_request.append([device, str_start, str_end]) result = self.vip.rpc.call( 'platform.actuator', 'request_new_schedule', self.core.identity, 'my_schedule', 'HIGH', actuator_schedule_request ).get(timeout=90)
不需要拆分单设备错峰请求:actuator内部自带BACnet请求队列管控,批量提交30个点位的读请求不会造成BACnet网络拥塞、设备无响应问题,批量提交的执行效率远高于单设备错峰调用。
内容的提问来源于stack exchange,提问作者bbartling
相关产品推荐
相关产品推荐

