You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 20:12:00