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.
Files changed (143) hide show
  1. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/CHANGELOG.rst +81 -0
  2. {nwp500_python-6.0.8/src/nwp500_python.egg-info → nwp500_python-6.1.1}/PKG-INFO +1 -1
  3. nwp500_python-6.1.1/docs/MQTT_DIAGNOSTICS.rst +1127 -0
  4. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/guides/command_queue.rst +1 -1
  5. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/guides/reservations.rst +74 -48
  6. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/index.rst +1 -1
  7. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/python_api/constants.rst +2 -5
  8. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/python_api/exceptions.rst +5 -5
  9. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/python_api/mqtt_client.rst +14 -39
  10. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/quickstart.rst +1 -1
  11. nwp500_python-6.1.1/examples/mqtt_diagnostics_example.py +312 -0
  12. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/reservation_schedule_example.py +8 -7
  13. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/__init__.py +13 -0
  14. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/cli/__main__.py +2 -2
  15. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/cli/commands.py +6 -7
  16. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/encoding.py +18 -4
  17. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/models.py +24 -0
  18. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/mqtt_client.py +9 -41
  19. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/mqtt_device_control.py +20 -41
  20. nwp500_python-6.1.1/src/nwp500/mqtt_diagnostics.py +449 -0
  21. {nwp500_python-6.0.8 → nwp500_python-6.1.1/src/nwp500_python.egg-info}/PKG-INFO +1 -1
  22. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500_python.egg-info/SOURCES.txt +3 -0
  23. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/tests/test_api_helpers.py +25 -3
  24. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/tests/test_models.py +11 -1
  25. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/.agent/workflows/pre-completion-testing.md +0 -0
  26. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/.coveragerc +0 -0
  27. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/.github/copilot-instructions.md +0 -0
  28. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/.github/workflows/ci.yml +0 -0
  29. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/.github/workflows/release.yml +0 -0
  30. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/.gitignore +0 -0
  31. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/.pre-commit-config.yaml +0 -0
  32. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/.readthedocs.yml +0 -0
  33. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/AUTHORS.rst +0 -0
  34. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/CONTRIBUTING.rst +0 -0
  35. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/LICENSE.txt +0 -0
  36. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/Makefile +0 -0
  37. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/README.rst +0 -0
  38. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/RELEASE.md +0 -0
  39. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/Makefile +0 -0
  40. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/_static/.gitignore +0 -0
  41. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/api/nwp500.rst +0 -0
  42. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/authors.rst +0 -0
  43. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/changelog.rst +0 -0
  44. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/conf.py +0 -0
  45. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/configuration.rst +0 -0
  46. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/development/contributing.rst +0 -0
  47. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/development/history.rst +0 -0
  48. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/guides/advanced_features_explained.rst +0 -0
  49. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/guides/auto_recovery.rst +0 -0
  50. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/guides/energy_monitoring.rst +0 -0
  51. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/guides/event_system.rst +0 -0
  52. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/guides/scheduling_features.rst +0 -0
  53. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/guides/time_of_use.rst +0 -0
  54. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/installation.rst +0 -0
  55. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/license.rst +0 -0
  56. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/openapi.yaml +0 -0
  57. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/protocol/data_conversions.rst +0 -0
  58. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/protocol/device_features.rst +0 -0
  59. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/protocol/device_status.rst +0 -0
  60. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/protocol/error_codes.rst +0 -0
  61. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/protocol/firmware_tracking.rst +0 -0
  62. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/protocol/mqtt_protocol.rst +0 -0
  63. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/protocol/rest_api.rst +0 -0
  64. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/python_api/api_client.rst +0 -0
  65. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/python_api/auth_client.rst +0 -0
  66. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/python_api/cli.rst +0 -0
  67. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/python_api/events.rst +0 -0
  68. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/python_api/models.rst +0 -0
  69. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/docs/requirements.txt +0 -0
  70. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/.ruff.toml +0 -0
  71. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/README.md +0 -0
  72. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/anti_legionella_example.py +0 -0
  73. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/api_client_example.py +0 -0
  74. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/auth_constructor_example.py +0 -0
  75. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/authenticate.py +0 -0
  76. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/auto_recovery_example.py +0 -0
  77. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/combined_callbacks.py +0 -0
  78. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/command_queue_demo.py +0 -0
  79. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/device_feature_callback.py +0 -0
  80. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/device_status_callback.py +0 -0
  81. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/device_status_callback_debug.py +0 -0
  82. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/energy_usage_example.py +0 -0
  83. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/event_emitter_demo.py +0 -0
  84. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/exception_handling_example.py +0 -0
  85. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/improved_auth_pattern.py +0 -0
  86. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/mask.py +0 -0
  87. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/mqtt_client_example.py +0 -0
  88. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/periodic_device_info.py +0 -0
  89. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/periodic_requests.py +0 -0
  90. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/power_control_example.py +0 -0
  91. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/reconnection_demo.py +0 -0
  92. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/set_dhw_temperature_example.py +0 -0
  93. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/set_mode_example.py +0 -0
  94. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/simple_auto_recovery.py +0 -0
  95. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/simple_periodic_info.py +0 -0
  96. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/simple_periodic_status.py +0 -0
  97. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/test_api_client.py +0 -0
  98. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/test_mqtt_connection.py +0 -0
  99. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/test_mqtt_messaging.py +0 -0
  100. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/test_periodic_minimal.py +0 -0
  101. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/token_restoration_example.py +0 -0
  102. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/tou_openei_example.py +0 -0
  103. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/examples/tou_schedule_example.py +0 -0
  104. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/pyproject.toml +0 -0
  105. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/scripts/README.md +0 -0
  106. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/scripts/bump_version.py +0 -0
  107. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/scripts/extract_changelog.py +0 -0
  108. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/scripts/format.py +0 -0
  109. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/scripts/lint.py +0 -0
  110. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/scripts/setup-dev.py +0 -0
  111. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/scripts/validate_version.py +0 -0
  112. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/setup.cfg +0 -0
  113. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/setup.py +0 -0
  114. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/api_client.py +0 -0
  115. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/auth.py +0 -0
  116. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/cli/__init__.py +0 -0
  117. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/cli/monitoring.py +0 -0
  118. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/cli/output_formatters.py +0 -0
  119. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/cli/token_storage.py +0 -0
  120. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/config.py +0 -0
  121. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/constants.py +0 -0
  122. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/events.py +0 -0
  123. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/exceptions.py +0 -0
  124. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/mqtt_command_queue.py +0 -0
  125. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/mqtt_connection.py +0 -0
  126. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/mqtt_periodic.py +0 -0
  127. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/mqtt_reconnection.py +0 -0
  128. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/mqtt_subscriptions.py +0 -0
  129. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/mqtt_utils.py +0 -0
  130. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/py.typed +0 -0
  131. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500/utils.py +0 -0
  132. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500_python.egg-info/dependency_links.txt +0 -0
  133. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500_python.egg-info/entry_points.txt +0 -0
  134. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500_python.egg-info/not-zip-safe +0 -0
  135. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500_python.egg-info/requires.txt +0 -0
  136. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/src/nwp500_python.egg-info/top_level.txt +0 -0
  137. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/tests/conftest.py +0 -0
  138. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/tests/test_auth.py +0 -0
  139. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/tests/test_command_queue.py +0 -0
  140. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/tests/test_events.py +0 -0
  141. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/tests/test_exceptions.py +0 -0
  142. {nwp500_python-6.0.8 → nwp500_python-6.1.1}/tests/test_utils.py +0 -0
  143. {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
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nwp500-python
3
- Version: 6.0.8
3
+ Version: 6.1.1
4
4
  Summary: A library for controlling Navien NWP500 Water Heaters via NaviLink
5
5
  Home-page: https://github.com/eman/nwp500-python
6
6
  Author: Emmanuel Levijarvi