我正在尝试开发一个查询platform.historian的代理,但在使用RPC查询方法时收到此错误消息:AttributeError:' NoneType'对象没有属性' 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'
答案 0 :(得分: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)