VOLTTRON 执行器代理 RPC 恢复不起作用

时间:2021-06-07 15:02:02

标签: volttron

我有一个用于 HVAC 控制的 BACnet 系统,我正在使用 VOLTTRON 执行器代理将 BACnet 中的 @ 优先级 10 写入值 2,这很好用。

result = self.vip.rpc.call('platform.actuator', 'set_multiple_points', self.core.identity, set_multi_topic_values_master).get(timeout=20)
_log.debug(f'*** [Setter Agent INFO] *** -  set_multiple_points ON ALL VAVs WRITE SUCCESS!')

然后系统会休眠一段时间以进行测试:

_log.debug(f'*** [Setter Agent INFO] *** -  SETTING UP GEVENT SLEEP!')
gevent.sleep(120)
_log.debug(f'*** [Setter Agent INFO] *** -  GEVENT SLEEP DONE!')

在 gevent sleep 之后,我遇到了一些关于恢复点不起作用的问题。下面的代码执行得很好,但使用 BACnet 扫描工具,HVAC 控件上仍然存在优先级 10 值 2,就像还原点没有做任何事情一样。

for device in revert_topic_devices_jci:
    response = self.vip.rpc.call('platform.actuator', 'revert_point', self.core.identity, topic_jci, self.jci_setpoint_topic).get(timeout=20)
    _log.debug(f'*** [Setter Agent INFO] *** -  REVERT POINTS ON {device} SUCCESS!')

_log.debug(f'*** [Setter Agent INFO] *** -  REVERT POINTS JCI DONE DEAL SUCCESS!')

我注意到的一件事是楼宇自动化将占用/空置写入 HVAC 控件 @ BACnet 优先级 12。它总是 1 表示占用或 2 表示空置。

我试图用 VOLTTRON 做的是在 BACnet 中以优先级 10 写入值 2,然后在还原时释放为空。是否可以通过恢复来做任何事情,因为也没有什么可恢复的?我希望 VOLTTRON 可以写@ BACnet 优先级 10 然后才发布。在 BACnet 扫描工具上,我可以做同样的事情 write @ priority 10 然后释放优先级 10 和优先级 10 write null

我是否应该像楼宇自动化系统一样将优先级设为 12,这样无论楼宇自动化正在做什么,VOLTTRON 都可以恢复?

2 个答案:

答案 0 :(得分:0)

我有一些观察:

  1. 在您的还原循环中,即上面的第三个代码块中,您实际上并不是 更改传递给 RPC 调用的主题。每次调用都会使用 不在该代码块中的设备主题(但我们可以 块内未更改查看)和设备主题,其中 同样没有在块中定义,但至少似乎不是 正在改变。可能值得设置一些断点和/或 此处的调试语句以确保您传递了正确的 要恢复的主题。
  2. 您对优先级的使用似乎是一致的 使用 BACnet 协议规范,以及使用 VOLTTRON BACnet 驱动程序实现。我们不建议您尝试 以与现有楼宇自动化相同的优先级写入
  3. BACnet 驱动程序代码将在“writeProperty”中发送一个 NULL(无)值 当“revert_point”函数被调用时的服务请求 平台驱动程序。这个功能我坦率地说不是很糟糕 熟悉,但鉴于您的扫描工具执行预期 传递 NULL 值时恢复功能,我怀疑这是预期的 在 BACnet 协议中执行“恢复到以前的值”类型功能的方法。 我没有理由相信你正在经历的行为是 驱动程序代码库中的错误导致。

总的来说,我建议调试在“revert_point”RPC 调用中传递的主题。

答案 1 :(得分:0)

我很幸运能够使用 set_multiple_points 将点恢复为 None

像这样:

        self.jci_device_map = {
        'VMA-2-6': '27',
        'VMA-2-4': '29',
        'VMA-2-7': '30',
        'VMA-1-8': '6',
}

revert_multi_topic_values_master = []
set_multi_topic_values_master = []

        for device in self.jci_device_map.values():
            topic_jci = '/'.join([self.building_topic, device])
            final_topic_jci = '/'.join([topic_jci, self.jci_setpoint_topic])

            # BACnet enum point for VAV occ
            # 1 == occ, 2 == unnoc
            
            # create a (topic, value) tuple and add it to our topic values
            set_multi_topic_values_master.append((final_topic_jci, self.unnoccupied_value)) # TO SET UNNOCUPIED
            revert_multi_topic_values_master.append((final_topic_jci, None)) # TO SET FOR REVERT

result = self.vip.rpc.call('platform.actuator', 'set_multiple_points', self.core.identity, revert_multi_topic_values_master).get(timeout=20)
相关问题