外设执行配置
外设执行把平台下发、本地定时或事件映射为一组动作。配置保存在 /config/periph_exec.json;新建、编辑、启停、导入与启动加载均须经过配置和资源校验。具体可用选项以当前设备能力、功能状态及动作描述为准。
配置步骤
- 先配置外设、协议、功能依赖与有效引脚,确认目标实际可用。
- 开发环境功能默认关闭,需要修改时按需通过密码确认开启,保留已有设备选择。
- 新建规则先保持停用,添加一个触发器及一个动作,检查具体参数和输出极性。
- 保存前阅读设备预检的拒绝原因和风险说明;保存成功只代表配置事务完成。
- 在已授权的现场范围执行一次,分别核对执行结果、协议数据与实物反馈,再启用周期或事件触发。
规则与动作字段
| 字段 | 含义 |
|---|---|
id/name/enabled | 唯一规则 ID、名称及启用意图 |
execMode | 规则执行模式:0 异步、1 同步;耗时读取及多步动作优先异步 |
triggers | 最多 3 个,OR 关系;任一准入后执行规则 |
actions | 最多 4 个,按配置顺序处理 |
reportAfterExec | 请求将结果通过 MQTT 上报,不保证消息已送达 |
allowPanelControl | 默认 false,显式授权设备屏幕卡片调用 |
recordHistory | 默认 false,允许的数值读取记录历史,还受功能和来源白名单限制 |
动作字段包括 targetPeriphId、actionType、字符串 actionValue、useReceivedValue、syncDelayMs 与各动作 execMode。延时为执行前延时,最多 10000 ms;不是等待上一个负载完成的反馈。执行模式不会绕过资源仲裁或类型检查。
触发器选择
| triggerType | 用途与边界 |
|---|---|
| 0 平台 | triggerPeriphId 精确匹配下发 id;操作符 0 为字符串匹配,1 为接受任意值的设置模式 |
| 1 定时 | 间隔 1~86400 秒或有效本地日历 HH:MM;无 cron,也不补错过的每日时间点 |
| 4 事件 | 系统、按键、固定设备事件、规则完成或 ds:<实际缓存键> 数据事件 |
| 5 轮询 | 间隔 5~86400 秒;含读取动作时到期执行整条规则,不用同轮结果门控后续动作 |
旧触发编号 2/3 已弃用。通用数据比较支持 0 等于、1 不等于、2 大于、3 小于、4 大于等于、5 小于等于、6 区间内、7 区间外、8 包含、9 不包含;区间填 "20,30"。平台的 0/1 有上述专属语义,不能照搬“不等于”表。空数据源或 "null" 不是通配符。
当前动作索引
| actionType | 作用与参数入口 |
|---|---|
| 0/1、13/14、30 | 高低电平、反相电平、逻辑翻转;GPIO |
| 2/3 | 闪烁/呼吸,目标须支持对应波形 |
| 4/5 | 原始 PWM 占空比计数 / DAC 0~255;PWM/DAC |
| 6/8 | 请求重启 / SNTP 同步;系统动作 |
| 7/9 | 恢复出厂/OTA 保留编号,当前规则执行拒绝或返回失败 |
| 10/11/12 | 通用指令 / NeoPixel 灯效 / 步进电机;11/12 是有效动作 |
| 15 | 命令序列,受规则引擎组合功能约束;脚本 |
| 16/17/18 | Modbus 继电器写 / FC06 写 / 采集;Modbus |
| 19 | 单个通道读取,参数为完整 JSON 对象字符串;传感器 |
| 20 | 历史保留编号,无当前动作 |
| 21/22/23 | 设备事件 / 启用规则 / 停用规则;事件动作 |
| 24/25/26 | TM1637 数字 / 文本 / 清屏,不能应用到所有显示外设 |
| 27 | LCD 类型的 OLED 多行自定义文字;显示 |
| 28/29 | 受检查的 RF / UART 输出;RF 边界 |
| 31/32 | 启用/禁用 webServer 或 mdns,保存后请求重启 |
| 33 | 已退休远程通道,旧规则保留但不能执行 |
| 34 | 请求单一心知天气来源刷新,参数必须空;天气 |
| 35/36/37 | DS1302 start/stop、只读日历、显式 system-local 校时;不自行发起 NTP |
| 38 | SD 生命周期与容量快照,不触发卡 I/O |
| 39 | 独立持续温控;温控 |
| 40 | 持续采集与有界 SD 记录,手动执行只查看状态 |
动作是否能保存、能初始化、能执行和已经完成必须分别判断。外设启用不代表资源一定就绪,临时保护应保留启用意图并显示原因,不修改用户目标来隐藏故障。
可核对的温湿度采集规则
先保存启用的 dht_room 外设,确认 DHT22 类别、引脚与实际采样间隔。以下是一条停用规则,不是整个文件:
{
"id": "exec_room_collect",
"name": "房间温湿度采集",
"enabled": false,
"execMode": 0,
"triggers": [
{
"triggerType": 1,
"timerMode": 0,
"intervalSec": 5
}
],
"actions": [
{
"targetPeriphId": "dht_room",
"actionType": 19,
"actionValue": "{\"periphId\":\"dht_room\",\"sensorCategory\":\"dht22\",\"channelField\":\"temperature\",\"dataField\":\"temperature\",\"unit\":\"°C\"}",
"useReceivedValue": false,
"syncDelayMs": 0,
"execMode": 0
},
{
"targetPeriphId": "dht_room",
"actionType": 19,
"actionValue": "{\"periphId\":\"dht_room\",\"sensorCategory\":\"dht22\",\"channelField\":\"humidity\",\"dataField\":\"humidity\",\"unit\":\"%\"}",
"useReceivedValue": false,
"syncDelayMs": 0,
"execMode": 0
}
],
"reportAfterExec": true,
"allowPanelControl": false,
"recordHistory": false
}每个动作只选择一个通道;读取温度不能自动产生湿度缓存。输出模板要使用 ${dht_room.temperature} 和 ${dht_room.humidity},而不是未定义的 ${temperature} 或系统变量。缓存不因重绘或上报而延长样本年龄。
若需阈值告警,另建事件规则监听 ds:dht_room_temperature。不要把采集后输出误写成“超过阈值才输出”。持续制热/制冷使用动作 39 的独立单动作规则,满足来源、极性、最小开停时间和故障关闭要求,不用两条普通比较规则替代。
上报、历史与屏幕
上报使用规则开始时捕获的 MQTT 实例及有界消息槽,超限、实例变化或发送失败必须保留失败/未知结果。上报数据字段与缓存键不同:dataField 是显式平台字段,缓存则按实际通道生成。
历史只记录允许的有效数值和原采样时间;非空 sourceAllowlist 须含目标来源。pointHistory 需已编译并启用;当前 C3 默认裁剪,不能把页面选项当作功能可用证据。
屏幕规则需显式 allowPanelControl=true,并通过动作白名单与版本检查;数值控件不能绕过电机、RAW 或脚本边界。见设备屏幕。
事务、结果与诊断
保存和启停失败保留有效配置及运行态;先刷新再重试,不重复提交结果不明的输出。整包配置导入是持久化暂存且需要重启,不能套用普通编辑的即时生效结论。规则完成事件的数据可能为 success/failed/cancelled,收到完成通知不代表所有动作成功。完成与固定事件联动环会返回 CONFIG_RULE_EVENT_CYCLE,图容量不足返回 CONFIG_RULE_EVENT_GRAPH_LIMIT;禁用草稿启用时重新校验。
执行结果的来源、应答、是否尝试与未知状态见动作检查和Modbus 结果。本地测试不能替代触点、电机运动、传感器标定或长期稳定验收。

