Skip to content

Releases: hbehrensj/PineCYD

v0.5.0

Choose a tag to compare

@github-actions github-actions released this 16 Jul 10:36
- Usage bridge architecture: the device no longer stores or sees an
  Anthropic OAuth token - it polls a small script (bridge/) on a
  trusted, already-logged-in-to-Claude-Code machine instead.
- WiFi and BLE now run simultaneously at all times (no more turning
  WiFi off while a Pinecil is connected).
- New Pinecil settings page at http://pinecyd.local/, active whenever
  a Pinecil is BLE-connected - 40 of the Pinecil's own settings,
  read/write over BLE.
- Usage-zone layout cleanup (percentage text dropped, resets-in
  countdown moved beside the bar) and an English-only text pass.

v0.4.0 - Claude usage zone + always-on settings page

Choose a tag to compare

@hbehrensj hbehrensj released this 15 Jul 21:05

Claude usage bars on the clock screen, and an always-on settings page for updating the
token/timezone without the BOOT-button dance.

New: Claude usage zone. Three bars (5-hour, 7-day, 7-day-Sonnet) shown beneath the
clock, polling Anthropic's usage endpoint every 5 minutes. Getting this reliable took real
diagnosis on real hardware: TLS handshakes were failing from heap fragmentation (not
total free memory - the board reported 50KB+ free at the same moments it failed). Fixed by
measuring and shrinking an over-provisioned LVGL memory pool (40KB -> 20KB, only ~13KB was
ever used), pausing BLE scanning during each fetch attempt, and checking available
contiguous memory before even trying instead of blocking on a doomed connect. Two more real
bugs found once the fetch was reliable: percentages were 100x too large (API returns them
already as a percentage, not a 0-1 fraction), and the bar fill had a visible gradient
banding/stripe artifact that two different fixes (dithering, gradient caching) failed to
resolve - solved by dropping the gradient for a flat per-state color instead.

Security note, explicit and deliberate: the OAuth token is entered and stored on the
device itself (masked input, NVS storage), not kept off-device via a safer bridge-script
design that was offered and declined. This is a real tradeoff, not an oversight - see the
firmware README's "Claude usage zone" section for the full writeup.

New: always-on settings page at http://pinecyd.local/ (reachable whenever the clock
screen is showing) for updating the token or timezone without needing the WiFi captive
portal - useful since the token isn't refreshed and needs periodic re-entry. The
BOOT-button-forced portal is also now non-destructive (no longer wipes WiFi credentials
just to edit a different field).

Known limitation: flash headroom is tight (~94% of the OTA partition slot) after this
release's added dependencies (ArduinoJson, HTTPClient, WiFiClientSecure).

v0.3.0

Choose a tag to compare

@github-actions github-actions released this 13 Jul 20:14
OTA updates over WiFi, configurable timezone

v0.2.0 - WiFi captive portal, no more compile-time credentials

Choose a tag to compare

@github-actions github-actions released this 13 Jul 19:31

No more compile-time WiFi credentials, and this is the first release with prebuilt,
flashable binaries attached - build it yourself with PlatformIO, or just flash the
.bin from this release.

WiFi setup is now a captive portal. include/secrets.h is gone entirely. On first
boot (or whenever the saved network is unreachable for 30s), the CYD opens its own
PineCYD-Setup WiFi network with a config portal (http://192.168.4.1) to enter your
network; if that isn't configured either within 2 minutes, it gives up for now and
retries automatically every 2 minutes. Hold the BOOT button (GPIO0) through power-on to
force a fresh portal any time. Runs fully non-blocking so it can never stall BLE
scanning or the display.

Fixed a real bug found via live testing: the config portal's access point couldn't
be joined at all from either iOS or macOS, even though the firmware's own log showed it
starting normally. Root cause: this project's continuous BLE scan was starving the
softAP of the airtime it needs to complete a client association - the same WiFi/BT
radio-coexistence contention already documented elsewhere in this project, just running
in the opposite direction. Fixed by pausing the scan for as long as the portal is open.

Also fixed a poll-cycle "jerkiness" reported while actually using the dashboard:
replaced a fast tip-temp-only poll running alongside a periodic 6-read "full cycle" with
a single round-robin cycle (tip temp every cycle, plus one of the other five
characteristics in rotation) - every cycle now costs about the same instead of
alternating between small and large bursts.

Release binaries (see the top-level README's "Flashing a release" section):

  • pinecyd-firmware-factory.bin - merged image (bootloader + partitions + app) for a
    blank/new board. Flash at offset 0x0.
  • pinecyd-firmware.bin - app only, for updating a board already running PineCYD. Flash
    at offset 0x10000.

Built and published automatically by .github/workflows/release.yml on this tag - pinned
to the exact ESP32 platform/core version (pioarduino/platform-espressif32 @ 55.03.39)
this project has actually been verified against on real hardware.

Known caveats:

  • Two things needing physical verification still pending: WiFi correctly resuming when a
    Pinecil disconnects, and the BOOT-button-forced portal reset.
  • No OTA/self-update yet - still a compile-and-flash (or flash-the-release-binary)
    workflow.
  • No touchscreen input - the dashboard is read-only; setpoint is controlled on the iron
    itself.

v0.1.0 - Initial experimental release

Choose a tag to compare

@hbehrensj hbehrensj released this 13 Jul 17:02

First public snapshot of PineCYD: a direct-BLE Pinecil V2 dashboard for an ESP32 CYD,
bypassing a separate private home-dashboard project's Home Assistant/IronOS polling chain
(~5s latency) for near-real-time tip temperature. Standalone project - see
docs/pinecil-direct-ble-handoff.md for the full motivation and risk assessment.

Status: experimental. Started as a three-phase build (BLE-only proof of concept, then
a minimal screen, then a full dashboard) iterated live against real hardware; the first
two phases were folded into the final one once the design converged, so
firmware/fase2-ember-design/ is now the only firmware in the repo.

Features: full "Ember" theme dashboard (design ported from that other project, layout
revised per live feedback - bigger tip-temp hero value via a custom-generated font,
read-only setpoint display, live scrolling setpoint-history in the chart), plus an
experimental WiFi/NTP clock shown while no Pinecil is connected (WiFi turns off
automatically once a Pinecil connects, to save heap and avoid radio contention with BLE).

Real bugs found and fixed along the way (full writeups in
firmware/fase2-ember-design/README.md): a ~6KB/hour heap leak from an unused NimBLE
scan-results cache; a null-pointer crash on disconnect-mid-poll; a unit-scaling error
inherited from a third-party summary (independently re-confirmed from IronOS's own
source); an LVGL float-formatting bug; a Unicode glyph mix-up (bullet vs. middle dot); and
a style_transform_zoom() attempt that silently broke label rendering on real hardware.

Known caveats:

  • WiFi's on/off toggle is new and not yet soak-tested as thoroughly as the rest.
  • No touchscreen input wired up yet - the dashboard is read-only; setpoint is controlled
    on the iron itself.
  • Needs firmware/fase2-ember-design/include/secrets.h (copy from secrets.h.example,
    gitignored) with your own WiFi credentials to build.