基于Forge的BIM与传感器集成求助:模拟传感器配置及数据关联
基于Forge的BIM与IoT集成完整实现方案
针对你使用aps-iot-extensions-demo项目遇到的问题,以下是分步解决指南:
一、搞定./services/iot.mocked.js的模拟传感器配置
1. 获取模型坐标系内的XYZ位置
- 启动项目后打开Viewer,加载目标模型
- 在浏览器控制台执行
NOP_VIEWER.getSelection(),先选中模型中你放置传感器的位置(比如Revit里创建的传感器构件),执行后会返回选中元素的信息 - 用
NOP_VIEWER.getSelection()[0].getBoundingBox().center()获取该元素的中心点坐标,将结果的x、y、z值替换到iot.mocked.js中对应传感器的position字段 - 如果需要自定义位置,也可以基于模型的全局坐标系微调数值
2. 关联房间的dbID
- 在Viewer中选中目标房间构件,在控制台执行
NOP_VIEWER.getSelection()[0].dbId,复制返回的数值 - 将该数值填入iot.mocked.js中对应传感器的
roomDbId字段 - 也可以通过Viewer的「属性」面板,找到房间元素的「dbID」属性值(需要开启高级属性显示)
二、对接真实InfluxDB与Revit定义的Sensor ID
1. 替换模拟数据源为InfluxDB
- 安装InfluxDB客户端依赖:
yarn add influx - 在
./services/目录下创建iot.influx.js,示例代码如下:
const Influx = require('influx'); const influx = new Influx.InfluxDB({ host: '你的InfluxDB地址', database: '目标数据库名', username: '用户名', password: '密码', schema: [ { measurement: 'sensor_data', fields: { value: Influx.FieldType.FLOAT }, tags: [ 'sensor_id' ] } ] }); async function getSensors() { // 查询InfluxDB中所有传感器的最新数据 const results = await influx.query(` SELECT last(value) as value, sensor_id FROM sensor_data GROUP BY sensor_id `); // 这里需要关联Forge模型中传感器的dbID和位置,可提前通过Model Derivative API获取 const mappedSensors = results.map(row => ({ id: row.sensor_id, name: `传感器 ${row.sensor_id}`, position: { x: 0, y: 0, z: 0 }, // 替换为从Forge模型获取的对应坐标 roomDbId: 0, // 替换为对应房间的dbID value: row.value, unit: '°C' // 根据实际传感器类型调整 })); return mappedSensors; } async function getSensorHistory(sensorId, startTime, endTime) { const results = await influx.query(` SELECT time, value FROM sensor_data WHERE sensor_id = '${sensorId}' AND time >= '${startTime}' AND time <= '${endTime}' `); return results.map(row => ({ timestamp: row.time.getTime(), value: row.value })); } module.exports = { getSensors, getSensorHistory };
- 修改
app.js中的服务引用,将const iotService = require('./services/iot.mocked');替换为const iotService = require('./services/iot.influx');
2. 关联Forge模型中的Sensor ID属性
- 通过Forge Model Derivative API的
GET /modelderivative/v2/designdata/{urn}/metadata/{guid}/properties接口,遍历模型所有元素,过滤出带有Sensor ID属性的元素 - 记录这些元素的
dbID、Sensor ID值,以及它们的位置坐标(通过API获取元素的边界盒中心点) - 在
iot.influx.js的getSensors函数中,用Sensor ID作为匹配键,将InfluxDB的数据与Forge模型元素的坐标、房间dbID绑定
三、集成验证
- 重新启动项目:
yarn start - 访问本地服务,加载模型后验证:
- 传感器标记是否显示在模型的正确位置
- 点击传感器能弹出对应的时序数据图表
- 切换房间时,能自动过滤显示该房间内的传感器
内容的提问来源于stack exchange,提问作者Kasun Jayasanka
相关产品推荐
相关产品推荐

