# 墨水屏仪表盘推送（eink-push）

将橘喵今日经营、近30天趋势、日期与天气合成为一张 **400×300 纯黑白**图片，
推送到 Zectrix 极趣云墨水屏设备（`zectrix-s3-epaper-4.2`，1bit）。

纯 Python + Pillow + Fusion Pixel 点阵字体，**无浏览器依赖**，适合后台/定时运行。

## 效果

- 顶部：大号时钟 + 日期 ｜ 天气（图标 + 温度 + 区间）
- 中部：橘喵今日经营（单量 / 流水 / 毛利，含环比、同比涨跌）
- 底部：近30天三指标趋势折线图（同一图表，实线 / 虚线 / 点线区分，X 轴仅月/日）

## 目录结构

```
eink-push/
├── main.py        # 入口：取数据 → 渲染 → 推送
├── config.py      # 配置：API Key、设备、字体、尺寸、推送参数
├── data.py        # 数据层：拉真实数据并映射，失败回退 mock
├── jm_api.py      # jm-devops 后端统计接口客户端（免鉴权 GET）
├── renderer.py    # 渲染层：DashboardRenderer 生成 400×300 图片
├── pusher.py      # 推送层：设备列表 / 推送图片（标准库 urllib）
├── fonts/         # Fusion Pixel 点阵字体（OFL 协议）
├── output/        # 生成的图片（git 忽略）
├── requirements.txt
└── README.md
```

## 安装

```bash
pip install -r requirements.txt
```

## 使用

```bash
python3 main.py               # 渲染并推送（默认取设备列表第一个）
python3 main.py --render-only # 只渲染到 output/dashboard.png，不推送
```

环境变量可覆盖配置：

```bash
ZECTRIX_API_KEY=zt_xxx ZECTRIX_DEVICE_ID=AA:BB:CC:DD:EE:FF python3 main.py
```

## 定时刷新（cron 示例，每 15 分钟）

```cron
*/15 * * * * cd /path/to/eink-push && /usr/bin/python3 main.py >> /tmp/eink.log 2>&1
```

## 数据来源

- **橘喵今日经营 + 近30天趋势**：已接入 jm-devops 后端统计接口（`jm_api.py`），
  免鉴权直接 GET：
  - `GET /system/statistics/realtime` —— 今日单量/流水/毛利 + 环比/同比
  - `GET /system/statistics/recent-days?days=30` —— 近30天每日数据
  `data.py` 负责把响应映射成渲染结构；**拉取失败会自动回退 mock**，
  设 `JM_USE_MOCK=1` 可强制用 mock 离线调试。后端地址等见 `config.py`。
- **天气**：`data.py` 的 `_weather()` 仍为 mock 占位，接入真实天气 API 时替换它即可。
- **日期 / 时间 / 上次更新**：真实系统时间。

## 设计说明

- 设备为 **1bit 无真灰阶**，灰阶只能抖动成网点（难看），故全程纯黑白，靠构图、字号、留白建立层级。
- 字体用 **Fusion Pixel 12px 点阵字体**，按整数倍尺寸(12/24/48)渲染、关闭抗锯齿 → 像素锐利；
  重点数据用「伪粗体」(偏移叠绘)加粗。
- 推送用 `dither=false`（硬阈值），纯黑白图最锐利。
```
