All notable changes to this project will be documented in this file.
Releases are created manually by tagging commits with version tags matching v*.*.* (e.g., v2.1.0). Users should build from source and configure private.h with their own meter settings.
Non-breaking hardening follow-up to the v3.0.0 GDO2 changes. The default and both opt-out paths are unchanged; correctly-wired setups behave identically to v3.0.0.
- TX FIFO overflow guard (GDO2 path). The wake-up FIFO feed loop in
get_meter_data_for_meter()now verifies real TX free space viaTXBYTESbefore writing in GDO2 mode, matching the safety the SPI-polling fallback already had. A miswired / stuck-LOW GDO2 can no longer drive the 64-byte TX FIFO into overflow.
- Stuck-GDO2 diagnostics. When the TX interrogation-frame gate waits the full safety window with GDO2 still HIGH, the driver now logs an explicit "GDO2 still HIGH - check wiring" warning and increments a lifetime counter (
cc1101_get_gdo2_timeout_count()), so a wiring fault is no longer silently misread as "meter asleep / out of range". - Boot-time GDO2 wiring self-test.
cc1101_init()performs a one-time check that GDO2 reads LOW with an empty TX FIFO and HIGH once the FIFO is filled past the threshold. A failed toggle logs a warning and bumps the same diagnostic counter, so a miswired GDO2 is flagged at boot instead of only after the first failed read. - ESPHome
gdo2_timeoutsdiagnostic sensor (optional) exposing that counter to Home Assistant.
- GDO2 input now uses a pull-up (matching GDO0), so a disconnected/miswired GDO2 reads HIGH and fails loudly via the stuck-HIGH path instead of floating. ESP8266 has internal pull-ups on every GPIO except GPIO16.
- ESPHome config validation now rejects setting both
gdo2_pin:anddisable_gdo2_fifo_management: true(previously the opt-out was silently ignored when a pin was also present).
⚠️ BREAKING CHANGE - CC1101 GDO2 hardware-assisted FIFO threshold management is now the default mechanism for talking to the radio on both the standalone (MQTT) and ESPHome targets. You must wire CC1101 GDO2 to a free GPIO and configure it, or explicitly opt out. Existing setups that did not wire GDO2 require migration (see below).This release also rolls in the previously unreleased v2.4.0 work: the hardware-assisted GDO2 FIFO mechanism (TX + RX) plus reliability, diagnostics, and data-validation improvements. Preserves ESP8266 (Arduino) and ESP32 + ESPHome support.
- GDO2 is required by default. The GDO2 hardware FIFO mechanism is now enabled by default instead of being optional:
- MQTT / standalone firmware:
include/private.hmust define eitherGDO2 <pin>(to enable, recommended) orDISABLE_GDO2_FIFO_MANAGEMENT(to opt out and keep legacy SPI polling). If neither is defined, the build fails with a clear compile-time#errorfromsrc/core/cc1101.cpppointing to the README anddocs/GDO2_FIFO_MANAGEMENT.md. - ESPHome component:
gdo2_pin:is now required unlessdisable_gdo2_fifo_management: trueis set. If neither is provided, configuration validation fails with a descriptivecv.Invaliderror explaining both options and linking to the docs.
- MQTT / standalone firmware:
- If you want the new (recommended) behaviour: wire CC1101 GDO2 to a free GPIO that does not collide with the SPI bus or GDO0, then:
- MQTT: add
#define GDO2 <pin>toinclude/private.h(e.g.#define GDO2 4). - ESPHome: add
gdo2_pin: <GPIO>to youreverblu_meter:block (e.g.GPIO4on ESP8266,GPIO27on ESP32).
- MQTT: add
- If you cannot/do not want to wire GDO2: opt out explicitly to keep the prior SPI-polling behaviour:
- MQTT: add
#define DISABLE_GDO2_FIFO_MANAGEMENTtoinclude/private.h. - ESPHome: add
disable_gdo2_fifo_management: trueto youreverblu_meter:block.
- MQTT: add
- Hardware-assisted GDO2 FIFO threshold management (Issues #83, #84): the CC1101 driver uses the GDO2 pin as a hardware FIFO threshold signal on both standalone (MQTT) and ESPHome targets, dynamically reconfiguring
IOCFG2per phase:- TX phase (
IOCFG2 = 0x02): GDO2 asserts at the TX FIFO threshold and replaces the stale SPITXBYTESstatus check and fixeddelay()in the WUP feeding loop and interrogation-frame gate, proactively preventingTXFIFO_UNDERFLOWunder ESPHome scheduler load. - RX phase (
IOCFG2 = 0x01): GDO2 signals the RX FIFO threshold / end-of-packet, letting the RX drain loop skip unnecessaryRXBYTESSPI reads while still draining promptly.
- TX phase (
gdo2_pinconfiguration in the ESPHome Python schema (__init__.py) and C++ integration, plus the standaloneGDO2macro; newcc1101_set_gdo2_pin()API andGET_GDO2_PIN()accessor so both targets share the same logic.disable_gdo2_fifo_managementESPHome option andDISABLE_GDO2_FIFO_MANAGEMENTstandalone macro to explicitly opt out of the GDO2 mechanism.- Single-day reading schedules: the reading schedule now accepts a single weekday (e.g.
Monday) in addition to theMonday-Friday/Monday-Saturday/Monday-Sundaypresets, so meters can be read on just one day of the week. (Thanks @b4dpxl, #79.) - ANSI colour support for the standalone Serial / WiFi serial monitor: log lines are colourised by level (
LOG_*) and by leading subsystem tag (e.g.[METER],[FREQ]) for easier scanning in the VS Code terminal, PlatformIO monitor, or telnet. ESPHome's own logger is unaffected. Disable at build time with-D EVERBLU_LOG_COLOR=0.platformio.ininow setsmonitor_filters = directso the escape sequences render instead of being rewritten to glyphs. - Wide frequency scan button for ESPHome radio crystal calibration (#96): a dedicated
wide_frequency_scan_buttonruns the wide-band (±100 kHz) coarse + fine sweep (performFrequencyScan(true)). Previously ESPHome only exposed the narrow ±30 kHz refine scan, so a CC1101 whose crystal was off by more than 30 kHz could never lock onto the signal, never saved an offset, and appeared broken/per-meter. Wired throughEverbluMeterTriggerButtoncodegen and added to all example YAMLs. The standalone (MQTT) build already performs a first-boot wide scan and is unchanged. - Robust ESPHome deploy script (
scripts/deploy-esphome-to-ha.ps1, #97): a runnable replacement for the ad-hocRemove-Item/Copy-Itemdeploy notes that clears read-only attributes and usesrobocopy /MIR, so a partial/aborted copy can no longer leave a broken component on the Home Assistant share. - Native unit tests covering RADIAN volume and out-of-range time rejection, plus expanded
schedule_managerschedule-matching tests. - Developer tooling: repo-wide linting/formatting via
.clang-format(ESPHome code style) for C++,ruff.tomlfor Python, and.yamllintfor YAML;ESPHOME/format-component.ps1/.shhelper scripts; an expanded pre-commit configuration; and comprehensive ESPHome CI fixtures (.ci/esphome/*) exercising all sensors, options, and code paths (including a legacy GDO2 opt-out config).
- Default maximum read retries lowered from 10 to 5 on both the standalone (MQTT) and ESPHome targets (#98). The count remains user-configurable via
MAX_RETRIES(include/private.h) andmax_retries(ESPHome, range 1–50); examples, docs, andESPHOME-release/were updated accordingly. - Frequency calibration sensors are now global (per-radio) (#96):
frequency_offset,tuned_frequency, andfrequency_estimateuse static pointers (first-registration wins), so the single radio-wide offset is reflected in one set of Home Assistant entities instead of being duplicated per meter. The frequency offset is a property of the radio, so all meters on one CC1101 share the same base frequency. - Device-level sensors are now shared across meters (#96):
CC1101 Connected,CC1101 State, andFirmware Versiondescribe the single shared radio/firmware, so their sensor pointers are now static (first-registration wins) and are declared once in the multi-meter example instead of being duplicated per meter. - Suppressed verbose per-attempt logging during frequency scans (#97): frequency scans invoke a full meter-read sequence at every step, which flooded the log with irrelevant
[METER]/[CC1101]/[RX]detail. Ag_echo_debug_quietflag honoured byecho_debug(), plus a non-copyable/non-movableEchoDebugQuietGuardRAII helper, wraps the wide/narrow scan functions on both the ESPHome and standalone builds; high-level scan progress (LOG_*) remains visible. ESPHOME/prepare-component-release.ps1now retries lock-prone file operations (#96): OneDrive/antivirus can briefly hold handles onESPHOME-release/files; the clear, copy, flatten, include-rewrite, and LF-normalize steps are now wrapped in anInvoke-WithRetryhelper that waits with an increasing delay before giving up, so the release script and pre-commit hook no longer fail mid-run.FIFOTHRchanged from0x47(TX threshold 33 bytes) to0x49(TX threshold 25 bytes), guaranteeing ≥ 40 free bytes so the 8-byte WUP buffer and 39-byte interrogation frame can be written after a single GDO2 check. Applied regardless of GDO2 wiring.- Non-blocking WiFi serial monitor: all TCP output now flows through a power-of-two ring buffer drained in
loop(), so a slow or full TCP socket can no longer stall the main loop. Dropped-byte counts are reported to the client on overrun, the buffer is reset on each new client connection, and the welcome banner now includes the ESP8266 reset reason. include/private.example.hnow enables#define GDO2 4by default and documents theDISABLE_GDO2_FIFO_MANAGEMENTopt-out.- All ESPHome examples (
example-water-meter.yaml,example-gas-meter-minimal.yaml,example-advanced.yaml,example-nano-esp32.yaml,example-multi-meter.yaml) now setgdo2_pinby default with safe free-GPIO choices and opt-out notes, and include SPI-bus pin warnings (avoiding GPIO12/13/14 on ESP8266). - Configuration logging: the ESPHome
dump_configand the standalone startup banner report whether GDO0/GDO2 are configured and how FIFO threshold detection is performed.dump_configreports the GDO2 fallback state as "disabled (legacy SPI polling fallback)" and the standalone banner reports whether GDO2 is enabled, explicitly disabled viaDISABLE_GDO2_FIFO_MANAGEMENT, or misconfigured. - Meter-read logging clarity (standalone): each read is now wrapped in
METER READ - START / COMPLETE / FAILEDbanner blocks, with the firmware version folded into the START banner (removing the duplicate[STATUS] Firmware versionline). A successful TX FIFO drain (MARCSTATE 0x16) is reported neutrally as the normal end of transmit instead of a false "No response" failure, and the "meter asleep / out of range / wrong Year-Serial" guidance is deferred until both the ACK and data-frame stages actually fail. CRC-failure and frame-timeout messages were reworded to point at RF link quality (antenna/frequency) rather than a code fault, the "First 32 bytes" hex dump is kept on a single line, and a malformed UTC seconds separator (%02d:%02d/%02drendering16:09/17instead of16:09:17) was corrected at all three time-print sites. - WiFi serial live streaming during frequency scans: the standalone frequency-scan loops now drain the WiFi serial ring buffer between steps, so remote log output streams live during a scan instead of arriving all at once when it completes.
- Repo-wide formatting/style pass: C++, Python, and YAML sources reformatted to the new
.clang-format/ruff/yamllintrules (accounts for the large mechanical churn ineverblu_meter.cpp/.h,__init__.py, and others); no behavioural change. - CI workflows reworked across all nine workflows: added
concurrencywith cancel-in-progress,paths:filters so jobs only run on relevant changes, a draft-PR skip guard, and manualworkflow_dispatch, while retaining continuous per-push PR feedback anddeveloppush builds (#92, #94). CONTRIBUTING.md, README, andESPHOME/docs/*updated, including ESPHome Device Builder compatibility notes and a fix for malformed Markdown list structure in the README configuration/advanced sections (#87).- README and
ESPHOME/README.mdupdated: GDO2 documented as required-by-default with opt-out instructions, wiring tables marked accordingly, and ESPHome documentation links surfaced prominently near the top of the main README. - Standardized file header comments across
src/core/to the Doxygen@file/@briefstyle already used throughoutsrc/services/andsrc/adapters/, resolving documentation drift from multiple contributors; added missing headers tocrc_kermit.h/.cpp,radian_parser.h/.cpp, andmeter_code_parser.h, and converted plain-comment headers incc1101.cpp,wifi_serial.h/.cpp, andversion.h. - Added the
docs/GDO2_FIFO_MANAGEMENT.mddesign document (TX and RX paths). - Regenerated the
ESPHOME-release/bundle so it reflects the new GDO2 support and standardized headers. - Bumped firmware version to
3.0.0.
- Frequency offset now persists across power-cycle reboots on ESP8266 (#96): ESPHome assigns preference storage slots by
make_preference()call order and defaults to RTC memory (wiped on power loss). The previous code created a new preference object inside everysaveFloat/loadFloat, so save and load landed on different slots - the post-save read-back passed but the value was never found again after a reboot. OneESPPreferenceObjectper key hash is now cached and reused for save/load, within_flash=trueso the offset is written to the flash sector and survives a full power cycle. ESP32 (NVS) and the standalone EEPROM path are unaffected. - Restored frequency calibration is now confirmed at boot (#96):
begin()distinguishes a genuinely persisted offset (even0.0) from "nothing stored" using a NaN sentinel, logs an explicit RESTORED-vs-not-found line, and publishes the restored offset and tuned frequency to Home Assistant at boot so persistence can be verified without waiting for the first read. - ESPHome
clearKey/hasKeyare now consistent and flash-safe (#96):clearKey()previously used a freshmake_preference<float>(hash)targeting a different slot/length thansaveFloat/loadFloatand omittingin_flash, so it could not reliably invalidate the stored offset. It now reuses the cached flash-backed preference object and writes a zeroed magic so a laterloadFloatfails its magic check and returns the default. BothclearKey()andhasKey()guard against a nullglobal_preferences, treat a zeroed magic as absent, and sync the cleared slot to flash so the clear survives a reboot. - RX frame truncation when GDO2 is wired: the Stage-2 payload receive loop runs in
PKTCTRL0_INFINITE_LENGTHmode where the CC1101 never generates an end-of-packet, so GDO2 (IOCFG2 = 0x01) only asserted at the 40-byte RX FIFO threshold and the final sub-threshold remainder of each frame was skipped indefinitely. The Stage-2 loop now always pollsRXBYTESto drain the tail (Stage-1 fixed-length sync loop and TX-side GDO2 logic are unchanged). - RADIAN data validation now rejects physically impossible meter volumes (> 1 billion litres), guarding against corrupted decode alignment. (Out-of-range time-value rejection already shipped in v2.3.0.)
meter_readernow maintains the active reading state throughout the retry sequence (the "Active Reading" sensor and radio state stay asserted across the whole retry sequence and are cleared only on final success or after max retries, instead of flickering idle between attempts).- Refresh
MARCSTATEon a GDO2 underflow break and guard the interrogation-frame write with a FIFO-ready check. - Junk sensor values before the first read (#69): the ESPHome component now publishes its known-at-boot configuration (meter year/serial, schedule, reading time, frequency, firmware version) and sensible idle placeholders (radio
Idle, statusReady, errorNone,active_readingfalse) at the end ofsetup(), so display lambdas and other components no longer read uninitialised sensor state before Home Assistant connects. Numeric sensors with restored history are left untouched so HA-restored values are not overwritten. - Guard against a null
gmtime()result in the scheduled-read check and standalone time prints to avoid a potential null dereference.
⚠️ BREAKING CHANGE - This release enforces strict validation of the meter code format. Existing configurations with flexible serial lengths (1–8 digits) will not validate without migration. See Migration Required below.
- Meter Code Validation: The meter code format is now strictly enforced as
YY-SSSSSSS[-NNN]:YY: Exactly 2-digit yearSSSSSSS: Exactly 7-digit serial number (leading zeros allowed)NNN: Optional 3-digit suffix (check digits, ignored if present)
- Serial numbers shorter or longer than 7 digits will now be rejected.
- Error messages updated to clarify "exactly 7 digits" instead of "1 to 8 digits".
- Update your
METER_CODEininclude/private.hto match the strict formatYY-SSSSSSS[-NNN]. - Ensure all ESPHome YAML configurations use valid meter codes with exactly 7-digit serials.
- Updated
src/core/meter_code_parser.hto enforce strict 7-digit serial validation. - Updated ESPHome validator to require
len(serial_str) == 7. - Updated error messages and examples to reflect the exact format.
- Updated test cases to validate only 7-digit serials.
- Added new test case to reject short serials (<7 digits).
- Removed outdated references to "1 to 8 digits" in comments and documentation.
- Added compile-time MQTT option
ENABLE_HA_DISCOVERY(default1) to allow disabling Home Assistant discovery topic publishing (homeassistant/...) while keeping raw MQTT telemetry and command topics active (Issue #77).
- Updated
include/private.example.hand README configuration guidance with the new Home Assistant discovery toggle. - Bumped firmware/component version to
2.2.1.
⚠️ BREAKING CHANGE - This release contains a breaking ESPHome configuration schema change due to the explicit SPI integration. Existingeverblu_meterYAML configurations will not validate without migration. See Migration Required below.
- ESPHome component configuration schema changed.
- Existing ESPHome YAML that relied on implicit CC1101 SPI wiring will no longer validate.
everblu_meternow requires explicit SPI integration fields:- top-level
spi:bus definition spi_idundereverblu_metercs_pinundereverblu_meter
- top-level
- Add a top-level
spi:block with your board-specific CLK/MOSI/MISO pins. - Add
spi_idandcs_pintoeverblu_meter. - Keep
gdo0_pinconfigured undereverblu_meter.
- Bumped firmware/component version to
2.2.0to reflect the large ESPHome SPI integration and migration impact. - Consolidated release notes for SPI schema migration, example updates, and ESPHome CC1101 integration hardening.
- Updated ESPHome example configurations to the new SPI schema (
spi:bus +spi_id+cs_pin) across water, gas, advanced, and Nano ESP32 examples. - Added SPI migration guidance in ESPHome README with explicit before/after configuration snippets.
- Clarified ESPHome CC1101 SPI transport behavior and comments to avoid implying the
500kHzsetup call controls ESPHome transfer speed.
- Reduced misleading
[ERROR] TX ABORTED due to TXFIFO_UNDERFLOWand related[ERROR]log messages that appeared whenever a meter did not respond during polling. These are expected conditions (meter asleep, out of range, or wrong Year/Serial configured) and are no longer logged at error level. They now appear with[METER]/[RX]prefixes and include context explaining likely causes. - Updated ESPHome
error_sensortext (visible in Home Assistant) to display actionable messages such as"No meter response (asleep/out of range/wrong Year/Serial) - retrying"and"No meter response after max retries - check distance and meter Year/Serial"instead of generic failure strings. - Prevented ESPHome boot state republish from overwriting CC1101 init failures with
status=Readyanderror=None. - Removed unused
cs_pinstorage from ESPHome CC1101 SPI bridge (cc1101_set_spi_devicenow takes only the SPI device pointer). - Removed unused
CONF_CS_PINimport in ESPHome component schema module. - Corrected Nano ESP32 example to include required SPI fields and removed unsupported
consecutive_failuressensor.
- Applied build updates and ESPHome
2026.3compatibility updates (PR #68 by @davidc).
- Updated ESPHome API usage from
is_connected(true)tois_connected_with_state_subscription()per ESPHome2026.3.0API changes. - Resolved ESPHome compatibility issue tracked in #65.
- Bumped firmware version to
2.1.3for both standalone MQTT firmware and ESPHome release component. - Updated README release callout to reflect current
V2.1.3release.
- Documented a reproducible recovery path for ESP32 PlatformIO builds failing with
ModuleNotFoundError: No module named 'intelhex'.
- CC1101 LQI/FREQEST register reads on buffer overflow (only read when packet completes normally)
- TX underflow error logging (distinct message vs successful completion)
- Comment typo in SFTX flush operation
- Schedule logic bug where "Monday-Sunday" schedule excluded Sunday
- ESPHome component memory leak from raw
newallocations without destructor - Schedule constant mismatch in ESPHome Python code (removed "Everyday", "Saturday", "Sunday")
- Duplicate STRINGIFY macro definition with include guards
- ESPHome namespace compliance for
setup_priorityconstant
- Comprehensive unit tests for schedule manager covering all day combinations
- Cross-platform Git hook installation with automatic executable bit setting
- PowerShell executable detection in pre-commit hook with graceful fallback
- Updated schedule documentation to use standardized names
- Updated ESPHome testing checklist to reflect current schedule options
SCHEDULE_EVERYDAYconstant - useSCHEDULE_MONDAY_SUNDAYinstead- References to legacy "Everyday", "Saturday", "Sunday" schedule options
🎉 ESPHome Integration is NOW FULLY WORKING! 🎉
Major production release with fully functional ESPHome component integration.
- ESPHome Integration: Full production support with 15+ sensors, Home Assistant binary state gating, and button controls
- Adaptive Frequency Tracking: Intelligent frequency offset optimization based on successful reads with configurable thresholds
- Enhanced Sensors: Read attempts counter, frequency offset monitoring, tuned frequency reporting, and meter status indicators
- Dual-Mode Release Package:
ESPHOME-release/directory for ESPHome distribution, dynamically built from shared source - Release Build Scripts: Cross-platform PowerShell and bash scripts to prepare component distribution
- Storage Persistence: Frequency offset persistence with verification (note: offset discovery not persistent between ESPHome reboots)
- Button Controls: Manual read triggers, frequency offset reset, and radio reinitialization commands
- Updated YAML configuration examples (advanced, minimal, water meter) with new sensors and features
- Enhanced data publishing in both ESPHome and MQTT adapters for new metrics
- Improved logging for frequency adjustments and read attempts
- IntelliSense optimization for ESPHome component development
- Documentation and repository URL updates for release clarity
- ESPHome radio initialization and sensor availability handling
- Log routing in ESPHome to capture all MeterReader logs in UI
- Repository URL references in documentation
- VSCode configuration for ESPHOME-release folder integration
- CC1101 discovered best frequency not persistent between ESPHome reboots (frequency offset offset discovery mechanism needs refinement)
- All core functionality remains operational despite this limitation
- ESPHome integration fully tested on hardware
- Standalone MQTT mode validated on ESP8266
- Dual-mode shared codebase verified with ~95% code reuse
The ESPHOME-release/ folder is dynamically built from shared source files via prepare-component-release.ps1 (Windows) or prepare-component-release.sh (Unix):
- Single Source, Dual Distribution: Core business logic in
src/is shared between standalone MQTT and ESPHome modes - Release Preparation: Build scripts copy entire
src/tree + ESPHome adapter layer intoESPHOME-release/everblu_meter/ - Include Path Preservation: No file modifications-pure structural copy preserves all relative includes
- Component Integration: ESPHome loads all
.cpp/.hfiles directly from the release package - Maintenance Simplification: Bug fixes and features in
src/automatically included in next component distribution
This approach eliminates code duplication while supporting both MQTT discovery and native ESPHome integration seamlessly.
Major architectural refactor with ESPHome integration support.
- ESPHome Integration (
⚠️ UNTESTED): Custom component with 15+ sensors, example YAMLs, and documentation - Dependency Injection Pattern: Abstract interfaces (IConfigProvider, ITimeProvider, IDataPublisher) for platform-agnostic operation
- Dual-Mode Support: Choose between standalone MQTT or ESPHome with ~95% code sharing
- WiFi Serial Monitor support for remote debugging
- Reorganized code structure:
adapters/,core/,services/directories - MeterReader now platform-agnostic using dependency injection
- Improved separation of concerns and maintainability
- Missing includes causing compilation failures
- WiFi Serial Monitor now captures all MeterReader logs
- ESP32 build error with watchdog timer include
- ✅ Standalone MQTT mode tested on ESP8266
⚠️ ESPHome integration UNTESTED - use with caution
- Source code structure reorganized
- Internal APIs changed due to adapter pattern
- Major release version bump.
What's changed since v1.1.6:
- Automatically append METER_SERIAL to MQTT client ID to prevent conflicts when running multiple devices on the same broker (#35)
- Restored Home Assistant button discovery by removing unsupported per-button availability payloads
- Device now gracefully handles missing CC1101 radio without continuous reboots
- CC1101 State sensor now shows "unavailable" instead of "Idle" when radio is not connected
- WiFi and MQTT functionality maintained even when CC1101 radio is disconnected
What's changed since v1.1.5:
- Add support for gas meters in addition to water meters (Issue #32)
- Add
METER_TYPEconfiguration option to select between water (default) or gas meters - Gas meter readings automatically convert to cubic meters (m³) with configurable divisor
- Add WiFi-based TCP serial monitor for remote debugging via Telnet (disabled by default)
- Add support for multiple board environments in OTA configuration
- Add OTA update support for all boards with intelligent device boot detection
- Add
MAX_RETRIESconfiguration option for customizable retry behavior - Fix auto-alignment to only apply to scheduled reads, not manual MQTT reads (Issue #34)
- Update MQTT discovery and Home Assistant integration for both meter types
- Improve logging with consistent context prefixes for easier debugging
- Rename MQTT entities from
water_meter_*toeverblu_meter_*for clarity - Update documentation with comprehensive setup and configuration guides
What's changed since v1.1.4:
- Address Copilot AI review feedback
- Fix critical VLA stack overflow bug causing data corruption (Issue #20)
- Add
.txtversions of datasheets - Document dredzik improvement experiments and validate 4x oversampling strategy
- Add error handling for invalid
reads_countervalues during meter report parsing
What's changed since v1.1.3:
- Fix MQTT discovery JSON construction issues and improve overall code quality
- Fix MQTT discovery for water meter reading sensor
- Improve MQTT topic initialization for meter serial handling
- Add optional MQTT debugging output
- Prefix MQTT topics and entity IDs with
METER_SERIALto support multi-meter deployments
What's changed since v1.1.2:
- Enhance RADIAN CRC validation to handle frame length discrepancies
- Add CRC-16/KERMIT verification for RADIAN frames
- Add CRC validation support for RADIAN protocol frames in the CC1101 interface
- Improve error logging around CRC failures
What's changed since v1.1.1:
- Implement automatic wide-frequency scan control on first boot
- Add functions to update and validate reading schedule times using local and UTC time
- Fix multiple definition of
validateConfiguration(Issue #22) - Clean up formatting and improve readability of
getchfunction - Add configuration validation helpers with corresponding unit tests
- Add comprehensive Doxygen-style API documentation and
API_DOCUMENTATION.md
What's changed since v1.1.0:
- Add additional plausibility checks for parsed meter readings (liters) to reject clearly impossible totals before publishing
- Harden historical volume validation to discard inconsistent history blocks while keeping valid primary meter fields
- Make historical attributes JSON generation more robust by using a larger buffer, tracking remaining space, and avoiding malformed payloads on truncation
What's changed since v1.0.1:
- Add first-layer protection against corrupted RADIAN frames using decode-quality and plausibility checks
- Prevent obviously invalid meter data from being published to MQTT
- Surface firmware version (
EVERBLU_FW_VERSIONfromversion.h) as Home Assistant device software version via MQTT discovery - Add retry handling, frequency scan notifications, and connectivity watchdog
- Add timezone offset support
- Add datasheets to the repository
What's changed since v1.0.0:
- Add WeMos D1 Mini board configuration to release workflow
- Make decoder tolerant to stop-bit errors and fix FALSE macro usage
- Add CC1101/RADIAN debug output control to
private.handcc1101.cpp - Rename
config.htoprivate.hand update related documentation - Update
.gitignore
- Initial tagged release
Format inspired by Keep a Changelog. For full details, see the Git commit history and GitHub Releases.