python-bsblan 6.1.9__tar.gz → 6.1.10__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 (178) hide show
  1. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/workflows/codeql.yaml +2 -2
  2. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/workflows/release-drafter.yaml +1 -1
  3. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/workflows/scorecard.yml +2 -2
  4. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/workflows/tests.yaml +1 -1
  5. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/PKG-INFO +1 -1
  6. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/docs/getting-started.md +6 -0
  7. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/pyproject.toml +3 -3
  8. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/src/bsblan/_validation.py +7 -1
  9. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/src/bsblan/constants.py +5 -0
  10. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_pps.py +34 -0
  11. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.editorconfig +0 -0
  12. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.gitattributes +0 -0
  13. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/CODE_OF_CONDUCT.md +0 -0
  14. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/CONTRIBUTING.md +0 -0
  15. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/ISSUE_TEMPLATE/PULL_REQUEST_TEMPLATE.md +0 -0
  16. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  17. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  18. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/SECURITY.md +0 -0
  19. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/agents/pr-review.agent.md +0 -0
  20. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/agents/security-reviewer.agent.md +0 -0
  21. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/agents/tdd-refactor.agent.md +0 -0
  22. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/copilot-instructions.md +0 -0
  23. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/labels.yml +0 -0
  24. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/prompts/add-parameter.prompt.md +0 -0
  25. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/prompts/code-review.prompt.md +0 -0
  26. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/prompts/opsx-apply.prompt.md +0 -0
  27. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/prompts/opsx-archive.prompt.md +0 -0
  28. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/prompts/opsx-explore.prompt.md +0 -0
  29. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/prompts/opsx-propose.prompt.md +0 -0
  30. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/prompts/opsx-sync.prompt.md +0 -0
  31. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/release-drafter.yml +0 -0
  32. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/renovate.json +0 -0
  33. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/skills/bsblan-parameters/SKILL.md +0 -0
  34. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/skills/bsblan-testing/SKILL.md +0 -0
  35. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/skills/feature-doc-updates/SKILL.md +0 -0
  36. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/skills/openspec-apply-change/SKILL.md +0 -0
  37. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/skills/openspec-archive-change/SKILL.md +0 -0
  38. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/skills/openspec-explore/SKILL.md +0 -0
  39. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/skills/openspec-propose/SKILL.md +0 -0
  40. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/skills/openspec-sync-specs/SKILL.md +0 -0
  41. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/workflows/auto-approve-renovate.yml +0 -0
  42. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/workflows/dependency-review.yaml +0 -0
  43. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/workflows/docs.yaml +0 -0
  44. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/workflows/labels.yaml +0 -0
  45. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/workflows/linting.yaml +0 -0
  46. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/workflows/lock.yaml +0 -0
  47. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/workflows/pr-labels.yaml +0 -0
  48. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/workflows/release.yaml +0 -0
  49. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/workflows/stale.yaml +0 -0
  50. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/workflows/typing.yaml +0 -0
  51. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/zizmor.yml +0 -0
  52. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.gitignore +0 -0
  53. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.nvmrc +0 -0
  54. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.pre-commit-config.yaml +0 -0
  55. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.prettierignore +0 -0
  56. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.yamllint +0 -0
  57. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/AGENTS.md +0 -0
  58. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/CLAUDE.md +0 -0
  59. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/LICENSE.md +0 -0
  60. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/Makefile +0 -0
  61. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/README.md +0 -0
  62. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/docs/api/client.md +0 -0
  63. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/docs/api/constants.md +0 -0
  64. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/docs/api/exceptions.md +0 -0
  65. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/docs/api/models.md +0 -0
  66. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/docs/index.md +0 -0
  67. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/examples/control.py +0 -0
  68. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/examples/discovery.py +0 -0
  69. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/examples/fake_bsblan_server.py +0 -0
  70. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/examples/fetch_param.py +0 -0
  71. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/examples/profile_init.py +0 -0
  72. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/examples/ruff.toml +0 -0
  73. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/examples/speed_test.py +0 -0
  74. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/mkdocs.yml +0 -0
  75. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-03-add-cooling-operating-mode/.openspec.yaml +0 -0
  76. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-03-add-cooling-operating-mode/design.md +0 -0
  77. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-03-add-cooling-operating-mode/proposal.md +0 -0
  78. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-03-add-cooling-operating-mode/specs/cooling-operating-mode/spec.md +0 -0
  79. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-03-add-cooling-operating-mode/tasks.md +0 -0
  80. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-04-harden-circuit-discovery-consistency/.openspec.yaml +0 -0
  81. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-04-harden-circuit-discovery-consistency/design.md +0 -0
  82. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-04-harden-circuit-discovery-consistency/proposal.md +0 -0
  83. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-04-harden-circuit-discovery-consistency/specs/circuit-discovery/spec.md +0 -0
  84. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-04-harden-circuit-discovery-consistency/tasks.md +0 -0
  85. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-04-improve-client-readability-domain-slices/.openspec.yaml +0 -0
  86. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-04-improve-client-readability-domain-slices/design.md +0 -0
  87. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-04-improve-client-readability-domain-slices/proposal.md +0 -0
  88. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-04-improve-client-readability-domain-slices/specs/client-retry-policy/spec.md +0 -0
  89. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-04-improve-client-readability-domain-slices/tasks.md +0 -0
  90. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-12-distinguish-schedule-error-types/.openspec.yaml +0 -0
  91. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-12-distinguish-schedule-error-types/design.md +0 -0
  92. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-12-distinguish-schedule-error-types/proposal.md +0 -0
  93. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-12-distinguish-schedule-error-types/specs/error-classification/spec.md +0 -0
  94. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-12-distinguish-schedule-error-types/tasks.md +0 -0
  95. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-16-fix-partial-validation-state/.openspec.yaml +0 -0
  96. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-16-fix-partial-validation-state/design.md +0 -0
  97. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-16-fix-partial-validation-state/proposal.md +0 -0
  98. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-16-fix-partial-validation-state/specs/lazy-validation-completeness/spec.md +0 -0
  99. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-16-fix-partial-validation-state/tasks.md +0 -0
  100. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/config.yaml +0 -0
  101. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/specs/circuit-discovery/spec.md +0 -0
  102. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/specs/client-retry-policy/spec.md +0 -0
  103. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/specs/cooling-operating-mode/spec.md +0 -0
  104. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/specs/error-classification/spec.md +0 -0
  105. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/specs/lazy-validation-completeness/spec.md +0 -0
  106. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/package-lock.json +0 -0
  107. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/package.json +0 -0
  108. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/sonar-project.properties +0 -0
  109. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/src/bsblan/__init__.py +0 -0
  110. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/src/bsblan/_hot_water.py +0 -0
  111. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/src/bsblan/_parameters.py +0 -0
  112. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/src/bsblan/_schedules.py +0 -0
  113. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/src/bsblan/_temperature.py +0 -0
  114. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/src/bsblan/_thermostat.py +0 -0
  115. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/src/bsblan/_transport.py +0 -0
  116. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/src/bsblan/_version.py +0 -0
  117. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/src/bsblan/bsblan.py +0 -0
  118. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/src/bsblan/exceptions.py +0 -0
  119. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/src/bsblan/models.py +0 -0
  120. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/src/bsblan/py.typed +0 -0
  121. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/src/bsblan/utility.py +0 -0
  122. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/__init__.py +0 -0
  123. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/conftest.py +0 -0
  124. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/fixtures/device.json +0 -0
  125. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/fixtures/dict_version.json +0 -0
  126. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/fixtures/hot_water_state.json +0 -0
  127. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/fixtures/info.json +0 -0
  128. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/fixtures/password.txt +0 -0
  129. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/fixtures/pps_device.json +0 -0
  130. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/fixtures/pps_state.json +0 -0
  131. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/fixtures/pps_static_values.json +0 -0
  132. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/fixtures/sensor.json +0 -0
  133. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/fixtures/state.json +0 -0
  134. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/fixtures/state_circuit2.json +0 -0
  135. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/fixtures/static_state.json +0 -0
  136. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/fixtures/static_state_circuit2.json +0 -0
  137. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/fixtures/thermostat_hvac.json +0 -0
  138. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/fixtures/thermostat_temp.json +0 -0
  139. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/fixtures/time.json +0 -0
  140. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/ruff.toml +0 -0
  141. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_api_initialization.py +0 -0
  142. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_api_validation.py +0 -0
  143. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_auth.py +0 -0
  144. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_backoff_retry.py +0 -0
  145. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_bsblan.py +0 -0
  146. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_bsblan_edge_cases.py +0 -0
  147. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_circuit.py +0 -0
  148. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_configuration.py +0 -0
  149. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_constants.py +0 -0
  150. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_context_manager.py +0 -0
  151. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_device.py +0 -0
  152. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_dhw_time_switch.py +0 -0
  153. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_entity_info.py +0 -0
  154. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_entity_info_ha.py +0 -0
  155. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_heating_schedule.py +0 -0
  156. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_hot_water_additional.py +0 -0
  157. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_hotwater_state.py +0 -0
  158. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_include_parameter.py +0 -0
  159. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_info.py +0 -0
  160. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_initialization.py +0 -0
  161. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_read_parameters.py +0 -0
  162. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_reset_validation.py +0 -0
  163. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_response_encoding.py +0 -0
  164. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_schedule_models.py +0 -0
  165. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_sensor.py +0 -0
  166. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_set_heating_schedule.py +0 -0
  167. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_set_hot_water_schedule.py +0 -0
  168. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_set_hotwater.py +0 -0
  169. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_state.py +0 -0
  170. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_static_state.py +0 -0
  171. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_temperature_unit.py +0 -0
  172. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_temperature_validation.py +0 -0
  173. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_thermostat.py +0 -0
  174. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_time.py +0 -0
  175. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_utility.py +0 -0
  176. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_utility_additional.py +0 -0
  177. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_utility_edge_cases.py +0 -0
  178. {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_version_errors.py +0 -0
@@ -27,6 +27,6 @@ jobs:
27
27
  with:
28
28
  persist-credentials: false
29
29
  - name: 🏗 Initialize CodeQL
30
- uses: github/codeql-action/init@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4.38.2
30
+ uses: github/codeql-action/init@24c54180a607b1449ed407dd24f251e4e9147c8d # v4.38.3
31
31
  - name: 🚀 Perform CodeQL Analysis
32
- uses: github/codeql-action/analyze@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4.38.2
32
+ uses: github/codeql-action/analyze@24c54180a607b1449ed407dd24f251e4e9147c8d # v4.38.3
@@ -36,7 +36,7 @@ jobs:
36
36
  steps:
37
37
  - name: 🚀 Run Release Drafter
38
38
  # yamllint disable-line rule:line-length
39
- uses: release-drafter/release-drafter@72967cdc98ddd3160f1fc3dff619de365e137dd0 # v7.9.0
39
+ uses: release-drafter/release-drafter@978bb0b30c5ee8cdd332ced253758157150d43f0 # v7.10.0
40
40
  with:
41
41
  prerelease: ${{ github.event.inputs.prerelease == 'true' }}
42
42
  prerelease-identifier: ${{ github.event.inputs.prerelease_identifier }}
@@ -57,7 +57,7 @@ jobs:
57
57
  # Upload the results as artifacts (optional).
58
58
  - name: "Upload artifact"
59
59
  # yamllint disable-line rule:line-length
60
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
60
+ uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
61
61
  with:
62
62
  name: SARIF file
63
63
  path: results.sarif
@@ -66,6 +66,6 @@ jobs:
66
66
  # Upload the results to GitHub's code scanning dashboard (optional).
67
67
  - name: "Upload to code-scanning"
68
68
  # yamllint disable-line rule:line-length
69
- uses: github/codeql-action/upload-sarif@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4.38.2
69
+ uses: github/codeql-action/upload-sarif@24c54180a607b1449ed407dd24f251e4e9147c8d # v4.38.3
70
70
  with:
71
71
  sarif_file: results.sarif
@@ -46,7 +46,7 @@ jobs:
46
46
  - name: 🚀 Run pytest
47
47
  run: uv run pytest --cov=bsblan tests
48
48
  - name: ⬆️ Upload coverage artifact
49
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
49
+ uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
50
50
  with:
51
51
  name: coverage-${{ matrix.python }}
52
52
  include-hidden-files: true
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: python-bsblan
3
- Version: 6.1.9
3
+ Version: 6.1.10
4
4
  Summary: Asynchronous Python client for BSBLAN API
5
5
  Project-URL: Homepage, https://github.com/liudger/python-bsblan
6
6
  Project-URL: Repository, https://github.com/liudger/python-bsblan
@@ -157,11 +157,17 @@ Supported PPS climate operations:
157
157
 
158
158
  - `state()` for `hvac_mode`, `target_temperature`, and `current_temperature`
159
159
  - `static_values()` for `min_temp` and `max_temp`
160
+ - `sensor()` for `outside_temperature` (`15030`) and `current_temperature` (`15008`)
160
161
  - `thermostat()` for target temperature and HVAC mode
161
162
  - `get_available_circuits()`, which returns `[1]` when the single PPS
162
163
  climate circuit is available, otherwise `[]`; PPS devices only ever expose
163
164
  circuit `1`
164
165
 
166
+ PPS sensor parameters are selected only when device metadata identifies the PPS
167
+ bus. BSB/LPB devices retain their existing sensor mappings. Sensor reads remain
168
+ on demand; `sensor(include=["outside_temperature"])` requests only `15030` on PPS
169
+ and only `8700` otherwise, without probing both parameter ranges.
170
+
165
171
  PPS devices currently have these limitations:
166
172
 
167
173
  - Only circuit `1` is supported.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "python-bsblan"
3
- version = "6.1.9"
3
+ version = "6.1.10"
4
4
  description = "Asynchronous Python client for BSBLAN API"
5
5
  authors = [
6
6
  {name = "Willem-Jan van Rootselaar", email = "liudgervr@gmail.com"}
@@ -197,7 +197,7 @@ dev = [
197
197
  # hatch is required to support type hinting and proper packaging of the py.typed file.
198
198
  "hatch>=1.14.1",
199
199
  "isort==8.0.1",
200
- "ty==0.0.85",
200
+ "ty==0.0.86",
201
201
  "prek>=0.3.3",
202
202
  "pre-commit-hooks==6.0.0",
203
203
  "pylint==4.1.2",
@@ -205,7 +205,7 @@ dev = [
205
205
  "pytest-asyncio==1.4.0",
206
206
  "pytest-cov==7.1.0",
207
207
  "pytest-xdist>=3.8.0",
208
- "pyupgrade==3.21.2",
208
+ "pyupgrade==3.22.0",
209
209
  "ruff==0.16.10",
210
210
  "safety==3.8.1",
211
211
  "vulture==2.16",
@@ -17,7 +17,12 @@ import asyncio
17
17
  import logging
18
18
  from typing import TYPE_CHECKING, cast
19
19
 
20
- from .constants import PPS_HEATING_PARAMS, PPS_STATIC_VALUES_PARAMS, ErrorMsg
20
+ from .constants import (
21
+ PPS_HEATING_PARAMS,
22
+ PPS_SENSOR_PARAMS,
23
+ PPS_STATIC_VALUES_PARAMS,
24
+ ErrorMsg,
25
+ )
21
26
  from .exceptions import BSBLANError
22
27
  from .utility import APIValidator
23
28
 
@@ -117,6 +122,7 @@ class SectionValidator:
117
122
 
118
123
  api_data["heating"] = PPS_HEATING_PARAMS.copy()
119
124
  api_data["staticValues"] = PPS_STATIC_VALUES_PARAMS.copy()
125
+ api_data["sensor"] = PPS_SENSOR_PARAMS.copy()
120
126
  api_data["heating_circuit2"] = {}
121
127
  api_data["staticValues_circuit2"] = {}
122
128
 
@@ -156,6 +156,11 @@ PPS_STATIC_VALUES_PARAMS: Final[dict[str, str]] = {
156
156
  "15007": "max_temp",
157
157
  }
158
158
 
159
+ PPS_SENSOR_PARAMS: Final[dict[str, str]] = {
160
+ "15030": "outside_temperature",
161
+ "15008": "current_temperature",
162
+ }
163
+
159
164
 
160
165
  # Circuit configuration
161
166
  class CircuitConfig:
@@ -420,6 +420,40 @@ async def test_pps_rejects_second_circuit(pps_bsblan: BSBLAN) -> None:
420
420
  await pps_bsblan.state(circuit=2)
421
421
 
422
422
 
423
+ @pytest.mark.asyncio
424
+ @pytest.mark.parametrize(
425
+ ("bus", "parameter"),
426
+ [("PPS", "15030"), ("BSB", "8700"), ("LPB", "8700"), (None, "8700")],
427
+ )
428
+ @pytest.mark.parametrize("full", [True, False])
429
+ async def test_outside_temperature_uses_bus_specific_parameter(
430
+ pps_bsblan: BSBLAN, bus: str | None, parameter: str, *, full: bool
431
+ ) -> None:
432
+ """Test outside temperature reads only the selected bus parameter on demand."""
433
+ assert pps_bsblan.device_info is not None
434
+ pps_bsblan._device = pps_bsblan.device_info.model_copy(update={"bus": bus})
435
+ pps_bsblan._api_data = build_api_config(full=full)
436
+ response = json.loads(load_fixture("sensor.json"))["8700"]
437
+ response["value"] = "-2.5"
438
+ request_mock = AsyncMock(return_value={parameter: response})
439
+ pps_bsblan._request = request_mock # type: ignore[method-assign]
440
+ pps_bsblan._validator.setup(
441
+ pps_bsblan._api_data, uses_pps_bus=pps_bsblan._uses_pps_bus
442
+ )
443
+ request_mock.assert_not_awaited()
444
+
445
+ for _ in range(2):
446
+ sensor = await pps_bsblan.sensor(include=["outside_temperature"])
447
+ assert sensor.outside_temperature is not None
448
+ assert sensor.outside_temperature.value == -2.5
449
+ assert sensor.outside_temperature.unit == "°C"
450
+ assert sensor.current_temperature is None
451
+
452
+ assert [call.kwargs for call in request_mock.await_args_list] == [
453
+ {"params": {"Parameter": parameter}}
454
+ ] * 3
455
+
456
+
423
457
  @pytest.mark.asyncio
424
458
  async def test_pps_empty_sensor_section_is_unsupported(pps_bsblan: BSBLAN) -> None:
425
459
  """Test an empty validated PPS sensor section is explicitly unsupported."""
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes