传感器读取动作
本页按当前源码说明行为:读取失败保留在底层的旧缓存不算新测量;动作仅发布质量有效且未超过时限的样本。缓存与页面保留原采样年龄和已记录单位,卡片重绘不会延长有效期,到期显示失效。DS18B20切换探头、电压/NTC校准变化会清旧缓存。启动内单调毫秒不是UTC时间,重启前后不能直接比较;这些软件保护不代表传感器校准或实物验收通过。
动作类型
| 动作 | actionType | 说明 |
|---|---|---|
| ACTION_SENSOR_READ | 19 | 读取传感器数据 |
概述
传感器读取动作触发指定传感器外设进行一次数据采集。采集结果存入传感器缓存,并在规则 reportAfterExec: true 时通过 MQTT 上报。
目标外设驱动负责采样,动作按物理通道形成缓存键 periphId_channelField,外设执行规则决定是否上报或供后续显示、联动使用。显示模板 ${periphId.channelField} 与 MQTT 物模型字段是不同用途,不能把它们当作同一个标识符。
支持的传感器类型
actionValue.sensorCategory 使用字符串,不使用外设类型或驱动内部的数字枚举。执行时去掉首尾空白并转为小写;每个读取动作选择一个通道。
| sensorCategory | 读取方式 | 通道或数值含义 | 驱动单位 |
|---|---|---|---|
analog | 已配置模拟输入 | 按外设ADC转换配置返回原始值或工程值 | 动作填写对应单位 |
digital | GPIO读取 | 电平0/1 | 无默认单位 |
radar | 雷达外设 | 存在状态0/1,建议字段 presence | 无默认单位 |
rf | 射频接收外设 | 接收电平0/1,不是信号强度 | 无默认单位 |
pulse | 编码器 | count、delta、direction;其余字段按累计计数读取 | 动作填写计数等单位 |
frequency | 编码器 | rpm 读取转速,其余字段读取频率 | 动作按所选量填写rpm或Hz |
dht11、dht22 | DHT协议 | temperature 或 humidity | °C、% |
ds18b20 | OneWire | 温度;deviceIndex 选择探头 | °C |
ultrasonic | 已保存的Trig/Echo引脚 | 距离,建议字段 distance | cm |
current | ADC与灵敏度、零点校准 | 电流,建议字段 current | A |
current_loop | ADC与4–20mA前端校准 | 默认电流;启用工程映射后输出配置范围内的工程值 | 默认mA,映射后填写工程单位 |
voltage | ADC与分压比例校准 | 电压,建议字段 voltage | V |
ntc | ADC与热敏电阻参数 | 温度,建议字段 temperature | °C |
SHT30、SHT31、AHT20 | 已注册I2C驱动 | temperature、humidity | °C、% |
BH1750 | 已注册I2C驱动 | illuminance | lx |
BMP280 | 已注册I2C驱动 | temperature、pressure、altitude | °C、hPa、m |
MPU6050 | 已注册I2C驱动 | mode=0:accelX/Y/Z;mode=1:gyroX/Y/Z;两种模式均有 temperature | m/s²、rad/s、°C |
INA226 | 已注册I2C驱动与分流校准 | voltage、current、power | V、A、W |
ADS1115 | 已注册I2C ADC驱动 | 默认 voltage、rawCode;可选扫描为配置选中的 voltage_mux0~voltage_mux7,最多4路 | 默认V、count;扫描V |
ADS1115多路读取:同一地址只建一个外设,整轮成功才发布,各通道保留实际采样时间;4路8SPS的配置最小间隔为1200ms。见多路配置与验收边界。
current_loop 也兼容 4-20ma、4_20ma。DHT、DS18B20、超声波、电流、电流环、电压和NTC路径需要固件包含 FASTBEE_ENABLE_SENSOR_DRIVER。I2C路径还要求相应驱动已注册、i2cSensors 功能已启用,外设配置及总线资源有效;表格不表示每块板、每种固件都包含所有驱动,以设备返回的驱动与通道列表为准。
推荐先保存并启用 SENSOR_GENERIC 外设,再在动作中选择“已配置传感器”。执行时以该外设保存的驱动、模式、地址和总线为准,动作中的类别或 driverParams 不会覆盖它。“已配置传感器”是表单选项,保存时会换成实际驱动名,不应手写 sensorCategory: "configured"。
参数说明
| 字段 | 说明 |
|---|---|
| targetPeriphId | 目标传感器外设 ID |
| actionType | 19 |
| actionValue | 非空JSON对象字符串,描述下面的读取参数;空串或仅写字段名无法执行 |
actionValue 内的字段:
| 字段 | 说明 |
|---|---|
periphId | 必须指向已保存并启用的外设;应与动作的 targetPeriphId 一致 |
sensorCategory | 上表中的字符串;导入时不应省略,缺省会走 analog |
channelField | 可显式选择实际读取通道,优先于 dataField |
dataField | 显式的MQTT物模型字段;未填写时上报ID回退为外设ID,不自动拼接 periphId.field |
sensorLabel | 本地显示名称 |
unit | 记录及上报的单位;为空时使用驱动检测的单位(若有) |
scaleFactor、offset | 数值转换 读数 × scaleFactor + offset,缺省分别为1、0;填写JSON数字 |
decimalPlaces | 小数位数,执行端缺省2,最多6 |
deviceIndex | DS18B20探头索引,缺省0 |
driverParams | 旧版I2C动作的参数对象或JSON对象字符串;推荐新配置将驱动参数保存到外设 |
注册驱动未显式填写 channelField 时,会先尝试把 dataField 解释为有效通道;若它只是物模型别名,则使用当前模式的第一个通道。MPU6050接受 accel_x/y/z、gyro_x/y/z 通道别名,并解析为 accelX/Y/Z、gyroX/Y/Z;旧版 driverParams.mode 接受0/1、数字字符串及 accel/gyro。例如BMP280的默认物理通道是温度;物模型字段叫 pressureValue 并不自动选择气压,须显式填写 channelField: "pressure"。
DHT的实际通道只能是 temperature 或 humidity,不能用任意物模型别名代替通道名。若需要自定义上报字段,应同时显式指定 channelField。驱动单位只在动作 unit 为空时补入;手写单位标签不会改变物理量,也不代表已校准。当前表单为DHT和“已配置传感器”同步实际通道单位。
actionValue 推荐格式
DHT11/DHT22动作的 actionValue 同样是下面格式的JSON字符串,不能只写 temperature 或 humidity。使用 sensorCategory=dht11/dht22,温度字段配 °C、湿度字段配 %。新开发候选的表单会自动同步两种固定单位,温控还核对真实通道,单位标签不能改变物理量。
下面读取已配置SHT31外设的温度,并映射到物模型字段 roomTemperature:
{
"periphId": "sht31_i2c",
"sensorCategory": "SHT31",
"channelField": "temperature",
"dataField": "roomTemperature",
"sensorLabel": "温度",
"unit": "°C",
"decimalPlaces": 1,
"scaleFactor": 1,
"offset": 0
}如需兼容绑定到已保存I2C主机总线的旧版动作,可以使用 driverParams: {"address": 68}(SHT31地址0x44)。SDA、SCL和总线频率从目标外设配置解析,不能靠在动作中填写 driverParams.sda/scl 临时接线。旧版动作只接受I2C总线或通用传感器外设作为这一驱动路径的目标。
ADC 电流/电压类传感器可以在同一 JSON 中增加校准参数:
{
"periphId": "current_01",
"sensorCategory": "current",
"dataField": "current",
"sensorLabel": "电流",
"unit": "A",
"decimalPlaces": 3,
"sensitivity": 0.100,
"zeroOffset": 1.65,
"vRef": 3.3,
"adcMax": 4095
}配置示例
方式1:Web界面配置(推荐)
传感器动作配置时重点核对外设ID、传感器类别、实际通道、物模型字段和单位;周期采集间隔在规则触发器中设置,I2C驱动的最小采样间隔还受已保存外设配置约束。
示例1:读取 DHT11 温湿度
场景:读取DHT11传感器的温度和湿度数据
配置步骤:
在外设执行管理页面编辑规则
点击 添加动作 按钮
选择传感器类别
dht11,填写动作配置:字段 填写内容 说明 动作类型 选择 传感器读取 读取传感器 目标外设 选择 dht1DHT11外设ID 数据字段 temperature或humidity读取的字段 显示名称 温度或湿度上报时的名称 单位 ℃或%数据单位 小数位数 1保留1位小数 点击 保存 按钮
一次DHT物理采样可取得温湿度,但每个动作只发布所选通道。需要两项缓存或上报时,分别添加温度、湿度两个读取动作。
示例2:读取超声波距离
场景:读取HC-SR04超声波传感器的距离数据
配置步骤:
编辑规则,添加动作
填写:
- 动作类型:选择 传感器读取
- 传感器类别:选择
ultrasonic - 目标外设:选择
ultrasonic1 - 数据字段:
distance - 显示名称:
距离 - 单位:
cm - 小数位数:
1
点击 保存
示例3:读取电流传感器(带校准)
场景:读取ACS712电流传感器数据
配置步骤:
编辑规则,添加动作
填写:
- 动作类型:选择 传感器读取
- 传感器类别:选择
current - 目标外设:选择
current_sensor - 数据字段:
current - 显示名称:
电流 - 单位:
A - 小数位数:
3 - 灵敏度:
0.100(根据模块填写) - 零点偏移:
1.65(VCC/2) - 参考电压:
3.3 - ADC最大值:
4095(ESP32为12位)
点击 保存
💡 提示:电流/电压传感器需要校准参数才能准确转换
方式2:JSON配置文件导入
可参考下方完整规则。先保存对应外设,并将每个动作的读取参数序列化为 actionValue 字符串;示例规则保持停用,核对物模型字段、接线与采样周期后再启用。
数据上报格式
上报ID优先取显式 dataField,否则取 periphId。例如两个DHT动作分别配置 dataField: "temperature"、dataField: "humidity" 时,上报核心字段如下(省略 remark 和 sample 元数据):
[
{"id": "temperature", "value": "25.6"},
{"id": "humidity", "value": "65.2"}
]实际传感器上报结果还携带 remark 和 sample,记录单位、采样质量、启动内单调采样时间及最大年龄;接收时的新鲜度标为未验证,不能把MQTT接收时间当成采样时间。读取失败的结果保留失败原因,值为空,不把旧缓存当作当前读数。配置了 reportAfterExec 也不等于平台已收到,仍受MQTT功能、实例及发送队列状态约束。
传感器缓存
成功发布的数据存入传感器缓存(SensorReadCache),键为 periphId_实际通道。例如 dht1_temperature 可用显示模板 ${dht1.temperature} 引用,${dht1.temperature.unit} 读取单位。数据源选择器中可能显示带 ds: 前缀的引用;它也不是MQTT物模型字段。
DS18B20、NTC等单值路径没有显式通道或数据字段时,缓存后缀沿用外设ID,例如 probe1_probe1;它们不会自动改为 probe1_temperature。表单通常会显式保存温度字段,导入规则应核对实际缓存键。注册I2C驱动则使用解析后的物理通道名;不同物模型别名可能仍对应同一个缓存键。
完整规则示例
定时采集并上报
{
"id": "exec_sensor_poll",
"name": "定时采集传感器",
"enabled": false,
"execMode": 0,
"triggers": [
{
"triggerType": 1,
"triggerPeriphId": "",
"operatorType": 0,
"compareValue": "",
"timerMode": 0,
"intervalSec": 60,
"timePoint": "",
"eventId": "",
"pollResponseTimeout": 1000,
"pollMaxRetries": 2,
"pollInterPollDelay": 100
}
],
"actions": [
{
"targetPeriphId": "dht1",
"actionType": 19,
"actionValue": "{\"periphId\":\"dht1\",\"sensorCategory\":\"dht11\",\"dataField\":\"temperature\",\"sensorLabel\":\"温度\",\"unit\":\"°C\",\"decimalPlaces\":1}",
"useReceivedValue": false,
"syncDelayMs": 0,
"execMode": 0
},
{
"targetPeriphId": "dht1",
"actionType": 19,
"actionValue": "{\"periphId\":\"dht1\",\"sensorCategory\":\"dht11\",\"dataField\":\"humidity\",\"sensorLabel\":\"湿度\",\"unit\":\"%\",\"decimalPlaces\":1}",
"useReceivedValue": false,
"syncDelayMs": 0,
"execMode": 0
},
{
"targetPeriphId": "ultrasonic1",
"actionType": 19,
"actionValue": "{\"periphId\":\"ultrasonic1\",\"sensorCategory\":\"ultrasonic\",\"dataField\":\"distance\",\"sensorLabel\":\"距离\",\"unit\":\"cm\",\"decimalPlaces\":1}",
"useReceivedValue": false,
"syncDelayMs": 200,
"execMode": 0
}
],
"protocolType": 0,
"scriptContent": "",
"reportAfterExec": true
}注意事项
将数值保存到SD
使用独立的“SD持续数值记录”动作40规则引用本页传感器读取规则产生的来源。生产来源须唯一、启用并勾选数值历史;记录器自身禁止数值历史和屏幕控制,也不直接发起传感器采样。Web来源目录仅描述已保存配置,不能代表新鲜有效样本。模板默认禁用;保存启用才开始持续记录,手动执行仅查看状态。来源变化或SD故障须检查并明确恢复;文件轮转会覆盖旧记录,SDK写入成功不代表断电持久性。具体步骤见SD卡存储。
- 采样间隔:专用驱动的最小间隔为DHT 2000ms、DS18B20 1000ms、超声波100ms、电流/电压/电流环/NTC 200ms。
analog通用模拟输入路径不同,不应套用专用ADC驱动的缓存间隔;I2C按设备驱动与外设配置执行。 - 缓存机制:可复用的成功缓存保留原采样时间;缓存返回、页面刷新或重新排队均不能把旧值变成新样本。
- 错误处理:失败不发布有效新样本。规则通常继续处理其它动作,但截止时间、来源变化或资源不足等条件可终止后续执行。
- 单位与标定:模拟量、电流、电压及4–20mA工程映射应按实物接线与标定配置;写入
°C标签本身不证明温度测量正确。作为温控来源还须满足本地温控规则的准入条件。

