73 lines
2.8 KiB
Markdown
73 lines
2.8 KiB
Markdown
# 墨水屏仪表盘推送(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`(硬阈值),纯黑白图最锐利。
|
||
```
|