span-panel-api 2.6.1__tar.gz → 2.6.2__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 (82) hide show
  1. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/CHANGELOG.md +8 -0
  2. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/PKG-INFO +1 -1
  3. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/pyproject.toml +1 -1
  4. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/src/span_panel_api/mqtt/connection.py +10 -3
  5. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/uv.lock +1 -1
  6. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/.codefactor +0 -0
  7. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/.codefactor.yml +0 -0
  8. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/.deps-installed +0 -0
  9. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  10. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  11. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/.github/dependabot.yml +0 -0
  12. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/.github/workflows/ci.yml +0 -0
  13. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/.github/workflows/dependabot-auto-approve.yml +0 -0
  14. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/.github/workflows/dependabot-auto-merge.yml +0 -0
  15. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/.github/workflows/release.yml +0 -0
  16. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/.gitignore +0 -0
  17. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/.markdownlint-cli2.jsonc +0 -0
  18. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/.markdownlint.json +0 -0
  19. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/.pre-commit-config.yaml +0 -0
  20. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/.prettierrc.json +0 -0
  21. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/.vscode/extensions.json +0 -0
  22. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/.vscode/tasks.json +0 -0
  23. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/DEVELOPMENT.md +0 -0
  24. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/LICENSE +0 -0
  25. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/README.md +0 -0
  26. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/SECURITY.md +0 -0
  27. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/conftest.py +0 -0
  28. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/developer_attribute_readme.md +0 -0
  29. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/openapi.json +0 -0
  30. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/pytest.ini +0 -0
  31. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/pytest_output.log +0 -0
  32. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/scripts/__init__.py +0 -0
  33. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/scripts/coverage.py +0 -0
  34. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/scripts/format.sh +0 -0
  35. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/scripts/format_markdown.py +0 -0
  36. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/scripts/test_live_auth.py +0 -0
  37. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/setup-hooks.sh +0 -0
  38. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/src/span_panel_api/__init__.py +0 -0
  39. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/src/span_panel_api/_http.py +0 -0
  40. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/src/span_panel_api/auth.py +0 -0
  41. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/src/span_panel_api/const.py +0 -0
  42. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/src/span_panel_api/detection.py +0 -0
  43. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/src/span_panel_api/exceptions.py +0 -0
  44. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/src/span_panel_api/factory.py +0 -0
  45. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/src/span_panel_api/models.py +0 -0
  46. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/src/span_panel_api/mqtt/__init__.py +0 -0
  47. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/src/span_panel_api/mqtt/accumulator.py +0 -0
  48. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/src/span_panel_api/mqtt/async_client.py +0 -0
  49. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/src/span_panel_api/mqtt/client.py +0 -0
  50. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/src/span_panel_api/mqtt/const.py +0 -0
  51. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/src/span_panel_api/mqtt/field_metadata.py +0 -0
  52. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/src/span_panel_api/mqtt/homie.py +0 -0
  53. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/src/span_panel_api/mqtt/models.py +0 -0
  54. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/src/span_panel_api/phase_validation.py +0 -0
  55. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/src/span_panel_api/protocol.py +0 -0
  56. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/src/span_panel_api/py.typed +0 -0
  57. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/tests/conftest.py +0 -0
  58. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/tests/fixtures/configs/simulation_config_32_circuit.yaml +0 -0
  59. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/tests/fixtures/configs/simulation_config_40_circuit_with_battery.yaml +0 -0
  60. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/tests/fixtures/configs/simulation_config_8_tab_workshop.yaml +0 -0
  61. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/tests/fixtures/v2/README.md +0 -0
  62. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/tests/fixtures/v2/homie_schema.json +0 -0
  63. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/tests/fixtures/v2/status.json +0 -0
  64. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/tests/simulation_fixtures/circuits.response.txt +0 -0
  65. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/tests/simulation_fixtures/panel.response.txt +0 -0
  66. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/tests/simulation_fixtures/soe.response.txt +0 -0
  67. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/tests/simulation_fixtures/status.response.txt +0 -0
  68. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/tests/test_accumulator.py +0 -0
  69. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/tests/test_async_mqtt_client.py +0 -0
  70. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/tests/test_auth_and_homie_helpers.py +0 -0
  71. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/tests/test_detection_auth.py +0 -0
  72. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/tests/test_exceptions.py +0 -0
  73. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/tests/test_field_metadata.py +0 -0
  74. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/tests/test_mqtt_bridge.py +0 -0
  75. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/tests/test_mqtt_client_connection.py +0 -0
  76. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/tests/test_mqtt_connect_flow.py +0 -0
  77. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/tests/test_mqtt_debounce.py +0 -0
  78. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/tests/test_mqtt_homie.py +0 -0
  79. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/tests/test_phase_validation_configs.py +0 -0
  80. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/tests/test_phase_validation_errors.py +0 -0
  81. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/tests/test_protocol_conformance.py +0 -0
  82. {span_panel_api-2.6.1 → span_panel_api-2.6.2}/tests/test_protocol_models.py +0 -0
@@ -4,6 +4,14 @@ All notable changes to this project will be documented in this file.
4
4
 
5
5
  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).
6
6
 
7
+ ## [2.6.2] - 04/2026
8
+
9
+ ### Changed
10
+
11
+ - **Reconnect loop log noise reduced** — `SpanMqttClient._reconnect_loop` now splits the catch-all exception handler in two: expected transient failures (`OSError` family — refused connection, DNS miss, socket timeout, `ssl.SSLError`) log a one-line
12
+ WARNING with the exception repr, while unexpected exceptions retain the full traceback via `exc_info=True`. The common "panel offline" case no longer buries logs in paho/stdlib stack frames that add no diagnostic signal; genuinely unknown failures still
13
+ surface full tracebacks for support-ticket triage.
14
+
7
15
  ## [2.6.1] - 04/2026
8
16
 
9
17
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: span-panel-api
3
- Version: 2.6.1
3
+ Version: 2.6.2
4
4
  Summary: A client library for SPAN Panel API
5
5
  Project-URL: Homepage, https://github.com/SpanPanel/span-panel-api
6
6
  Project-URL: Issues, https://github.com/SpanPanel/span-panel-api/issues
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "span-panel-api"
3
- version = "2.6.1"
3
+ version = "2.6.2"
4
4
  description = "A client library for SPAN Panel API"
5
5
  authors = [
6
6
  {name = "SpanPanel"}
@@ -407,10 +407,17 @@ class AsyncMqttBridge:
407
407
  self._client.on_socket_open = self._on_socket_open_sync
408
408
  self._client.on_socket_register_write = self._on_socket_register_write_sync
409
409
  await self._loop.run_in_executor(None, self._client.reconnect)
410
+ except (OSError, TimeoutError) as exc:
411
+ # Expected transient failures — panel offline, DNS miss, socket
412
+ # timeout, refused connection. The exception type and errno are
413
+ # the full diagnostic; paho/stdlib stack frames add no signal.
414
+ # ssl.SSLError is an OSError subclass and falls in here too;
415
+ # SSL misconfiguration would have failed at setup, so a
416
+ # reconnect-time SSL error is handled as a transient failure.
417
+ _LOGGER.warning("Reconnect failed (%s), retrying in %ss", exc, delay)
410
418
  except Exception: # pylint: disable=broad-exception-caught
411
- # paho can raise OSError, socket.gaierror, WebsocketConnectionError,
412
- # ssl.SSLError, and others depending on transport. Never let the
413
- # reconnect loop die — just log and keep backing off.
419
+ # Unknown territory keep the traceback so support tickets
420
+ # are actionable. Never let the reconnect loop die.
414
421
  _LOGGER.warning("Reconnect failed, retrying in %ss", delay, exc_info=True)
415
422
  finally:
416
423
  if self._client is not None:
@@ -1310,7 +1310,7 @@ wheels = [
1310
1310
 
1311
1311
  [[package]]
1312
1312
  name = "span-panel-api"
1313
- version = "2.6.1"
1313
+ version = "2.6.2"
1314
1314
  source = { editable = "." }
1315
1315
  dependencies = [
1316
1316
  { name = "httpx" },
File without changes
File without changes