0

我正在尝试开发一个查询 platform.historian 的代理,但在使用 RPC 查询方法时收到此错误消息:AttributeError: 'NoneType' object has no attribute 'call'

class TCMAgent(Agent):
    def __init__(self, config_path, **kwargs):
        super(TCMAgent, self).__init__(**kwargs)
        self.config = utils.load_config(config_path)
        self.site = self.config.get('campus')
        self.building = self.config.get('building')
        self.unit = self.config.get('unit')
        self.subdevices = self.config.get('subdevices')
        self.subdevice = self.subdevices[0]
    ...
    ...


def test_api():
    '''To test Volttron APIs'''
    import os

    topic_tmpl = "{campus}/{building}/{unit}/{subdevice}/{point}"
    tcm = TCMAgent(os.environ.get('AGENT_CONFIG'))

    topic1 = topic_tmpl.format(campus='PNNL',
                               building='SEB',
                               unit='AHU1',
                               subdevice='VAV123A',
                               point='MaximumZoneAirFlow')
    result = tcm.vip.rpc.call('platform.historian',
                              'query',
                              topic=topic1,
                              count=20,
                              order="LAST_TO_FIRST").get(timeout=100)
    assert result is not None

if __name__ == '__main__':
    # Entry point for script
    #sys.exit(main())
    test_api()

更新下面的错误跟踪:

2016-07-19 14:58:31,362 volttron.platform.vip.agent.core DEBUG: publickey is None
2016-07-19 14:58:31,362 volttron.platform.vip.agent.core DEBUG: secretkey is None
Traceback (most recent call last):
  File "/home/hngo/volttron/examples/TCMAgent/tcm/agent.py", line 236, in <module>
    test_api()
  File "/home/hngo/volttron/examples/TCMAgent/tcm/agent.py", line 230, in test_api
    order="LAST_TO_FIRST").get(timeout=100)
  File "/home/hngo/volttron/volttron/platform/vip/agent/subsystems/rpc.py", line 303, in call
    request, result = self._dispatcher.call(method, args, kwargs)
AttributeError: 'NoneType' object has no attribute 'call'
4

1 回答 1

1

您的代理没有连接到平台,也没有“启动”。这就是你在这里处理的问题。我也看不到您如何指定您的 vip 地址以连接到正在运行的平台。

您需要先运行您的代理,然后才能允许它进行 rpc 调用。类似于以下内容,以https://github.com/VOLTTRON/volttron/blob/develop/examples/SimpleForwarder/simpleforwarder/simpleforwarder.py#L118为例进行修改。

destination_vip="tcp://127.0.0.1:22916?serverkey=blah&publickey=wah&privatekey=nah

agent = TMCAgent(config_path=cfg_path, identity=tester, address=destination_vip)

event = gevent.event.Event()

# agent.core.run set the event flag to true when agent is running
gevent.spawn(agent.core.run, event)

# Wait until the agent is fully initialized and ready to 
# send and receive messages.
event.wait(timeout=3)
于 2016-07-19T22:04:16.640 回答