ihcctl 0.2.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 (56) hide show
  1. ihcctl-0.2.0/PKG-INFO +110 -0
  2. ihcctl-0.2.0/README.md +100 -0
  3. ihcctl-0.2.0/pyproject.toml +23 -0
  4. ihcctl-0.2.0/setup.cfg +4 -0
  5. ihcctl-0.2.0/src/ihcctl.egg-info/PKG-INFO +110 -0
  6. ihcctl-0.2.0/src/ihcctl.egg-info/SOURCES.txt +54 -0
  7. ihcctl-0.2.0/src/ihcctl.egg-info/dependency_links.txt +1 -0
  8. ihcctl-0.2.0/src/ihcctl.egg-info/entry_points.txt +2 -0
  9. ihcctl-0.2.0/src/ihcctl.egg-info/requires.txt +4 -0
  10. ihcctl-0.2.0/src/ihcctl.egg-info/top_level.txt +1 -0
  11. ihcctl-0.2.0/src/zehnder_ihc/__init__.py +66 -0
  12. ihcctl-0.2.0/src/zehnder_ihc/backup.py +280 -0
  13. ihcctl-0.2.0/src/zehnder_ihc/bleak_backend.py +70 -0
  14. ihcctl-0.2.0/src/zehnder_ihc/cli.py +530 -0
  15. ihcctl-0.2.0/src/zehnder_ihc/client.py +1026 -0
  16. ihcctl-0.2.0/src/zehnder_ihc/errors.py +94 -0
  17. ihcctl-0.2.0/src/zehnder_ihc/framing.py +39 -0
  18. ihcctl-0.2.0/src/zehnder_ihc/identity.py +58 -0
  19. ihcctl-0.2.0/src/zehnder_ihc/models.py +128 -0
  20. ihcctl-0.2.0/src/zehnder_ihc/mutations.py +57 -0
  21. ihcctl-0.2.0/src/zehnder_ihc/protocol.py +477 -0
  22. ihcctl-0.2.0/src/zehnder_ihc/restore.py +231 -0
  23. ihcctl-0.2.0/src/zehnder_ihc/transport.py +143 -0
  24. ihcctl-0.2.0/tests/test_active_weekplan.py +199 -0
  25. ihcctl-0.2.0/tests/test_bleak_backend.py +146 -0
  26. ihcctl-0.2.0/tests/test_cli.py +1095 -0
  27. ihcctl-0.2.0/tests/test_client.py +409 -0
  28. ihcctl-0.2.0/tests/test_dayplan_delete.py +307 -0
  29. ihcctl-0.2.0/tests/test_framing.py +47 -0
  30. ihcctl-0.2.0/tests/test_home_assistant_active_weekplan_select.py +410 -0
  31. ihcctl-0.2.0/tests/test_home_assistant_boost.py +385 -0
  32. ihcctl-0.2.0/tests/test_home_assistant_frontend_static.py +74 -0
  33. ihcctl-0.2.0/tests/test_home_assistant_layout.py +119 -0
  34. ihcctl-0.2.0/tests/test_home_assistant_schedule.py +636 -0
  35. ihcctl-0.2.0/tests/test_home_assistant_schedule_backup_restore.py +582 -0
  36. ihcctl-0.2.0/tests/test_home_assistant_structured_backend.py +433 -0
  37. ihcctl-0.2.0/tests/test_home_assistant_values.py +287 -0
  38. ihcctl-0.2.0/tests/test_identity.py +40 -0
  39. ihcctl-0.2.0/tests/test_modes.py +29 -0
  40. ihcctl-0.2.0/tests/test_package.py +46 -0
  41. ihcctl-0.2.0/tests/test_protocol.py +75 -0
  42. ihcctl-0.2.0/tests/test_quick_heating.py +250 -0
  43. ihcctl-0.2.0/tests/test_release_helper.py +48 -0
  44. ihcctl-0.2.0/tests/test_restore_executor.py +470 -0
  45. ihcctl-0.2.0/tests/test_restore_planner.py +327 -0
  46. ihcctl-0.2.0/tests/test_schedule_backup.py +226 -0
  47. ihcctl-0.2.0/tests/test_schedule_backup_snapshot.py +145 -0
  48. ihcctl-0.2.0/tests/test_schedule_client.py +913 -0
  49. ihcctl-0.2.0/tests/test_schedule_lists.py +244 -0
  50. ihcctl-0.2.0/tests/test_schedule_models.py +135 -0
  51. ihcctl-0.2.0/tests/test_schedule_mutation_contract.py +238 -0
  52. ihcctl-0.2.0/tests/test_schedule_protocol.py +203 -0
  53. ihcctl-0.2.0/tests/test_status.py +21 -0
  54. ihcctl-0.2.0/tests/test_task10a_hardware_tool.py +191 -0
  55. ihcctl-0.2.0/tests/test_transport.py +234 -0
  56. ihcctl-0.2.0/tests/test_weekplan_delete.py +285 -0
ihcctl-0.2.0/PKG-INFO ADDED
@@ -0,0 +1,110 @@
1
+ Metadata-Version: 2.4
2
+ Name: ihcctl
3
+ Version: 0.2.0
4
+ Summary: Python library and CLI for local Zehnder IHC control
5
+ Requires-Python: >=3.11
6
+ Description-Content-Type: text/markdown
7
+ Requires-Dist: bleak>=0.22
8
+ Provides-Extra: test
9
+ Requires-Dist: pytest>=8; extra == "test"
10
+
11
+ # ihcctl
12
+
13
+ `ihcctl` is a Python library and CLI for local Zehnder IHC controller control
14
+ over Bluetooth Low Energy. Normal use does not require a cloud service.
15
+
16
+ The distribution is `ihcctl`; the Python import namespace remains
17
+ `zehnder_ihc`; the CLI command is `ihcctl`.
18
+
19
+ ## Install
20
+
21
+ For the CLI, prefer pipx:
22
+
23
+ ```bash
24
+ pipx install ihcctl
25
+ ihcctl --help
26
+ ```
27
+
28
+ Alternatively install into a Python environment:
29
+
30
+ ```bash
31
+ python -m pip install ihcctl
32
+ ```
33
+
34
+ The first public release, `ihcctl` 0.2.0, is prepared but not yet published.
35
+ Until public publication and verification, these are the intended future
36
+ commands rather than a current PyPI installation path.
37
+
38
+ ## Python library and CLI
39
+
40
+ Use `import zehnder_ihc` or import public classes directly:
41
+
42
+ ```python
43
+ from zehnder_ihc import IHCClient
44
+ ```
45
+
46
+ The CLI requires a Bluetooth address and an externally stored identity file.
47
+ Do not commit it or share it with Home Assistant.
48
+
49
+ ```bash
50
+ ihcctl --help
51
+ ihcctl register --help
52
+ ```
53
+
54
+ Registration requires physical IHC confirmation. The help commands do not
55
+ contact hardware. Do not keep the CLI connected while Home Assistant polls the
56
+ same controller.
57
+
58
+ ## Home Assistant
59
+
60
+ The custom integration uses the same `zehnder_ihc` library internally. During
61
+ this preparation phase its `manifest.json` deliberately retains the existing
62
+ local direct-wheel requirement; it has not switched to `ihcctl`.
63
+
64
+ Only after a verified public PyPI release will a separately authorized change
65
+ pin it to `ihcctl==0.2.0`. Do not manually install, uninstall, or remove
66
+ packages in a Home Assistant container.
67
+
68
+ The optional Schedule Manager resource is:
69
+
70
+ ```yaml
71
+ url: /zehnder_ihc/frontend/zehnder-ihc-schedule-card.js
72
+ type: module
73
+ ```
74
+
75
+ ## Development / fallback workflow
76
+
77
+ `tools/start-local-pypi.sh` and local pypiserver remain development/fallback
78
+ tools. They are not the normal workflow for new CLI users or the intended
79
+ production Home Assistant workflow after public PyPI migration. Existing Home
80
+ Assistant deployments still need the current local wheel until the later
81
+ manifest migration succeeds.
82
+
83
+ For repository work, use the existing test extra:
84
+
85
+ ```bash
86
+ python -m venv .venv
87
+ source .venv/bin/activate
88
+ python -m pip install -e ".[test]"
89
+ python -m pytest -q
90
+ ```
91
+
92
+ Tests use sanitized frames and fake BLE backends; they do not contact IHC
93
+ hardware or perform writes.
94
+
95
+ ## Publishing
96
+
97
+ Maintainers must read [the publishing guide](docs/publishing-pypi.md). Local
98
+ readiness never publishes:
99
+
100
+ ```bash
101
+ tools/release-pypi.sh --check
102
+ ```
103
+
104
+ TestPyPI and production PyPI require separate explicit authorization.
105
+
106
+ ## Safety
107
+
108
+ Phase-1 research is frozen. Never commit client identities, `ihc-client*.json`,
109
+ or files under `phase1-private/`. Hardware-changing tests need explicit
110
+ approval and protocol-level readback where possible.
ihcctl-0.2.0/README.md ADDED
@@ -0,0 +1,100 @@
1
+ # ihcctl
2
+
3
+ `ihcctl` is a Python library and CLI for local Zehnder IHC controller control
4
+ over Bluetooth Low Energy. Normal use does not require a cloud service.
5
+
6
+ The distribution is `ihcctl`; the Python import namespace remains
7
+ `zehnder_ihc`; the CLI command is `ihcctl`.
8
+
9
+ ## Install
10
+
11
+ For the CLI, prefer pipx:
12
+
13
+ ```bash
14
+ pipx install ihcctl
15
+ ihcctl --help
16
+ ```
17
+
18
+ Alternatively install into a Python environment:
19
+
20
+ ```bash
21
+ python -m pip install ihcctl
22
+ ```
23
+
24
+ The first public release, `ihcctl` 0.2.0, is prepared but not yet published.
25
+ Until public publication and verification, these are the intended future
26
+ commands rather than a current PyPI installation path.
27
+
28
+ ## Python library and CLI
29
+
30
+ Use `import zehnder_ihc` or import public classes directly:
31
+
32
+ ```python
33
+ from zehnder_ihc import IHCClient
34
+ ```
35
+
36
+ The CLI requires a Bluetooth address and an externally stored identity file.
37
+ Do not commit it or share it with Home Assistant.
38
+
39
+ ```bash
40
+ ihcctl --help
41
+ ihcctl register --help
42
+ ```
43
+
44
+ Registration requires physical IHC confirmation. The help commands do not
45
+ contact hardware. Do not keep the CLI connected while Home Assistant polls the
46
+ same controller.
47
+
48
+ ## Home Assistant
49
+
50
+ The custom integration uses the same `zehnder_ihc` library internally. During
51
+ this preparation phase its `manifest.json` deliberately retains the existing
52
+ local direct-wheel requirement; it has not switched to `ihcctl`.
53
+
54
+ Only after a verified public PyPI release will a separately authorized change
55
+ pin it to `ihcctl==0.2.0`. Do not manually install, uninstall, or remove
56
+ packages in a Home Assistant container.
57
+
58
+ The optional Schedule Manager resource is:
59
+
60
+ ```yaml
61
+ url: /zehnder_ihc/frontend/zehnder-ihc-schedule-card.js
62
+ type: module
63
+ ```
64
+
65
+ ## Development / fallback workflow
66
+
67
+ `tools/start-local-pypi.sh` and local pypiserver remain development/fallback
68
+ tools. They are not the normal workflow for new CLI users or the intended
69
+ production Home Assistant workflow after public PyPI migration. Existing Home
70
+ Assistant deployments still need the current local wheel until the later
71
+ manifest migration succeeds.
72
+
73
+ For repository work, use the existing test extra:
74
+
75
+ ```bash
76
+ python -m venv .venv
77
+ source .venv/bin/activate
78
+ python -m pip install -e ".[test]"
79
+ python -m pytest -q
80
+ ```
81
+
82
+ Tests use sanitized frames and fake BLE backends; they do not contact IHC
83
+ hardware or perform writes.
84
+
85
+ ## Publishing
86
+
87
+ Maintainers must read [the publishing guide](docs/publishing-pypi.md). Local
88
+ readiness never publishes:
89
+
90
+ ```bash
91
+ tools/release-pypi.sh --check
92
+ ```
93
+
94
+ TestPyPI and production PyPI require separate explicit authorization.
95
+
96
+ ## Safety
97
+
98
+ Phase-1 research is frozen. Never commit client identities, `ihc-client*.json`,
99
+ or files under `phase1-private/`. Hardware-changing tests need explicit
100
+ approval and protocol-level readback where possible.
@@ -0,0 +1,23 @@
1
+ [build-system]
2
+ requires = ["setuptools>=68"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "ihcctl"
7
+ version = "0.2.0"
8
+ description = "Python library and CLI for local Zehnder IHC control"
9
+ readme = "README.md"
10
+ requires-python = ">=3.11"
11
+ dependencies = ["bleak>=0.22"]
12
+
13
+ [project.scripts]
14
+ ihcctl = "zehnder_ihc.cli:main"
15
+
16
+ [project.optional-dependencies]
17
+ test = ["pytest>=8"]
18
+
19
+ [tool.pytest.ini_options]
20
+ testpaths = ["tests"]
21
+
22
+ [tool.setuptools.packages.find]
23
+ where = ["src"]
ihcctl-0.2.0/setup.cfg ADDED
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,110 @@
1
+ Metadata-Version: 2.4
2
+ Name: ihcctl
3
+ Version: 0.2.0
4
+ Summary: Python library and CLI for local Zehnder IHC control
5
+ Requires-Python: >=3.11
6
+ Description-Content-Type: text/markdown
7
+ Requires-Dist: bleak>=0.22
8
+ Provides-Extra: test
9
+ Requires-Dist: pytest>=8; extra == "test"
10
+
11
+ # ihcctl
12
+
13
+ `ihcctl` is a Python library and CLI for local Zehnder IHC controller control
14
+ over Bluetooth Low Energy. Normal use does not require a cloud service.
15
+
16
+ The distribution is `ihcctl`; the Python import namespace remains
17
+ `zehnder_ihc`; the CLI command is `ihcctl`.
18
+
19
+ ## Install
20
+
21
+ For the CLI, prefer pipx:
22
+
23
+ ```bash
24
+ pipx install ihcctl
25
+ ihcctl --help
26
+ ```
27
+
28
+ Alternatively install into a Python environment:
29
+
30
+ ```bash
31
+ python -m pip install ihcctl
32
+ ```
33
+
34
+ The first public release, `ihcctl` 0.2.0, is prepared but not yet published.
35
+ Until public publication and verification, these are the intended future
36
+ commands rather than a current PyPI installation path.
37
+
38
+ ## Python library and CLI
39
+
40
+ Use `import zehnder_ihc` or import public classes directly:
41
+
42
+ ```python
43
+ from zehnder_ihc import IHCClient
44
+ ```
45
+
46
+ The CLI requires a Bluetooth address and an externally stored identity file.
47
+ Do not commit it or share it with Home Assistant.
48
+
49
+ ```bash
50
+ ihcctl --help
51
+ ihcctl register --help
52
+ ```
53
+
54
+ Registration requires physical IHC confirmation. The help commands do not
55
+ contact hardware. Do not keep the CLI connected while Home Assistant polls the
56
+ same controller.
57
+
58
+ ## Home Assistant
59
+
60
+ The custom integration uses the same `zehnder_ihc` library internally. During
61
+ this preparation phase its `manifest.json` deliberately retains the existing
62
+ local direct-wheel requirement; it has not switched to `ihcctl`.
63
+
64
+ Only after a verified public PyPI release will a separately authorized change
65
+ pin it to `ihcctl==0.2.0`. Do not manually install, uninstall, or remove
66
+ packages in a Home Assistant container.
67
+
68
+ The optional Schedule Manager resource is:
69
+
70
+ ```yaml
71
+ url: /zehnder_ihc/frontend/zehnder-ihc-schedule-card.js
72
+ type: module
73
+ ```
74
+
75
+ ## Development / fallback workflow
76
+
77
+ `tools/start-local-pypi.sh` and local pypiserver remain development/fallback
78
+ tools. They are not the normal workflow for new CLI users or the intended
79
+ production Home Assistant workflow after public PyPI migration. Existing Home
80
+ Assistant deployments still need the current local wheel until the later
81
+ manifest migration succeeds.
82
+
83
+ For repository work, use the existing test extra:
84
+
85
+ ```bash
86
+ python -m venv .venv
87
+ source .venv/bin/activate
88
+ python -m pip install -e ".[test]"
89
+ python -m pytest -q
90
+ ```
91
+
92
+ Tests use sanitized frames and fake BLE backends; they do not contact IHC
93
+ hardware or perform writes.
94
+
95
+ ## Publishing
96
+
97
+ Maintainers must read [the publishing guide](docs/publishing-pypi.md). Local
98
+ readiness never publishes:
99
+
100
+ ```bash
101
+ tools/release-pypi.sh --check
102
+ ```
103
+
104
+ TestPyPI and production PyPI require separate explicit authorization.
105
+
106
+ ## Safety
107
+
108
+ Phase-1 research is frozen. Never commit client identities, `ihc-client*.json`,
109
+ or files under `phase1-private/`. Hardware-changing tests need explicit
110
+ approval and protocol-level readback where possible.
@@ -0,0 +1,54 @@
1
+ README.md
2
+ pyproject.toml
3
+ src/ihcctl.egg-info/PKG-INFO
4
+ src/ihcctl.egg-info/SOURCES.txt
5
+ src/ihcctl.egg-info/dependency_links.txt
6
+ src/ihcctl.egg-info/entry_points.txt
7
+ src/ihcctl.egg-info/requires.txt
8
+ src/ihcctl.egg-info/top_level.txt
9
+ src/zehnder_ihc/__init__.py
10
+ src/zehnder_ihc/backup.py
11
+ src/zehnder_ihc/bleak_backend.py
12
+ src/zehnder_ihc/cli.py
13
+ src/zehnder_ihc/client.py
14
+ src/zehnder_ihc/errors.py
15
+ src/zehnder_ihc/framing.py
16
+ src/zehnder_ihc/identity.py
17
+ src/zehnder_ihc/models.py
18
+ src/zehnder_ihc/mutations.py
19
+ src/zehnder_ihc/protocol.py
20
+ src/zehnder_ihc/restore.py
21
+ src/zehnder_ihc/transport.py
22
+ tests/test_active_weekplan.py
23
+ tests/test_bleak_backend.py
24
+ tests/test_cli.py
25
+ tests/test_client.py
26
+ tests/test_dayplan_delete.py
27
+ tests/test_framing.py
28
+ tests/test_home_assistant_active_weekplan_select.py
29
+ tests/test_home_assistant_boost.py
30
+ tests/test_home_assistant_frontend_static.py
31
+ tests/test_home_assistant_layout.py
32
+ tests/test_home_assistant_schedule.py
33
+ tests/test_home_assistant_schedule_backup_restore.py
34
+ tests/test_home_assistant_structured_backend.py
35
+ tests/test_home_assistant_values.py
36
+ tests/test_identity.py
37
+ tests/test_modes.py
38
+ tests/test_package.py
39
+ tests/test_protocol.py
40
+ tests/test_quick_heating.py
41
+ tests/test_release_helper.py
42
+ tests/test_restore_executor.py
43
+ tests/test_restore_planner.py
44
+ tests/test_schedule_backup.py
45
+ tests/test_schedule_backup_snapshot.py
46
+ tests/test_schedule_client.py
47
+ tests/test_schedule_lists.py
48
+ tests/test_schedule_models.py
49
+ tests/test_schedule_mutation_contract.py
50
+ tests/test_schedule_protocol.py
51
+ tests/test_status.py
52
+ tests/test_task10a_hardware_tool.py
53
+ tests/test_transport.py
54
+ tests/test_weekplan_delete.py
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ ihcctl = zehnder_ihc.cli:main
@@ -0,0 +1,4 @@
1
+ bleak>=0.22
2
+
3
+ [test]
4
+ pytest>=8
@@ -0,0 +1 @@
1
+ zehnder_ihc
@@ -0,0 +1,66 @@
1
+ """Public Zehnder IHC client API."""
2
+
3
+ from .bleak_backend import BleakBackend
4
+ from .backup import BackupDayplanV1, BackupSourceDeviceV1, BackupWeekplanV1, ScheduleBackupV1
5
+ from .client import IHCClient
6
+ from .errors import (
7
+ ActivePlanDeletionError,
8
+ AmbiguousPlanNameError,
9
+ BackupDeviceMismatchError,
10
+ BackupValidationError,
11
+ IndeterminateRegistrationError,
12
+ PlanNotFoundError,
13
+ PlanReferencedError,
14
+ )
15
+ from .identity import Identity
16
+ from .models import (
17
+ Dayplan,
18
+ DayplanQuickHeating,
19
+ DayplanTransition,
20
+ OperatingMode,
21
+ ScheduleInventory,
22
+ ScheduleState,
23
+ Status,
24
+ Weekday,
25
+ Weekplan,
26
+ )
27
+ from .restore import (
28
+ ScheduleRestoreActionKindV1,
29
+ ScheduleRestoreActionV1,
30
+ ScheduleRestoreExecutionStepV1,
31
+ ScheduleRestoreMappingV1,
32
+ ScheduleRestorePlanV1,
33
+ )
34
+ from .transport import BLETransport
35
+
36
+ __all__ = [
37
+ "BLETransport",
38
+ "BleakBackend",
39
+ "ActivePlanDeletionError",
40
+ "AmbiguousPlanNameError",
41
+ "BackupDayplanV1",
42
+ "BackupDeviceMismatchError",
43
+ "BackupSourceDeviceV1",
44
+ "BackupValidationError",
45
+ "BackupWeekplanV1",
46
+ "Dayplan",
47
+ "DayplanQuickHeating",
48
+ "DayplanTransition",
49
+ "IHCClient",
50
+ "Identity",
51
+ "IndeterminateRegistrationError",
52
+ "OperatingMode",
53
+ "PlanNotFoundError",
54
+ "PlanReferencedError",
55
+ "ScheduleInventory",
56
+ "ScheduleBackupV1",
57
+ "ScheduleRestoreActionKindV1",
58
+ "ScheduleRestoreActionV1",
59
+ "ScheduleRestoreExecutionStepV1",
60
+ "ScheduleRestoreMappingV1",
61
+ "ScheduleRestorePlanV1",
62
+ "ScheduleState",
63
+ "Status",
64
+ "Weekday",
65
+ "Weekplan",
66
+ ]