森雅养殖场 · 玩客云自动称重系统（V18.5）使用说明
====================================================

一、需要购买的硬件（合计约 900~1000 元）
----------------------------------------------------
1. 耀华电子地磅（XK3190 系列仪表，带双插口版）：约 200 元
   - 一个插口接地磅传感器，另一个插口（RS232 串口输出）接玩客云
2. 玩客云（刷 Armbian / Debian Linux）：约 50 元
   - 自动称重程序跑在这台机器上，7×24 小时开机
3. 科智牧 JY-L8600 低频耳标阅读器（通用 RS485 / FDX-B）：约 660 元
   - 牛经过磅台时自动读取耳标号，识别是哪头牛
4. RS485 双绞屏蔽线若干米（耳标阅读器 ↔ 玩客云）
5. RS232 转 USB 线（地磅仪表 ↔ 玩客云）、RS485 转 USB 线（耳标阅读器 ↔ 玩客云）
   - 或玩客云板载 UART 直连（需按实际硬件接线）

二、工作原理（数据流）
----------------------------------------------------
  牛上磅台 → JY-L8600 读到耳标号 + 地磅重量稳定
        → 玩客云程序写入本地 SQLite（断网也不丢）
        → 每天 22:00 汇总：同一头牛当天多次称重，去掉最大、最小，取平均值
        → 每天 1 次上传主服务器（api.pingling.net）
        → 服务器写入台账 weights 表（来源=自动），与手动称重合并显示

  体重合并显示：同一头牛在网页/小程序"体重变化"里，自动称重的记录
  和手动称重记录放在同一张表，自动记录带"自动"小标签。

三、部署步骤
----------------------------------------------------
1. 把"自动称重-V18.5"整个文件夹拷到玩客云（如 /opt/auto_weight）
2. 编辑 config.json：
     api_base   ：主服务器地址，默认 https://api.pingling.net
     username   ：【服务器账号】= 主服务器（api.pingling.net）上的账号（不是本机账号）
     password   ：该服务器账号的密码
     deploy_url ：本机部署网址，要与部署情况里上报的网址一致
                  （决定上传校验用的是哪条部署记录）
     scale_port ：地磅串口，如 /dev/ttyUSB0
     rfid_port  ：耳标阅读器串口，如 /dev/ttyUSB1
     upload_hour：每天上传时间，默认 22
   （第一次运行会自动登录并缓存 token 到 config.json 的 token 字段）
   ★ 重点：自动称重采集只在本机记录；只有"上传"这一步用服务器账号
     登录主服务器，所以 username/password 必须填主服务器 api.pingling.net
     的账号密码（网页版"自动称重系统"设置里也可以填，两者保持一致）。
3. 安装并启动：
     sudo bash install.sh
4. 看是否正常：tail -f /opt/auto_weight/auto_weight.log
   正常日志：称重成功：耳标 123456789012345 = 456.0 kg（…）

四、VIP 说明
----------------------------------------------------
- 免费用户：自动称重本地记录正常使用；不上传（每天 1 次上传是 VIP 功能）
- VIP 用户（在网页"卡密激活"输入卡密激活后）：自动称重每天 1 次上传 +
  云备份（备份到主服务器 / 远程恢复）
- 超级管理员可在主服务器"部署情况"里开关某一台部署的上传（缓解服务器压力）；
  被关闭上传的部署，上传会被服务器拒绝，但本地记录不受影响

五、协议调试（重要）
----------------------------------------------------
耀华地磅：
  XK3190 系列连续输出 ASCII 帧，程序自动解析 6 位重量（kg）。
  如读数不对，把 auto_weight.log 里的原始字节发给我们，按实际格式调整。

JY-L8600 耳标：
  默认监听模式（RFID 被动上报，程序从响应里提取 10~15 位数字耳标号）。
  如果厂家需要主动发送读卡指令：
    - 在 config.json 的 rfid_cmd 填指令十六进制（空格分隔，如 "AA 01 01 00 00 00 00 00 00 00 00 00 00 00 00"）
    - rfid_regex 填提取耳标号的正则（FDX-B 一般为 15 位数字）
  读不到耳标时，日志里会记录 RFID 原始十六进制数据，便于按厂家协议调整。

六、断网续传
----------------------------------------------------
本地数据先写 SQLite，网络恢复后下次上传会补传所有未上传日期，
不会丢数据。

七、手动操作
----------------------------------------------------
- 手动补传一次：python3 auto_weight.py --once
- 重启服务：sudo systemctl restart auto-weight
- 停止服务：sudo systemctl stop auto-weight
- 查看数据：sqlite3 /opt/auto_weight/weigh_data.db "select * from weigh_logs order by id desc limit 10"
