修改VOLTTRON restful驱动后出现Heartbeat点未配置错误咨询
问题描述
- 边缘设备运行日志中抛出Heartbeat相关报错,初步怀疑报错和自己对platform.driver代理下restful驱动的定制修改有关。
- 修改驱动的背景:业务侧REST API需要单次请求拉取解析大量数据,原生restful驱动仅会基于BASE URL发起请求,在URL后追加
point参数拉取单个点位数据,无法满足业务需求因此做了定制改造。 - 核心疑问:日志中的Heartbeat报错是否由restful驱动的修改导致?
错误日志
2022-06-01 17:10:44,992 (platform_driveragent-4.0 2731042) volttron.platform.vip.agent.subsystems.rpc ERROR: unhandled exception in JSON-RPC method 'heart_beat': Traceback (most recent call last): File "/home/geb/.volttron/agents/db5dc5bf-e75f-4ef3-a672-235f23c3f124/platform_driveragent-4.0/platform_driver/interfaces/__init__.py", line 296, in get_register_by_name return self.point_map[name] KeyError: 'Heartbeat' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/geb/volttron/volttron/platform/vip/agent/subsystems/rpc.py", line 181, in method return method(*args, **kwargs) File "/home/geb/.volttron/agents/db5dc5bf-e75f-4ef3-a672-235f23c3f124/platform_driveragent-4.0/platform_driver/agent.py", line 504, in heart_beat device.heart_beat() File "/home/geb/.volttron/agents/db5dc5bf-e75f-4ef3-a672-235f23c3f124/platform_driveragent-4.0/platform_driver/driver.py", line 327, in heart_beat self.set_point(self.heart_beat_point, self.heart_beat_value) File "/home/geb/.volttron/agents/db5dc5bf-e75f-4ef3-a672-235f23c3f124/platform_driveragent-4.0/platform_driver/driver.py", line 344, in set_point return self.interface.set_point(point_name, value, **kwargs) File "/home/geb/.volttron/agents/db5dc5bf-e75f-4ef3-a672-235f23c3f124/platform_driveragent-4.0/platform_driver/interfaces/__init__.py", line 599, in set_point result = self._set_point(point_name, value) File "/home/geb/.volttron/agents/db5dc5bf-e75f-4ef3-a672-235f23c3f124/platform_driveragent-4.0/platform_driver/interfaces/restful.py", line 78, in _set_point register = self.get_register_by_name(point_name) File "/home/geb/.volttron/agents/db5dc5bf-e75f-4ef3-a672-235f23c3f124/platform_driveragent-4.0/platform_driver/interfaces/__init__.py", line 298, in get_register_by_name raise DriverInterfaceError("Point not configured on device: "+name) platform_driver.interfaces.DriverInterfaceError: Point not configured on device: Heartbeat
解答
该报错大概率和你做的批量数据拉取改造无关,本质是点位配置缺失问题,只有特定场景下才会和你的代码修改有关。
从错误栈可以直接梳理出完整触发链路:
- PlatformDriverAgent定时执行内置的心跳RPC方法
- 心跳逻辑尝试调用
set_point向设备写入预设的心跳点值,当前配置里要写入的点名为Heartbeat - 请求走到restful驱动的
_set_point方法时,会先从驱动维护的点位映射表point_map里查找对应点位的寄存器配置,查找失败抛出Point not configured on device: Heartbeat错误。
触发该错误的原因只有两类:
- 纯配置问题(90%以上概率):你在设备配置中开启了心跳功能,指定了
heart_beat_point=Heartbeat,但没有在restful驱动的点位配置列表中添加名为Heartbeat的点位定义,驱动初始化时没有把这个点注册到point_map里,自然查找失败。如果你的改造只涉及GET请求批量拉取数据的逻辑,完全没碰点位注册加载、_set_point相关代码,就属于这类情况。 - 和你的修改有关的场景:如果你改造驱动时重写了点位加载、点位注册的逻辑,代码存在bug把配置里的Heartbeat点位意外过滤掉,没有注册到
point_map,才会是修改导致的问题。
对应修复方式:
- 不需要心跳功能的话,直接删除设备配置中所有
heart_beat_point、heart_beat_value相关配置项,驱动会跳过心跳写点逻辑,报错直接消失,不影响其他业务功能。 - 需要启用心跳功能的话,先检查点位配置,把名为
Heartbeat的可写点位正确添加到restful驱动的点位列表中,保证驱动初始化时能正常注册该点位。 - 如果排查后确认点位配置已经正确添加,就去核对你改造后的点位加载逻辑,检查是否存在过滤规则误删Heartbeat点位的问题。
内容的提问来源于stack exchange,提问作者bbartling
相关产品推荐
相关产品推荐

