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.
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/workflows/codeql.yaml +2 -2
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/workflows/release-drafter.yaml +1 -1
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/workflows/scorecard.yml +2 -2
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/workflows/tests.yaml +1 -1
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/PKG-INFO +1 -1
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/docs/getting-started.md +6 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/pyproject.toml +3 -3
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/src/bsblan/_validation.py +7 -1
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/src/bsblan/constants.py +5 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_pps.py +34 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.editorconfig +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.gitattributes +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/CODE_OF_CONDUCT.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/CONTRIBUTING.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/ISSUE_TEMPLATE/PULL_REQUEST_TEMPLATE.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/SECURITY.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/agents/pr-review.agent.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/agents/security-reviewer.agent.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/agents/tdd-refactor.agent.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/copilot-instructions.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/labels.yml +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/prompts/add-parameter.prompt.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/prompts/code-review.prompt.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/prompts/opsx-apply.prompt.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/prompts/opsx-archive.prompt.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/prompts/opsx-explore.prompt.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/prompts/opsx-propose.prompt.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/prompts/opsx-sync.prompt.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/release-drafter.yml +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/renovate.json +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/skills/bsblan-parameters/SKILL.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/skills/bsblan-testing/SKILL.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/skills/feature-doc-updates/SKILL.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/skills/openspec-apply-change/SKILL.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/skills/openspec-archive-change/SKILL.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/skills/openspec-explore/SKILL.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/skills/openspec-propose/SKILL.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/skills/openspec-sync-specs/SKILL.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/workflows/auto-approve-renovate.yml +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/workflows/dependency-review.yaml +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/workflows/docs.yaml +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/workflows/labels.yaml +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/workflows/linting.yaml +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/workflows/lock.yaml +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/workflows/pr-labels.yaml +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/workflows/release.yaml +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/workflows/stale.yaml +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/workflows/typing.yaml +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/zizmor.yml +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.gitignore +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.nvmrc +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.pre-commit-config.yaml +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.prettierignore +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/.yamllint +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/AGENTS.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/CLAUDE.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/LICENSE.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/Makefile +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/README.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/docs/api/client.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/docs/api/constants.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/docs/api/exceptions.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/docs/api/models.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/docs/index.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/examples/control.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/examples/discovery.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/examples/fake_bsblan_server.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/examples/fetch_param.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/examples/profile_init.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/examples/ruff.toml +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/examples/speed_test.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/mkdocs.yml +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-03-add-cooling-operating-mode/.openspec.yaml +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-03-add-cooling-operating-mode/design.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-03-add-cooling-operating-mode/proposal.md +0 -0
- {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
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-03-add-cooling-operating-mode/tasks.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-04-harden-circuit-discovery-consistency/.openspec.yaml +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-04-harden-circuit-discovery-consistency/design.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-04-harden-circuit-discovery-consistency/proposal.md +0 -0
- {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
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-04-harden-circuit-discovery-consistency/tasks.md +0 -0
- {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
- {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
- {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
- {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
- {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
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-12-distinguish-schedule-error-types/.openspec.yaml +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-12-distinguish-schedule-error-types/design.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-12-distinguish-schedule-error-types/proposal.md +0 -0
- {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
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-12-distinguish-schedule-error-types/tasks.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-16-fix-partial-validation-state/.openspec.yaml +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-16-fix-partial-validation-state/design.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-16-fix-partial-validation-state/proposal.md +0 -0
- {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
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/changes/archive/2026-07-16-fix-partial-validation-state/tasks.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/config.yaml +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/specs/circuit-discovery/spec.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/specs/client-retry-policy/spec.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/specs/cooling-operating-mode/spec.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/specs/error-classification/spec.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/specs/lazy-validation-completeness/spec.md +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/package-lock.json +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/package.json +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/sonar-project.properties +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/src/bsblan/__init__.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/src/bsblan/_hot_water.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/src/bsblan/_parameters.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/src/bsblan/_schedules.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/src/bsblan/_temperature.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/src/bsblan/_thermostat.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/src/bsblan/_transport.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/src/bsblan/_version.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/src/bsblan/bsblan.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/src/bsblan/exceptions.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/src/bsblan/models.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/src/bsblan/py.typed +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/src/bsblan/utility.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/__init__.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/conftest.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/fixtures/device.json +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/fixtures/dict_version.json +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/fixtures/hot_water_state.json +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/fixtures/info.json +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/fixtures/password.txt +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/fixtures/pps_device.json +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/fixtures/pps_state.json +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/fixtures/pps_static_values.json +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/fixtures/sensor.json +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/fixtures/state.json +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/fixtures/state_circuit2.json +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/fixtures/static_state.json +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/fixtures/static_state_circuit2.json +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/fixtures/thermostat_hvac.json +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/fixtures/thermostat_temp.json +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/fixtures/time.json +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/ruff.toml +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_api_initialization.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_api_validation.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_auth.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_backoff_retry.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_bsblan.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_bsblan_edge_cases.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_circuit.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_configuration.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_constants.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_context_manager.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_device.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_dhw_time_switch.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_entity_info.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_entity_info_ha.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_heating_schedule.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_hot_water_additional.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_hotwater_state.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_include_parameter.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_info.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_initialization.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_read_parameters.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_reset_validation.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_response_encoding.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_schedule_models.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_sensor.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_set_heating_schedule.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_set_hot_water_schedule.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_set_hotwater.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_state.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_static_state.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_temperature_unit.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_temperature_validation.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_thermostat.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_time.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_utility.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_utility_additional.py +0 -0
- {python_bsblan-6.1.9 → python_bsblan-6.1.10}/tests/test_utility_edge_cases.py +0 -0
- {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@
|
|
30
|
+
uses: github/codeql-action/init@24c54180a607b1449ed407dd24f251e4e9147c8d # v4.38.3
|
|
31
31
|
- name: 🚀 Perform CodeQL Analysis
|
|
32
|
-
uses: github/codeql-action/analyze@
|
|
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@
|
|
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@
|
|
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@
|
|
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@
|
|
49
|
+
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
|
|
50
50
|
with:
|
|
51
51
|
name: coverage-${{ matrix.python }}
|
|
52
52
|
include-hidden-files: true
|
|
@@ -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.
|
|
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.
|
|
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.
|
|
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
|
|
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
|
{python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/ISSUE_TEMPLATE/PULL_REQUEST_TEMPLATE.md
RENAMED
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_bsblan-6.1.9 → python_bsblan-6.1.10}/.github/skills/openspec-archive-change/SKILL.md
RENAMED
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_bsblan-6.1.9 → python_bsblan-6.1.10}/openspec/specs/lazy-validation-completeness/spec.md
RENAMED
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|