← 全部笔记

HARDWARE TUTORIAL · 8 MIN READ

用 Kindle PW3
搭一块家庭信息板

服务器定时生成黑白 PNG,Kindle 每 30 分钟短暂联网刷新,其他时间回到深度待机。下面是完整实现路线。

中文 Kindle 家庭信息板,包含天气、垃圾收集日和未来六小时降雨
最终输出:1088×1448、纯黑白,由程序根据结构化数据生成。

目标很简单:让一台 Kindle Paperwhite 3 常显日期、天气、未来数小时降雨和垃圾收集日。更新时才唤醒 Wi-Fi 与 CPU,完成后立即待机;电子墨水屏则继续保留最后一张图。

整体架构

天气 API / 市政收集日 ↓ 服务器:Pillow 生成 1088×1448 PNG(每 15 分钟) ↓ 固定 URL:/kindle/dashboard.png ↓ Kindle:RTC 唤醒 → wget → eips → 关闭 Wi-Fi → 待机 每 30 分钟

图像不是 AI 生成的。日期、天气、图标、分隔线和降雨图都由固定代码绘制。这个方案的关键,是把复杂的数据获取与排版留在服务器,Kindle 只做三件事:下载、显示、休眠。

准备条件

  • Kindle Paperwhite 3;本文实机固件为 5.16.2.1.1;
  • 已完成越狱,并安装 MRPI、KUAL 与 USBNetwork;
  • 可通过 USB SSH 进入 Kindle;
  • 一台能运行 Docker Compose 的服务器和一个可访问的图片 URL;
  • 建议先配置 SSH 公钥,并阻止 Kindle OTA 更新。

不同 Kindle 型号、固件和 framebuffer 参数可能不同。越狱与修改系统存在风险,开始前应准备恢复手段。

第一步:确认图像尺寸

通过 USB SSH 查看 framebuffer:

fbset -s
cat /sys/class/graphics/fb0/stride 2>/dev/null

这台 PW3 的参数是:可见宽度 1072、高度 1448、虚拟宽度 1088、line_length=1088、8 bpp 灰度。因此传给 eips 的 PNG 使用 1088×1448,与实际行跨度一致。

Kindle 屏幕显示 1088×1448 framebuffer 网格诊断图
建议先显示网格测试图,确认四角、行跨度和方向,再开始设计正式版面。

用一张测试图验证:

eips -g /mnt/us/test-1088x1448.png -f -w gc16

-f -w gc16 会进行完整黑白刷新,能明显减少原 Kindle 首页的残影。

第二步:部署服务器渲染器

服务器项目的 server/ 目录包含 Pillow 渲染器和 Docker Compose。复制环境变量模板:

cd server
cp .env.example .env

.env 中设置:

  • DASHBOARD_LATITUDEDASHBOARD_LONGITUDE
  • 时区和 Yahoo!天气对应地区页面;
  • 周一到周日的垃圾收集项目;
  • UPDATE_INTERVAL=900,即每 15 分钟更新。

启动服务:

docker compose up -d --build
docker compose ps

渲染器在每小时的 :00:15:30:45 生成 public/dashboard.png。先写临时文件,再原子替换正式 PNG;天气请求失败时使用最后一份有效缓存。

第三步:发布一个稳定图片 URL

将渲染器的 public/ 目录以只读卷挂载到现有 Nginx,并为图片关闭缓存:

location = /kindle/dashboard.png {
    expires -1;
    add_header Cache-Control "no-store, no-cache, must-revalidate";
    try_files $uri =404;
}

现代客户端使用 HTTPS 即可。部分老 Kindle 的 BusyBox wget 无法与现代 TLS 服务正常协商,可以额外建立一个纯 HTTP 兼容入口,但只开放这一张 PNG,其他路径全部返回 404。正式图片可在这里查看:dashboard.png ↗

第四步:安装 Kindle 客户端

先复制客户端配置:

cp kindle/dashboard.conf.example kindle/dashboard.conf

填写稳定图片地址:

DASHBOARD_URL='http://YOUR_SERVER/kindle/dashboard.png'

然后通过 USBNetwork 上传并安装。以下地址应替换为自己的 Kindle USB 地址:

scp -r kindle root@192.168.15.244:/mnt/us/kindle-dashboard-installer

ssh root@192.168.15.244 \
  '/mnt/us/kindle-dashboard-installer/install-kual.sh'

重新打开 KUAL 后会出现 Kindle Dashboard,其中包含:

  • Refresh now:立即下载并显示一次;
  • Start battery refresh (30 min):进入低功耗自动更新;
  • Stop dashboard:停止循环并恢复正常 Kindle。

第五步:让设备真正低功耗运行

客户端不使用普通的常驻 sleep 1800,而是交给 Kindle 自己的 powerd 与 RTC:

  1. 唤醒并打开 Wi-Fi;
  2. 下载到临时文件,确认非空后原子替换;
  3. 执行 eips -g dashboard.png -f -w gc16
  4. 关闭 Wi-Fi,注册 30 分钟后的 RTC 唤醒;
  5. 进入原生 suspend,屏幕继续保留当前图像。

公告板显示期间,通过 com.lab126.deviced enable_touch 0 禁用触摸,防止底层 Kindle 首页发生局部重绘。物理电源键唤醒后,脚本停止自动循环、恢复触摸并返回 KUAL。

不要停止 frameworklab126_gui,也不要在公告板模式下设置 preventScreenSaver。前者可能触发设备重启,后者在这版固件上会让短按电源键失效。

服务器和 Kindle 的计时需要同步吗?

不需要。服务器每 15 分钟固定生成一次,Kindle 每 30 分钟拉取一次。即使两边启动时刻错开,Kindle 通常也只会拿到最多约 15 分钟前的图片。服务端与客户端都使用原子替换,因此不会读到写了一半的 PNG。

完成后的验证清单

  • 浏览器访问 PNG URL,尺寸为 1088×1448;
  • KUAL 的 Refresh now 能完整刷新,无首页残影;
  • 触摸屏不会触发底层 Kindle 首页;
  • 启动自动更新后 Wi-Fi 会关闭,设备进入 suspend;
  • 30 分钟后能自行唤醒、更新并再次待机;
  • 断网时仍显示最后一张有效图;
  • 短按电源键可以退出公告板并回到 KUAL。

天气来源可以自由替换。本实现用 Yahoo!天气提供本地天气表述,Open-Meteo 提供精确坐标的逐小时降雨,日本气象厅作为备用;垃圾收集安排则以横滨市官方页面 ↗为准。


这条路线的核心不是某个特定天气 API,而是“服务器生成简单图片,Kindle 只负责可靠显示”。把版式、数据和更新频率换掉,同一套客户端也可以用于日历、交通、家庭留言或监控摘要。