diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..d3cc61b --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,147 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +This project follows a simple semantic versioning style: +`MAJOR.MINOR.PATCH` + +--- + +## [6.0.0] - 2026-01-27 + +### Added +- **Daily fetch + NVS storage (ESP32‑C3 NVS)** + - Introduced non‑volatile storage for daily price data using the existing `Preferences` (NVS) subsystem under the `"my-ticker"` namespace. + - Stored fields: + - `data_day`, `data_mon`, `data_year` (calendar date of the data) + - `data_prc` (raw JSON returned from the Energy‑Charts API) + - `data_last_store` (UNIX timestamp of last successful store) + - On boot, after Wi‑Fi and NTP time sync: + - The ticker checks NVS for stored data. + - If the stored date matches **today**, the JSON is deserialized and used directly (no initial API call needed). + - If the stored date is **not** today (or invalid), the data is ignored and the ticker behaves as if no data is available yet. + +- **Midnight rollover + daily fetch logic** + - The system now performs **one daily fetch per day**, instead of hourly: + - **On boot**: fetch only if NVS does not already contain valid data for today. + - **After local midnight**: invalidate the previous day’s data and trigger a new fetch for the new day. + - As soon as a local‑time day change is detected: + - `isTodayDataAvailable` is set to `false`. + - The display state is forced to `"No data for today"` (`NO_DATA_OFFSET`). + - The white LED is turned off (same behavior as “no data”). + - A midnight fetch phase is activated. + +- **Midnight fetch retry strategy** + - When midnight is detected: + - First fetch is scheduled **immediately**. + - If it fails (HTTP error or JSON/“day mismatch”), the system stays in `"No data for today"` and the LEDs remain off. + - Retry policy during midnight phase: + 1. Retry every **10 minutes**, up to **5 attempts**. + 2. If still unsuccessful, retry only once **at the top of each following hour** until fresh data for the new day is retrieved. + - As soon as a successful fetch for today is obtained: + - `isTodayDataAvailable = true`. + - The enforced `NO_DATA_OFFSET` state is cleared back to `CURRENT_PRICES`. + - The white LED resumes indicating the current 15‑minute segment price. + - The entire successful JSON payload and metadata are saved back into NVS. + +- **Improved resilience after power loss** + - If the device reboots during the same day: + - It can **restore and reuse** the last successfully stored daily data from NVS. + - This avoids unnecessary API calls and gives a fast “warm start” after power outages. + - If the device reboots on the **next** day: + - Yesterday’s stored data is **not** used for display (to avoid confusion). + - The display starts in `"No data for today"` until the first successful fetch. + +- **Extended secondary (info) menu** + - The secondary info screen (reachable via double‑click on the button) is extended from 16 to **20 lines**, still shown as 4‑line pages. + - Existing info retained: + - Current time and date. + - Last successful update timestamp. + - Daily average price. + - Wi‑Fi RSSI and device IP. + - API success ratio. + - Uptime. + - Credits and version information. + - **New NVS status section** (first defined around lines 12–15, later rearranged in your version): + - Shows: + - NVS data status (`NVS status:`) + - Stored data date (`Data day: DD.MM.YYYY` or `Data day: none`) + - Last store timestamp (`Last save: DD.MM.YY` or `Last save: none`) + - Basic quick status: + - `NVS: OK (today)` – valid data for today loaded from NVS + - `NVS: old data` – NVS has data, but not from today (ignored for display) + - `NVS: empty` – no stored price data present + +### Changed +- **API call strategy** + - Removed regular **top‑of‑hour** automatic fetching. + - API calls now occur only: + - Once at boot (if NVS has no valid data for today). + - After midnight (with the retry strategy described above). + - On user‑initiated **long‑press** (manual refresh). + - This significantly reduces network load while keeping behavior safe and predictable. + +- **UI & behavior around day boundaries** + - At midnight / day change: + - Display is immediately set to: + - Line 0: `No data for today` + - Line 1: `Press & hold to` + - Line 2: `refresh manually` + - White LED is turned off (no price indication until new data arrives). + - Once data for the new day is available: + - The ticker returns to the usual 15‑minute detail + hourly display mode. + +- **Versioning and info screens** + - Version bumped to **v6.0** and reflected in: + - Source file header comment. + - Secondary menu text (`price ticker v6.0`). + - New version documentation (`VERSION.md` / `CHANGELOG.md` / `README.md`). + +- **Long‑press threshold (in repository version)** + - Long‑press detection threshold extended from 2s to **3s** (in your repository copy) to avoid accidental manual refreshes. + +### Fixed / Ensured +- Yesterday’s data is **never shown** as if it were today’s: + - On boot: previous‑day NVS data is ignored for display. + - After midnight: in‑RAM data is invalidated and the UI explicitly shows `"No data for today"` until fresh data is fetched. +- LED state is always consistent with the availability of **today’s** data: + - LED off → no today data (or negative price). + - LED patterns → valid today data and a positive price in the current 15‑minute interval. + +--- + +## [5.5.0] - 2025-10-27 + +> First 15‑minute detail version and DST‑fixed base, which v6.0 builds upon. + +### Added +- **15‑minute detail mode**: + - Primary display shows: + - Current hour average. + - Four 15‑minute prices in compact format (`XX XX XX XX`). + - Next 2 hours’ averages. + - LED behavior switched from hourly‑based to **15‑minute‑segment based**. +- **Compact price format**: + - 15‑minute values shown as 2‑digit hundredths (e.g. `+99 -07 24 11`). +- **DST / timezone handling**: + - `configTzTime()` with `TZ_CET_CEST` for automatic CET ↔ CEST switching. +- **Aggressive retry and state enforcement**: + - Improved logic for: + - Handling stale data. + - Enforcing `"No data for today"` state when needed. + - Aggressively retrying fetches after HTTP/JSON failures. +- **UI and usability tweaks**: + - Button: + - Single click: scroll primary list (hourly view). + - Double click: switch primary/secondary list. + - Long press: manual refresh. + - Secondary info list: + - Date/time, last update, daily average, Wi‑Fi and API stats, uptime, credits. + +--- + +## Older versions + +Earlier versions (≤5.4) introduced the basic ticker behavior, LCD layout, Energy‑Charts API integration, and the initial presence sensor / backlight / LED logic. + +Those versions are not fully documented here, but key user‑visible behavior is maintained in v6.0 unless explicitly noted in this changelog.