通过 Node-RED 将 SenseCAP 连接到 Power BI
SenseCAP K1100 - 传感器原型套件 是 Seeed Studio 集中 LoRa® 通信技术和边缘智能产品精华的体现,旨在让 LoRa® 和物联网应用的部署和掌握变得最简单。

可升级为工业传感器
通过 SenseCAP S2110 控制器 和 S2100 数据记录仪,您可以轻松将 Grove 转变为 LoRaWAN® 传感器。Seeed 不仅帮助您完成原型设计,还为您提供了通过 SenseCAP 系列坚固的工业传感器扩展项目的可能性。
IP66 外壳、蓝牙配置、与全球 LoRaWAN® 网络的兼容性、内置 19 Ah 电池以及来自 APP 的强大支持,使得 SenseCAP S210x 成为工业应用的最佳选择。该系列包括土壤湿度、空气温湿度、光强、二氧化碳、电导率以及 8 合 1 气象站的传感器。尝试最新的 SenseCAP S210x,助力您的下一个成功的工业项目。
SenseCAP 工业传感器 | |||
![]() | ![]() | ![]() | ![]() |
S2100 数据记录仪 | S2101 空气温湿度 | S2102 光强 | S2103 空气温湿度 & CO2 |
![]() | ![]() | ![]() | ![]() |
S2104 土壤湿度 & 温度 | S2105 土壤湿度 & 温度 & 电导率 | S2110 LoRaWAN® 控制器 | S2120 8 合 1 气象站 |
Power BI
通过将 Power BI 与 Azure 分析服务(包括 Azure Synapse Analytics 和 Azure Data Lake Storage)结合使用,可以连接并分析整个数据资产。分析 PB 级数据,使用高级 AI 功能,应用额外的数据保护,并更轻松地在组织内共享洞察。
在本教程中,我们将指导您如何通过使用 Node-RED 将 SenseCAP 的传感器数据导入 Power BI 以进行更深入的数据处理。

前期准备
完成本教程,您需要:
- 如果您尚未安装或不了解 Node-RED,请参考 Node-RED & SenseCAP 教程。
- 一个 Power BI 账户。如果您没有 Power BI 账户,请在开始之前注册一个 免费 Power BI Pro 试用版。
- 在以下任意一个 Wiki 中,您已成功将数据上传到 SenseCAP。
创建 MQTT 节点
步骤 1. 启动 Node-RED
通过在终端中输入命令 node-red
启动 Node-RED,然后打开浏览器,在地址栏中输入 http://localhost:1880 访问 Node-RED 的编辑器。
步骤 2. 创建 MQTT 节点
我们使用 Network -> mqtt in 节点,并按照 之前的教程 中的要求配置 SenseCAP API 格式的 mqtt。
-
服务器: openstream.api.sensecap.seeed.cc
-
端口: 1883
-
协议: MQTT V3.1.1
-
客户端 ID: 格式为
org-<Organization ID>-<Random ID>
<Organization ID>
是您的组织 ID。我们已在 获取 SenseCAP API 中获取。<Random ID>
使用您自己随机生成的数字或小写字母。
-
主题格式:
/device_sensor_data/<OrgID>/<DeviceEUI>/<Channel>/<Reserved>/<MeasurementID>
OrgID | 您的组织 ID。我们已在获取 SenseCAP API 中获取。 |
DevEUI | 传感器设备的唯一标识。此信息可以在 Grove - Wio E5 背面的标签上找到,也可以在 SenseCAP 控制台设备中找到。 |
Channel | 设备上连接传感器的物理接口。对于 K1100 套件,此处的默认值为 1。 |
Reserved | 保留字段。 |
MeasurementID | 测量值 ID。此 ID 可以在 SenseCAP 文档 的测量 ID 部分中找到。 |
我们建议一个 mqtt in 节点仅传输单个传感器的值,以避免同时传输多个传感器值导致的数据混淆。

步骤 3. 验证 MQTT 节点
配置完成后,请点击右上角的 Deploy 按钮,检查配置是否成功。如果填写正确,则会显示 Connected 字样。

配置 function 节点
将数据上报到 Power BI 需要遵循特定的数据格式,因此需要添加一个 function 节点来处理数据格式。

从左侧功能栏中拖出 function 节点,双击进入编辑页面,然后将代码复制到 On Message 中。

{
var payload = msg.payload;
var topic = msg.topic;
var strs = topic.split("/");
var length = strs.length
if (length >= 2) {
var measurementId = strs[length - 1]
var body = {}
var value = payload.value
if (measurementId == 4100) {
body.co2 = value
body.timestamp = msg.payload.timestamp
} else if (measurementId == 4103) {
body.soilmoisture = value
body.timestamp = msg.payload.timestamp
} else if (measurementId == 4150) {
body.accelX = value
body.timestamp = msg.payload.timestamp
} else if (measurementId == 4151) {
body.accelY = value
body.timestamp = msg.payload.timestamp
} else if (measurementId == 4152) {
body.accelZ = value
body.timestamp = msg.payload.timestamp
} else if (measurementId == 4192) {
body.soundintensity = value
body.timestamp = msg.payload.timestamp
} else if (measurementId == 4193) {
body.lightIntensity = value
body.timestamp = msg.payload.timestamp
} else if (measurementId == 4195) {
body.tvoc = value
body.timestamp = msg.payload.timestamp
} else if (measurementId == 4097) {
body.airtemperature = value
body.timestamp = msg.payload.timestamp
} else if (measurementId == 4098) {
body.airhumidity = value
body.timestamp = msg.payload.timestamp
} else if (measurementId == 4175) {
body.AIdetection_1 = value
body.timestamp = msg.payload.timestamp
} else if (measurementId == 4176) {
body.AIdetection_2 = value
body.timestamp = msg.payload.timestamp
} else if (measurementId == 4177) {
body.AIdetection_3 = value
body.timestamp = msg.payload.timestamp
} else if (measurementId == 4178) {
body.AIdetection_4 = value
body.timestamp = msg.payload.timestamp
} else if (measurementId == 4179) {
body.AIdetection_5 = value
body.timestamp = msg.payload.timestamp
} else if (measurementId == 4180) {
body.AIdetection_6 = value
body.timestamp = msg.payload.timestamp
} else if (measurementId == 4181) {
body.AIdetection_7 = value
body.timestamp = msg.payload.timestamp
} else if (measurementId == 4182) {
body.AIdetection_8 = value
body.timestamp = msg.payload.timestamp
} else if (measurementId == 4183) {
body.AIdetection_9 = value
body.timestamp = msg.payload.timestamp
} else if (measurementId == 4184) {
body.AIdetection_10 = value
body.timestamp = msg.payload.timestamp
}
msg.payload = body;
}
return msg;
}
上述代码适用于所有传感器,您可以选择将其全部粘贴到一个 function 节点中,或者截取其中一部分用于您正在使用的传感器。
需要注意的是,程序中的传感器名称需要与稍后在 Power BI 中设置的名称匹配,数据流才能成功传输。例如,在上述程序中,光传感器的值名称为:lightIntensity。
创建 Power BI 数据集
步骤 1. 登录到您的 Power BI 账户。
步骤 2. 创建一个工作区。
选择 Workspaces,然后选择 Create a workspace。

在“创建工作区”页面中,输入 In-store analytics - checkout 作为工作区名称。选择 Save。

步骤 3. 创建一个流式数据集。
在工作区页面中,选择 + New > Streaming dataset。

在“新建流式数据集”页面中,选择 API,然后点击 Next。

输入 Light-Sensor 作为数据集名称。
根据以下表格输入流中的光照值:
值名称 | 值类型 |
---|---|
Timestamp | DataTime |
lightIntensity | Number |
值名称应与 Node RED 中函数程序的名称相同。

现在您已经创建了一个流式数据集。请记录下您在此处获得的 Push URL,我们将在下一步中使用它。

配置 HTTP 请求节点
从左侧的存储栏中添加 http request,双击它进入配置页面,然后点击编辑按钮以编辑 http request 节点。

请将上一部分中获得的 URL 复制到 HTTP 请求页面中的 URL。
将方法更改为 POST 并保存。

部署并观察数据
步骤 1. 部署
然后我们连接所有节点并点击 Deploy 按钮,如果一切设置正确,您将能够看到 mqtt in 节点显示已连接。
如果您想查看数据的日志信息,可以在函数节点后添加一个调试节点。

一旦 Wio Terminal 开始启动并工作,并开始将数据发送到 SenseCAP PaaS 服务器,我们就可以在 Node-RED 调试日志中检查数据。
步骤 2. 配置 Power BI 仪表板
选择 Workspaces > In-store analytics - checkout。
选择 + New > Dashboard。

输入 Store analytics 作为仪表板名称,然后选择 Create。
添加折线图
添加一个折线图图块以显示来自 Wio Terminal 内置传感器的光照值。使用以下表格中的信息创建图块。要添加每个图块,请从选择 Edit > Add a tile 开始。

选择 Custom Streaming Data,然后点击 Next。

配置横坐标以显示时间戳,纵坐标以显示数据值。

当数据流开始传输时,您将能够看到仪表板显示为折线图。
您还可以根据需要添加更多图形或数据分析。

技术支持与产品讨论
感谢您选择我们的产品!我们致力于为您提供多种支持,以确保您使用我们的产品时能够获得尽可能顺畅的体验。我们提供多种沟通渠道,以满足不同的偏好和需求。
声明
- LoRa® 标志是 Semtech Corporation 或其子公司的商标。
- LoRaWAN® 是根据 LoRa Alliance® 授权使用的标志。