nwp500-python 6.0.8__tar.gz → 6.1.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/CHANGELOG.rst +81 -0
- {nwp500_python-6.0.8/src/nwp500_python.egg-info → nwp500_python-6.1.1}/PKG-INFO +1 -1
- nwp500_python-6.1.1/docs/MQTT_DIAGNOSTICS.rst +1127 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/guides/command_queue.rst +1 -1
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/guides/reservations.rst +74 -48
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/index.rst +1 -1
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/python_api/constants.rst +2 -5
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/python_api/exceptions.rst +5 -5
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/python_api/mqtt_client.rst +14 -39
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/quickstart.rst +1 -1
- nwp500_python-6.1.1/examples/mqtt_diagnostics_example.py +312 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/reservation_schedule_example.py +8 -7
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/__init__.py +13 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/cli/__main__.py +2 -2
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/cli/commands.py +6 -7
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/encoding.py +18 -4
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/models.py +24 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/mqtt_client.py +9 -41
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/mqtt_device_control.py +20 -41
- nwp500_python-6.1.1/src/nwp500/mqtt_diagnostics.py +449 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1/src/nwp500_python.egg-info}/PKG-INFO +1 -1
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500_python.egg-info/SOURCES.txt +3 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/tests/test_api_helpers.py +25 -3
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/tests/test_models.py +11 -1
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/.agent/workflows/pre-completion-testing.md +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/.coveragerc +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/.github/copilot-instructions.md +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/.github/workflows/ci.yml +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/.github/workflows/release.yml +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/.gitignore +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/.pre-commit-config.yaml +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/.readthedocs.yml +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/AUTHORS.rst +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/CONTRIBUTING.rst +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/LICENSE.txt +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/Makefile +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/README.rst +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/RELEASE.md +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/Makefile +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/_static/.gitignore +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/api/nwp500.rst +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/authors.rst +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/changelog.rst +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/conf.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/configuration.rst +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/development/contributing.rst +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/development/history.rst +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/guides/advanced_features_explained.rst +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/guides/auto_recovery.rst +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/guides/energy_monitoring.rst +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/guides/event_system.rst +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/guides/scheduling_features.rst +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/guides/time_of_use.rst +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/installation.rst +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/license.rst +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/openapi.yaml +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/protocol/data_conversions.rst +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/protocol/device_features.rst +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/protocol/device_status.rst +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/protocol/error_codes.rst +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/protocol/firmware_tracking.rst +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/protocol/mqtt_protocol.rst +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/protocol/rest_api.rst +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/python_api/api_client.rst +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/python_api/auth_client.rst +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/python_api/cli.rst +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/python_api/events.rst +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/python_api/models.rst +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/requirements.txt +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/.ruff.toml +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/README.md +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/anti_legionella_example.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/api_client_example.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/auth_constructor_example.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/authenticate.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/auto_recovery_example.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/combined_callbacks.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/command_queue_demo.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/device_feature_callback.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/device_status_callback.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/device_status_callback_debug.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/energy_usage_example.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/event_emitter_demo.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/exception_handling_example.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/improved_auth_pattern.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/mask.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/mqtt_client_example.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/periodic_device_info.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/periodic_requests.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/power_control_example.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/reconnection_demo.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/set_dhw_temperature_example.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/set_mode_example.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/simple_auto_recovery.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/simple_periodic_info.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/simple_periodic_status.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/test_api_client.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/test_mqtt_connection.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/test_mqtt_messaging.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/test_periodic_minimal.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/token_restoration_example.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/tou_openei_example.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/tou_schedule_example.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/pyproject.toml +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/scripts/README.md +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/scripts/bump_version.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/scripts/extract_changelog.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/scripts/format.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/scripts/lint.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/scripts/setup-dev.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/scripts/validate_version.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/setup.cfg +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/setup.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/api_client.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/auth.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/cli/__init__.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/cli/monitoring.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/cli/output_formatters.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/cli/token_storage.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/config.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/constants.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/events.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/exceptions.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/mqtt_command_queue.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/mqtt_connection.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/mqtt_periodic.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/mqtt_reconnection.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/mqtt_subscriptions.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/mqtt_utils.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/py.typed +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/utils.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500_python.egg-info/dependency_links.txt +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500_python.egg-info/entry_points.txt +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500_python.egg-info/not-zip-safe +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500_python.egg-info/requires.txt +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500_python.egg-info/top_level.txt +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/tests/conftest.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/tests/test_auth.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/tests/test_command_queue.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/tests/test_events.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/tests/test_exceptions.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/tests/test_utils.py +0 -0
- {nwp500_python-6.0.8 → nwp500_python-6.1.1}/tox.ini +0 -0
|
@@ -2,6 +2,87 @@
|
|
|
2
2
|
Changelog
|
|
3
3
|
=========
|
|
4
4
|
|
|
5
|
+
Version 6.1.1 (2025-12-08)
|
|
6
|
+
==========================
|
|
7
|
+
|
|
8
|
+
Added
|
|
9
|
+
-----
|
|
10
|
+
|
|
11
|
+
- **MQTT Diagnostics Module**: New ``MqttDiagnosticsCollector`` for capturing MQTT message traffic for debugging
|
|
12
|
+
|
|
13
|
+
- Captures all MQTT publish/subscribe activity with timestamps and payloads
|
|
14
|
+
- Configurable message filtering by topic pattern
|
|
15
|
+
- Message deduplication to reduce storage
|
|
16
|
+
- Automatic cleanup of old diagnostics (configurable retention)
|
|
17
|
+
- Export diagnostics to JSON for analysis and debugging
|
|
18
|
+
- Home Assistant integration support for custom components
|
|
19
|
+
- ``examples/mqtt_diagnostics_example.py`` demonstrating usage patterns
|
|
20
|
+
- Comprehensive documentation in ``docs/MQTT_DIAGNOSTICS.rst``
|
|
21
|
+
- Exported from main package: ``from nwp500 import MqttDiagnosticsCollector``
|
|
22
|
+
|
|
23
|
+
Version 6.1.0 (2025-12-03)
|
|
24
|
+
==========================
|
|
25
|
+
|
|
26
|
+
**BREAKING CHANGES**: Temperature API simplified with Fahrenheit input
|
|
27
|
+
|
|
28
|
+
This release fixes incorrect temperature conversions and provides a cleaner API
|
|
29
|
+
where users pass temperatures in Fahrenheit directly, with automatic conversion
|
|
30
|
+
to the device's internal format.
|
|
31
|
+
|
|
32
|
+
Changed
|
|
33
|
+
-------
|
|
34
|
+
|
|
35
|
+
- **``build_reservation_entry()``**: Now accepts ``temperature_f`` (Fahrenheit)
|
|
36
|
+
instead of raw ``param`` value. The conversion to half-degrees Celsius is
|
|
37
|
+
handled automatically.
|
|
38
|
+
|
|
39
|
+
.. code-block:: python
|
|
40
|
+
|
|
41
|
+
# OLD (removed)
|
|
42
|
+
build_reservation_entry(..., param=120)
|
|
43
|
+
|
|
44
|
+
# NEW
|
|
45
|
+
build_reservation_entry(..., temperature_f=140.0)
|
|
46
|
+
|
|
47
|
+
- **``set_dhw_temperature()``**: Now accepts ``temperature_f: float`` (Fahrenheit)
|
|
48
|
+
instead of raw integer. Valid range: 95-150°F.
|
|
49
|
+
|
|
50
|
+
.. code-block:: python
|
|
51
|
+
|
|
52
|
+
# OLD (removed)
|
|
53
|
+
await mqtt.set_dhw_temperature(device, 120)
|
|
54
|
+
|
|
55
|
+
# NEW
|
|
56
|
+
await mqtt.set_dhw_temperature(device, 140.0)
|
|
57
|
+
|
|
58
|
+
Removed
|
|
59
|
+
-------
|
|
60
|
+
|
|
61
|
+
- **``set_dhw_temperature_display()``**: Removed. This method used an incorrect
|
|
62
|
+
conversion formula (subtracting 20 instead of proper half-degrees Celsius
|
|
63
|
+
encoding). Use ``set_dhw_temperature()`` with Fahrenheit directly.
|
|
64
|
+
|
|
65
|
+
Added
|
|
66
|
+
-----
|
|
67
|
+
|
|
68
|
+
- **``fahrenheit_to_half_celsius()``**: New utility function for converting
|
|
69
|
+
Fahrenheit to the device's half-degrees Celsius format. Exported from the
|
|
70
|
+
main package for advanced use cases.
|
|
71
|
+
|
|
72
|
+
.. code-block:: python
|
|
73
|
+
|
|
74
|
+
from nwp500 import fahrenheit_to_half_celsius
|
|
75
|
+
|
|
76
|
+
param = fahrenheit_to_half_celsius(140.0) # Returns 120
|
|
77
|
+
|
|
78
|
+
Fixed
|
|
79
|
+
-----
|
|
80
|
+
|
|
81
|
+
- **Temperature Encoding Bug**: Fixed ``set_dhw_temperature()`` which was using
|
|
82
|
+
an incorrect "subtract 20" conversion instead of proper half-degrees Celsius
|
|
83
|
+
encoding. This caused temperatures to be set incorrectly for values other
|
|
84
|
+
than 140°F (where both formulas happened to give the same result).
|
|
85
|
+
|
|
5
86
|
Version 6.0.8 (2025-12-02)
|
|
6
87
|
==========================
|
|
7
88
|
|