You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Forge的BIM与传感器集成求助:模拟传感器配置及数据关联

基于Forge的BIM与IoT集成完整实现方案

针对你使用aps-iot-extensions-demo项目遇到的问题,以下是分步解决指南:

一、搞定./services/iot.mocked.js的模拟传感器配置

1. 获取模型坐标系内的XYZ位置

  1. 启动项目后打开Viewer,加载目标模型
  2. 在浏览器控制台执行NOP_VIEWER.getSelection(),先选中模型中你放置传感器的位置(比如Revit里创建的传感器构件),执行后会返回选中元素的信息
  3. 用NOP_VIEWER.getSelection()[0].getBoundingBox().center()获取该元素的中心点坐标,将结果的x、y、z值替换到iot.mocked.js中对应传感器的position字段
  4. 如果需要自定义位置,也可以基于模型的全局坐标系微调数值

2. 关联房间的dbID

  1. 在Viewer中选中目标房间构件,在控制台执行NOP_VIEWER.getSelection()[0].dbId,复制返回的数值
  2. 将该数值填入iot.mocked.js中对应传感器的roomDbId字段
  3. 也可以通过Viewer的「属性」面板,找到房间元素的「dbID」属性值(需要开启高级属性显示)

二、对接真实InfluxDB与Revit定义的Sensor ID

1. 替换模拟数据源为InfluxDB

  1. 安装InfluxDB客户端依赖:yarn add influx
  2. 在./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 };
  1. 修改app.js中的服务引用,将const iotService = require('./services/iot.mocked');替换为const iotService = require('./services/iot.influx');

2. 关联Forge模型中的Sensor ID属性

  1. 通过Forge Model Derivative API的GET /modelderivative/v2/designdata/{urn}/metadata/{guid}/properties接口,遍历模型所有元素,过滤出带有Sensor ID属性的元素
  2. 记录这些元素的dbID、Sensor ID值,以及它们的位置坐标(通过API获取元素的边界盒中心点)
  3. 在iot.influx.js的getSensors函数中,用Sensor ID作为匹配键,将InfluxDB的数据与Forge模型元素的坐标、房间dbID绑定

三、集成验证

  1. 重新启动项目:yarn start
  2. 访问本地服务,加载模型后验证:
    • 传感器标记是否显示在模型的正确位置
    • 点击传感器能弹出对应的时序数据图表
    • 切换房间时,能自动过滤显示该房间内的传感器

内容的提问来源于stack exchange,提问作者Kasun Jayasanka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 21:01:44