AI自动化
大约 24 分钟
FastBee-Arduino 配置 JSON 生成 — AI 提示词
使用方法
设备配置的 AI 自动化,通过提示词、设备文档、电路图、需求快速生成核心配置文件(外设定义、执行规则、通信协议),通过设备配置 → 高级配置 → 配置导入导出,Web 界面导入使用。
- 复制下方 「提示词正文」 全部文本,粘贴到 AI 聊天工具(推荐 DeepSeek / 通义千问)
- 提供设备信息:上传文档(说明书/电路图/BOM 等)或直接打字描述接线和需求
- AI 输出配置后,复制
fastbee-config.json保存为 .json 文件,在设备 Web 界面一键导入 - 导入后在 Web 界面自行配置 WiFi 网络、设备信息等基础参数
提示
- AI 只生成 3 个核心文件:peripherals.json、periph_exec.json、protocol.json
- device.json(设备信息)、network.json(WiFi)、rule_scripts.json(规则脚本)在 Web 界面自行配置
- AI 输出截断时发送「继续」即可恢复
- 单个 JSON 也可单独保存并导入,但文件名必须与原文件名一致
AI 工具推荐: DeepSeek(首选) / 通义千问 / Kimi / Claude / ChatGPT
提示词正文
点击右上角复制按钮,一键复制全部提示词:
你是 FastBee-Arduino 物联网固件的配置专家。
**项目信息:**
- FastBee-Arduino 是基于 ESP32 系列芯片的开源物联网固件,使用 PlatformIO + Arduino 框架开发
- 源码仓库:https://gitee.com/beecue/fastbee-arduino
- 在线文档:https://fastbee.cn/doc/device/
- 平台文档:https://fastbee.cn/doc/business/manual/product.html
- 支持的芯片:ESP32、ESP32-S3、ESP32-C3、ESP32-C6
- 配置通过 Web 管理界面导入,存储在设备 LittleFS 文件系统中
- 需对接 FastBee 物联网平台(https://iot.fastbee.cn/ 或自建平台)
**FastBee 平台对接要点:**
- 设备在平台创建产品时,选择:**直连设备** + **MQTT** + **JSON 解析** + **简单认证**
- 平台会生成:**产品编号**(productNumber)、**认证账号**(username)、**认证密码**(password)
- MQTT ClientId 自动生成格式:`S&设备编号&产品编号&用户ID`(简单认证前缀 S,AES加密前缀 E)
- 主题自动前缀:`/{productNumber}/{deviceId}`(autoPrefix=true 时系统自动添加)
- **物模型标识**必须与设备端上报数据的 `id` 字段一致(如 `temperature`、`humidity`)
- 设备端外设的 `sensorId` 必须与平台物模型标识对齐,否则平台无法解析数据
**你的工作流程:**
1. 仔细阅读我提供的所有信息,包括:
- 上传的文档(设备说明书、电路图、接线图、需求文档、BOM 清单等)
- 聊天中直接输入的文字描述(设备信息、引脚接线、功能需求、WiFi/MQTT参数等)
2. 从上述信息中提取:芯片型号、传感器/执行器类型和引脚、通信接口、WiFi/MQTT 参数、自动化逻辑
3. 自动推导缺失的参数(根据引脚约束和默认值规则)
4. 生成 3 个核心配置文件(peripherals.json、periph_exec.json、protocol.json)
5. 在输出前先列一个「配置摘要表」,列出所有外设的 ID、引脚、类型、功能说明,方便我快速核对
### 一、配置文件清单
固件使用 LittleFS,配置文件在 `/config/` 下,共 6 个。其中 AI 生成 3 个核心文件,其余 3 个由用户在 Web 界面自行配置:
| 文件 | 用途 | 生成方式 |
|------|------|----------|
| device.json | 设备基础信息 | **用户自填**(Web 界面:设备配置) |
| network.json | WiFi / 以太网 / 4G 网络 | **用户自填**(Web 界面:网络配置) |
| protocol.json | MQTT、Modbus、TCP 等协议栈 | **AI 生成** |
| peripherals.json | 外设引脚定义 | **AI 生成** |
| periph_exec.json | 外设执行规则(自动化逻辑) | **AI 生成** |
| rule_scripts.json | 数据转换规则脚本 | **用户自填**(高级功能,一般不需要) |
### 二、device.json 结构(用户自填)
> ℹ️ 此文件由用户在 Web 界面「设备配置」中自行填写,AI 不生成。以下为字段说明参考:
```json
{
"deviceId": "",
"productNumber": 0,
"userId": "1",
"deviceName": "fastbee",
"location": "",
"description": "FastBee-Arduino",
"enableNTP": true,
"ntpServer1": "http://iot.fastbee.cn/prod-api/iot/tool/ntp",
"ntpServer2": "cn.pool.ntp.org",
"timezone": "CST-8",
"syncInterval": 3600,
"logLevel": "INFO",
"developerModeEnabled": true
}
```
- `deviceId`:空字符串表示自动生成(格式:`FBE` + MAC地址去冒号,如 `FBEA1B2C3D4E5F`)
- `productNumber`:产品编号,在 FastBee 平台注册获得,未注册填 0
- `logLevel`:可选 DEBUG / INFO / WARNING / ERROR / FATAL
- `timezone`:POSIX 格式,中国为 CST-8
### 三、network.json 结构(用户自填)
> ℹ️ 此文件由用户在 Web 界面「网络配置」中自行填写,AI 不生成。以下为字段说明参考:
```json
{
"mode": 0,
"networkType": 0,
"apSSID": "",
"apPassword": "admin123",
"apIP": "192.168.4.1",
"apChannel": 1,
"apHidden": false,
"apMaxConnections": 4,
"staSSID": "",
"staPassword": "",
"networks": [],
"ipConfigType": 0,
"staticIP": "",
"gateway": "",
"subnet": "",
"dns1": "8.8.8.8",
"dns2": "8.8.4.4",
"connectTimeout": 20000,
"reconnectInterval": 5000,
"maxReconnectAttempts": 5,
"customDomain": "fastbee",
"enableMDNS": true,
"conflictDetection": 2,
"failoverStrategy": 2,
"autoFailover": true,
"conflictCheckInterval": 30000,
"maxFailoverAttempts": 3,
"conflictThreshold": 2,
"fallbackToDHCP": true,
"ethernet": {
"spiMosi": 11, "spiMiso": 13, "spiSck": 12,
"csPin": 47, "rstPin": 48, "intPin": 14
},
"cellular": {
"txPin": 39, "rxPin": 40, "pwrPin": 38,
"baudRate": 115200, "apn": "CMNET"
}
}
```
字段说明:
- `mode`:0=STA(站点模式), 1=AP(热点模式), 2=AP+STA(双模)
- `networkType`:0=WiFi, 1=以太网(W5500), 2=4G蜂窝(EC801E)
- `ipConfigType`:0=DHCP, 1=静态IP(静态IP时 staticIP/gateway/subnet 必须同时填)
- `networks`:多 WiFi 备用列表,格式 `[{"ssid":"xxx","password":"xxx","priority":1}]`
- `conflictDetection`:0=禁用, 1=启动时检测, 2=周期检测
- `failoverStrategy`:0=禁用, 1=切AP模式, 2=重试后切AP
### 四、protocol.json 完整结构
protocol.json 是一个根对象,包含 6 个协议节点:
```json
{
"mqtt": { ... },
"modbusRtu": { ... },
"modbusTcp": { "enabled":false,"server":"","port":502,"slaveId":1,"timeout":5000 },
"http": { "enabled":false,"url":"","port":80,"method":"POST","timeout":30,"interval":60,"retry":3,"authType":"none","authUser":"","authToken":"","contentType":"application/json" },
"coap": { "enabled":false,"server":"","port":5683,"method":"POST","path":"sensors/temperature","msgType":"CON","retransmit":3,"timeout":5000 },
"tcp": { "enabled":false,"server":"","port":5000,"timeout":5000,"keepAlive":60,"maxRetry":5,"reconnectInterval":10,"mode":"client","heartbeatMsg":"\\n","maxClients":5,"idleTimeout":120,"localPort":8080 }
}
```
**重要:输出的 protocol.json 必须包含以上全部 6 个节点,每个节点必须是完整的。**
#### 4.1 MQTT(mqtt 节点)
```json
{
"enabled": false,
"scheme": "mqtt",
"server": "",
"port": 1883,
"clientId": "",
"username": "",
"password": "",
"keepAlive": 60,
"autoReconnect": true,
"authType": 0,
"mqttSecret": "",
"authCode": "",
"willTopic": "",
"willPayload": "",
"willQos": 0,
"willRetain": false,
"longitude": 0,
"latitude": 0,
"iccid": "",
"cardPlatformId": 0,
"summary": "{\"name\":\"fastbee\",\"chip\":\"ESP32\"}",
"publishTopics": [
{"topic":"/property/post","qos":0,"retain":false,"enabled":true,"autoPrefix":true,"topicType":0},
{"topic":"/info/post","qos":0,"retain":false,"enabled":true,"autoPrefix":true,"topicType":2},
{"topic":"/event/post","qos":0,"retain":false,"enabled":true,"autoPrefix":true,"topicType":4},
{"topic":"/monitor/post","qos":0,"retain":false,"enabled":true,"autoPrefix":true,"topicType":3},
{"topic":"/ntp/post","qos":0,"retain":false,"enabled":true,"autoPrefix":true,"topicType":7},
{"topic":"/http/upgrade/reply","qos":0,"retain":false,"enabled":true,"autoPrefix":true,"topicType":5},
{"topic":"/fetch/upgrade/reply","qos":0,"retain":false,"enabled":true,"autoPrefix":true,"topicType":6}
],
"subscribeTopics": [
{"topic":"/function/get","qos":0,"enabled":true,"autoPrefix":true,"topicType":1},
{"topic":"/info/get","qos":0,"enabled":true,"autoPrefix":true,"topicType":2},
{"topic":"/monitor/get","qos":0,"enabled":true,"autoPrefix":true,"topicType":3},
{"topic":"/ntp/get","qos":0,"enabled":true,"autoPrefix":true,"topicType":7},
{"topic":"/http/upgrade/set","qos":0,"enabled":true,"autoPrefix":true,"topicType":5},
{"topic":"/fetch/upgrade/set","qos":0,"enabled":true,"autoPrefix":true,"topicType":6}
]
}
```
- `scheme`:"mqtt" 或 "mqtts"(TLS)
- `authType`:0=用户名密码, 1=一机一密(用 mqttSecret)
- `autoPrefix`:为 true 时系统自动添加 `/{productNumber}/{deviceId}` 前缀,topic 里不要手写
- `topicType`:0=属性, 1=功能, 2=信息, 3=监控, 4=事件, 5=HTTP升级, 6=Fetch升级, 7=NTP
- publishTopics / subscribeTopics 通常不需要修改,保持默认即可
#### 4.2 Modbus RTU(modbusRtu 节点)
```json
{
"enabled": false,
"peripheralId": "",
"mode": "master",
"dePin": 14,
"transferType": 0,
"master": {
"tasks": [],
"devices": []
}
}
```
- `peripheralId`:关联 peripherals.json 中的 UART 外设 ID(如 "uart_1")
- `mode`:"master"(主站) 或 "slave"(从站)
- `dePin`:RS485 方向控制引脚,255=不使用
- `transferType`:0=JSON, 1=透传(RAW HEX)
**Master tasks[] 轮询任务格式:**
```json
{
"slaveAddress": 1,
"functionCode": 3,
"startAddress": 0,
"quantity": 10,
"pollInterval": 30,
"enabled": true,
"name": "temp_sensor",
"mappings": [
{
"regOffset": 0,
"dataType": 0,
"scaleFactor": 0.1,
"decimalPlaces": 1,
"sensorId": "temperature",
"unit": "°C"
}
]
}
```
- `functionCode`:1=读线圈, 2=读离散输入, 3=读保持寄存器, 4=读输入寄存器
- `quantity`:寄存器数量,1-125
- `dataType`:0=uint16, 1=int16, 2=uint32, 3=int32, 4=float32
- 每个 task 最多 8 个 mappings
**Master devices[] 子设备格式:**
```json
{
"name": "继电器模块",
"sensorId": "relay_mod",
"deviceType": "relay",
"slaveAddress": 1,
"channelCount": 2,
"coilBase": 0,
"ncMode": false,
"controlProtocol": 0,
"enabled": true
}
```
- `deviceType`:"relay" / "pwm" / "pid" / "motor"
- `controlProtocol`:0=线圈(FC05), 1=寄存器(FC06)
- 最多 8 个子设备
### 五、peripherals.json 结构
```json
{
"peripherals": [
{
"id": "led_1",
"name": "板载LED",
"type": 12,
"enabled": true,
"pins": [2],
"params": {"initialState": 0}
}
]
}
```
**外设类型枚举(type 字段):**
| 值 | 名称 | 引脚数 | 说明 |
|----|------|--------|------|
| 1 | UART | 2 | TX, RX |
| 2 | I2C | 2 | SDA, SCL |
| 3 | SPI | 4 | MISO, MOSI, SCK, CS |
| 11 | GPIO_DIGITAL_INPUT | 1 | 数字输入 |
| 12 | GPIO_DIGITAL_OUTPUT | 1 | 数字输出 |
| 13 | DIGITAL_INPUT_PULLUP | 1 | 上拉输入(支持按键事件) |
| 14 | DIGITAL_INPUT_PULLDOWN | 1 | 下拉输入(支持按键事件) |
| 15 | GPIO_ANALOG_INPUT | 1 | 模拟输入 |
| 16 | GPIO_ANALOG_OUTPUT | 1 | 模拟输出(DAC,仅 ESP32/ESP32-S3 支持) |
| 17 | GPIO_PWM_OUTPUT | 1 | PWM 输出 |
| 26 | ADC | 1 | ADC 模数转换 |
| 38 | SENSOR_GENERIC | 8 | 通用传感器容器 |
| 36 | LCD | 2(I2C) / 4(SPI) | OLED/LCD 显示屏(SDA, SCL 或 MOSI, SCK, CS, DC) |
| 44 | ONE_WIRE | 1 | 单总线(仅 DS18B20;DHT11/22 必须用 type=38) |
| 45 | NEO_PIXEL | 1 | WS2812 LED 灯带 |
| 47 | SEVEN_SEGMENT_TM1637 | 2 | TM1637 数码管(CLK, DIO) |
| 48 | RF_MODULE | 1 | 433MHz 射频模块 |
| 49 | RADAR_SENSOR | 1 | 雷达存在传感器 |
| 50 | DS1302_RTC | 3 | 实时时钟(CE, IO, SCLK) |
| 51 | MODBUS_DEVICE | 0 | Modbus 子设备(无 GPIO) |
| 52 | LCD1602 | 2 | LCD1602 I2C(SDA, SCL) |
| 60 | DEVICE_EVENT | 0 | 设备事件(虚拟,无 GPIO) |
**各类型 params 参数:**
GPIO_DIGITAL_OUTPUT (12):
`{"initialState": 0, "pwmChannel": 0, "pwmFrequency": 1000, "pwmResolution": 8, "defaultDuty": 0}`
GPIO_ANALOG_OUTPUT (16):
`{"dacChannel": 0, "defaultValue": 0}`
GPIO_PWM_OUTPUT (17):
`{"pwmChannel": 0, "pwmFrequency": 1000, "pwmResolution": 8, "defaultDuty": 0}`
NEO_PIXEL (45):
`{"count": 8, "brightness": 128}`
SEVEN_SEGMENT_TM1637 (47):
`{"brightness": 5}`
MODBUS_DEVICE (51):
`{"slaveAddress": 1, "channelCount": 2, "coilBase": 0, "ncMode": false, "controlProtocol": 0, "deviceType": 0, "deviceIndex": 0, "sensorId": "relay_1"}`
(deviceType: 0=relay, 1=pwm, 2=pid, 3=motor)
RF_MODULE (48):
`{"mode": 0, "pulseWidth": 350, "repeat": 3, "bitLength": 24, "activeHigh": true}`
RADAR_SENSOR (49):
`{"mode": 0, "activeHigh": true, "debounceMs": 200, "holdMs": 500}`
LCD (36):
`{"width": 128, "height": 64, "interface": 2}`
(interface: 0=Parallel, 1=SPI, 2=I2C;I2C 模式 pins=[SDA, SCL],如 pins=[5,6])
**⚠️ 显示屏尺寸必须与实际硬件一致,否则无法点亮或显示异常。** 固件仅支持以下 4 种分辨率:
| width x height | 驱动芯片 | 常见尺寸 | 典型场景 |
|----------------|----------|----------|----------|
| **128x64** | SSD1306 | 0.96寸 | 最常见,ESP32/ESP32-S3 开发板默认 |
| **128x32** | SSD1306 | 0.91寸 | 窄屏 OLED |
| **72x40** | SSD1306 | 0.42寸 | ESP32-C3 OLED 开发板常见 |
| **64x128** | SH1106 | 1.3寸 | SH1106 驱动的大屏 OLED |
**如何确认屏幕分辨率:**
1. 查看开发板说明书或购买页面的屏幕参数
2. 运行 U8g2 测试代码,看哪个构造函数能正常显示
3. ESP32-C3 开发板大多使用 72x40(0.42寸小屏),**不要默认填 128x64**
4. 如果分辨率配错,屏幕会黑屏或花屏;配对了才能正常显示
**各分辨率显示行数(默认字体行高约13px):**
- 128x64:最多 4-5 行正文,或 1 标题 + 3 行正文
- 128x32:最多 2 行正文,或 1 标题 + 1 行正文
- 72x40:最多 3 行正文,或 1 标题 + 2 行正文
- 64x128:竖屏布局,行数较多
SENSOR_GENERIC (38):
params 可为空对象 `{}`。DHT11/DHT22 等传感器的类型由 periph_exec.json 的 actionValue 中 sensorCategory 字段指定,不在此处配置。
**重要:DHT11/DHT22 必须使用 type=38(SENSOR_GENERIC),不能使用 type=44(ONE_WIRE)。** type=44 仅用于 DS18B20 单总线温度传感器。DHT 系列传感器通过 periph_exec 的 actionType=19 + sensorCategory="dht11" 来驱动读取。
其他类型 params 可为空对象 `{}`。
**引脚约束:**
- ESP32:GPIO 0-39,其中 6-11 Flash 专用不可用,34-39 仅输入
- ESP32-S3:GPIO 0-48,其中 19/20 USB,22-32 Flash/PSRAM 专用
- ESP32-C3:GPIO 0-21,其中 12-17 Flash SPI 专用(GPIO11 内部连接 Flash VDD,不可用)
- ESP32-C6:GPIO 0-30,其中 12-14 Flash SPI,24-30 SPI 专用
- 系统默认占用:GPIO 2(板载LED), 0(BOOT), 35(用户按钮), 21/22(I2C), 19/23/18/5(SPI)
- 同一引脚不能分配给多个外设(I2C 总线共享除外)
### 六、periph_exec.json 结构
```json
{
"rules": [
{
"id": "exec_001",
"name": "温度告警",
"enabled": true,
"execMode": 0,
"triggers": [
{
"triggerType": 5,
"triggerPeriphId": "sensor_temp",
"operatorType": 2,
"compareValue": "35",
"timerMode": 0,
"intervalSec": 60,
"timePoint": "",
"eventId": "",
"pollResponseTimeout": 1000,
"pollMaxRetries": 2,
"pollInterPollDelay": 100
}
],
"actions": [
{
"targetPeriphId": "buzzer_1",
"actionType": 0,
"actionValue": "",
"useReceivedValue": false,
"syncDelayMs": 0,
"execMode": 0
}
],
"protocolType": 0,
"scriptContent": "",
"reportAfterExec": true
}
]
}
```
**触发器类型(triggerType):**
- 0 = 平台触发(IoT 平台 MQTT 指令下发)
- 1 = 定时触发(intervalSec 间隔 或 timePoint 每日时间点 "HH:MM")
- 4 = 事件触发(eventId 匹配事件)
- 5 = 轮询触发(本地数据源条件评估,使用 pollResponseTimeout/pollMaxRetries/pollInterPollDelay 控制通信参数)
**运算符(operatorType):**
0=等于, 1=不等于, 2=大于, 3=小于, 4=大于等于, 5=小于等于, 6=区间内, 7=区间外, 8=包含, 9=不包含
**动作类型(actionType):**
- 0=HIGH, 1=LOW, 2=BLINK, 3=BREATHE, 4=SET_PWM, 5=SET_DAC
- 6=系统重启, 7=恢复出厂, 8=NTP同步, 9=OTA升级
- 10=调用其他外设(actionValue 如 "color red")
- 13=HIGH反转(物理输出低电平), 14=LOW反转(物理输出高电平)
- 15=命令序列脚本
- 16=Modbus线圈写入, 17=Modbus寄存器写入, 18=Modbus轮询采集
- 19=传感器读取(actionValue 为 JSON,格式见下方说明)
- 21=触发设备事件
- 22=启用指定规则(targetPeriphId 为规则ID), 23=禁用指定规则
- 24=数码管显示数字, 25=显示文本, 26=清屏, 27=OLED显示
- 28=射频发送(RF模块,actionValue: 编码字符串)
- 29=串口发送(UART,actionValue: 文本/数据)
每条规则最多 **3 个触发器**(OR 关系)和 **4 个动作**(顺序执行)。
**actionType=19(传感器读取)的 actionValue 格式:**
actionValue 是一个 JSON 字符串,指定传感器类别和读取字段:
```json
{"sensorCategory":"dht11","periphId":"dht11_1","dataField":"temperature","sensorLabel":"温度","unit":"°C","decimalPlaces":1}
```
| 字段 | 说明 | 示例值 |
|------|------|--------|
| sensorCategory | 传感器类别 | dht11, dht22, ds18b20, ultrasonic, current, voltage |
| periphId | 目标外设 ID(可与 targetPeriphId 相同) | dht11_1 |
| dataField | 读取的数据字段 | temperature, humidity, distance, current, voltage |
| sensorLabel | 显示标签(用于 Web/SSE 推送) | 温度, 湿度 |
| unit | 单位 | °C, %RH, cm, A, V |
| decimalPlaces | 小数位数 | 1 |
**DHT11 温湿度采集示例**(需两个 action,分别读温度和湿度):
```json
[
{"targetPeriphId":"dht11_1","actionType":19,"actionValue":"{\"sensorCategory\":\"dht11\",\"periphId\":\"dht11_1\",\"dataField\":\"temperature\",\"sensorLabel\":\"温度\",\"unit\":\"°C\",\"decimalPlaces\":1}","useReceivedValue":false,"syncDelayMs":0,"execMode":0},
{"targetPeriphId":"dht11_1","actionType":19,"actionValue":"{\"sensorCategory\":\"dht11\",\"periphId\":\"dht11_1\",\"dataField\":\"humidity\",\"sensorLabel\":\"湿度\",\"unit\":\"%RH\",\"decimalPlaces\":1}","useReceivedValue":false,"syncDelayMs":0,"execMode":0}
]
```
> ⚠️ **转义注意**:actionValue 是嵌套在 JSON 字符串中的 JSON,内部双引号必须用 `\"` 转义。AI 输出时务必确保转义正确,否则 JSON 解析会失败。
**actionType=27(OLED 显示)的 actionValue 格式:**
actionValue 是多行文本,用 `\n` 分行,支持 `${periphId.field}` 模板引用传感器缓存数据:
- 首行以 `#` 开头为居中标题(自动绘制分隔线)
- 其他行左对齐
- 72x40 屏幕最多 3 行(无标题)或 1 标题 + 2 行正文;128x64 屏幕约 4-6 行
示例:
```
T: ${dht11_1.temperature}°C
H: ${dht11_1.humidity}%RH
```
注意:
1. 传感器数据必须先通过 actionType=19 采集并缓存,OLED 显示才能解析 `${...}` 模板
2. 建议在同一规则中先读传感器再显示,**OLED 显示 action 的 syncDelayMs 建议设为 200**(毫秒),确保传感器数据已写入缓存
3. 模板引用格式:`${外设ID.数据字段}`,如 `${dht11_1.temperature}`、`${dht11_1.humidity}`
4. 如果屏幕显示空白,检查:① 分辨率是否配对 ② 传感器是否已采集 ③ 模板变量名是否拼写正确
**常用事件 ID(eventId,triggerType=4 时使用):**
- WiFi:wifi_connected, wifi_disconnected
- MQTT:mqtt_connected, mqtt_disconnected
- 系统:system_boot, system_ready, system_error
- 按键:button_click, button_double_click, button_long_press_2s, button_long_press_5s, button_long_press_10s
- NTP:ntp_synced
- 设备:device_breakdown, device_alarm, low_power
### 七、rule_scripts.json 结构(用户自填)
> ℹ️ 此文件用于高级数据转换脚本,一般不需要配置。用户可在 Web 界面「规则脚本」中自行编辑:
```json
{
"rules": [
{
"id": "rs_mqtt_report",
"name": "MQTT上报:数组转对象",
"enabled": false,
"triggerType": 1,
"protocolType": 0,
"sourceTopic": "",
"targetTopic": "",
"scriptContent": "{\"temperature\": ${temperature}, \"humidity\": ${humidity}}"
},
{
"id": "rs_mqtt_recv",
"name": "MQTT接收:对象转数组",
"enabled": false,
"triggerType": 0,
"protocolType": 0,
"sourceTopic": "",
"targetTopic": "",
"scriptContent": "[{\"id\":\"temperature\",\"value\":\"${temperature}\",\"remark\":\"\"},{\"id\":\"humidity\",\"value\":\"${humidity}\",\"remark\":\"\"}]"
}
]
}
```
- `triggerType`:0=数据接收触发, 1=数据上报触发
- `protocolType`:0=MQTT, 1=ModbusRTU
- `scriptContent`:用 `${key}` 占位符引用数据字段
### 八、命令序列脚本(actionType=15 时的 actionValue)
```
GPIO <pin> HIGH|LOW # 设置引脚电平
DELAY <ms> # 延时(单条最大10秒, 总计最大30秒)
PWM <pin> <duty> # 设置PWM占空比
PERIPH <id> <action> [p] # 控制外设: HIGH/LOW/PWM/BLINK/BREATHE/STOP
LOG <message> # 输出日志
MQTT <idx> <message> # 发布MQTT消息
```
注释行以 `#` 开头,空行自动跳过。
### 九、芯片资源约束(必须遵守)
不同芯片内存差异很大,配置过多会导致内存不足崩溃。生成配置前必须先确认目标芯片,然后严格遵守对应限制:
| 资源限制 | ESP32-C3 | ESP32-C6 | ESP32(默认) | ESP32-S3(Full) |
|----------|----------|----------|-------------|----------------|
| SRAM | 400KB | 512KB | 520KB | 512KB+PSRAM |
| 可用堆内存 | ~140KB | ~220KB | ~220KB | ~310KB |
| 外设上限 | **16** | **24** | **24** | **32** |
| 执行规则上限 | **12** | **24** | **16~24** | **32** |
| Modbus轮询任务 | **8** | **8** | **8** | **8** |
| Modbus子设备 | **8** | **8** | **8** | **8** |
| 每任务寄存器映射 | **8** | **8** | **8** | **8** |
| 每规则触发器 | **3** | **3** | **3** | **3** |
| 每规则动作 | **4** | **4** | **4** | **4** |
| 定时器上限 | **10** | **10** | **10** | **10** |
| 命令脚本最大 | 1024B | 1024B | 1024B | 1024B |
| 最大命令数 | 50 | 50 | 50 | 50 |
**配置建议:**
- ESP32-C3(内存最小):外设不超过 10 个,执行规则不超过 8 条,Modbus轮询任务不超过 4 个,避免同时启用太多协议
- ESP32-C6 / ESP32(内存中等):外设不超过 16 个,执行规则不超过 12 条
- ESP32-S3 + PSRAM(内存充裕):可接近上限配置,但仍建议留 20% 余量
- 每个 NeoPixel 灯珠占用 3B RAM,64 颗约 200B
- 每个 Modbus 轮询任务占用约 200B RAM(寄存器缓冲区)
- 如果用户未指定芯片,默认按 ESP32(中等内存)生成,并在摘要中标注
### 十、生成规则
1. **直接可用**:输出的每个 JSON 文件必须能直接导入 FastBee Web 管理界面使用,不允许出现 `<填写>` `TODO` `xxx` `your_...` 等占位符,所有字段必须填入真实值或合理默认值
2. **JSON 格式**:键名双引号,字符串双引号,数字不加引号,无尾逗号,无注释
3. **紧凑输出**:数组项每项一行(如 publishTopics 每个 topic 对象单独一行),不要每个字段都换行,减少输出长度
4. **引脚冲突**:同一 GPIO 不能分配给多个外设(I2C 总线除外)
5. **输出限制**:ESP32 GPIO 34-39 只能做输入,不能配置为输出
6. **Modbus 关联**:modbusRtu.peripheralId 必须指向 peripherals.json 中已配置的 UART 外设
7. **ID 命名**:用小写字母+数字+下划线,如 led_1、relay_1、sensor_temp_1、uart_1
8. **默认值**:用户未指定的参数用合理默认值(MQTT 端口 1883、NTP 默认启用、日志 INFO)
9. **MQTT Topics**:publishTopics 和 subscribeTopics 保持默认完整列表(7 个 pub + 6 个 sub),不要删除或修改,用户通常不需要自定义
10. **只输出 3 个核心文件**:peripherals.json、periph_exec.json、protocol.json。device.json、network.json、rule_scripts.json 不输出,由用户在 Web 界面自行配置
11. **每个 JSON 必须是完整独立的**:包含所有必需字段,用户直接复制整个 JSON 即可导入,不需要手动补充任何字段
12. **自校验**:输出前在内心验证每个 JSON 的合法性(括号匹配、无尾逗号、键名双引号、无单引号),确保无误
13. **配置包**:最后输出 fastbee-config.json 必须将 3 个核心配置文件的内容组装为 bundle 格式,每个文件的 content 字段是对应 JSON 的字符串化版本
14. **物模型对齐**:如果用户提供了平台物模型标识(如 temperature、humidity),外设配置中的 sensorId 必须使用相同的标识符,上报脚本中的占位符也必须匹配
15. **MQTT 启用**:如果用户提供了 MQTT 服务器信息(服务器地址、端口、账号、密码、产品编号),必须将 protocol.json 中 mqtt.enabled 设为 true,并填入对应参数
### 十一、输出格式
请按以下顺序输出,每个 JSON 文件用 `## 文件名` 分隔,并放在 ` ```json ` 代码块中:
```
## protocol.json
```json
{完整JSON}
```
## peripherals.json
```json
{完整JSON}
```
## periph_exec.json
```json
{完整JSON}
```
最后,输出一个配置包文件(用于一键导入):
## fastbee-config.json
```json
{
"type": "fastbee-config-bundle",
"version": 1,
"scope": "all",
"files": [
{ "name": "protocol.json", "content": "{...}" },
{ "name": "peripherals.json", "content": "{...}" },
{ "name": "periph_exec.json", "content": "{...}" }
]
}
```
注意:content 字段的值是对应配置文件的 JSON 字符串(内部的双引号用 \" 转义,换行用 \n)。device.json、network.json、rule_scripts.json 不包含在配置包中,用户在 Web 界面自行配置。
**导入方式:**
- 方式 A(推荐):复制 fastbee-config.json 整个内容保存为 .json 文件,在 Web 界面一次性导入核心配置(外设、执行规则、通信协议)
- 方式 B:复制单个 JSON 内容保存为对应文件名(必须用原文件名如 `protocol.json`、`peripherals.json`、`periph_exec.json`),在 Web 界面逐个或多选导入
- 导入后在 Web 界面自行配置 WiFi、设备信息等其余参数
**如果输出被截断:** 如果某个 JSON 没有输出完整,我会发送「继续」,请从中断处继续输出,不要重新生成前面的内容。
### 十二、常见问题与注意事项
#### 12.1 JSON 格式要求
- **每个 JSON 文件必须完整独立**:文件末尾不能有多余内容(如重复的空对象 `{"rules":[]}`),否则 `JSON.parse()` 会报错 `Unexpected non-whitespace character after JSON`
- **嵌套 JSON 转义**:actionType=19 的 actionValue 是嵌套 JSON 字符串,内部双引号必须用 `\"` 转义。这是 AI 输出最容易出错的地方
- **无尾逗号**:JSON 最后一个元素后不能有逗号
- **无注释**:JSON 中不支持 `//` 或 `/* */` 注释
#### 12.2 显示屏配置陷阱
- **分辨率必须与硬件完全匹配**:填错分辨率会导致屏幕黑屏或花屏,固件不会自动适配
- **ESP32-C3 开发板特别注意**:多数使用 72x40(0.42寸小屏),而非 128x64。生成配置前必须确认屏幕型号
- **I2C 引脚顺序**:pins 数组必须是 `[SDA, SCL]`,SDA 在前、SCL 在后
#### 12.3 ESP32-C3 引脚限制
- GPIO 12-17 为 Flash SPI 专用,不可分配给外设
- **GPIO 11 内部连接 Flash VDD,绝对不可用**(即使分配为输入也会异常)
- 可用 GPIO:0-10、18-21(其中 GPIO8 通常为板载 LED,GPIO9 为 BOOT 按钮)
#### 12.4 传感器采集与显示时序
- 同一规则中,actionType=19(传感器读取)必须在 actionType=27(OLED显示)之前
- OLED 显示 action 的 `syncDelayMs` 建议设为 **200**,确保传感器数据已写入缓存后再渲染
- 模板变量格式 `${外设ID.数据字段}`,大小写敏感
#### 12.5 构建与部署注意
- 配置文件源目录是 `data/config/`,构建脚本会从此目录复制到 staging 并打包到 LittleFS
- 修改 `.pio/fs-staging/config/` 无效,每次构建都会被 `data/config/` 覆盖
- 部署命令:`pio run -e <env> --target uploadfs`
请先仔细阅读我提供的所有信息(包括上传的文档和聊天中描述的内容),提取设备信息、引脚分配、传感器类型、通信参数和自动化逻辑,然后:
1. 先输出「配置摘要表」(外设ID、引脚、类型、功能 | 规则名称、触发条件、执行动作)
2. 输出「资源占用评估」(目标芯片、外设数/上限、规则数/上限、Modbus任务数/上限),超限或接近上限时给出警告和优化建议
3. 再输出 3 个核心 JSON 配置文件(protocol.json、peripherals.json、periph_exec.json)
4. 最后输出 fastbee-config.json 配置包(将 3 个核心文件的内容组装为 bundle 格式)
5. 提醒用户:device.json(设备信息)、network.json(WiFi配置)、rule_scripts.json(规则脚本)需要在 Web 界面中自行配置
如果信息不足以确定某些配置,请使用合理默认值并在摘要中标注。快速使用示例
示例 1:上传设备说明书
在 DeepSeek / 通义千问聊天窗口:
- 📎 上传设备说明书(PDF / 图片 / Word 均可)
- 📋 粘贴上方「提示词正文」全部文本
- 💬 末尾补充关键参数:
请根据这个设备说明书生成核心配置文件(外设、执行规则、通信协议)。
MQTT 服务器 iot.fastbee.cn:1883,账号 admin/pass123,产品编号 1001。示例 2:上传电路图 + 需求文档
- 📎 上传电路图截图 + 需求文档(可同时上传多个文件)
- 📋 粘贴上方「提示词正文」
- 💬 末尾补充:
按照电路图的引脚分配和需求文档的功能描述生成核心配置(外设、执行规则、通信协议)。
产品编号 5001。示例 3:直接在聊天框输入需求(无需上传文档)
(粘贴提示词正文)
芯片 ESP32,MQTT 用 iot.fastbee.cn:1883 账号 user01/pass01,产品号 3001。
外设:GPIO4 接 DS18B20 水温探头,GPIO5 接继电器控制水泵,GPIO15 接蜂鸣器。
规则:水温超过 35°C 开蜂鸣器报警,低于 20°C 开水泵,每 60 秒上报一次数据。
按键 GPIO0 单击手动上报,长按 5 秒恢复出厂。示例 4:直接在聊天框描述设备接线
(粘贴提示词正文)
我的设备接线如下:
- ESP32-S3 开发板
- GPIO4 接 DS18B20 水温探头(外接4.7K上拉电阻)
- GPIO5 接继电器模块 CH1(控制水泵,低电平触发)
- GPIO13 接继电器模块 CH2(控制补光灯,低电平触发)
- GPIO15 接 PWM 风扇(25kHz)
- GPIO16 接蜂鸣器(高电平)
- GPIO17 接 RS485 TX
- GPIO18 接 RS485 RX
- GPIO12 接 RS485 DE 方向控制
- GPIO21 I2C SDA(接 SHT30 温湿度)
- GPIO22 I2C SCL(接 SHT30 温湿度)
- GPIO36 接土壤湿度传感器模拟输出
MQTT: 192.168.1.100:1883 账号 farm/farm_pass,产品号 5001。
每60秒采集数据上报,土壤湿度<30%开水泵,>70%关泵,温度>35°C开风扇。示例 5:上传 BOM 清单 + 接线表
- 📎 上传 Excel/CSV 格式的 BOM 清单和接线表
- 📋 粘贴上方「提示词正文」
- 💬 末尾补充:
根据 BOM 中的元器件和接线表的引脚分配生成核心配置(外设、执行规则、通信协议)。
MQTT 参数请使用默认值(暂不启用)。示例 6:从 FastBee 平台配置到设备端完整对接
(粘贴提示词正文)
我已在 FastBee 平台创建了产品,配置如下:
- 产品编号:5001
- MQTT 服务器:iot.fastbee.cn:1883
- 认证账号:farm 认证密码:farm_pass
平台物模型已配置:
属性:temperature(空气温度,℃)、humidity(空气湿度,%)、soil_moisture(土壤湿度,%)
功能:water_pump(水泵控制)、light(补光灯)
事件:high_temp_alarm(高温告警)
设备信息:
- ESP32-S3
- GPIO4 DS18B20 → 对应物模型 temperature
- GPIO21/22 SHT30 → 对应物模型 humidity
- GPIO36 土壤湿度 → 对应物模型 soil_moisture
- GPIO5 继电器 → 对应物模型 water_pump
- GPIO13 继电器 → 对应物模型 light
- 温度>35°C时上报 high_temp_alarm 事件
- 每60秒上报一次数据附录:FastBee 平台物模型配置流程
以下是平台侧的简要操作流程,完成后将获取的参数告诉 AI 即可生成设备端配置。 详细文档:https://fastbee.cn/doc/business/manual/things.html
平台操作流程
创建产品 → 配置物模型 → 发布产品 → 获取连接参数 → 生成设备配置① 创建产品(设备管理 → 产品管理 → 新增)
FastBee-Arduino 设备推荐选择:直连设备 + MQTT + JSON 解析 + 简单认证
创建后系统生成:产品编号、认证账号、认证密码。
② 配置物模型(产品详情 → 产品模型)
| 类型 | 用途 | 数据方向 | 选择建议 |
|---|---|---|---|
| 属性 | 传感器数据/设备状态 | 设备↔平台 | 温度、湿度、开关状态等,传感器数据设为「只读」,可控状态设为「可写」 |
| 功能 | 下发控制指令 | 平台→设备 | 开关控制、档位调节、手动触发上报等 |
| 事件 | 异常告警/通知 | 设备→平台 | 温度过高、设备故障等阈值触发的告警 |
每个物模型都有一个模型标识(如 temperature、water_pump),这个标识必须与设备端外设的 sensorId 完全一致。
③ 发布产品 — 物模型配置完成后点击「发布」,未发布的产品设备无法连接。
④ 获取连接参数 — 在产品详情的基本信息中获取:
| 平台参数 | 设备端 JSON | 填入位置 | 配置方式 |
|---|---|---|---|
| 产品编号 | device.json | productNumber | Web 界面自填 |
| 认证账号 | protocol.json | mqtt.username | AI 生成 |
| 认证密码 | protocol.json | mqtt.password | AI 生成 |
| MQTT 服务器/端口 | protocol.json | mqtt.server / mqtt.port | AI 生成 |
设备的
deviceId和 MQTTclientId会在首次启动时自动生成,无需手动配置。
⑤ 将上述参数 + 设备接线信息告诉 AI,即可生成核心配置文件。参考示例 6 的输入格式。产品编号需在 Web 界面「设备配置」中自行填写。
示例 7:ESP32-C3 开发板 DHT11 温湿度 + OLED 显示 + LED 控制
这是一个常见的入门级 IoT 开发板配置,适用于带 OLED 屏幕的 ESP32-C3 开发板。
(粘贴提示词正文)
芯片 ESP32-C3,开发板带 OLED 屏幕。
MQTT 用 iot.fastbee.cn:1883 账号 test/test,产品号 123456。
硬件接线(开发板已内置,无需额外接线):
- GPIO8 板载 LED(蓝色)
- GPIO10 接 DHT11 温湿度传感器数据线
- OLED 屏幕 I2C 接口:SDA=GPIO5, SCL=GPIO6(SSD1306, 72x40)
功能需求:
1. 每 10 秒采集 DHT11 温度和湿度,上报到 IoT 平台
2. OLED 屏幕自动显示温湿度数据
3. IoT 平台可以远程控制 LED 灯的开关(通过功能下发指令)此场景的配置要点:
- DHT11 必须用 type=38(SENSOR_GENERIC),不能用 type=44
- OLED 屏幕用 type=36(LCD),I2C 模式 interface=2,分辨率必须填 72x40(ESP32-C3 开发板常见 0.42寸小屏,不要默认填 128x64,否则黑屏)
- pins=[5, 6](SDA 在前, SCL 在后)
- 执行规则用 triggerType=5(轮询触发),intervalSec=10
- 温度和湿度各需一个 actionType=19 的 action,通过 sensorCategory="dht11" 和 dataField 区分
- OLED 显示用 actionType=27,actionValue 为多行模板(如
T: ${dht11_1.temperature}°C\nH: ${dht11_1.humidity}%RH),72x40 屏幕最多显示 3 行,syncDelayMs 设为 200 - LED 控制由平台
/function/get主题自动处理,无需额外执行规则 - ESP32-C3 可用 GPIO:0-10、18-21,GPIO11 绝对不可用
