Skip to content

Releases: op7418/ai-desk-card

v0.10.1 · V1.1 idle-sleep + packing fix

22 May 17:14

Choose a tag to compare

小版本,主要给 M5Paper V1.1 加 "离线自动睡眠" — 不需要 daemon 也能自己渲染电子名片 + deep sleep。

新功能

V1.1 离线 idle-sleep(不依赖 daemon)

之前 V1.1 想要"屏自动息屏 + 显示名片"必须 daemon 一直跑着 + 推 /card-sleep。现在彻底本地:

[用户行为]                          [设备]
────────                            ────
按 RESET                             boot, loads idle_minutes from NVS
└─→ 任意 daemon push frame            calls markContentDisplayed → resets idle timer
└─→ 再无活动 N 分钟                   firmware paint sleep_card.bin
                                     → 2.5 s GC16 settle
                                     → esp_deep_sleep_start
[panel 0 W 保留名片 ∞]

配置(一次性)

# 1. 改 assets/profile.yaml 写你的电子名片内容
# 2. 在 host 上渲染 540×960 灰阶 card → data/sleep_card.bin
python3 tools/build_sleep_card.py
# 3. 烧 LittleFS(一次就行)
pio run -e card -t uploadfs
# 4. 设阈值(30 分钟)
python3 -c "import serial,time;s=serial.Serial('/dev/cu.usbserial-XXX',115200);s.write(b'{\"cmd\":\"idle_sleep_set\",\"minutes\":30}\n');time.sleep(2);print(s.read(200).decode())"

阈值持久化在 NVS — 重启后保留。设为 0 = 关闭。最大 1440 (24h)。

关键修复

  • 4bpp packer 反色 bugtools/build_sleep_card.py 原本直接 pixel >> 4,但 M5EPD 4bpp 是 "0=白 / 15=黑"(跟 PIL 反),导致名片显示成"对比度错乱 + 模糊"。改用 daemon/card_render.py 现成的 to_4bpp_packed(带 invert)就清晰了。

v0.10.0 → v0.10.1 升级

cd ~/.claude/skills/ai-desk-card && git pull
# V1.1 用户启用 idle sleep:
python3 tools/build_sleep_card.py
pio run -e card -t uploadfs
pio run -e card -t upload  # 重新烧 firmware 拿到 0.10.1 + idle 模块

Color 用户不需要做任何事 — idle-sleep 是 V1.1 only 特性,Color 不影响。

完整 commit log

  • 15692f9 build_sleep_card: use daemon's canonical 4bpp packer
  • bdeb9a8 V1.1: idle-sleep timer + local sleep card
  • dc3b498 v0.10.1: bump CARD_VERSION + plugin.json

完整变更见 HANDOVER.md

v0.10.0 · M5Paper Color port

22 May 15:07

Choose a tag to compare

这个 release 把 ai-desk-card 从单设备扩到双设备:原有的 M5Paper V1.1(灰阶)+ 新增的 M5Paper Color(Spectra 6 真彩)。Skill 自动识别 device profile,所有 17 个 widget 在两块板上都有对应的渲染。

新增:M5Paper Color 完整支持

新硬件参数差异:

V1.1 Color (新)
SoC ESP32 ESP32-S3R8(native USB CDC)
4.7" 540×960 16 灰阶 4" 600×400 Spectra 6 真彩 6 色
刷新 GC16 ~700ms / A2 ~150ms ~15-19 秒/帧全刷
触屏 GT911 3 物理键 + 电源键
M5EPD M5Unified + M5GFX + NeoPixel
传感器 SHT40 温湿度 / ES8311 codec + 1W speaker + MEMS 麦 / 2× RGB LED / IR 发射

移植要点

  • env:paper-color 新增到 platformio.ini,跟 env:cardbuild_src_filter 隔离
  • src/paper_color/ 完整目录(独立的 wifi_bridge / http_server / frame_buffer / sht40 / audio / feedback_led)
  • 横屏 setRotation(1):native 是 400×600 portrait,必须强制 landscape
  • 字号 ≥ 20pt 强制:Spectra 6 上小字断成 dither pattern
  • M5GFX 在 Spectra 6 panel 上必须 setEpdMode(epd_fastest),否则 silently 不刷新

新模块

  • daemon/card_render_color.py — 600×400 RGB → M5GFX 自动量化到 Spectra 6 palette。17 个 widget 全部 color 化,每个有独立 accent header 颜色
  • daemon/card_render_settings_color.py — Color 版设置页(fw / panel / battery / Wi-Fi / SHT40)
  • daemon/card_render_sleep_color.py — Color 版电子名片(彩色 chip + 蓝色头像圆 + 黑底 footer)
  • daemon/color_daemon.py — 全新持久 daemon,bind 0.0.0.0 + IP allowlist,接 agent /widget POST + 设备 /button POST 闭环

Color 专属功能

  • ambient widget — 设备 SHT40 实时温湿度,0 cloud / 0 API
  • /beep endpoint — 3 个预设(chime / urgent / alert)+ 自定义 freq+ms。日程 deadline 临近时可让 Agent 响铃
  • 3 物理键顶=睡眠 / 下左=刷新 / 下中=设置(已验过 M5.BtnA/B/C 在这块板上跟物理位置反着对应)
  • RGB LED — 按下时白闪 ack,/frame 进来时绿色 pulse 提示"数据到了"
  • deep sleep + 唤醒 — 顶键推名片 + esp_deep_sleep。三个 user 键 + 电源键都能唤
  • 状态栏新按键 hint — 底栏左侧显示 顶 睡眠 左 刷新 中 设置(黄字物理位置)

Skill 路由

SKILL.md 新增 Step 1.5 device profile 识别 — 如果 /heartbeat 返回 device == M5PaperColor,agent 走 flows/08_paper_color.md。所有 V1.1 流程不变。

v0.9 → v0.10 升级

cd ~/.claude/skills/ai-desk-card && git pull
# 如果你买了 M5Paper Color
pio run -e paper-color -t upload  # USB-C 插上设备
python3 daemon/color_daemon.py --device-ip <IP>

V1.1 用户不需要做任何事 — env:card / card_daemon.py / 所有 V1.1 flow 完全不动。

已知限制

  • 两个 daemon 不能同时跑(都占 127.0.0.1:9877)。用户按手上哪块设备选启动哪个。
  • Color daemon 还没并入主 daemon,是独立进程。下一版可能做统一 router。
  • Color 板 17 秒全刷限制下,高频更新 widget(比如秒级 status 字段)不实用。规划层面 Color 适合"每分钟看一眼" 的低频信息。

完整变更见 HANDOVER.md

v0.9.0 · Skill-first architecture + touch + tap-ack + boot preservation

22 May 08:59

Choose a tag to compare

首个面向最终用户的版本。装上 Skill 后由 AI Agent 全程引导烧固件、配 Wi-Fi、推内容;不再需要用户手动跑 piocurl

主要变化

Skill-first 架构

  • SKILL.md 成为 agent-agnostic 入口(Claude Code / Codex / Cursor / Aider 等都能识别)
  • scripts/state.sh 统一状态探测 → JSON 输出 hardware / firmware / daemon / transport / device / wifi / interests
  • flows/01-07 7 个子流程(install / transport / wifi / interests / push / schedule / sleep)按需读取
  • 老的 plugin/ slash 命令保留作为 Claude Code 兼容层

触屏 + 点击反馈

  • 固件 50 Hz 直接 poll GT911(不依赖 IRQ,V1.1 GPIO 36 没内部上拉)
  • 按下 chip 立即 EPD partial refresh (A2 mode) ~150 ms 白色 ACK 反馈
  • daemon 通过 cmd:set_chips 把 chip rects 推给固件,固件本地 hit-test 不依赖 daemon 来回

设备 liveness

  • GET /heartbeat endpoint:{alive, last_seen_seconds, active_transport, battery_pct, uptime, firmware}
  • 底栏正确显示当前传输(Wi-Fi / USB / BLE)而非启动时的初始选择
  • Device 90 秒没回包时底栏显示 OFFLINE

Wi-Fi 回程通道

  • 固件在 wifi_connected 时把 status_report / touch event POST 给 daemon(daemon IP 从最近的 /frame 入站请求 cache)
  • Arch A (Wi-Fi only) 终于有了 device → daemon 的回包路径
  • 副通道:daemon 在 Wi-Fi 主传输时,如果 USB 也插着,自动开 read-only 副串口当 fallback

自动 quiet hours 名片

  • daemon 后台线程读 ~/.ai-desk-card/interests.yaml,到 quiet_hours.start 自动渲染电子名片 + 设备 deep sleep
  • 不需要 Agent 在线触发

Boot 体验

  • RTC slow memory 记 magic — 第一次显示帧后置上,软重启 / 拔 USB 再插 / cmd:sleep_now 醒来都保留上一帧(e-ink 物理 0 功耗特性)
  • 真正首次开机才画 install splash,splash 现在带 GitHub URL + 给 AI 的指令 + BLE 配对名

多个 Wi-Fi / 启动鲁棒性 bug 修复

  • mDNS 探测 2.5s → 8s(避免烧固件后立即 daemon 启动降级到 32s/帧的 USB serial)
  • WiFiTransport.connected() 不再 sticky-false(单次 POST 超时不再永久锁死传输)
  • 持久化 last_frame 在设备重启时主动 reset(避免推 144×33 diff 留 splash)

文档

  • 中文 README 设为主文档(README.md),英文 mirror(README.en.md
  • HANDOVER.md 重写:覆盖架构图、11 个真实踩过的 bug + 修法、调试 recipe、扩展指南
  • PRODUCT.md 重写:产品 / 思考 / 体验 / 预测 / 用户 5 段叙事

30 秒开始

npx skills add https://github.com/op7418/ai-desk-card --skill ai-desk-card

或发给你的 AI Agent:

帮我装 ai-desk-card Skill。把 https://github.com/op7418/ai-desk-card 克隆到 ~/.claude/skills/ai-desk-card。

之后跟 Agent 说:

帮我把卡片装上,M5Paper V1.1 已经插好了。

Skill 会自动探测硬件、烧固件、起 daemon、配 Wi-Fi、推第一个 widget。

已知限制(v0.10 计划修)

  • 硬件长按旋钮 2s = AXP192 切电源,固件来不及拦截。/card-sleep 走 deep_sleep 名片正常;硬关机会停在最后一帧
  • BLE frame-data 路径长包重组有 bug,目前 BLE 只跑小命令,frame 走 Wi-Fi

完整变更见 HANDOVER.md § 已知问题