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.
- {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/PKG-INFO +14 -6
- {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/README.md +12 -4
- {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/pyproject.toml +4 -3
- python_duco_connectivity-0.6.0/src/duco_connectivity/__init__.py +235 -0
- {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/src/duco_connectivity/cli.py +3 -0
- {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/src/duco_connectivity/client.py +447 -75
- python_duco_connectivity-0.6.0/src/duco_connectivity/models.py +1654 -0
- {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/src/python_duco_connectivity.egg-info/PKG-INFO +14 -6
- {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/src/python_duco_connectivity.egg-info/requires.txt +1 -1
- {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/tests/test_api_reference.py +2 -0
- {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/tests/test_client.py +673 -11
- python_duco_connectivity-0.6.0/tests/test_models.py +890 -0
- python_duco_connectivity-0.4.0/src/duco_connectivity/__init__.py +0 -123
- python_duco_connectivity-0.4.0/src/duco_connectivity/models.py +0 -588
- python_duco_connectivity-0.4.0/tests/test_models.py +0 -423
- {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/LICENSE +0 -0
- {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/setup.cfg +0 -0
- {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/src/duco_connectivity/__main__.py +0 -0
- {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/src/duco_connectivity/exceptions.py +0 -0
- {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/src/duco_connectivity/py.typed +0 -0
- {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/src/python_duco_connectivity.egg-info/SOURCES.txt +0 -0
- {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/src/python_duco_connectivity.egg-info/dependency_links.txt +0 -0
- {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/src/python_duco_connectivity.egg-info/entry_points.txt +0 -0
- {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/src/python_duco_connectivity.egg-info/top_level.txt +0 -0
- {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/tests/test_cli.py +0 -0
- {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/tests/test_exceptions.py +0 -0
- {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/tests/test_local_sample_validation.py +0 -0
- {python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/tests/test_pytest_live_support.py +0 -0
- {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.
|
|
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.
|
|
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
|
|
112
|
-
escape hatches. Use the typed methods when the model already
|
|
113
|
-
you need, and use the raw helpers when you need endpoint
|
|
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
|
|
80
|
-
escape hatches. Use the typed methods when the model already
|
|
81
|
-
you need, and use the raw helpers when you need endpoint
|
|
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.
|
|
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.
|
|
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
|
+
]
|
{python_duco_connectivity-0.4.0 → python_duco_connectivity-0.6.0}/src/duco_connectivity/cli.py
RENAMED
|
@@ -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."),
|