VOLTTRON代理如何在消息总线监听其他代理发布的信号载荷数据
是的,你需要为setteroccvavagent新增发布逻辑、指定自定义的发布主题,同时为监听代理新增对应主题的订阅和消息处理逻辑,具体实现如下:
1. 修改setteroccvavagent新增消息发布逻辑
在你现有的dr_signal_checker方法末尾,拿到sig_payload之后调用VOLTTRON内置的pubsub接口,把信号数据发布到指定主题即可,修改后的代码示例:
def dr_signal_checker(self): try: requests = (grequests.get(self.url),) result, = grequests.map(requests) contents = result.json() _log.debug(f"Flask App API contents: {contents}") _log.debug(f"Flask App API SUCCESS") sig_payload = contents["current_state"] except Exception as error: _log.debug(f"*** [SIG CHECKER Agent INFO] *** - Error trying Flask App API {error}") _log.debug(f"*** [SIG CHECKER Agent INFO] *** - RESORTING TO NO DEMAND RESPONSE EVENT") sig_payload = 0 _log.debug(f'*** [SIG CHECKER Agent INFO] *** - signal_payload from Flask App is {sig_payload}!') # 新增发布逻辑,主题可按业务规范自定义层级 self.vip.pubsub.publish( peer='pubsub', topic='dr/campus/building/current_signal', # 建议按区域/功能层级命名避免冲突 message={ "signal_payload": sig_payload, "timestamp": self.core.get_current_timestamp() # 可选添加时间戳方便后续校验 } )
2. 修改原有控制代理新增订阅与处理逻辑
分为两步调整:
- 把新增的DR信号主题加入订阅列表:如果你的代理是从配置文件读取订阅主题,直接在配置里新增
dr/campus/building/current_signal即可;如果是代码硬编码的主题列表,直接把该主题追加到传入_create_subscriptions的topics参数里。 - 修改
_handle_publish方法区分处理不同主题的消息,原BACnet温度处理逻辑保持不变,新增DR信号的判断分支,修改后的代码示例:
def _handle_publish(self, peer, sender, bus, topic, headers, message): # 优先处理DR信号主题 if topic == "dr/campus/building/current_signal": self.current_dr_signal = message.get("signal_payload", 0) _log.debug(f"*** [Handle Pub Sub INFO] *** 收到DR需求响应信号: {self.current_dr_signal}") return # 原有BACnet温度采集处理逻辑保持不变,补充了边界判断避免异常赋值 topic = topic.strip('/all') _log.debug(f"*** [Handle Pub Sub INFO] *** topic_formatted {topic}") sensor_reading = None for point,reading in message[0].items(): if point == 'ZN-T' or point == 'Space Temperature Local': _log.debug(f"*** [Handle Pub Sub INFO] *** Found a Zone Temp Published {point} that is {reading}") if point == 'Space Temperature Local': # Fix Trane controller data that comes through in Metric sensor_reading = (9/5) * reading + 32 else: sensor_reading = reading break # 找到目标点位就跳出循环减少遍历 if sensor_reading is not None: self.znt_values[topic] = float(sensor_reading) _log.debug(f"*** [Handle Pub Sub INFO] *** self.znt_values {self.znt_values}")
补充注意事项
- 两个代理配置的发布、订阅主题必须完全一致,避免出现订阅不到的问题
- 如果需要多区域部署,可以按照
dr/园区/建筑/信号类型的规则扩展主题命名 - 如果你的VOLTTRON集群开启了主题权限控制,需要在权限配置里给两个代理开放对应主题的发布、订阅权限
内容的提问来源于stack exchange,提问作者bbartling
相关产品推荐
相关产品推荐

