LoRaWAN 农业环境监测方案:选型、部署与接口
这是运维看板,不是计量认证系统:显示的数值就是节点上报的原值,只加了单位。
这套方案是干什么的
大棚里,土壤水分和电导率决定什么时候灌溉、什么时候追肥;大田里,雨量和土壤温度对另一种作物起同样的作用。SenseCAP LoRaWAN 节点测出这些量并无线上报,上行进入 Home Assistant 后成为带单位、device class 和 state class 的实体:显示在看板上、积累历史,数值越界时发通知。
适用于大棚、大田地块、没有可用外网的场地,以及想要一份本地看板又不愿搬动现有链路的存量 SenseCAP 部署。
- 选型与部署:可部署方案页
SenseCAP 节点开箱即用
S210x 节点按自身配置的周期上报,不需要下发任何配置;实体由 MQTT 自动发现建好,带单位和类型,不用手写 YAML。
第三方探头按同一套接入
已有的 RS485 或模拟量探头经 S2100 数据采集器接入,走同一张测量映射表。映射表、compose 文件、看板与自动化都在公开的方案包里,新增一个量在配置文件里加一行。
可以完全不联外网
ChirpStack 跑在 M2 网关上,桥和 Home Assistant 跑在本地主机上,不用云账号,不需要出站连接。
换网络服务器,看板不用改
SenseCAP 云、自建 The Things Stack、本地 ChirpStack 三条路径的实体命名相同,换路径时看板、自动化和导出都不用改。

需要哪些硬件
现场四样东西:LoRaWAN 节点、能收到它们的网关、网络服务器,以及一台装了 Docker 的 Linux 主机。
① 节点——SenseCAP S210x 传感器直接测量;S2100 数据采集器把已有的第三方 RS485 或模拟量探头接进同一张 LoRaWAN 网。两者都不需要下发任何东西,按节点上自己配置的周期定时测量并上报。
② 网关与网络服务器——三条路径只在这里不同,选哪条决定现场要不要外网。
| 设备 | 承担 | 什么时候选它 | |
|---|---|---|---|
![]() | SenseCAP S210x 土壤与空气传感节点 | 测量并上报 | 必配。按需要的量选型号,按所在地区选频段 |
![]() | SenseCAP S2100 LoRaWAN 数据采集器 | 第三方探头转 LoRaWAN | 已经有 RS485 或模拟量探头 |
![]() | S-Soil MTEC-02B RS485 土壤水分温度电导率探头 | 经 RS485(Modbus-RTU)接到 S2100,由 S2100 发 LoRaWAN 上行 | 要测土壤水分、温度、电导率,且走 S2100 这条链路 |
![]() | SenseCAP M2 LoRaWAN 室内网关 | 转发到 SenseCAP 云,或自己跑 ChirpStack | 要完全本地部署:在 M2 的 Web 界面里切到内置网络服务器即可 |
![]() | reComputer R12 系列 LoRaWAN 网关与工业控制器 | 自建网关,同一台机器跑 The Things Stack | 自建 The Things Stack 且手上没有网关 |
![]() | reRouter CM4 reRouter CM4 主机 | 跑网络服务器,或跑看板 | 需要一台主机,且手上没有现成的 Docker 机器 |
③ 看板主机——任意装了 Docker 的 Linux 机器,跑 Home Assistant、MQTT broker 和 agri-env-bridge,不需要外网入站访问。
节点、网关、集中器按同一频段选购(EU868 / US915 / AS923 等),频段出厂固定,软件里改不了。两条自建路径还需要每个节点的 DevEUI、JoinEUI、AppKey,用来在网络服务器上注册设备。
选型排他边界
- 高频高带宽业务:LoRaWAN 节点上报默认推荐 5–60 分钟,适用于温湿度、光照、土壤传感器;若有连续视频监控或秒级高频采样需求,请勿使用 LoRaWAN,应选配 4G/有线工业相机。
- 金属密闭与深地障碍:厚金属筒仓、金属大棚骨架密集区域或地下深井会导致 LoRaWAN 信号严重衰减,需增设吸顶天线或采用 RS-485 有线传感器中继。
现场怎么部署
一、装节点
土壤探头读的是它所在的那一层。10 cm 与 40 cm 的读数是两个实体(soil_moisture_10cm … soil_moisture_40cm)。挖第一个坑前按作物根区定好深度;装好后挪动探头,该实体已有的历史会失去可比性。
射频覆盖按现场实测,这里不给距离数字。定传感点位置前,先在现场确认节点上行能被网关收到。
二、装软件:按路径 3 到 6 步
逐设备步骤和应用包在可部署方案页,按现场条件选好配置后下载。
步骤轮廓:
- 在 Linux 主机上部署 Home Assistant 与 broker(三条路径都有,一次 Docker compose 部署)。
- 把网络服务器跑起来——云路径无事可做;ChirpStack 路径在 M2 的 Web 界面里切到内置本地网络服务器,或者在一台 Linux 主机上拉起 ChirpStack compose stack;The Things Stack 路径在 reComputer R12 系列网关上把带 Postgres 与 Redis 的 stack 拉起来。
- 装 decoder(仅自建路径)——The Things Stack 上装 payload formatter,ChirpStack 上装 device-profile codec。不装则不会出现任何实体。
- 入网节点(仅自建路径)——在网络服务器上逐个注册 DevEUI、JoinEUI、AppKey。
- 部署桥,source 按路径配置,填入 broker 凭据。
- 导入看板与自动化,确认实体带着数值出现。
预计 45 分钟,难度 intermediate。The Things Stack 路径最久:集中器要物理安装,stack 还要拉起自己的数据库和缓存。
三条路径的验收相同:最后一步导入的 Lovelace 看板上,实体带着数值显示出来。
有哪些接口
所有数据从看板主机上的一个 MQTT broker 出来,端口 1883,三个 retained 主题就是全部接口。
- Home Assistant——零配置。桥发布自动发现配置,实体自动出现并带上正确的单位、device class 和 state class,不用手写 YAML。
- 灌溉或农业管理系统——订阅
agri_env/sensecap_<deveui>/<entity_key>/state取值,订阅agri_env/sensecap_<deveui>/availability判断节点是否还活着。两者都是 retained,后连上来的订阅方也能立刻拿到当前全貌。 - 自建服务——
homeassistant/…上的自动发现配置带着完整的实体元数据(单位、device class、state class、设备标识),据此即可建表。
完整的主题与 payload
| 主题 / 端口 | 内容 | retained |
|---|---|---|
homeassistant/sensor/sensecap_<deveui>/<entity_key>/config(1883) | 自动发现配置,每个实体一条:name、unique_id、object_id、state_topic、availability_topic、unit_of_measurement、state_class、device.identifiers | 是 |
agri_env/sensecap_<deveui>/<entity_key>/state(1883) | 单个测量项的值,例如 33.8 | 是 |
agri_env/sensecap_<deveui>/availability(1883) | online 或 offline | 是 |
实体命名:实体 ID 是 sensor.sensecap_<deveui>_<entity_key>,DevEUI 小写且用完整 DevEUI;用缩短形式时,地址后缀相同的两个节点会冲突。改命名规则时要同时清掉 broker 的 retained 消息和 Home Assistant 的实体注册表,否则重启后旧主题会回来。
broker 只放在可信局域网内,不要暴露到公网。 凭据在主机的 .env 里;ChirpStack 路径下 LNS 侧的 broker 在 compose 网络内不带认证运行。
性能与实测数据
运行时与关键参数
三条路径背后是同一个服务 agri-env-bridge,与 Home Assistant、MQTT broker 一起跑在看板主机上。
| 路径 | 桥读什么 |
|---|---|
| SenseCAP 云 | SenseCAP OpenAPI 加云端 MQTT 流;首次启动按月回填历史 |
| The Things Stack | stack 的 MQTT 集成,上行已由 payload formatter 解码 |
| ChirpStack | ChirpStack 的 MQTT 集成,上行已由 device-profile codec 解码 |
- 测量映射表:
assets/config/measurements.yaml。覆盖四个深度的土壤温度与水分、土壤张力、热通量与体积含水率;空气温湿度、CO2、气压、PM2.5 与 PM10、噪声;pH、溶解氧、浊度、TDS、盐度与水温;风速风向、总辐射、日照时长、PAR 与光量子;瞬时流量、累计流量、液位与漏水。新增一个量在文件里加一行,不用改代码;数值本身不缩放,只贴单位。 - 离线判定阈值:默认 S210x 两个上报周期加余量。超时后该节点的实体在 Home Assistant 里变成不可用,保留最后一个值。
- 去重:读数按
(DevEUI, measurementId, 时间戳)去重,云端回填与实时流不会把同一条读数记两遍;同一实体出现两个值时,较晚的那条胜出。 - 功能检查:录制的上行按三种来源格式回放进 broker,共建出 15 个实体。
- 复现:回放测试位于方案仓库
tests/replay_bench.py,执行python3 tests/replay_bench.py --fixtures tests/data/验证三类上行与 15 个实体自动注册。
已知退化
- broker 是单点:broker 停了,三条路径都不再更新。状态主题是 retained 的,Home Assistant 重启后能恢复最后的值。
数据与素材出处
measurementId到物理量的对照表(assets/config/measurements.yaml)读自 Seeed-Solution/SenseCAP-Decoder 仓库 commitd0a2342的 decoder 源码——S210X 系列取自third_party/SenseCAP-Decoder/S210X/Helium/SenseCAP_S210X_Helium_Decoder.js,T1000 取自third_party/SenseCAP-Decoder/T1000/TTN/SenseCAP_T1000_TTN_Decoder.js。YAML 里每条记录都标注了它的源文件与行号。- 该仓库的许可状态未确认:没有 LICENSE 文件,README 里也没有许可段落;唯一的许可声明在一个第三方贡献的文件头里,写的是
Unlicensed for internal use。方案包不分发 decoder,只用了id → 物理量的对应关系;两条自建路径的部署指南链接上游仓库。要随部署分发 decoder 本身,先与 Seeed 确认许可。 device_class、unit_of_measurement、state_class三列不来自 decoder——那里没有这些信息,它们取自 Home Assistant sensor 文档。- 架构图由 Architecture IR 生成,产品贴图取自已审核的 Seeed 产品素材库。





