diff --git a/CHANGELOG.md b/CHANGELOG.md index 69a8766..3012d74 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,34 @@ 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/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.8.5] - 2026-03-13 + +### Added + +- **Model Aliases**: Introduced `MODEL_ALIASES` to support devices whose `PRODUCT_CODE` differs from the model ID used in data keys and mappings + - Replaces the former hardcoded workaround for `PDHC1H1HAR1V1` + - New device supported: **SEKO POOLDOSE pH+ORP CF Group Wi-Fi** (`PDPR1H1HAW102`, FW `539187`) — resolves to `PDPR1H1HAW100` mapping +- **New Device Mapping**: Added `model_PDPH1H1HAW100_FW539176.json` for pH-only devices + - New device supported: **SEKO PoolDose pH** (`PDPH1H1HAW100`, FW `539176`) +- **Extended Mapping**: `model_PDPR1H1HAW100_FW539187.json` extended from 32 to 54 entities + - 11 new binary sensor alarms (secondary overfeed, temperature, pH/chlorine concentration, system standby) + - 6 new sensors with conversions (circulation pump, CL dosing mode, device config, temperature unit, delay statuses) + - 5 new number entities (dosing off-timers, delay timers) + +### Fixed + +- **Session Consistency**: All functions in `RequestHandler` now use the shared `_get_session()` method, enabling correct session hand-over from Home Assistant +- **Response Parsing**: Fixed double-read bug in `get_access_point()` + +### Enhanced + +- **Test Coverage**: Added tests for alias resolution, session consistency, and access point parsing +- **Code Quality**: All tests pass (143 total), pylint score 10.00/10 + +### Contributors + +Thanks to [@ronaldvdmeer](https://github.com/ronaldvdmeer) and [@pwntester](https://github.com/pwntester) for their contributions to this release. + ## [0.8.2] - 2026-01-12 ### Changed diff --git a/README.md b/README.md index 0674d42..2a388cc 100644 --- a/README.md +++ b/README.md @@ -883,9 +883,13 @@ The `instant_values_structured()` method returns data organized by type: This client has been tested with: -- **SEKO PoolDose Double** (Model: PDPR1H1HAW100, FW: 539187) -- **VÁGNER POOL VA DOS BASIC** (Model: PDHC1H1HAR1V0, FW: 539224) -- **VÁGNER POOL VA DOS EXACT** (Model: PDHC1H1HAR1V1, FW: 539224) +| Device | PRODUCT_CODE | FW Code | Notes | +|---|---|---|---| +| SEKO PoolDose Double | PDPR1H1HAW100 | 539187 | Extended mapping (54 entities) | +| SEKO POOLDOSE pH+ORP CF Group Wi-Fi | PDPR1H1HAW102 | 539187 | Alias for PDPR1H1HAW100 mapping | +| SEKO PoolDose pH | PDPH1H1HAW100 | 539176 | pH-only device | +| VÁGNER POOL VA DOS BASIC | PDHC1H1HAR1V0 | 539224 | | +| VÁGNER POOL VA DOS EXACT | PDHC1H1HAR1V1 | 539224 | Alias for PDHC1H1HAR1V0 mapping | Other SEKO or VÁGNER POOL models may work but are untested. The client uses JSON mapping files to adapt to different device models and firmware versions (see e.g. `src/pooldose/mappings/model_PDPR1H1HAW100_FW539187.json`). @@ -967,6 +971,9 @@ Data Classification: For detailed release notes and version history, please see [CHANGELOG.md](CHANGELOG.md). -### Latest Release (0.8.2) +### Latest Release (0.8.5) -- **Type Constants**: centralized runtime constants for platform types +- Added support for **SEKO POOLDOSE pH+ORP CF Group Wi-Fi** (`PDPR1H1HAW102`) and **SEKO PoolDose pH** (`PDPH1H1HAW100`) devices +- Extended `PDPR1H1HAW100` mapping from 32 to 54 entities +- Improved session consistency in `RequestHandler` +- Thanks to [@ronaldvdmeer](https://github.com/ronaldvdmeer) and [@pwntester](https://github.com/pwntester) diff --git a/src/pooldose/__init__.py b/src/pooldose/__init__.py index 27c6d6b..225016f 100644 --- a/src/pooldose/__init__.py +++ b/src/pooldose/__init__.py @@ -1,5 +1,5 @@ """Async API client for SEKO Pooldose.""" from .client import PooldoseClient -__version__ = "0.8.2" +__version__ = "0.8.5" __all__ = ["PooldoseClient"] diff --git a/tests/test_request_handler.py b/tests/test_request_handler.py index 04a8748..89d40b9 100644 --- a/tests/test_request_handler.py +++ b/tests/test_request_handler.py @@ -312,7 +312,7 @@ async def test_get_device_language_closes_internal_session(self): async_cm.__aenter__.return_value = mock_response mock_session.post = MagicMock(return_value=async_cm) - status, data = await handler.get_device_language("TEST_DEVICE") + status, _ = await handler.get_device_language("TEST_DEVICE") assert status == RequestStatus.SUCCESS mock_session.close.assert_awaited_once()