chore: bump version to 1.9.4, update docs

- FIRMWARE_VERSION 1.9.3 → 1.9.4
- CHANGELOG: add v1.9.3 (modular refactor) and v1.9.4 (bug fixes) entries
- README: add v1.9.3/v1.9.4 journey sections, fix project structure tree,
  update version references, correct SDK credentials description

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Alex Petrochenko
2026-05-14 18:52:26 +01:00
co-authored by Claude Sonnet 4.6
parent 3a34244ac8
commit e4ef5c8e07
3 changed files with 61 additions and 10 deletions
+29
View File
@@ -5,6 +5,35 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [1.9.4] - 2026-05-14
### Fixed
- **Date timezone** (#5): Date string now uses local time, so date rolls over at local midnight instead of UTC midnight
- **Weather periodic refresh** (#7): Removed `WEATHER_SUCCESS` state that permanently blocked periodic weather updates after first fetch; also fixed "Last update" counter showing raw timestamp instead of elapsed seconds
- **WiFi connects to wrong network** (#3): `WiFi.begin()` without params is now skipped when a saved SSID exists, preventing connection to SDK-cached open hotspots and config corruption
### Changed
- WiFi startup: SDK-cached credentials only attempted on first boot (no saved SSID); subsequent boots go directly to saved credentials
- ArduinoJson: `StaticJsonDocument` → `JsonDocument` for compatibility with ArduinoJson v7
### Removed
- Unused `weekday` variable in NTP DST calculation (compiler warning)
### Internal
- Split `clock_ntp_ota_v1.9/` directory renamed to `weather_clock/` — version no longer baked into path
- Removed internal development documents from repository
## [1.9.3] - 2026-01-06
### Changed
- Refactored monolithic 2,100-line `.ino` into modular structure:
`display.cpp`, `ntp_client.cpp`, `weather.cpp`, `web_server.cpp`, `wifi_manager.cpp`
## [1.9.2] - 2026-01-06 ## [1.9.2] - 2026-01-06
### Fixed ### Fixed
+31 -9
View File
@@ -27,7 +27,7 @@ I bought a cute weather clock kit from AliExpress ([TJ-56-654](https://pt.aliexp
- [The Investigation](#the-investigation) - [The Investigation](#the-investigation)
- [The Solution: Custom Firmware](#the-solution-custom-firmware) - [The Solution: Custom Firmware](#the-solution-custom-firmware)
- [Technical Deep Dive](#technical-deep-dive) - [Technical Deep Dive](#technical-deep-dive)
- [The Journey: v1.7 → v1.9.2](#the-journey-v17--v192) - [The Journey: v1.7 → v1.9.4](#the-journey-v17--v194)
- [What's Next: Home Assistant Integration](#whats-next-home-assistant-integration) - [What's Next: Home Assistant Integration](#whats-next-home-assistant-integration)
- [How to Flash This Firmware](#how-to-flash-this-firmware) - [How to Flash This Firmware](#how-to-flash-this-firmware)
- [Web Interface](#web-interface) - [Web Interface](#web-interface)
@@ -395,7 +395,7 @@ Wire.begin(0, 2); // SDA=GPIO0, SCL=GPIO2
--- ---
## The Journey: v1.7 → v1.9.2 ## The Journey: v1.7 → v1.9.4
### v1.7: Display Discovery ✅ ### v1.7: Display Discovery ✅
@@ -475,7 +475,7 @@ void setup() {
- ✅ Proper initialization order guaranteed - ✅ Proper initialization order guaranteed
- ✅ Device never freezes on WiFi loss during operation - ✅ Device never freezes on WiFi loss during operation
### v1.9.2: WiFi Resilience (Current) 🛡️ ### v1.9.2: WiFi Resilience 🛡️
**Problem Discovered:** **Problem Discovered:**
@@ -510,7 +510,7 @@ if (wifiRetry.currentRetry >= wifiRetry.maxRetries) {
- **Exponential backoff**: 5s → 10s → 20s → ... → 5min max - **Exponential backoff**: 5s → 10s → 20s → ... → 5min max
- **Fallback AP** ("TJ56654-Setup") enabled after ~5 min, while still retrying - **Fallback AP** ("TJ56654-Setup") enabled after ~5 min, while still retrying
- **Dual STA+AP mode**: Device continues reconnect attempts while AP is active - **Dual STA+AP mode**: Device continues reconnect attempts while AP is active
- **SDK credentials support**: Tries WiFiManager-stored credentials first, then EEPROM - **SDK credentials**: Used only on first boot (no saved SSID); subsequent boots go straight to saved credentials
- **"No WiFi" display**: Shows retry countdown instead of cryptic numbers - **"No WiFi" display**: Shows retry countdown instead of cryptic numbers
- **"!" indicator**: Shown in date line when WiFi disconnected - **"!" indicator**: Shown in date line when WiFi disconnected
@@ -543,6 +543,31 @@ if (wifiRetry.currentRetry >= wifiRetry.maxRetries) {
✅ Time synced and displayed ✅ Time synced and displayed
``` ```
### v1.9.3: Modular Architecture 🗂️
Split monolithic 2,100-line `.ino` into focused modules:
| File | Responsibility |
| ------------------- | --------------------------------------- |
| `weather_clock.ino` | Entry point: `setup()` and `loop()` |
| `config.h` | Config struct, EEPROM layout, constants |
| `globals.h` | Shared state and extern declarations |
| `display.cpp` | OLED rendering |
| `ntp_client.cpp` | Async NTP sync |
| `weather.cpp` | Open-Meteo API fetch |
| `web_server.cpp` | Web UI and REST API |
| `wifi_manager.cpp` | WiFi connection and resilience |
### v1.9.4: Bug Fixes & Cleanup ✅ (Current)
Community-reported bugs fixed:
- **Date timezone** (#5): Date now changes at local midnight, not UTC midnight
- **Weather refresh** (#7): Periodic weather updates no longer blocked after first fetch
- **WiFi hotspot** (#3): Device no longer connects to open SDK-cached networks (e.g. public hotspots) when a saved SSID exists, preventing config corruption
- **ArduinoJson v7**: Updated `StaticJsonDocument` → `JsonDocument` for library compatibility
- **Compiler warnings**: Removed unused variable, fixed sprintf buffer size
### Memory Evolution ### Memory Evolution
| Version | RAM Usage | IRAM Usage | Flash Usage | Notes | | Version | RAM Usage | IRAM Usage | Flash Usage | Notes |
@@ -975,10 +1000,7 @@ esp8266-weather-clock/
│ └── weather_clock.ino # Main firmware (~2,100 lines) │ └── weather_clock.ino # Main firmware (~2,100 lines)
├── docs/ ├── docs/
│ ├── HARDWARE.md # Hardware specifications │ ├── HARDWARE.md # Hardware specifications
│ ├── INSTALLATION.md # Flashing guide │ └── INSTALLATION.md # Flashing guide
│ ├── v1.9_RELEASE_NOTES.md # v1.9.0 async refactoring
│ ├── v1.9.1_HYBRID_FIX.md # WiFi startup fix
│ └── v1.9.2_WIFI_RESILIENCE.md # WiFi resilience documentation
├── CHANGELOG.md # Version history ├── CHANGELOG.md # Version history
└── README.md # This file └── README.md # This file
``` ```
@@ -1016,4 +1038,4 @@ Now go make something cool. 🚀
**Author**: apetrochenko **Author**: apetrochenko
**Date**: 2026-01-06 **Date**: 2026-01-06
**Firmware Version**: v1.9.2 (Production Ready) **Firmware Version**: v1.9.4 (Production Ready)
+1 -1
View File
@@ -9,7 +9,7 @@
#include <Arduino.h> #include <Arduino.h>
// Firmware version // Firmware version
#define FIRMWARE_VERSION "1.9.3" #define FIRMWARE_VERSION "1.9.4"
// OLED I2C Configuration // OLED I2C Configuration
#define I2C_SDA 0 // GPIO0 (I2C Data) - SWAPPED! #define I2C_SDA 0 // GPIO0 (I2C Data) - SWAPPED!