python-bsblan 5.1.2__tar.gz → 5.1.4__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 (107) hide show
  1. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/.github/renovate.json +1 -2
  2. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/.github/workflows/codeql.yaml +2 -2
  3. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/.github/workflows/release-drafter.yaml +1 -1
  4. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/.github/workflows/release.yaml +2 -2
  5. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/.github/workflows/tests.yaml +3 -3
  6. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/.gitignore +3 -0
  7. python_bsblan-5.1.4/.nvmrc +1 -0
  8. python_bsblan-5.1.4/Makefile +20 -0
  9. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/PKG-INFO +14 -2
  10. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/README.md +13 -1
  11. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/examples/speed_test.py +2 -85
  12. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/package-lock.json +4 -4
  13. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/package.json +1 -1
  14. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/pyproject.toml +16 -8
  15. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/src/bsblan/bsblan.py +85 -185
  16. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/src/bsblan/constants.py +146 -198
  17. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/src/bsblan/exceptions.py +3 -4
  18. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/src/bsblan/models.py +0 -1
  19. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/conftest.py +0 -3
  20. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/fixtures/dict_version.json +1 -2
  21. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/fixtures/state.json +0 -12
  22. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/fixtures/state_circuit2.json +2 -14
  23. python_bsblan-5.1.4/tests/test_api_initialization.py +59 -0
  24. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/test_api_validation.py +4 -7
  25. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/test_bsblan_edge_cases.py +0 -48
  26. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/test_circuit.py +30 -126
  27. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/test_configuration.py +7 -7
  28. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/test_constants.py +11 -15
  29. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/test_dhw_time_switch.py +2 -2
  30. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/test_hotwater_state.py +0 -2
  31. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/test_include_parameter.py +5 -6
  32. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/test_initialization.py +19 -87
  33. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/test_set_hotwater.py +3 -3
  34. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/test_state.py +1 -6
  35. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/test_temperature_unit.py +9 -9
  36. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/test_temperature_validation.py +18 -16
  37. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/test_thermostat.py +4 -5
  38. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/test_version_errors.py +6 -6
  39. python_bsblan-5.1.2/.nvmrc +0 -1
  40. python_bsblan-5.1.2/tests/test_api_initialization.py +0 -103
  41. python_bsblan-5.1.2/uv.lock +0 -2381
  42. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/.editorconfig +0 -0
  43. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/.gitattributes +0 -0
  44. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/.github/CODE_OF_CONDUCT.md +0 -0
  45. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/.github/CONTRIBUTING.md +0 -0
  46. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/.github/ISSUE_TEMPLATE/PULL_REQUEST_TEMPLATE.md +0 -0
  47. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  48. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  49. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/.github/copilot-instructions.md +0 -0
  50. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/.github/labels.yml +0 -0
  51. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/.github/prompts/add-parameter.prompt.md +0 -0
  52. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/.github/prompts/code-review.prompt.md +0 -0
  53. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/.github/release-drafter.yml +0 -0
  54. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/.github/skills/bsblan-parameters/SKILL.md +0 -0
  55. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/.github/skills/bsblan-testing/SKILL.md +0 -0
  56. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/.github/workflows/auto-approve-renovate.yml +0 -0
  57. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/.github/workflows/labels.yaml +0 -0
  58. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/.github/workflows/linting.yaml +0 -0
  59. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/.github/workflows/lock.yaml +0 -0
  60. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/.github/workflows/pr-labels.yaml +0 -0
  61. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/.github/workflows/stale.yaml +0 -0
  62. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/.pre-commit-config.yaml +0 -0
  63. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/.prettierignore +0 -0
  64. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/.yamllint +0 -0
  65. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/AGENTS.md +0 -0
  66. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/CLAUDE.md +0 -0
  67. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/LICENSE.md +0 -0
  68. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/examples/control.py +0 -0
  69. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/examples/discovery.py +0 -0
  70. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/examples/fetch_param.py +0 -0
  71. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/examples/profile_init.py +0 -0
  72. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/examples/ruff.toml +0 -0
  73. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/sonar-project.properties +0 -0
  74. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/src/bsblan/__init__.py +0 -0
  75. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/src/bsblan/py.typed +0 -0
  76. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/src/bsblan/utility.py +0 -0
  77. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/__init__.py +0 -0
  78. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/fixtures/device.json +0 -0
  79. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/fixtures/hot_water_state.json +0 -0
  80. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/fixtures/info.json +0 -0
  81. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/fixtures/password.txt +0 -0
  82. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/fixtures/sensor.json +0 -0
  83. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/fixtures/static_state.json +0 -0
  84. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/fixtures/static_state_circuit2.json +0 -0
  85. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/fixtures/thermostat_hvac.json +0 -0
  86. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/fixtures/thermostat_temp.json +0 -0
  87. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/fixtures/time.json +0 -0
  88. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/ruff.toml +0 -0
  89. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/test_auth.py +0 -0
  90. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/test_backoff_retry.py +0 -0
  91. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/test_bsblan.py +0 -0
  92. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/test_context_manager.py +0 -0
  93. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/test_device.py +0 -0
  94. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/test_entity_info.py +0 -0
  95. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/test_entity_info_ha.py +0 -0
  96. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/test_hot_water_additional.py +0 -0
  97. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/test_info.py +0 -0
  98. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/test_read_parameters.py +0 -0
  99. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/test_reset_validation.py +0 -0
  100. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/test_schedule_models.py +0 -0
  101. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/test_sensor.py +0 -0
  102. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/test_set_hot_water_schedule.py +0 -0
  103. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/test_static_state.py +0 -0
  104. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/test_time.py +0 -0
  105. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/test_utility.py +0 -0
  106. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/test_utility_additional.py +0 -0
  107. {python_bsblan-5.1.2 → python_bsblan-5.1.4}/tests/test_utility_edge_cases.py +0 -0
@@ -6,8 +6,7 @@
6
6
  "labels": ["dependencies", "no-stale"],
7
7
  "platformAutomerge": true,
8
8
  "lockFileMaintenance": {
9
- "enabled": true,
10
- "automerge": true
9
+ "enabled": false
11
10
  },
12
11
  "commitMessagePrefix": "⬆️",
13
12
  "packageRules": [
@@ -24,6 +24,6 @@ jobs:
24
24
  - name: ⤵️ Check out code from GitHub
25
25
  uses: actions/checkout@v6.0.2
26
26
  - name: 🏗 Initialize CodeQL
27
- uses: github/codeql-action/init@v4.32.5
27
+ uses: github/codeql-action/init@v4.35.1
28
28
  - name: 🚀 Perform CodeQL Analysis
29
- uses: github/codeql-action/analyze@v4.32.5
29
+ uses: github/codeql-action/analyze@v4.35.1
@@ -34,7 +34,7 @@ jobs:
34
34
  runs-on: ubuntu-latest
35
35
  steps:
36
36
  - name: 🚀 Run Release Drafter
37
- uses: release-drafter/release-drafter@v6.2.0
37
+ uses: release-drafter/release-drafter@v7.2.0
38
38
  with:
39
39
  prerelease: ${{ github.event.inputs.prerelease == 'true' }}
40
40
  prerelease-identifier: ${{ github.event.inputs.prerelease_identifier }}
@@ -43,12 +43,12 @@ jobs:
43
43
  - name: 🏗 Build package
44
44
  run: uv build
45
45
  - name: 🚀 Publish to PyPi
46
- uses: pypa/gh-action-pypi-publish@v1.13.0
46
+ uses: pypa/gh-action-pypi-publish@v1.14.0
47
47
  with:
48
48
  verbose: true
49
49
  print-hash: true
50
50
  - name: ✍️ Sign published artifacts
51
- uses: sigstore/gh-action-sigstore-python@v3.2.0
51
+ uses: sigstore/gh-action-sigstore-python@v3.3.0
52
52
  with:
53
53
  inputs: ./dist/*.tar.gz ./dist/*.whl
54
54
  release-signing-artifacts: false
@@ -43,7 +43,7 @@ jobs:
43
43
  - name: 🚀 Run pytest
44
44
  run: uv run pytest --cov=bsblan tests
45
45
  - name: ⬆️ Upload coverage artifact
46
- uses: actions/upload-artifact@v7.0.0
46
+ uses: actions/upload-artifact@v7.0.1
47
47
  with:
48
48
  name: coverage-${{ matrix.python }}
49
49
  include-hidden-files: true
@@ -58,7 +58,7 @@ jobs:
58
58
  with:
59
59
  fetch-depth: 0
60
60
  - name: ⬇️ Download coverage data
61
- uses: actions/download-artifact@v8.0.0
61
+ uses: actions/download-artifact@v8.0.1
62
62
  - name: 🏗 Set up uv
63
63
  uses: astral-sh/setup-uv@v7
64
64
  with:
@@ -76,7 +76,7 @@ jobs:
76
76
  uv run python -m coverage xml -i
77
77
  - name: 🚀 Upload coverage report
78
78
  if: env.HAS_CODECOV_TOKEN == 'true'
79
- uses: codecov/codecov-action@v5.5.2
79
+ uses: codecov/codecov-action@v6.0.0
80
80
  with:
81
81
  token: ${{ secrets.CODECOV_TOKEN }}
82
82
  - name: ℹ️ Skip Codecov upload (missing token)
@@ -94,6 +94,9 @@ ENV/
94
94
  # ruff
95
95
  .ruff_cache
96
96
 
97
+ # uv
98
+ uv.lock
99
+
97
100
  # Visual Studio Code
98
101
  .vscode
99
102
 
@@ -0,0 +1 @@
1
+ 24.14.1
@@ -0,0 +1,20 @@
1
+ .PHONY: setup lint test coverage help
2
+
3
+ .DEFAULT_GOAL := help
4
+
5
+ help: ## Show this help message
6
+ @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | \
7
+ awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-15s\033[0m %s\n", $$1, $$2}'
8
+
9
+ setup: ## Install dev dependencies and git hooks
10
+ uv sync --dev
11
+ uv run prek install
12
+
13
+ lint: ## Run all pre-commit hooks
14
+ uv run prek run --all-files
15
+
16
+ test: ## Run tests
17
+ uv run pytest
18
+
19
+ coverage: ## Run tests with coverage report
20
+ uv run pytest --cov=src/bsblan --cov-report=term-missing
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-bsblan
3
- Version: 5.1.2
3
+ Version: 5.1.4
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
@@ -182,9 +182,21 @@ To install all packages, including all development requirements:
182
182
 
183
183
  ```bash
184
184
  npm install
185
- uv sync --dev
185
+ make setup
186
186
  ```
187
187
 
188
+ ### Makefile Targets
189
+
190
+ A `Makefile` is provided for common development tasks. Run `make help` to
191
+ see all available targets:
192
+
193
+ | Command | Description |
194
+ |-----------------|--------------------------------------|
195
+ | `make setup` | Install dev dependencies & git hooks |
196
+ | `make lint` | Run all pre-commit hooks |
197
+ | `make test` | Run tests |
198
+ | `make coverage` | Run tests with coverage report |
199
+
188
200
  As this repository uses [prek][prek] (a faster, Rust-based drop-in replacement
189
201
  for pre-commit), all changes are linted and tested with each commit. You can
190
202
  run all checks and tests manually, using the following command:
@@ -150,9 +150,21 @@ To install all packages, including all development requirements:
150
150
 
151
151
  ```bash
152
152
  npm install
153
- uv sync --dev
153
+ make setup
154
154
  ```
155
155
 
156
+ ### Makefile Targets
157
+
158
+ A `Makefile` is provided for common development tasks. Run `make help` to
159
+ see all available targets:
160
+
161
+ | Command | Description |
162
+ |-----------------|--------------------------------------|
163
+ | `make setup` | Install dev dependencies & git hooks |
164
+ | `make lint` | Run all pre-commit hooks |
165
+ | `make test` | Run tests |
166
+ | `make coverage` | Run tests with coverage report |
167
+
156
168
  As this repository uses [prek][prek] (a faster, Rust-based drop-in replacement
157
169
  for pre-commit), all changes are linted and tested with each commit. You can
158
170
  run all checks and tests manually, using the following command:
@@ -4,7 +4,6 @@ Compares different approaches using pluggable benchmark suites:
4
4
  - basic: Original tests (parallel calls, read_parameters, filtering)
5
5
  - scalability: Large parameter set tests
6
6
  - dual-circuit: Single vs parallel calls for dual heating circuit params
7
- - triple-circuit: Same idea extended to 3 heating circuits
8
7
  - hot-water: Hot water parameter group loading tests
9
8
 
10
9
  Usage:
@@ -56,29 +55,20 @@ STATIC_PARAMS = ["714", "716"] # Min/max temp setpoints
56
55
  ALL_PARAMS = INFO_PARAMS + STATIC_PARAMS
57
56
 
58
57
  # Heating circuit 1 (700-series)
59
- HC1_PARAMS = ["700", "710", "900", "8000", "8740", "8749"]
58
+ HC1_PARAMS = ["700", "710", "900", "8000", "8740"]
60
59
 
61
60
  # Heating circuit 2 (1000-series) — mirrors HC1 with offset
62
- HC2_PARAMS = ["1000", "1010", "1200", "8001", "8741", "8750"]
63
-
64
- # Heating circuit 3 (1300-series) — mirrors HC1 with offset
65
- HC3_PARAMS = ["1300", "1310", "1500", "8002", "8742", "8751"]
61
+ HC2_PARAMS = ["1000", "1010", "1200", "8001", "8770"]
66
62
 
67
63
  # Static values per circuit
68
64
  HC1_STATIC_PARAMS = ["714", "716"]
69
65
  HC2_STATIC_PARAMS = ["1014", "1016"]
70
- HC3_STATIC_PARAMS = ["1314", "1316"]
71
66
 
72
67
  # Combined dual circuit parameter sets
73
68
  DUAL_HEATING_PARAMS = HC1_PARAMS + HC2_PARAMS
74
69
  DUAL_STATIC_PARAMS = HC1_STATIC_PARAMS + HC2_STATIC_PARAMS
75
70
  DUAL_ALL_PARAMS = DUAL_HEATING_PARAMS + DUAL_STATIC_PARAMS
76
71
 
77
- # Triple circuit parameter sets
78
- TRIPLE_HEATING_PARAMS = HC1_PARAMS + HC2_PARAMS + HC3_PARAMS
79
- TRIPLE_STATIC_PARAMS = HC1_STATIC_PARAMS + HC2_STATIC_PARAMS + HC3_STATIC_PARAMS
80
- TRIPLE_ALL_PARAMS = TRIPLE_HEATING_PARAMS + TRIPLE_STATIC_PARAMS
81
-
82
72
  # Sensor parameters
83
73
  SENSOR_PARAMS = ["8700", "8740"]
84
74
 
@@ -515,78 +505,6 @@ def build_dual_circuit_suite(bsblan: BSBLAN) -> BenchmarkSuite:
515
505
  return suite
516
506
 
517
507
 
518
- def build_triple_circuit_suite(bsblan: BSBLAN) -> BenchmarkSuite:
519
- """Build the triple heating circuit benchmark suite.
520
-
521
- Same idea as dual-circuit but for 3 circuits. Most systems have
522
- at most 2 circuits; HC3 params will return '---' on those
523
- devices but this still measures the network call overhead.
524
- """
525
- suite = BenchmarkSuite(
526
- name="Triple Heating Circuit",
527
- description=(
528
- "Compare fetching strategies for 3 heating circuits.\n"
529
- " HC1: " + ", ".join(HC1_PARAMS) + "\n"
530
- " HC2: " + ", ".join(HC2_PARAMS) + "\n"
531
- " HC3: " + ", ".join(HC3_PARAMS)
532
- ),
533
- )
534
-
535
- suite.add(
536
- (f"HC1+HC2+HC3 combined — 1 call ({len(TRIPLE_HEATING_PARAMS)} params)"),
537
- f"1 call ({len(TRIPLE_HEATING_PARAMS)}p)",
538
- lambda: bsblan.read_parameters(TRIPLE_HEATING_PARAMS),
539
- param_count=len(TRIPLE_HEATING_PARAMS),
540
- )
541
-
542
- suite.add(
543
- "HC1+HC2+HC3 parallel — 3 calls",
544
- "3 parallel",
545
- lambda: asyncio.gather(
546
- bsblan.read_parameters(HC1_PARAMS),
547
- bsblan.read_parameters(HC2_PARAMS),
548
- bsblan.read_parameters(HC3_PARAMS),
549
- ),
550
- param_count=len(TRIPLE_HEATING_PARAMS),
551
- )
552
-
553
- async def _sequential_3() -> None:
554
- await bsblan.read_parameters(HC1_PARAMS)
555
- await bsblan.read_parameters(HC2_PARAMS)
556
- await bsblan.read_parameters(HC3_PARAMS)
557
-
558
- suite.add(
559
- "HC1+HC2+HC3 sequential — 3 calls",
560
- "3 sequential",
561
- _sequential_3,
562
- param_count=len(TRIPLE_HEATING_PARAMS),
563
- )
564
-
565
- # Full init with static values
566
- suite.add(
567
- (f"All circuits + static — 1 call ({len(TRIPLE_ALL_PARAMS)} params)"),
568
- f"1 call all ({len(TRIPLE_ALL_PARAMS)}p)",
569
- lambda: bsblan.read_parameters(TRIPLE_ALL_PARAMS),
570
- param_count=len(TRIPLE_ALL_PARAMS),
571
- )
572
-
573
- suite.add(
574
- "All circuits + static — 6 parallel (heat+static per circ)",
575
- "6 parallel per section",
576
- lambda: asyncio.gather(
577
- bsblan.read_parameters(HC1_PARAMS),
578
- bsblan.read_parameters(HC2_PARAMS),
579
- bsblan.read_parameters(HC3_PARAMS),
580
- bsblan.read_parameters(HC1_STATIC_PARAMS),
581
- bsblan.read_parameters(HC2_STATIC_PARAMS),
582
- bsblan.read_parameters(HC3_STATIC_PARAMS),
583
- ),
584
- param_count=len(TRIPLE_ALL_PARAMS),
585
- )
586
-
587
- return suite
588
-
589
-
590
508
  def build_hot_water_suite(bsblan: BSBLAN) -> BenchmarkSuite:
591
509
  """Build the hot water parameter benchmark suite."""
592
510
  suite = BenchmarkSuite(
@@ -645,7 +563,6 @@ SUITE_BUILDERS: dict[str, Callable[[BSBLAN], BenchmarkSuite]] = {
645
563
  "basic": build_basic_suite,
646
564
  "scalability": build_scalability_suite,
647
565
  "dual-circuit": build_dual_circuit_suite,
648
- "triple-circuit": build_triple_circuit_suite,
649
566
  "hot-water": build_hot_water_suite,
650
567
  }
651
568
 
@@ -12,13 +12,13 @@
12
12
  "url-parse": "1.5.10"
13
13
  },
14
14
  "devDependencies": {
15
- "prettier": "3.8.1"
15
+ "prettier": "3.8.2"
16
16
  }
17
17
  },
18
18
  "node_modules/prettier": {
19
- "version": "3.8.1",
20
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz",
21
- "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==",
19
+ "version": "3.8.2",
20
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.2.tgz",
21
+ "integrity": "sha512-8c3mgTe0ASwWAJK+78dpviD+A8EqhndQPUBpNUIPt6+xWlIigCwfN01lWr9MAede4uqXGTEKeQWTvzb3vjia0Q==",
22
22
  "dev": true,
23
23
  "license": "MIT",
24
24
  "bin": {
@@ -9,7 +9,7 @@
9
9
  "author": "WJL van Rootselaar <liudgervr@gmail.com>",
10
10
  "license": "MIT",
11
11
  "devDependencies": {
12
- "prettier": "3.8.1"
12
+ "prettier": "3.8.2"
13
13
  },
14
14
  "dependencies": {
15
15
  "url-parse": "1.5.10"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "python-bsblan"
3
- version = "5.1.2"
3
+ version = "5.1.4"
4
4
  description = "Asynchronous Python client for BSBLAN API"
5
5
  authors = [
6
6
  {name = "Willem-Jan van Rootselaar", email = "liudgervr@gmail.com"}
@@ -166,6 +166,14 @@ runtime-evaluated-base-classes = ["pydantic.BaseModel"]
166
166
  [tool.ruff.lint.mccabe]
167
167
  max-complexity = 25
168
168
 
169
+ [[tool.ty.overrides]]
170
+ include = ["tests/**", "**/test_*.py", "examples/**"]
171
+
172
+ [tool.ty.overrides.rules]
173
+ invalid-assignment = "ignore"
174
+ invalid-argument-type = "ignore"
175
+ unresolved-attribute = "ignore"
176
+
169
177
  [tool.codespell]
170
178
  ignore-words-list = "astroid"
171
179
 
@@ -177,29 +185,29 @@ build-backend = "hatchling.build"
177
185
  dev = [
178
186
  "aresponses==3.0.0",
179
187
  "bandit==1.9.4",
180
- "black==26.1.0",
188
+ "black==26.3.1",
181
189
  "blacken-docs==1.20.0",
182
- "codespell==2.4.1",
190
+ "codespell==2.4.2",
183
191
  "covdefaults==2.3.0",
184
- "coverage==7.13.4",
192
+ "coverage==7.13.5",
185
193
  "darglint==1.8.1",
186
194
  "flake8==7.3.0",
187
195
  "flake8-simplify==0.30.0",
188
196
  # hatch is required to support type hinting and proper packaging of the py.typed file.
189
197
  "hatch>=1.14.1",
190
198
  "isort==8.0.1",
191
- "ty==0.0.20",
199
+ "ty==0.0.29",
192
200
  "prek>=0.3.3",
193
201
  "pre-commit-hooks==6.0.0",
194
202
  "pylint==4.0.5",
195
203
  "pytest>=8.3.5",
196
204
  "pytest-asyncio==1.3.0",
197
- "pytest-cov==7.0.0",
205
+ "pytest-cov==7.1.0",
198
206
  "pytest-xdist>=3.8.0",
199
207
  "pyupgrade==3.21.2",
200
- "ruff==0.15.5",
208
+ "ruff==0.15.10",
201
209
  "safety==3.7.0",
202
- "vulture==2.14",
210
+ "vulture==2.16",
203
211
  "yamllint==1.38.0",
204
212
  "zeroconf>=0.148.0",
205
213
  ]