Skip to content

Angler edition: solunar bite forecast + live tides/weather/water + catch log#32

Merged
daniel-frenkel merged 1 commit into
mainfrom
feat/angler-edition
Jul 1, 2026
Merged

Angler edition: solunar bite forecast + live tides/weather/water + catch log#32
daniel-frenkel merged 1 commit into
mainfrom
feat/angler-edition

Conversation

@daniel-frenkel

@daniel-frenkel daniel-frenkel commented Jul 1, 2026

Copy link
Copy Markdown
Member

The sixth compile-time product (-DFEATURE_ANGLER) — a desk fishing companion built from the same boards + shared infra as the radar/EAM/Space/Seismic/Birding editions. Ships in two stages (both in this PR).

Stage 1 — on-device solunar bite forecast (no network)

Hero feature: a solunar "best bite times" forecast computed entirely from the shared sun/moon ephemeris — works offline and worldwide.

  • Shared astronomy core moved src/space/Astro.{h,cpp}src/astro/ (namespace unchanged), compiled only in Space + Angler; every other env drops it (paired with -<angler/>). Space + radar re-verified building.
  • Solunar core (src/angler/Solunar.*): majors = moon transit (+2h), minors = moonrise/set (+1h), start-at-event; day rating from moon phase + a sunrise/sunset "green window" bump. Validated on hardware vs NYC 2026-06-01 to the minute (majors 01:33 & 13:58, minors 05:53 & 22:04, sun 05:27/20:21 EDT, 98% moon → Excellent).
  • Hybrid shell (auto-rotate + swipe + tap-to-inspect): Bite (24h ring), Moon (live phase disk), Sun, Clock, Splash — user-toggleable grid. No PPI sweep (gated out of main.cpp).

Stage 2 — keyless live feeds (all no-key, no-backend)

  • AnglerFeedClient — one core-0 worker over four endpoints (mirrors SpaceFeedClient: depth-1 queues, per-feed interval + backoff, last-good retained): NOAA CO-OPS predictions (hi/lo) + water temperature (US; only with a station set), Open-Meteo forecast (wind/temp/pressure + 24h pressure history), Open-Meteo Marine (waves + sea-surface temp, worldwide). US-first, Open-Meteo worldwide fallback.
  • Screens (+ detail cards): Tides (cosine-interp curve + next hi/lo countdown + water temp), Barometer (pressure + falling/rising/steady rate + 24h sparkline), Wind (compass + WMO conditions), Water (temp + waves, NOAA gauge preferred), Catch Log.
  • Catch log (AnglerLogbook, own NVS): tap to log a catch, tagged whether a solunar window was active → a "% during bite windows" hit-rate, plus best day + fishing-day streak.
  • Alerts: bite-window + falling-barometer + tide-turning-soon, edge-seeded; ntfy + optional speaker chime.
  • Config: NOAA tide-station id with a browser-side "find nearest" button (resolves client-side, stores only the id), imperial/metric units, alert toggles, expanded screen grid.

Keyless mandate

No baked keys, no backend anywhere. NOAA CO-OPS + Open-Meteo are keyless; tides degrade to Open-Meteo / a clean "no station" state outside the US.

Verification

  • Builds: angler (flash 23.4%, RAM 18.4%), space, radar all SUCCESS after the astro move.
  • Flashed to the S3 1.46" (Bend, OR — inland): boots clean (QMI8658 IMU + I2S speaker ready), OTA channel angler-s3-146, no WDT. Live weather feed lands (53°F, wind 10 mph N, 1013.6 hPa, 24h history → Barometer/Wind populate); marine + tides correctly skip inland/no-station; solunar self-check still exact.
  • Tide + water-temp URLs validated against live NOAA (predictions shape matches the parser; sensorless stations return {"error"}, handled as a valid empty result).

Wiring

[env:blipscope-angler-s3-146] (FW_OTA_PREFIX="angler-"); main.cpp manager + sweep gates; ConfigurationWebServer #elif defined(FEATURE_ANGLER) branch (teal theme); CI matrix row angler-s3-146; CLAUDE.md section.

Stage 3 (optional, later): NDBC buoy real observations, the tide 6-minute curve, further units polish.

🤖 Generated with Claude Code

New sixth compile-time product (-DFEATURE_ANGLER): a desk fishing companion whose
hero is an on-device SOLUNAR "best bite times" forecast computed from the shared
sun/moon ephemeris -- no network, works offline and worldwide.

- Shared astronomy core moved src/space/Astro.{h,cpp} -> src/astro/ (namespace
  space::astro unchanged); compiled only in the Space + Angler builds and dropped
  from every other env's build_src_filter, always paired with -<angler/> since
  Angler links astro. Space + radar re-verified building after the move.
- Solunar core (src/angler/Solunar.*): majors = moon transit, +2h; minors =
  moonrise/set, +1h (start-at-event, matching the published table validated
  against); day rating from moon phase + a sunrise/sunset "green window" bump.
  On-hardware self-check vs NYC 2026-06-01 matches to the minute (majors 01:33 &
  13:58, minors 05:53 & 22:04, sun 05:27/20:21 EDT, 98% moon -> Excellent).
- Hybrid shell (auto-rotate + swipe + tap detail): Bite / Moon / Sun / Clock +
  Splash, user-toggleable via the ang-screens checkbox grid. The Bite hero is a
  24h ring with period arcs, sunrise/sunset markers, a now-hand, day rating, and
  tap-to-inspect period / day-summary cards; Moon draws a live phase disk.
- ntfy + optional speaker-chime alerts when a major feeding window opens
  (edge-seeded at boot so the backlog never fires). Reuses the shared ntfy-topic.
- Wiring: [env:blipscope-angler-s3-146] (FW_OTA_PREFIX="angler-"), main.cpp
  manager + sweep gates, ConfigurationWebServer #elif branch (teal theme;
  location/tz/screens/alerts; no BYO key -- fully on-device in Stage 1), CI matrix
  row angler-s3-146, CLAUDE.md section.

Stage 2 will layer the keyless live-data feeds on top (NOAA CO-OPS tides + water
temp, Open-Meteo weather + barometer trend, NDBC buoys) plus a catch log.

Verified on the S3 1.46": builds (flash 22.6%, RAM 18.2%), boots clean (QMI8658
IMU + I2S speaker ready), OTA channel angler-s3-146, solunar self-check passes.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@daniel-frenkel daniel-frenkel merged commit a4ef97b into main Jul 1, 2026
8 checks passed
@daniel-frenkel daniel-frenkel changed the title Angler edition (Stage 1): on-device solunar bite forecast Angler edition: solunar bite forecast + live tides/weather/water + catch log Jul 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant