墨水屏「今天是周五吗?」+ 天气屏
为 Zectrix 400×300 单色墨水屏渲染一页趣味屏,灵感来自开源项目 eyaeya/today-is-friday(MIT)。本技能专为黑白单色屏重新排版,并叠加了当地天气资讯。
效果见 assets/preview.png:
- 顶部:左方显示「今天是周五吗?」,右方显示用户所在地区(如「成都·成华区」)
- 左栏:开场语加上两行趣味文案,根据星期和时段切换文案池,采用洗牌袋选句机制(一轮内不重复)
- 右栏:大型天气图标、大号温度、天气状况、紫外线等级以及 HI/LO 温度信息
- 下方:今明后三天的天气预报格,以及一条依据真实天气生成的出行穿搭建议(雨天带伞、高温防晒、低温添衣、温差提醒、紫外线涂防晒霜)
时段与配色规则(沿用原项目逻辑):
| 时间 | 开场语 | 配色 |
|---|---|---|
| 周一至周四 | 不是。 | 白底黑字 |
| 周五 16:00 前 | 周五啦! | 黑底反白 |
| 周五 16:00 后 | 周五啦!+ 右上「退朝」印章 | 黑底反白 |
| 周六、周日 19:00 前 | 休息。 | 黑底反白 |
| 周日 19:00 后 | 明天周一。 | 白底黑字 |
文案池共有 9 个(周一至周四 / 周五白天 / 周五晚 / 周六 / 周日白天 / 周日晚),每个池子有 65 条文案,存储在
scripts/friday_phrases.json中,可直接添加句子扩充。
一、首次使用:必须初始化(已脱敏,无内置密钥)
本技能不包含任何 API Key、设备号或坐标,全部由用户自行准备。首次运行前必须执行初始化。
cd ~/.workbuddy/skills/zectrix-friday-weather/scripts
python3 init.py # 交互式引导,推荐
# 或非交互方式:
python3 init.py --api-key zt_xxx --device AA:BB:CC:DD:EE:FF --place "成都成华区" --label "成都·成华区"
需要向用户收集以下三项信息,缺一不可(不要猜测,不要使用示例值):
- Zectrix API Key:用户在极趣云控制台获取,以
zt_开头。如果不确定,可先执行python3 init.py --api-key zt_xxx --list-devices查看是否能列出设备。 - 设备 ID:设备的 MAC 地址,格式如
AA:BB:CC:DD:EE:FF;可从上述命令的输出中获取。 - 所在地区:中文地名,例如「成都成华区」、「上海徐汇」、「深圳南山」。脚本会调用 Open-Meteo 地理编码服务解析为经纬度;若有多个候选结果,交互模式下会提示选择,非交互环境默认使用第一个。
初始化过程会校验 Key 与设备是否匹配(不匹配时会发出警告并退出,若确认识别问题可添加 --no-verify 参数),随后将配置写入 ~/.config/zectrix-friday-weather/config.json:
{
"api_key": "zt_xxx",
"device_id": "AA:BB:CC:DD:EE:FF",
"page": "5",
"location": {"label": "XX·XX区", "lat": 30.0000, "lon": 104.0000, "timezone": "Asia/Shanghai"}
}
配置与状态文件都存放在 ~/.config/zectrix-friday-weather/ 目录下(可通过环境变量 ZECTRIX_FRIDAY_CONFIG_DIR 覆盖),不在技能目录内,因此技能可以安全地分享或更新,而不会泄露密钥。
二、日常使用
cd ~/.workbuddy/skills/zectrix-friday-weather/scripts
ZECTRIX_NO_PUSH=1 python3 zectrix_friday_push.py # 仅渲染预览,生成图片 /tmp/zectrix_friday_screen.png
python3 zectrix_friday_push.py # 渲染并推送到墨水屏
若尚未初始化,脚本会打印 NEED_INIT: 并以退出码 2 结束——此时请按照上一节引导用户补充配置信息,不要自行编造 Key。
三、渲染与排版经验(修改样式时务必遵守)
- 原生 400×300、1:1 渲染,不要放大后再缩小;二值化阈值
THRESHOLD=128,推送时设置dither=false(硬阈值,文字最锐利) - 字体:默认使用仓库自带的
assets/fonts/Zfull.ttf点阵字体(8-24px 像素级锐利,最适合墨水屏,clone 后即可生效,无需额外安装);可通过$ZECTRIX_FONT=/path/to/xxx.ttf覆盖,再回退到系统自带的 PingFang / 黑体 / Noto CJK 字体 - 图标:
draw_icon()使用两次绘制(先用描边色外扩,再用背景色填充),得到无内线的粗轮廓,云体还能自然遮挡背后的太阳;▲▼ 等多字节符号在点阵字体小字号时会缺失字形,一律改用代码绘制 - 文字一律使用默认字重,不加粗也不描边(加粗在 1-bit 屏上会模糊成一团)
- 右栏图标+温度整体居中:先用
d.textlength()测量温度实际宽度,再以右栏中线为基准计算组合起点;晴天图标光芒外扩,占位宽度需单独加宽 - 印章旋转时使用
fillcolor=255避免黑角;反白场景下印章需使用img.paste(tcol, box, mask)按框内色粘贴
四、定时推送
设备采用拉取式刷新方式,API 返回 code:0 即表示成功,屏幕会在下次轮询时更新。文案会按时段变化,建议配置自动化任务每天 10:00 推送一次;若希望周日 19:00 后显示「明天周一。」、周五 16:00 后出现「退朝」印章,则需再增加一条 19:00 的推送任务。
五、文件说明
| 文件 | 说明 |
|---|---|
scripts/init.py | 初始化向导:收集 Key/设备/地区,地理编码,写入配置 |
scripts/zectrix_friday_push.py | 渲染 + 推送的主脚本 |
scripts/dev_render_sample.py | 生成文档示例图(指定星期/时段/天气,不推送) |
scripts/friday_phrases.json | 9×65 条文案池,可直接编辑扩充 |
assets/fonts/Zfull.ttf | 自带点阵字体(默认渲染字体,随仓库分发) |
assets/preview.png | 效果预览图 |
assets/sample-friday.png | 周五傍晚示例(黑底反白 + 退朝印章) |
天气数据来自 Open-Meteo(免费,无需注册 Key),紫外线数据取自当日的 uv_index_max。