如何通过Orion订阅将CrateDB计算结果更新至实体属性?
实现属性变化驱动的自动更新方案
可以通过事件驱动的订阅+中间服务替代手动脚本,实现当State属性变化后自动更新Output属性的需求。以下是具体可行的实现方式:
方式1:基于Orion订阅触发中间服务
通过新增Orion订阅,在State属性变化时通知自定义中间服务,由中间服务完成从CrateDB获取计算结果、更新Orion实体Output属性的流程。
步骤1:创建新的Orion订阅
新增订阅,指定当State变化时通知你的中间服务:
curl -X POST 'http://orion:1026/v2/subscriptions/' \ -H 'Content-Type: application/json' \ -d '{ "description": "Orion notify middleware on State changes", "subject": { "entities": [ { "idPattern": ".*", "type": "SomeType" } ], "condition": { "attrs": ["State"] } }, "notification": { "http": { "url": "http://your-middleware:3000/update-output" }, "attrs": ["State", "id"], "metadata": [] } }'
注意:订阅中的
type要和实体定义的SomeType保持大小写一致(你现有订阅里写的Sometype是小写t,需要修正)。
步骤2:实现中间服务逻辑
中间服务收到Orion的通知后,执行以下操作:
- 从通知 payload 中提取实体ID(比如
Asset:001)和当前State值 - 连接CrateDB,查询该实体对应的计算结果
- 调用Orion的属性更新接口,将计算结果写入
Output属性:
curl -X PATCH 'http://orion:1026/v2/entities/{entityId}/attrs' \ -H 'Content-Type: application/json' \ -d '{ "Output": { "type": "Float", "value": 123.45 # 替换为CrateDB查询到的实际计算结果 } }'
方式2:基于CrateDB触发器触发更新
如果计算逻辑是在CrateDB中自动完成的(比如通过存储过程),可以直接配置CrateDB触发器,当计算结果写入表时触发HTTP请求,调用中间服务更新Orion实体:
- 在CrateDB中创建触发器,监听目标计算结果表的插入/更新事件
- 触发器触发时,调用你的中间服务接口,传递实体ID和计算结果
- 中间服务收到请求后,直接调用Orion的更新接口完成
Output属性的更新
关键说明
- Orion本身不支持直接通过订阅实现属性间的自动更新,必须依赖外部服务调用Orion的API完成属性修改
- 两种方案均为事件驱动,相比手动脚本的定时执行,更实时且高效
内容的提问来源于stack exchange,提问作者drypatrick
相关产品推荐
相关产品推荐

