Install
openclaw skills install tianjin-anxinhuarui-gas-monitoring-iot基于QuecPython平台的Modbus协议IoT框架,支持多传感器数据采集、4G通信、云端上报及OTA远程升级。
openclaw skills install tianjin-anxinhuarui-gas-monitoring-iot技能名称: quecpython-modbus-iot
版本: 1.0.0
作者: 天津安信华瑞科技有限公司
描述: 基于移远 QuecPython 平台的 Modbus IoT 设备通用框架,支持传感器数据采集、4G 网络传输、云平台对接、OTA 升级等功能。
当用户提到以下需求时激活此技能:
将技能模板复制到用户项目目录:
# 从技能模板创建新项目
cp -r ~/.easyclaw/skills/quecpython-modbus-iot/template/ ~/projects/your-project/
编辑 config/config.py 文件,修改以下关键参数:
# ========== 必须修改的配置 ==========
# 1. 数据上报平台地址
URL_REPORT = "https://your-platform.com/api/data" # 客户平台地址
URL_OTA = "https://your-ota-server.com/ota" # OTA 服务器地址
# 2. 设备信息
PROJECT_NAME = "your-project-name" # 项目名称
PROJECT_VERSION = "1.0.0" # 版本号
MANUFACTURER_NAME = "Your Company Name" # 厂商名称
MANUFACTURER_ID = "your-contact-phone" # 联系电话
# 3. 上报频率 (秒)
REPORT_INTERVAL_SEC = 60 # 60 秒 = 1 分钟,可根据需求调整
# ========== 根据硬件修改的配置 ==========
# 4. Modbus 通信参数
MODBUS_UART = 2 # UART 端口 (1/2/3)
MODBUS_BAUDRATE = 9600 # 波特率 (根据传感器调整)
# 5. LED 引脚
LED_NET_PIN = 36 # 网络指示灯 GPIO
LED_MODBUS_PIN = 44 # Modbus 指示灯 GPIO
# ========== 可选修改的配置 ==========
# 6. 传感器配置
SENSOR_MAX_COUNT = 32 # 最大传感器数量 (1-32)
SENSOR_BASE_ADDR = 1000 # 浓度数据起始地址
SENSOR_STAT_ADDR = 2000 # 状态数据起始地址
# 7. 重试次数
MODBUS_RETRY_MAX = 5 # Modbus 重试次数
HTTP_RETRY_MAX = 2 # HTTP 重试次数
如果传感器协议与默认不同,修改 src/sensor_device.py:
# 修改状态码解析
def read_status(self):
result = self.modbus.read_registers(1, 2000 + self.addr, 1)
status_value = result['data'][0]
# 根据你的传感器协议修改状态码
if status_value == 0:
# 正常
pass
elif status_value == 1:
# 你的自定义状态
self.level_1_alarm = 1
# ... 更多状态
如果平台数据格式不同,修改 src/data_reporter.py:
def report_sensor_data(self, net_info, sensor_stat, sensor_dens, sys_stat):
# 修改数据格式
body = {
# 根据你的平台协议修改字段
'device_id': net_info.get('IMEI', ''),
'timestamp': utime.time(),
'sensors': sensor_stat,
# ...
}
将以下 8 个文件复制到 QuecPython 设备的 /usr 目录:
/usr/
├── config.py ← 从 config/config.py 复制
├── main.py ← 从 src/main.py 复制
├── led_control.py ← 从 src/led_control.py 复制
├── modbus_rtu.py ← 从 src/modbus_rtu.py 复制
├── sensor_device.py ← 从 src/sensor_device.py 复制
├── network_manager.py ← 从 src/network_manager.py 复制
├── system_manager.py ← 从 src/system_manager.py 复制
└── data_reporter.py ← 从 src/data_reporter.py 复制
| 参数 | 说明 | 默认值 | 必须修改 |
|---|---|---|---|
URL_REPORT | 数据上报平台地址 | 天津安信华瑞平台 | ✅ |
URL_OTA | OTA 升级服务器地址 | 天津安信华瑞 OTA | ✅ |
PROJECT_NAME | 项目名称 | tuoan_demo_shenzhen | ✅ |
PROJECT_VERSION | 项目版本 | 2026.3.26 tuoan-dingzhi | ✅ |
REPORT_INTERVAL_SEC | 上报频率 (秒) | 60 | ✅ |
| 参数 | 说明 | 默认值 | 按需修改 |
|---|---|---|---|
MODBUS_UART | UART 端口号 | 2 | 根据硬件 |
MODBUS_BAUDRATE | Modbus 波特率 | 9600 | 根据传感器 |
LED_NET_PIN | 网络 LED 引脚 | 36 | 根据硬件 |
LED_MODBUS_PIN | Modbus LED 引脚 | 44 | 根据硬件 |
| 参数 | 说明 | 默认值 | 按需修改 |
|---|---|---|---|
SENSOR_MAX_COUNT | 最大传感器数 | 32 | 根据实际 |
SENSOR_BASE_ADDR | 浓度数据起始地址 | 1000 | 根据协议 |
SENSOR_STAT_ADDR | 状态数据起始地址 | 2000 | 根据协议 |
# config/config.py
REPORT_INTERVAL_SEC = 300 # 300 秒 = 5 分钟
# config/config.py
URL_REPORT = "https://api.mycompany.com/iot/data"
URL_OTA = "https://ota.mycompany.com/firmware"
# config/config.py
MODBUS_BAUDRATE = 19200
# config/config.py
SENSOR_MAX_COUNT = 8
# config/config.py
DEBUG_ENABLE = False
DEBUG_MODBUS = False
DEBUG_NETWORK = False
DEBUG_HTTP = False
在 src/data_reporter.py 中修改 report_sensor_data() 方法:
# 原格式
body = {
'id': timestamp,
'time': time_str,
'unit_code': net_info.get('IMEI', ''),
# ...
}
# 修改为新格式
body = {
'deviceId': net_info.get('IMEI', ''),
'timestamp': timestamp,
'data': {
'sensors': sensor_stat,
'densities': sensor_dens
}
# ...
}
quecpython-modbus-iot/
├── SKILL.md # 技能说明 (本文件)
├── README.md # 技能介绍
├── template/ # 项目模板
│ ├── config/ # 配置文件
│ │ ├── __init__.py
│ │ └── config.py # ⚙️ 主配置
│ ├── src/ # 源代码
│ │ ├── main.py # 🚀 主程序
│ │ ├── led_control.py # 💡 LED 控制
│ │ ├── modbus_rtu.py # 🔌 Modbus 协议
│ │ ├── sensor_device.py# 📡 传感器管理
│ │ ├── network_manager.py # 🌐 网络管理
│ │ ├── system_manager.py # 🖥️ 系统管理
│ │ └── data_reporter.py # 📤 数据上报
│ └── docs/ # 文档
│ ├── README.md # 项目说明
│ ├── 部署指南.md
│ ├── 配置说明.md
│ └── 调试指南.md
└── examples/ # 示例配置
├── example-gas/ # 气体监测示例
├── example-temp/ # 温湿度监测示例
└── example-water/ # 水质监测示例
| 模块 | 功能 | 是否可修改 |
|---|---|---|
config.py | 配置参数 | ✅ 必须修改 |
main.py | 主程序逻辑 | ⚠️ 一般不改 |
modbus_rtu.py | Modbus 协议 | ⚠️ 协议不变不改 |
sensor_device.py | 传感器管理 | ✅ 根据传感器修改 |
data_reporter.py | 数据上报 | ✅ 根据平台修改 |
| 模块 | 功能 | 是否可修改 |
|---|---|---|
led_control.py | LED 控制 | ❌ 无需修改 |
network_manager.py | 网络管理 | ❌ 无需修改 |
system_manager.py | 系统管理 | ❌ 无需修改 |
{
"id": 1711600000,
"time": "2026-03-28 09:00:00",
"unit_code": "863950067267346",
"sys_stat": {
"main_power_fail": 0,
"back_power_fail": 0,
"has_alarm": 0,
"has_fail": 0
},
"sensor_stat": [
{
"sensor_index": 1,
"sensor_addr": 0,
"level_1_alarm": 0,
"level_2_alarm": 0,
"com_error": 0,
"sensor_fail": 0
}
],
"sensor_dens": [
{
"sensor_index": 1,
"sensor_addr": 0,
"sensor_dense": 15
}
],
"collections": {
"IMEI": "863950067267346",
"signal_power": 20,
"error_code": 0,
"gas_sensor_state": 0
}
}
# config/config.py
DEBUG_ENABLE = True
DEBUG_MODBUS = True
DEBUG_NETWORK = True
DEBUG_HTTP = True
from modbus_rtu import ModbusRTU
modbus = ModbusRTU(2, 9600, 8, 0, 1, 0)
result = modbus.read_registers(1, 0, 1)
print("电池状态:", result)
from network_manager import NetworkManager
net = NetworkManager("test", "1.0")
if net.wait_connected(30):
info = net.get_network_info()
print("IMEI:", info['IMEI'])
print("信号:", info['signal_power'])
from data_reporter import DataReporter
from led_control import LED
led = LED(36)
reporter = DataReporter(URL_REPORT, URL_OTA, led)
test_data = '{"test": 1}'
result = reporter.post(test_data, URL_REPORT)
print("上报结果:", result)
A: 修改 config.py 中的 REPORT_INTERVAL_SEC 参数
A: 修改 config.py 中的 URL_REPORT 和 URL_OTA
A: 检查 MODBUS_BAUDRATE 是否与传感器一致,检查 RS485 接线
A: 检查 SIM 卡、天线,查看信号强度 net.csqQueryPoll()
A: 修改 sensor_device.py 中的状态解析逻辑
| 版本 | 日期 | 说明 |
|---|---|---|
| 1.0.0 | 2026-03-28 | 初始版本,气体监测设备框架 |
Copyright © 2026 天津安信华瑞科技有限公司
使用此技能前,请确保你有 QuecPython 开发环境和兼容的硬件设备。