python-duco-connectivity 0.4.0__tar.gz → 0.6.0__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 (29) hide show
  1. {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/PKG-INFO +14 -6
  2. {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/README.md +12 -4
  3. {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/pyproject.toml +4 -3
  4. python_duco_connectivity-0.6.0/src/duco_connectivity/__init__.py +235 -0
  5. {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/src/duco_connectivity/cli.py +3 -0
  6. {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/src/duco_connectivity/client.py +447 -75
  7. python_duco_connectivity-0.6.0/src/duco_connectivity/models.py +1654 -0
  8. {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/src/python_duco_connectivity.egg-info/PKG-INFO +14 -6
  9. {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/src/python_duco_connectivity.egg-info/requires.txt +1 -1
  10. {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/tests/test_api_reference.py +2 -0
  11. {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/tests/test_client.py +673 -11
  12. python_duco_connectivity-0.6.0/tests/test_models.py +890 -0
  13. python_duco_connectivity-0.4.0/src/duco_connectivity/__init__.py +0 -123
  14. python_duco_connectivity-0.4.0/src/duco_connectivity/models.py +0 -588
  15. python_duco_connectivity-0.4.0/tests/test_models.py +0 -423
  16. {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/LICENSE +0 -0
  17. {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/setup.cfg +0 -0
  18. {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/src/duco_connectivity/__main__.py +0 -0
  19. {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/src/duco_connectivity/exceptions.py +0 -0
  20. {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/src/duco_connectivity/py.typed +0 -0
  21. {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/src/python_duco_connectivity.egg-info/SOURCES.txt +0 -0
  22. {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/src/python_duco_connectivity.egg-info/dependency_links.txt +0 -0
  23. {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/src/python_duco_connectivity.egg-info/entry_points.txt +0 -0
  24. {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/src/python_duco_connectivity.egg-info/top_level.txt +0 -0
  25. {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/tests/test_cli.py +0 -0
  26. {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/tests/test_exceptions.py +0 -0
  27. {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/tests/test_local_sample_validation.py +0 -0
  28. {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/tests/test_pytest_live_support.py +0 -0
  29. {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/tests/test_replay_helpers.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-duco-connectivity
3
- Version: 0.4.0
3
+ Version: 0.6.0
4
4
  Summary: Async HTTP client for the local Duco Connectivity API
5
5
  Author: Ronald van der Meer
6
6
  License-Expression: MIT
@@ -27,7 +27,7 @@ Requires-Dist: pip-audit>=2.7; extra == "dev"
27
27
  Requires-Dist: pytest>=8.0; extra == "dev"
28
28
  Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
29
29
  Requires-Dist: pytest-cov>=5.0; extra == "dev"
30
- Requires-Dist: ruff>=0.11; extra == "dev"
30
+ Requires-Dist: ruff>=0.15.14; extra == "dev"
31
31
  Dynamic: license-file
32
32
 
33
33
  # python-duco-connectivity
@@ -62,9 +62,14 @@ in the development examples below.
62
62
 
63
63
  - HTTP only
64
64
  - asynchronous communication via `aiohttp`
65
+ - typed stable config families for the documented `/config` branches
65
66
  - typed models that stay close to the API response shape
66
67
  - preserved `raw_payload` data on typed response models for forward compatibility
67
68
 
69
+ Diagnostic subsystem reads now keep raw component and status strings from
70
+ `Diag.SubSystems`, so future subsystem names or status values remain available
71
+ to downstream consumers without parse fallbacks or product-specific filtering.
72
+
68
73
  ## Getting started
69
74
 
70
75
  ```python
@@ -102,16 +107,19 @@ public client methods, exports, compatibility aliases, and construction rules.
102
107
  captures
103
108
  - `docs/actions.md` for action discovery and execution
104
109
  - `docs/nodes.md` for node models and node information readers
110
+ - `docs/public-api-boundaries.md` for the typed-model contract and raw escape
111
+ hatch boundaries
105
112
  - `docs/zones.md` for zone and group info and config readers
106
113
  - `docs/ventilation-states.md` for ventilation enum values and compatibility
107
114
  members
108
115
  - `docs/payload-preservation.md` for raw payload preservation and raw endpoint
109
116
  access
110
117
 
111
- The public surface keeps a split between stable typed readers and broader raw
112
- escape hatches. Use the typed methods when the model already matches the data
113
- you need, and use the raw helpers when you need endpoint coverage that has not
114
- been typed yet.
118
+ The public surface keeps a deliberate split between stable typed readers and
119
+ broader raw escape hatches. Use the typed methods when the model already
120
+ matches the data you need, and use the raw helpers when you need endpoint
121
+ coverage, selector flexibility, or payload fields that have not been typed yet.
122
+ See `docs/public-api-boundaries.md` for the full contract.
115
123
 
116
124
  ## Testing strategy
117
125
 
@@ -30,9 +30,14 @@ in the development examples below.
30
30
 
31
31
  - HTTP only
32
32
  - asynchronous communication via `aiohttp`
33
+ - typed stable config families for the documented `/config` branches
33
34
  - typed models that stay close to the API response shape
34
35
  - preserved `raw_payload` data on typed response models for forward compatibility
35
36
 
37
+ Diagnostic subsystem reads now keep raw component and status strings from
38
+ `Diag.SubSystems`, so future subsystem names or status values remain available
39
+ to downstream consumers without parse fallbacks or product-specific filtering.
40
+
36
41
  ## Getting started
37
42
 
38
43
  ```python
@@ -70,16 +75,19 @@ public client methods, exports, compatibility aliases, and construction rules.
70
75
  captures
71
76
  - `docs/actions.md` for action discovery and execution
72
77
  - `docs/nodes.md` for node models and node information readers
78
+ - `docs/public-api-boundaries.md` for the typed-model contract and raw escape
79
+ hatch boundaries
73
80
  - `docs/zones.md` for zone and group info and config readers
74
81
  - `docs/ventilation-states.md` for ventilation enum values and compatibility
75
82
  members
76
83
  - `docs/payload-preservation.md` for raw payload preservation and raw endpoint
77
84
  access
78
85
 
79
- The public surface keeps a split between stable typed readers and broader raw
80
- escape hatches. Use the typed methods when the model already matches the data
81
- you need, and use the raw helpers when you need endpoint coverage that has not
82
- been typed yet.
86
+ The public surface keeps a deliberate split between stable typed readers and
87
+ broader raw escape hatches. Use the typed methods when the model already
88
+ matches the data you need, and use the raw helpers when you need endpoint
89
+ coverage, selector flexibility, or payload fields that have not been typed yet.
90
+ See `docs/public-api-boundaries.md` for the full contract.
83
91
 
84
92
  ## Testing strategy
85
93
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "python-duco-connectivity"
7
- version = "0.4.0"
7
+ version = "0.6.0"
8
8
  description = "Async HTTP client for the local Duco Connectivity API"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -38,7 +38,7 @@ dev = [
38
38
  "pytest>=8.0",
39
39
  "pytest-asyncio>=0.23",
40
40
  "pytest-cov>=5.0",
41
- "ruff>=0.11",
41
+ "ruff>=0.15.14",
42
42
  ]
43
43
 
44
44
  [project.urls]
@@ -80,9 +80,10 @@ exclude_lines = [
80
80
  [tool.ruff]
81
81
  line-length = 100
82
82
  target-version = "py312"
83
+ required-version = ">=0.15.14"
83
84
 
84
85
  [tool.ruff.lint]
85
- select = ["E", "F", "I", "UP"]
86
+ select = ["B", "E", "F", "I", "RUF", "UP"]
86
87
 
87
88
  [tool.mypy]
88
89
  python_version = "3.12"
@@ -0,0 +1,235 @@
1
+ """Public package exports for python-duco-connectivity."""
2
+
3
+ from importlib.metadata import PackageNotFoundError, version
4
+
5
+ from .client import DucoClient
6
+ from .exceptions import (
7
+ DucoConnectionError,
8
+ DucoError,
9
+ DucoRateLimitError,
10
+ DucoResponseError,
11
+ DucoWriteLimitError,
12
+ )
13
+ from .models import (
14
+ Action,
15
+ ActionEnumValue,
16
+ ActionItem,
17
+ ActionItemList,
18
+ ActionName,
19
+ ActionNode,
20
+ ActionResult,
21
+ ActionResultStatus,
22
+ ActionValueType,
23
+ ApiEndpoint,
24
+ ApiEndpointInfo,
25
+ ApiInfo,
26
+ BoardInfo,
27
+ BoardName,
28
+ Config,
29
+ ConfigAutoRebootComm,
30
+ ConfigGeneral,
31
+ ConfigGeneralSubmoduleSelector,
32
+ ConfigGroup,
33
+ ConfigGroupStruct,
34
+ ConfigHeatRecovery,
35
+ ConfigHeatRecoveryBypass,
36
+ ConfigHeatRecoverySubmoduleSelector,
37
+ ConfigLan,
38
+ ConfigModbus,
39
+ ConfigModuleSelector,
40
+ ConfigNode,
41
+ ConfigNodeOverview,
42
+ ConfigNodeStruct,
43
+ ConfigSection,
44
+ ConfigTime,
45
+ ConfigValue,
46
+ ConfigValueOptions,
47
+ ConfigValueString,
48
+ ConfigZone,
49
+ ConfigZonesOverview,
50
+ ConfigZoneStruct,
51
+ ConfigZoneWithGroupStruct,
52
+ DeviceGroupConfigSubmoduleSelector,
53
+ DiagComponent,
54
+ DiagInfo,
55
+ DucoSerialNumber,
56
+ DucoVersion,
57
+ HostName,
58
+ InfoGeneralSubmoduleSelector,
59
+ InfoGroup,
60
+ InfoGroupStruct,
61
+ InfoModuleSelector,
62
+ InfoZone,
63
+ InfoZoneGroup,
64
+ InfoZonesOverview,
65
+ InfoZoneStruct,
66
+ IpAddress,
67
+ KnownActionName,
68
+ KnownBoardName,
69
+ KnownLanMode,
70
+ LanInfo,
71
+ LanMode,
72
+ MacAddress,
73
+ NetworkType,
74
+ Node,
75
+ NodeActionItemList,
76
+ NodeAirQualityIndex,
77
+ NodeAssociationId,
78
+ NodeCo2Ppm,
79
+ NodeGeneralInfo,
80
+ NodeIdentify,
81
+ NodeInfoModuleSelector,
82
+ NodeListActionItemList,
83
+ NodeMotorDeviceType,
84
+ NodeMotorPosition,
85
+ NodeMotorRequest,
86
+ NodeMotorStateInfo,
87
+ NodeName,
88
+ NodeOverview,
89
+ NodeParentId,
90
+ NodeRelativeHumidity,
91
+ NodeSensorInfo,
92
+ NodeSubtype,
93
+ NodeTemperature,
94
+ NodeType,
95
+ NodeVentilationInfo,
96
+ PatchConfig,
97
+ PatchConfigAutoRebootComm,
98
+ PatchConfigGeneral,
99
+ PatchConfigHeatRecovery,
100
+ PatchConfigHeatRecoveryBypass,
101
+ PatchConfigLan,
102
+ PatchConfigModbus,
103
+ PatchConfigModel,
104
+ PatchConfigNodeStruct,
105
+ PatchConfigNodeValue,
106
+ PatchConfigTime,
107
+ PatchConfigValue,
108
+ PatchConfigZoneDeviceGroupConfig,
109
+ PatchConfigZoneGeneral,
110
+ PatchConfigZoneStruct,
111
+ VentilationFlowLevelTarget,
112
+ VentilationMode,
113
+ VentilationState,
114
+ VentilationTimeEnd,
115
+ VentilationTimeRemaining,
116
+ ZoneModuleSelector,
117
+ )
118
+
119
+ try:
120
+ __version__ = version("python-duco-connectivity")
121
+ except PackageNotFoundError:
122
+ __version__ = "0.0.0"
123
+
124
+ __all__ = [
125
+ "Action",
126
+ "ActionEnumValue",
127
+ "ActionItem",
128
+ "ActionItemList",
129
+ "ActionName",
130
+ "ActionNode",
131
+ "ActionResult",
132
+ "ActionResultStatus",
133
+ "ActionValueType",
134
+ "ApiEndpoint",
135
+ "ApiEndpointInfo",
136
+ "ApiInfo",
137
+ "BoardInfo",
138
+ "BoardName",
139
+ "Config",
140
+ "ConfigAutoRebootComm",
141
+ "ConfigGeneral",
142
+ "ConfigGeneralSubmoduleSelector",
143
+ "ConfigGroup",
144
+ "ConfigGroupStruct",
145
+ "ConfigHeatRecovery",
146
+ "ConfigHeatRecoveryBypass",
147
+ "ConfigHeatRecoverySubmoduleSelector",
148
+ "ConfigLan",
149
+ "ConfigModbus",
150
+ "ConfigModuleSelector",
151
+ "ConfigNode",
152
+ "ConfigNodeOverview",
153
+ "ConfigNodeStruct",
154
+ "ConfigSection",
155
+ "ConfigTime",
156
+ "ConfigValue",
157
+ "ConfigValueOptions",
158
+ "ConfigValueString",
159
+ "ConfigZone",
160
+ "ConfigZoneStruct",
161
+ "ConfigZoneWithGroupStruct",
162
+ "ConfigZonesOverview",
163
+ "DeviceGroupConfigSubmoduleSelector",
164
+ "DiagComponent",
165
+ "DiagInfo",
166
+ "DucoClient",
167
+ "DucoConnectionError",
168
+ "DucoError",
169
+ "DucoRateLimitError",
170
+ "DucoResponseError",
171
+ "DucoSerialNumber",
172
+ "DucoVersion",
173
+ "DucoWriteLimitError",
174
+ "HostName",
175
+ "InfoGeneralSubmoduleSelector",
176
+ "InfoGroup",
177
+ "InfoGroupStruct",
178
+ "InfoModuleSelector",
179
+ "InfoZone",
180
+ "InfoZoneGroup",
181
+ "InfoZoneStruct",
182
+ "InfoZonesOverview",
183
+ "IpAddress",
184
+ "KnownActionName",
185
+ "KnownBoardName",
186
+ "KnownLanMode",
187
+ "LanInfo",
188
+ "LanMode",
189
+ "MacAddress",
190
+ "NetworkType",
191
+ "Node",
192
+ "NodeActionItemList",
193
+ "NodeAirQualityIndex",
194
+ "NodeAssociationId",
195
+ "NodeCo2Ppm",
196
+ "NodeGeneralInfo",
197
+ "NodeIdentify",
198
+ "NodeInfoModuleSelector",
199
+ "NodeListActionItemList",
200
+ "NodeMotorDeviceType",
201
+ "NodeMotorPosition",
202
+ "NodeMotorRequest",
203
+ "NodeMotorStateInfo",
204
+ "NodeName",
205
+ "NodeOverview",
206
+ "NodeParentId",
207
+ "NodeRelativeHumidity",
208
+ "NodeSensorInfo",
209
+ "NodeSubtype",
210
+ "NodeTemperature",
211
+ "NodeType",
212
+ "NodeVentilationInfo",
213
+ "PatchConfig",
214
+ "PatchConfigAutoRebootComm",
215
+ "PatchConfigGeneral",
216
+ "PatchConfigHeatRecovery",
217
+ "PatchConfigHeatRecoveryBypass",
218
+ "PatchConfigLan",
219
+ "PatchConfigModbus",
220
+ "PatchConfigModel",
221
+ "PatchConfigNodeStruct",
222
+ "PatchConfigNodeValue",
223
+ "PatchConfigTime",
224
+ "PatchConfigValue",
225
+ "PatchConfigZoneDeviceGroupConfig",
226
+ "PatchConfigZoneGeneral",
227
+ "PatchConfigZoneStruct",
228
+ "VentilationFlowLevelTarget",
229
+ "VentilationMode",
230
+ "VentilationState",
231
+ "VentilationTimeEnd",
232
+ "VentilationTimeRemaining",
233
+ "ZoneModuleSelector",
234
+ "__version__",
235
+ ]
@@ -77,6 +77,9 @@ METHOD_SPECS: dict[str, MethodSpec] = {
77
77
  ),
78
78
  "async_get_board_info": MethodSpec(description="Return board identity details."),
79
79
  "async_get_lan_info": MethodSpec(description="Return LAN settings."),
80
+ "async_get_diagnostics_info": MethodSpec(
81
+ description="Return the typed diagnostics response from /info?module=Diag."
82
+ ),
80
83
  "async_get_diagnostics": MethodSpec(description="Return diagnostic subsystem states."),
81
84
  "async_get_nodes": MethodSpec(description="Return full node information."),
82
85
  "async_get_zones_info": MethodSpec(description="Return zone information."),