• v0.9.0 935d07d0aa

    v0.9.0 — BTClock 4.0.0 API + Nostr Wallet Connect
    All checks were successful
    Lint / Ruff (push) Successful in 1m17s
    Test / Pytest (push) Successful in 4m18s
    Stable

    djuri released this 2026-06-01 13:42:50 +00:00 | 0 commits to main since this release

    Full support for BTClock 4.0.0 firmware, while staying compatible with the 3.4.x and 3.3.x (legacy) firmware lines — verified against the firmware source.

    BTClock 4.0.0 API support

    • Fonts dropdown fixavailableFonts is now a list of {id, hasBtcSymbol} objects (was strings); the font select surfaces the ids correctly again.
    • Frontlight brightness now uses the v4 JSON body ({b}) on 4.0.0; 3.4.x/legacy keep the query form. Same body-vs-query split applied to show-screen / show-currency / show-text.
    • Frontlight status — v4 nests live state under frontlight.{on,duties}; normalized so the light entity reflects real device state.
    • Price symbol select (v4 priceSymMode) replaces the old sats-symbol switch.
    • Nostr relay sensor falls back to the new nostrRelays array.

    New v4 features

    • Nostr Wallet Connect (NIP-47) — switches (enabled / show payment notifications / flash on payment), an NWC balance-poll-interval number, and an "NWC connected" binary sensor.
    • Per-relay Nostr connectivityconnectionStatus.nostr is now a per-relay array; feed/relay state reports any relay up instead of always-connected.
    • Decimal share-separator switch, WiFi MAC diagnostic sensor, and a Stop-data-sources button.

    Compatibility

    • 3.3.x (legacy) and 3.4.0 behaviour verified against the btclock_v3 firmware source; all v4 additions are variant- / setting-gated and never appear on older firmware. Legacy settings-write keeps /api/json/settings; 3.4.0+ uses PATCH /api/settings.

    Maintenance

    • Home Assistant test pins → 2026.5.4, pytest-homeassistant-custom-component → 0.13.333, ruff → 0.15.15, playwright → 1.60.0.
    • Test suite expanded to 208 tests covering all of the above.
    Downloads
  • v0.5.5 d26d268136

    v0.5.5
    Some checks failed
    Lint / Ruff (push) Failing after 4s
    Test / Pytest (push) Failing after 1m9s
    Validate / Hassfest Validation (push) Failing after 2s
    Validate / HACS Validation (push) Failing after 1m8s
    Release / Release (release) Failing after 1m8s
    Stable

    djuri released this 2026-04-18 15:48:34 +00:00 | 43 commits to main since this release

    Bug fixes

    • Entities disabled / missing after firmware update — entity composition is decided at setup time based on the detected API variant (legacy vs 3.4.0+). Currency select, DND switch, screen-nav buttons and friends are V3.4-only. When a device updated across that boundary, the cached entity set no longer matched the new firmware: V3.4-only entities showed up as unavailable on a downgrade, and newly-supported entities never appeared on an upgrade. Reported on btclock-2ad158.

      Fix: the post-install watchdog now schedules a config-entry reload as soon as it confirms a gitTag change, so async_setup_entry re-runs with the new variant. Reload is skipped on timeout (a still-broken device gains nothing from thrashed entities).

    Downloads
  • v0.5.4 ce4cbffd80

    v0.5.4
    Some checks failed
    Lint / Ruff (push) Failing after 1m9s
    Test / Pytest (push) Failing after 4s
    Validate / HACS Validation (push) Failing after 2s
    Validate / Hassfest Validation (push) Failing after 1m8s
    Release / Release (release) Failing after 1m8s
    Stable

    djuri released this 2026-04-18 15:31:11 +00:00 | 44 commits to main since this release

    Bug fixes

    • Progress bar stuck after OTA completes — even though the watchdog correctly detected the device coming back on new firmware, the progress bar kept spinning until SSE reconnected. Root cause: in_progress was (install task running) OR coordinator.data["isOTAUpdating"], and the cached status still held the True value from the last pre-reboot SSE frame. The watchdog now explicitly clears the stale flag via async_apply_optimistic({"isOTAUpdating": False}) before writing state, so the bar disappears the moment the install is deemed complete.
    • Simplified polling cadence — once a minute for up to 20 minutes, per user request. The old 10s/10s schedule was noisy and didn't produce any faster detection since the device is unreachable for the first minute or so during reboot anyway.
    Downloads
  • v0.5.3 816a137de0

    v0.5.3
    Some checks failed
    Test / Pytest (push) Failing after 4s
    Lint / Ruff (push) Failing after 1m10s
    Validate / Hassfest Validation (push) Failing after 1s
    Validate / HACS Validation (push) Failing after 1m9s
    Release / Release (release) Failing after 1m8s
    Stable

    djuri released this 2026-04-18 15:18:16 +00:00 | 45 commits to main since this release

    Bug fixes

    • Update entity stuck on "Installing" — after an OTA, the progress bar never cleared because installed_version was cached at setup and never refreshed, and isOTAUpdating transitions can be missed across the device reboot (SSE disconnects; firmware doesn't push a status frame when OTA starts).

      Fix: spawn a background watchdog when the user starts an install. It records the pre-install gitTag and polls /api/settings every 10s (after a 10s grace), swallowing errors during the reboot. When a different gitTag comes back — or 10 minutes pass — it clears the in-progress flag and refreshes the installed version. Works for both the one-shot auto-update and the file-by-file specific-version install paths.

    Downloads
  • v0.5.2 a67c558819

    v0.5.2
    Some checks failed
    Lint / Ruff (push) Failing after 4s
    Test / Pytest (push) Failing after 1m9s
    Release / Release (release) Failing after 1m8s
    Validate / Hassfest Validation (push) Failing after 2s
    Validate / HACS Validation (push) Failing after 1m7s
    Stable

    djuri released this 2026-04-18 15:09:20 +00:00 | 46 commits to main since this release

    Bug fixes

    The v0.5.1 variant-detection fix correctly classified 3.3.x devices as LEGACY, but button.py returned early whenever variant != V3_4, making every button — including identify, restart and full_refresh — disappear on legacy devices.

    • Buttons now declare their path-table key and setup filters per-button on path-table membership. On LEGACY we keep identify / restart / full_refresh (GET); on V3_4 we keep all six.
    • Dropped the now-incorrect _require_v3_4 guards from async_identify / async_restart / async_full_refresh — the path tables already dispatch GET vs POST per variant.

    Verified live on 192.168.20.253 (3.3.19): GET /api/identify, /api/restart, /api/full_refresh all return 200.

    Downloads
  • v0.5.1 1513bbbfbb

    v0.5.1
    Some checks failed
    Lint / Ruff (push) Failing after 1m9s
    Validate / Hassfest Validation (push) Failing after 1m8s
    Validate / HACS Validation (push) Failing after 1m8s
    Test / Pytest (push) Failing after 25s
    Release / Release (release) Failing after 1m8s
    Stable

    djuri released this 2026-04-18 15:03:45 +00:00 | 47 commits to main since this release

    Bug fixes

    • Firmware auto-update — clicking Install in the Update entity against a 3.3.x device (e.g. 3.3.19) previously POSTed /api/firmware/auto_update and got a 404, because that firmware only registers the route as GET. Two root causes:
      • detect_variant trusted the httpAuthPassSet fallback over a real gitTag, so 3.3.x builds (which ship that field) were misclassified as V3.4. Now a valid semver gitTag short-circuits the fallbacks.
      • The legacy path table was missing OTA routes. Added auto_update (GET), upload_firmware (POST), upload_webui (POST), verified live against 3.3.19.
    • The Update entity now works on 3.3.x release builds too (no V3.4 gate).
    Downloads
  • v0.5.0 5a4df5958f

    v0.5.0
    Some checks failed
    Lint / Ruff (push) Waiting to run
    Test / Pytest (push) Waiting to run
    Validate / Hassfest Validation (push) Waiting to run
    Validate / HACS Validation (push) Waiting to run
    Release / Release (release) Failing after 1m26s
    Stable

    djuri released this 2026-04-18 11:49:50 +00:00 | 50 commits to main since this release

    New capabilities

    • Servicesbtclock.show_text (auto-uppercased, clamped to the device's numScreens) and btclock.show_custom (one string per screen). 3.4.0+ firmware only.
    • LED brightness slider (number.led_brightness, 0–255) + Disable LEDs switch backed by PATCH /api/settings.
    • Firmware update entity — polls gitReleaseUrl once a day; only shown for real semver builds. Installing the latest version fires POST /api/firmware/auto_update; specific-version installs download the matching {board}_firmware.bin and littlefs_{size}.bin assets and upload them over /upload/firmware + /upload/webui. Release notes fall back to first-line compare-API commit messages when the release body is empty.

    UX

    • README now has My Home Assistant buttons for HACS install and the config-flow start.

    Tested

    119 tests passing; live-verified show_text, show_custom, ledBrightness, disableLeds against the Rev A device.

    Downloads