3.0 KiB
3.0 KiB
Poo Recorder
本文档说明 poo recorder 在 Python 项目中的当前行为边界,以及 poo SQLite 的 Alembic 接管策略。
当前基线
当前生产版本中的真实 SQLite schema 为:
CREATE TABLE poo_records (
timestamp TEXT NOT NULL,
status TEXT NOT NULL,
latitude REAL NOT NULL,
longitude REAL NOT NULL,
PRIMARY KEY (timestamp)
);
历史上 legacy Go 实现使用:
PRAGMA user_version = 1;
当前 Python 迁移以这套 schema 为事实基线,不重新设计表结构。
当前已迁入的 API
当前 Python 项目已经接入:
POST /poo/recordGET /poo/latest
POST /poo/record
用途:
- 记录一条 poo event
- 最佳努力地刷新 Home Assistant sensor
- 如果配置了
POO_WEBHOOK_ID,最佳努力地触发 Home Assistant webhook
请求体:
{
"status": "done",
"latitude": "1.23",
"longitude": "4.56"
}
当前策略:
- unknown field:
400 bad request - 数值非法:
400 bad request - 记录成功后,即使 Home Assistant side effect 失败,也不会回滚本地 DB 写入
GET /poo/latest
用途:
- 读取最新一条 poo 记录
- 将其重新发布到 Home Assistant sensor
当前外部行为与 legacy 保持一致:
- 成功:空响应体,HTTP 200
- 如果当前 DB 里还没有任何 poo 记录:仍返回空响应体,HTTP 200,但不会发布 sensor
- 真正的发布失败:简洁
internal server error
Home Assistant side effects
当前已复用 Python 项目中已有的 Home Assistant outbound adapter。
当前支持:
- 发布 / 更新 poo status sensor
- 可选触发 webhook
相关配置:
HOME_ASSISTANT_BASE_URLHOME_ASSISTANT_AUTH_TOKENHOME_ASSISTANT_TIMEOUT_SECONDSPOO_SENSOR_ENTITY_NAMEPOO_SENSOR_FRIENDLY_NAMEPOO_WEBHOOK_ID
Alembic 接管策略
poo 的接管逻辑刻意保持与 location 一致。
当前 baseline revision:
20260420_01_poo_baseline
当前提供的脚本入口:
python scripts/poo_db_adopt.py
或:
python -m scripts.poo_db_adopt
规则如下:
- 如果本地不存在 poo DB 文件:
- 视为新库初始化
- 通过
alembic_poo upgrade head创建新库
- 如果本地已经存在 legacy DB:
- 先检查
poo_records表 schema - 再检查
PRAGMA user_version = 1 - 只有完全匹配,才通过 Alembic
stamp接管
- 先检查
- 如果 schema 或
user_version不匹配:- 直接失败
- 不自动修复
- 如果数据库已经存在
alembic_version:- 只有 revision 与当前 baseline 一致才接受
- 否则直接失败
同时,应用启动时也会对 POO_DATABASE_URL 做只读校验:
- 文件不存在:拒绝启动
- DB 尚未被 Alembic 接管:拒绝启动
- revision 不匹配:拒绝启动
明确移除 Notion
这一轮不会迁入任何 Notion 逻辑。
也就是说,当前 Python 版的 poo recorder:
- 不保留 Notion adapter
- 不保留 Notion sync
- 不保留
tableId依赖 - 不因为 legacy 中存在 Notion 就继续保留兼容层