Homeassistant-SSH集成中JSON输出格式问题解析
问题背景
在使用Home Assistant的SSH集成执行远程命令时,开发者可能会遇到JSON输出格式不正确的问题。具体表现为从远程服务器返回的响应数据格式不符合标准JSON规范,导致后续处理出现困难。
问题现象分析
当通过SSH集成执行远程脚本时,返回的响应数据格式如下:
{'results': [{'device_id': '5ed148cba9197da009f9966b31d06d31', 'device_name': 'RT-AC3200', 'success': True, 'command': '/jffs/scripts/update-trustedwanips.sh', 'stdout': ['Name: trustedwanips', 'Type: hash:net', 'Revision: 6', 'Header: family inet hashsize 32768 maxelem 65536', 'Size in memory: 372', 'References: 4', 'Number of entries: 1', 'Members:', '182.173.67.29'], 'stderr': ['update-trustedwanips.sh: Getting latest list from Home Assistant', 'update-trustedwanips.sh: Checking the difference between the two', 'update-trustedwanips.sh: Difference found!', 'update-trustedwanips.sh: Flushing the trustedwanips ipset!', 'update-trustedwanips.sh: Added IP 182.173.67.29', 'update-trustedwanips.sh: Saving trustedwanips ipset file!'], 'code': 0}]}
这段输出存在几个格式问题:
- 使用了单引号而非JSON标准的双引号
- 布尔值True未转换为小写的true
- 整体结构不符合严格的JSON规范
技术原理
Home Assistant的SSH集成实际上已经正确处理了远程命令的返回结果,将其转换为Python字典对象。在自动化中直接使用response_variable获取的变量实际上是Python对象,而非JSON字符串。问题出现在尝试将该对象直接显示为通知时,系统自动调用了对象的字符串表示方法,产生了非标准JSON的输出。
解决方案
方案一:正确访问响应对象属性
在自动化中,可以直接访问响应对象的属性,而不需要处理JSON字符串:
- service: persistent_notification.create
data:
message: "{{ output.results[0].stdout }}"
这种方式直接访问了响应对象中的stdout数组,避免了JSON格式问题。
方案二:使用to_json过滤器
如果需要将响应转换为标准JSON格式,可以使用to_json过滤器:
- service: persistent_notification.create
data:
message: "{{ output | to_json }}"
方案三:处理特定字段
对于只需要特定字段的情况,可以组合使用模板:
- service: persistent_notification.create
data:
message: >
{% set result = output.results[0] %}
命令: {{ result.command }}
状态: {{ '成功' if result.code == 0 else '失败' }}
输出: {{ result.stdout | join('\n') }}
最佳实践建议
- 避免直接输出整个响应对象:只提取需要的字段,提高可读性
- 使用模板条件判断:根据返回代码(code)判断命令执行是否成功
- 合理处理多行输出:对于stdout/stderr数组,使用join过滤器合并为字符串
- 错误处理:考虑添加错误处理逻辑,应对命令执行失败的情况
总结
Homeassistant-SSH集成的响应处理实际上比表面看起来更加灵活和强大。理解响应数据的实际结构(Python对象而非JSON字符串)是解决问题的关键。通过直接访问对象属性或使用适当的模板过滤器,可以轻松提取和处理远程命令的执行结果,实现复杂的自动化逻辑。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



