大人的园务台 孩子的小花园

wojiaohua.cn / 今日园务
小程序 MINI PROGRAM

孩子看到的,就是这几张图

数据怎么流动 DATA FLOW

一次浇水,怎么走到窗台

三根管道、四个节点:手机和电脑先把请求交给云端,云端再把指令送到窗台,读数再沿原路回来。全程一步一步走,跟着那束光就知道数据到了哪。

01 / 04 · 手机 · 小程序
孩子这一头
打开就是今天的浇水计划和提醒;打卡、日记、照片写回云端,大人那边看的是同一份数据。
硬件接线 WIRING

哪根线插哪个孔

两个传感器进 ESP32,一根信号线去水泵驱动模块,模块再把水泵接通。每颗孔旁边印着它自己在实物上叫什么,同一行另一头写着它要去的那颗孔:DHT11 的 S 出发,落在 ESP32 标着 21 的孔上。

keyes DHT11 温湿度模块:蓝色小板、白色防反插端子、三颗针印着 S / VCC / GND
DHT11 温湿度
单总线,一根 S 线就够了
→ 21S → 3V3VCC → GNDGND
TLC555 电容式土壤湿度模块:黑色小板、两条探针插土、右边缘三颗针
土壤湿度
TLC555 电容式,探头插土,AOUT 出 0–3 V
→ 34AOUT → 3V3VCC → GNDGND
ESP32 主控
本地决策的大脑,断网也照浇
ESP32 开发板:两排排针孔、四角固定孔、左侧 USB-C
板上左排
21S 34AOUT 3V3VCC ×2 GNDGND ×2
板上右排
IN+23 IN−GND
单通道 H 桥水泵驱动模块:左边两颗控制针 IN+ / IN−,右边两颗电源针 V+ / G−,下沿两颗输出针接泵
水泵驱动模块
单通道 H 桥,1.8–6.8 V / 1.2 A
控制端
IN+23 IN−GND
电源 / 泵输出
电源 +V+ 电源 −G− 泵红线OUT1 泵黑线OUT2
3–5 V 电源
给泵供电,只与主控共地
→ V++ → G−−
微型潜水泵
微型潜水泵
从水桶抽水,只在浇的那几秒通电
→ OUT1红线 → OUT2黑线
3V3 电源 GND 共地 数字 / 模拟信号 水泵负载线 顺着颜色找线:孔旁边是这颗孔自己的名字,同一行另一头写着它要去哪
固件升级 OTA

换固件,先过四道闸

后台把 .bin 传上网关,点一次升级要走完四道检查才下发;设备下载断了会从断点接着下,写坏了不切换分区,新固件三次启动没通过自测就退回原来那一版。

园务台 / 固件升级网关已连 broker
固件产物
/opt/plant/firmware
BIN v1.3.0.bin1.14 MB · sha256 9f3c…a1 当前最高
BIN v1.2.7.bin1.12 MB · sha256 4d8e…07 历史
BIN v1.2.4.bin1.10 MB · sha256 e21b…c4 历史
↑ 把 .bin 拖进来文件名必须长成 v1.3.0.bin 这种形状
带路径的一律拒绝../../etc/v1.0.0.bin 不会入库
园务台 / 设备档案网关已连 broker
下发升级 · 窗台 1 号
ESP32 · 1.2.7
1产物在盘上,文件名合规通过
2目标版本比当前高通过
3网关连着 MQTT broker通过
4设备此刻在线通过
窗台 1 号→准备刷成 1.3.01.2.7 → 1.3.0
设备离线?直接拒绝,不写升级记录,也不进离线队列——迟到几个小时的刷机指令,比当场失败更危险。
窗台 1 号 / 串口日志OTA 进行中
设备串口
115200 baud

OTA 已排队 1.3.0 ← /firmware/v1.3.0.bin

第 1 次尝试 写入 524288 字节后连接结束

第 2 次尝试 Range: bytes=524288- → 206

续传到 1144000 字节,体积与后台一致

Update.end(true) 镜像自校验通过

切换启动分区 重启进入 1.3.0

写入备用分区 B100%
45 秒没有新字节就认输主动中止并保留旧固件,水泵和 MQTT 都能恢复。
园务台 / 升级记录OTA 记录
升级记录
ota_log
#431.2.4 → 1.2.7 · 书房 3 号下载中
#421.2.7 → 1.3.0 · 窗台 1 号成功 · 版本对账
#401.2.7 → 1.2.8 · 窗台 1 号失败 · 连接提前结束
#391.2.4 → 1.2.7 · 窗台 1 号作废 · 等不到设备
成功不靠设备自报重启后上报的 firmware_version 等于目标版本,才把记录改成成功。
版本还有人在用就不许删还有进行中的升级记录占着这个版本,后台会拒绝删除产物。
01 / 04 · 产物

文件名就是版本号

v1.3.0.bin 上传就记成 1.3.0 版;带路径、不是 .bin、名字不成形的一律不入库。

只认这一种形状v1.2.0.bin 或 1.2.0-rc1.bin;../、子目录、别的扩展名直接拒绝。
原子落盘先写临时文件再改名,半截文件不会被当成可用产物。
sha256 只留档上传时算一遍写进操作日志;真正校验镜像的是设备端的 esp_ota_end()。
.binsha256 留档体积上限
02 / 04 · 四道闸

四道闸,一道不过就不发

产物在盘上、目标版本更高、网关连上了 broker、设备此刻在线——四条同时成立才写升级记录并下发。

版本只升不降目标不比当前高就拒绝,防止刷回旧固件后与后台账面对不上;设备没报过版本时放行,记录里写明没做单调性判断。
broker 没连上就拒绝报文只会积在网关内存里,设备收到的是迟到的指令,比当场失败更危险。
设备离线不排队OTA 绝不进离线队列;这一刻发不出去,就等它上线后重新发起。
版本单调在线直发不排队
03 / 04 · 下载与校验

断在半路,接着下

从断点续传,最多试 3 次;45 秒没有新字节就主动认输,旧固件继续运行。校验通过才切换启动分区。

体积先对账后台给了字节数,收到的不一致就当场失败,不写坏分区。
写进备用分区A 分区照常跑,B 分区接收;Update.end(true) 内含镜像自校验。
失败不重启没有切启动分区,设备留在旧版本,水泵和 MQTT 都不受影响。
Range 续传试 3 次45 秒停滞认输
04 / 04 · 重启与回滚

三次没自证,就退回去

重启后连上 MQTT 并发出 capability 才算自测通过;后台再用上报的版本号对账,不采信设备自报成功。

启动先记账每次启动先累加计数,刷坏了无限重启也数得到第 3 次。
退回原分区3 次仍未销账,就把启动分区指回升级前那一块。
等不到回话就作废后台可以把一直挂着的记录标为作废;还有升级在用的版本不许删。
自测 1/3版本对账作废留审计
待确认 / 下载中 成功 · 版本对账 失败 · 原因留档 作废 · 等不到设备 后台的升级记录只有这几种状态,不猜
数据与留痕 DATA

能恢复的,才叫备份

每天 03:30 把全库和源码备一份,周日把备份真恢复到临时库核对;操作日志按人署名,删除也不抹审计。

03:30每日备份
外环 24 小时 · 每天 03:30 内环一周 · 周日 04:00
日备留 7 天7d
周备留 28 天28d
01 / 03 · 每日备份

每天 03:30,全库 + 源码

一份数据库 dump、一份源码包,连同 SHA256SUMS 一起落盘;日备留 7 天,超期自动删。

一份库一份源码pg_dump -Fc --no-owner 出的 dump,加上网关、小程序与后台的源码包。
写完自报结果末行 BACKUP-OK 是唯一验收口径,平时只看这一行。
同盘不算异地默认只写本机磁盘,脚本自己会警告;异地留档要另外配。
03:30留 7 天BACKUP-OK
02 / 03 · 每周校验

周日 04:00,把备份真恢复一次

在随机命名的临时库里恢复,核对行数与列数、应用账号读得动,退出时删掉临时库——生产库一行不动。

真恢复,不是看文件大小2026-10-24 的实测回执是 verify=ok cols=147 app_role=plant。
临时库随机命名脚本跑完即删,不在生产库上做演练。
周备留 28 天比日备长,覆盖一个月的回滚窗口。
verify=okcols=147临时库即删
03 / 03 · 异地留档

电脑上那份,才算异地

pull-backup.sh 一条命令把 dump 和源码拉回本机,逐份对 sha256;服务器那块盘坏了,手里还有一份。

一条命令拉回本机密钥已经装好,双击工具或跑脚本都能拉。
逐份校验拉回后对 SHA256SUMS,全部通过才算完成。
演练过一次整机全毁2026-10-24 只用电脑上那份 dump + tgz 重建整站,演练环境已删,生产未受影响。
pull-backup.shsha256 全对D:\plant-backups
留多久写清楚日备 7 天、周备 28 天,超期自动删;保留期不是靠人记得。
谁改的查得到操作日志按管理员账号逐条署名;删账号、删记录不抹历史审计。
小孩只看自己的小朋友的账号只管自己的植物,大人的具名账号才进园务台。
三层兜底 FALLBACK

没人看着的时候
它们自己会动

断网照浇、刷坏了退回旧版、每天备份每周校验——三层兜底各自有一件事在没人看着的时候发生。

断网也会浇水的硬件
  • 本地自动决策土壤湿度低于阈值就地浇水,不依赖网络;阈值与浇水量在小程序或园务台里改。
  • 离线指令队列断网时指令先进设备队列,回线后按序补发,不会静默丢掉。
  • MQTT 实时通道浇水指令秒级送达,读数与告警实时回传。
wojiaohua.cnwojiaohua.cn

▲ 一个人的花园,也按能长期跑的标准做