quilt-hp-python 0.1.1__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 (111) hide show
  1. quilt_hp_python-0.1.1/.github/workflows/ci.yml +77 -0
  2. quilt_hp_python-0.1.1/.github/workflows/docs-deploy.yml +45 -0
  3. quilt_hp_python-0.1.1/.github/workflows/release.yml +114 -0
  4. quilt_hp_python-0.1.1/.gitignore +50 -0
  5. quilt_hp_python-0.1.1/CHANGELOG.md +21 -0
  6. quilt_hp_python-0.1.1/LICENSE +21 -0
  7. quilt_hp_python-0.1.1/PKG-INFO +172 -0
  8. quilt_hp_python-0.1.1/README.md +107 -0
  9. quilt_hp_python-0.1.1/docs/explanation/architecture.md +113 -0
  10. quilt_hp_python-0.1.1/docs/explanation/authentication.md +109 -0
  11. quilt_hp_python-0.1.1/docs/explanation/grpc-and-protobuf.md +95 -0
  12. quilt_hp_python-0.1.1/docs/explanation/snapshot-and-stream.md +96 -0
  13. quilt_hp_python-0.1.1/docs/explanation/streaming-protocol.md +103 -0
  14. quilt_hp_python-0.1.1/docs/how-to/authenticate.md +191 -0
  15. quilt_hp_python-0.1.1/docs/how-to/automation-daemon.md +234 -0
  16. quilt_hp_python-0.1.1/docs/how-to/cli-scripting.md +181 -0
  17. quilt_hp_python-0.1.1/docs/how-to/configure-comfort-settings.md +96 -0
  18. quilt_hp_python-0.1.1/docs/how-to/configure-schedules.md +117 -0
  19. quilt_hp_python-0.1.1/docs/how-to/contribute.md +131 -0
  20. quilt_hp_python-0.1.1/docs/how-to/control-spaces.md +159 -0
  21. quilt_hp_python-0.1.1/docs/how-to/home-assistant.md +368 -0
  22. quilt_hp_python-0.1.1/docs/how-to/regenerate-protos.md +80 -0
  23. quilt_hp_python-0.1.1/docs/how-to/stream-updates.md +145 -0
  24. quilt_hp_python-0.1.1/docs/how-to/tui-app.md +225 -0
  25. quilt_hp_python-0.1.1/docs/index.md +75 -0
  26. quilt_hp_python-0.1.1/docs/reference/api-reference.md +49 -0
  27. quilt_hp_python-0.1.1/docs/reference/client.md +570 -0
  28. quilt_hp_python-0.1.1/docs/reference/documentation-standards.md +128 -0
  29. quilt_hp_python-0.1.1/docs/reference/grpc-services-matrix.md +98 -0
  30. quilt_hp_python-0.1.1/docs/reference/hds-entities.md +222 -0
  31. quilt_hp_python-0.1.1/docs/reference/models.md +419 -0
  32. quilt_hp_python-0.1.1/docs/reference/token-management.md +247 -0
  33. quilt_hp_python-0.1.1/docs/tutorial/get-started.md +207 -0
  34. quilt_hp_python-0.1.1/mkdocs.yml +68 -0
  35. quilt_hp_python-0.1.1/proto/cleaned/quilt_device_pairing.proto +105 -0
  36. quilt_hp_python-0.1.1/proto/cleaned/quilt_hds.proto +1020 -0
  37. quilt_hp_python-0.1.1/proto/cleaned/quilt_notifier.proto +98 -0
  38. quilt_hp_python-0.1.1/proto/cleaned/quilt_services.proto +347 -0
  39. quilt_hp_python-0.1.1/proto/cleaned/quilt_system.proto +55 -0
  40. quilt_hp_python-0.1.1/pyproject.toml +151 -0
  41. quilt_hp_python-0.1.1/scripts/bump_version.py +118 -0
  42. quilt_hp_python-0.1.1/scripts/check_docs_nav.py +75 -0
  43. quilt_hp_python-0.1.1/scripts/generate_public_api_reference.py +141 -0
  44. quilt_hp_python-0.1.1/scripts/regen_protos.sh +63 -0
  45. quilt_hp_python-0.1.1/src/quilt_hp/__init__.py +22 -0
  46. quilt_hp_python-0.1.1/src/quilt_hp/_paths.py +26 -0
  47. quilt_hp_python-0.1.1/src/quilt_hp/_proto/__init__.py +0 -0
  48. quilt_hp_python-0.1.1/src/quilt_hp/_proto/quilt_device_pairing_pb2.py +56 -0
  49. quilt_hp_python-0.1.1/src/quilt_hp/_proto/quilt_device_pairing_pb2.pyi +317 -0
  50. quilt_hp_python-0.1.1/src/quilt_hp/_proto/quilt_device_pairing_pb2_grpc.py +24 -0
  51. quilt_hp_python-0.1.1/src/quilt_hp/_proto/quilt_hds_pb2.py +292 -0
  52. quilt_hp_python-0.1.1/src/quilt_hp/_proto/quilt_hds_pb2.pyi +3947 -0
  53. quilt_hp_python-0.1.1/src/quilt_hp/_proto/quilt_hds_pb2_grpc.py +1732 -0
  54. quilt_hp_python-0.1.1/src/quilt_hp/_proto/quilt_notifier_pb2.py +55 -0
  55. quilt_hp_python-0.1.1/src/quilt_hp/_proto/quilt_notifier_pb2.pyi +258 -0
  56. quilt_hp_python-0.1.1/src/quilt_hp/_proto/quilt_notifier_pb2_grpc.py +97 -0
  57. quilt_hp_python-0.1.1/src/quilt_hp/_proto/quilt_services_pb2.py +171 -0
  58. quilt_hp_python-0.1.1/src/quilt_hp/_proto/quilt_services_pb2.pyi +1320 -0
  59. quilt_hp_python-0.1.1/src/quilt_hp/_proto/quilt_services_pb2_grpc.py +1188 -0
  60. quilt_hp_python-0.1.1/src/quilt_hp/_proto/quilt_system_pb2.py +53 -0
  61. quilt_hp_python-0.1.1/src/quilt_hp/_proto/quilt_system_pb2.pyi +164 -0
  62. quilt_hp_python-0.1.1/src/quilt_hp/_proto/quilt_system_pb2_grpc.py +270 -0
  63. quilt_hp_python-0.1.1/src/quilt_hp/auth.py +244 -0
  64. quilt_hp_python-0.1.1/src/quilt_hp/cli/__init__.py +1 -0
  65. quilt_hp_python-0.1.1/src/quilt_hp/cli/main.py +770 -0
  66. quilt_hp_python-0.1.1/src/quilt_hp/cli/settings.py +123 -0
  67. quilt_hp_python-0.1.1/src/quilt_hp/cli/store.py +105 -0
  68. quilt_hp_python-0.1.1/src/quilt_hp/cli/tui.py +2677 -0
  69. quilt_hp_python-0.1.1/src/quilt_hp/client.py +616 -0
  70. quilt_hp_python-0.1.1/src/quilt_hp/const.py +57 -0
  71. quilt_hp_python-0.1.1/src/quilt_hp/exceptions.py +23 -0
  72. quilt_hp_python-0.1.1/src/quilt_hp/models/__init__.py +85 -0
  73. quilt_hp_python-0.1.1/src/quilt_hp/models/comfort.py +47 -0
  74. quilt_hp_python-0.1.1/src/quilt_hp/models/controller.py +135 -0
  75. quilt_hp_python-0.1.1/src/quilt_hp/models/energy.py +31 -0
  76. quilt_hp_python-0.1.1/src/quilt_hp/models/enums.py +298 -0
  77. quilt_hp_python-0.1.1/src/quilt_hp/models/indoor_unit.py +412 -0
  78. quilt_hp_python-0.1.1/src/quilt_hp/models/outdoor_unit.py +71 -0
  79. quilt_hp_python-0.1.1/src/quilt_hp/models/qsm.py +105 -0
  80. quilt_hp_python-0.1.1/src/quilt_hp/models/schedule.py +98 -0
  81. quilt_hp_python-0.1.1/src/quilt_hp/models/sensor.py +92 -0
  82. quilt_hp_python-0.1.1/src/quilt_hp/models/software_update.py +74 -0
  83. quilt_hp_python-0.1.1/src/quilt_hp/models/space.py +177 -0
  84. quilt_hp_python-0.1.1/src/quilt_hp/models/system.py +451 -0
  85. quilt_hp_python-0.1.1/src/quilt_hp/py.typed +1 -0
  86. quilt_hp_python-0.1.1/src/quilt_hp/services/__init__.py +1 -0
  87. quilt_hp_python-0.1.1/src/quilt_hp/services/hds.py +480 -0
  88. quilt_hp_python-0.1.1/src/quilt_hp/services/streaming.py +561 -0
  89. quilt_hp_python-0.1.1/src/quilt_hp/services/system.py +95 -0
  90. quilt_hp_python-0.1.1/src/quilt_hp/services/user.py +143 -0
  91. quilt_hp_python-0.1.1/src/quilt_hp/tokens.py +119 -0
  92. quilt_hp_python-0.1.1/src/quilt_hp/transport.py +192 -0
  93. quilt_hp_python-0.1.1/tests/__init__.py +1 -0
  94. quilt_hp_python-0.1.1/tests/conftest.py +3 -0
  95. quilt_hp_python-0.1.1/tests/test_auth.py +188 -0
  96. quilt_hp_python-0.1.1/tests/test_auth_store_settings_edges.py +122 -0
  97. quilt_hp_python-0.1.1/tests/test_cli_feature_completion.py +260 -0
  98. quilt_hp_python-0.1.1/tests/test_cli_login.py +58 -0
  99. quilt_hp_python-0.1.1/tests/test_cli_surfaces_extra.py +197 -0
  100. quilt_hp_python-0.1.1/tests/test_client_cache.py +435 -0
  101. quilt_hp_python-0.1.1/tests/test_client_service_error_paths.py +298 -0
  102. quilt_hp_python-0.1.1/tests/test_hds_schedule_mapping.py +66 -0
  103. quilt_hp_python-0.1.1/tests/test_hds_service_branches.py +162 -0
  104. quilt_hp_python-0.1.1/tests/test_models.py +67 -0
  105. quilt_hp_python-0.1.1/tests/test_models_from_proto.py +974 -0
  106. quilt_hp_python-0.1.1/tests/test_settings_store.py +65 -0
  107. quilt_hp_python-0.1.1/tests/test_streaming.py +304 -0
  108. quilt_hp_python-0.1.1/tests/test_streaming_reconnect_dispatch_extra.py +170 -0
  109. quilt_hp_python-0.1.1/tests/test_tokens.py +105 -0
  110. quilt_hp_python-0.1.1/tests/test_transport.py +64 -0
  111. quilt_hp_python-0.1.1/tests/test_transport_interceptor_extra.py +127 -0
@@ -0,0 +1,77 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ jobs:
10
+ proto-sync:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@v6
14
+ - uses: actions/setup-python@v6
15
+ with:
16
+ python-version: "3.14"
17
+ allow-prereleases: true
18
+ - run: pip install -e ".[dev]"
19
+ - name: Verify generated protobuf stubs are up to date
20
+ run: |
21
+ ./scripts/regen_protos.sh
22
+ git diff --exit-code -- src/quilt_hp/_proto
23
+
24
+ lint:
25
+ needs: proto-sync
26
+ runs-on: ubuntu-latest
27
+ steps:
28
+ - uses: actions/checkout@v6
29
+ - uses: actions/setup-python@v6
30
+ with:
31
+ python-version: "3.14"
32
+ allow-prereleases: true
33
+ - run: pip install -e ".[dev,cli]"
34
+ - run: ruff check src/ tests/
35
+ - run: ruff format --check src/ tests/
36
+ - run: mypy src/quilt_hp/
37
+
38
+ test:
39
+ needs: proto-sync
40
+ runs-on: ubuntu-latest
41
+ strategy:
42
+ matrix:
43
+ python-version: ["3.14"]
44
+ steps:
45
+ - uses: actions/checkout@v6
46
+ - uses: actions/setup-python@v6
47
+ with:
48
+ python-version: ${{ matrix.python-version }}
49
+ allow-prereleases: true
50
+ - run: pip install -e ".[dev,cli]"
51
+ - run: pytest
52
+
53
+ package:
54
+ needs: proto-sync
55
+ runs-on: ubuntu-latest
56
+ steps:
57
+ - uses: actions/checkout@v6
58
+ - uses: actions/setup-python@v6
59
+ with:
60
+ python-version: "3.14"
61
+ allow-prereleases: true
62
+ - run: pip install -e ".[dev]"
63
+ - run: python -m build
64
+ - run: twine check dist/*
65
+
66
+ docs:
67
+ needs: proto-sync
68
+ runs-on: ubuntu-latest
69
+ steps:
70
+ - uses: actions/checkout@v6
71
+ - uses: actions/setup-python@v6
72
+ with:
73
+ python-version: "3.14"
74
+ allow-prereleases: true
75
+ - run: pip install -e ".[docs]"
76
+ - run: python scripts/check_docs_nav.py
77
+ - run: mkdocs build --strict
@@ -0,0 +1,45 @@
1
+ name: Deploy docs to GitHub Pages
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ workflow_dispatch:
7
+
8
+ permissions:
9
+ contents: read
10
+ pages: write
11
+ id-token: write
12
+
13
+ concurrency:
14
+ group: pages
15
+ cancel-in-progress: false
16
+
17
+ jobs:
18
+ build:
19
+ runs-on: ubuntu-latest
20
+ steps:
21
+ - uses: actions/checkout@v6
22
+ - uses: actions/setup-python@v6
23
+ with:
24
+ python-version: "3.14"
25
+ allow-prereleases: true
26
+ - name: Install docs dependencies
27
+ run: pip install -e ".[docs]"
28
+ - name: Validate docs nav
29
+ run: python scripts/check_docs_nav.py
30
+ - name: Build docs
31
+ run: mkdocs build --strict
32
+ - uses: actions/configure-pages@v5
33
+ - uses: actions/upload-pages-artifact@v3
34
+ with:
35
+ path: site/
36
+
37
+ deploy:
38
+ needs: build
39
+ runs-on: ubuntu-latest
40
+ environment:
41
+ name: github-pages
42
+ url: ${{ steps.deployment.outputs.page_url }}
43
+ steps:
44
+ - id: deployment
45
+ uses: actions/deploy-pages@v4
@@ -0,0 +1,114 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*.*.*"
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ concurrency:
12
+ group: release-${{ github.ref }}
13
+ cancel-in-progress: false
14
+
15
+ jobs:
16
+ quality-gates:
17
+ name: Quality gates
18
+ runs-on: ubuntu-latest
19
+ steps:
20
+ - uses: actions/checkout@v6
21
+ - uses: actions/setup-python@v6
22
+ with:
23
+ python-version: "3.14"
24
+ allow-prereleases: true
25
+ - name: Install dependencies
26
+ run: pip install -e ".[dev,cli,docs]"
27
+ - name: Verify generated protobuf stubs are up to date
28
+ run: |
29
+ ./scripts/regen_protos.sh
30
+ git diff --exit-code -- src/quilt_hp/_proto
31
+ - name: Validate tag, package version, and changelog
32
+ env:
33
+ TAG_VERSION: ${{ github.ref_name }}
34
+ run: |
35
+ python - <<'PY'
36
+ import os
37
+ import pathlib
38
+ import re
39
+ import tomllib
40
+
41
+ tag = os.environ["TAG_VERSION"]
42
+ if tag.startswith("v"):
43
+ tag = tag[1:]
44
+
45
+ if not re.fullmatch(r"\d+\.\d+\.\d+", tag):
46
+ raise SystemExit(f"Tag must be SemVer (vX.Y.Z). Got: {os.environ['TAG_VERSION']}")
47
+
48
+ pyproject = tomllib.loads(pathlib.Path("pyproject.toml").read_text(encoding="utf-8"))
49
+ version = pyproject["project"]["version"]
50
+ if version != tag:
51
+ raise SystemExit(
52
+ f"Tag version ({tag}) must match pyproject.toml project.version ({version})"
53
+ )
54
+
55
+ changelog = pathlib.Path("CHANGELOG.md").read_text(encoding="utf-8")
56
+ if "## [Unreleased]" not in changelog:
57
+ raise SystemExit("CHANGELOG.md must keep an [Unreleased] section")
58
+ if f"## [{tag}]" not in changelog:
59
+ raise SystemExit(f"CHANGELOG.md must contain a section for version [{tag}]")
60
+
61
+ print("Tag, package version, and changelog validation passed")
62
+ PY
63
+ - run: ruff check src/ tests/
64
+ - run: ruff format --check src/ tests/
65
+ - run: mypy src/quilt_hp/
66
+ - run: pytest
67
+ - run: python -m build
68
+ - run: twine check dist/*
69
+ - run: python scripts/check_docs_nav.py
70
+ - run: mkdocs build --strict
71
+ - uses: actions/upload-artifact@v4
72
+ with:
73
+ name: dist
74
+ path: dist/
75
+ if-no-files-found: error
76
+
77
+ github-release:
78
+ name: Create GitHub release
79
+ needs: quality-gates
80
+ runs-on: ubuntu-latest
81
+ permissions:
82
+ contents: write
83
+ steps:
84
+ - uses: actions/checkout@v6
85
+ - id: semver
86
+ run: echo "version=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT"
87
+ - id: changelog
88
+ uses: mindsers/changelog-reader-action@v2
89
+ with:
90
+ version: ${{ steps.semver.outputs.version }}
91
+ path: ./CHANGELOG.md
92
+ - uses: softprops/action-gh-release@v2
93
+ with:
94
+ body: ${{ steps.changelog.outputs.changes }}
95
+
96
+ publish-pypi:
97
+ name: Publish to PyPI
98
+ needs:
99
+ - quality-gates
100
+ - github-release
101
+ runs-on: ubuntu-latest
102
+ permissions:
103
+ actions: read
104
+ id-token: write
105
+ environment:
106
+ name: pypi
107
+ steps:
108
+ - uses: actions/download-artifact@v4
109
+ with:
110
+ name: dist
111
+ path: dist/
112
+ - uses: pypa/gh-action-pypi-publish@release/v1
113
+ with:
114
+ packages-dir: dist/
@@ -0,0 +1,50 @@
1
+ # Virtual environments
2
+ .venv/
3
+ venv/
4
+
5
+ # Python bytecode
6
+ __pycache__/
7
+ *.pyc
8
+ *.pyo
9
+
10
+ # Build artifacts
11
+ dist/
12
+ build/
13
+ *.egg-info/
14
+ src/*.egg-info/
15
+
16
+ # Tool caches
17
+ .ruff_cache/
18
+ .pytest_cache/
19
+ .mypy_cache/
20
+ htmlcov/
21
+ .coverage
22
+
23
+ # IDE
24
+ .idea/
25
+ .vscode/
26
+ *.swp
27
+ *.swo
28
+
29
+ # OS
30
+ .DS_Store
31
+ Thumbs.db
32
+
33
+ # MkDocs build output
34
+ site/
35
+
36
+ # Keep source protos in-repo for standalone regeneration
37
+ !proto/
38
+ !proto/cleaned/
39
+ !proto/cleaned/*.proto
40
+
41
+ # Local API reference files — not for version control
42
+ /reference
43
+ tokens.json
44
+ *.pem
45
+ *.key
46
+ *.crt
47
+ *.p12
48
+ .env
49
+ .env.*
50
+
@@ -0,0 +1,21 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ## [0.1.1] - 2026-05-08
11
+
12
+ ## [0.1.0]
13
+
14
+ ### Added
15
+ - GitHub Actions release automation for SemVer tags (`vX.Y.Z`) that enforces quality gates, creates a GitHub Release, and publishes distribution artifacts to PyPI via trusted publishing
16
+ - Initial async client for Quilt cloud gRPC API
17
+ - Cognito OTP authentication with token caching
18
+ - HomeDatastoreService: spaces, indoor units, comfort settings, schedules
19
+ - SystemInformationService: system listing, energy metrics
20
+ - NotifierService: real-time streaming subscriptions
21
+ - CLI for interactive use (`quilt` command)
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,172 @@
1
+ Metadata-Version: 2.4
2
+ Name: quilt-hp-python
3
+ Version: 0.1.1
4
+ Summary: Async Python client for Quilt mini-split HVAC systems
5
+ Project-URL: Repository, https://github.com/eman/quilt-hp-python
6
+ Project-URL: Issues, https://github.com/eman/quilt-hp-python/issues
7
+ Project-URL: Changelog, https://github.com/eman/quilt-hp-python/blob/main/CHANGELOG.md
8
+ Author: Emmanuel
9
+ License: MIT License
10
+
11
+ Copyright (c) 2026
12
+
13
+ Permission is hereby granted, free of charge, to any person obtaining a copy
14
+ of this software and associated documentation files (the "Software"), to deal
15
+ in the Software without restriction, including without limitation the rights
16
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
17
+ copies of the Software, and to permit persons to whom the Software is
18
+ furnished to do so, subject to the following conditions:
19
+
20
+ The above copyright notice and this permission notice shall be included in all
21
+ copies or substantial portions of the Software.
22
+
23
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
28
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
29
+ SOFTWARE.
30
+ License-File: LICENSE
31
+ Keywords: grpc,home-automation,hvac,mini-split,quilt
32
+ Classifier: Development Status :: 3 - Alpha
33
+ Classifier: Framework :: AsyncIO
34
+ Classifier: Intended Audience :: Developers
35
+ Classifier: License :: OSI Approved :: MIT License
36
+ Classifier: Programming Language :: Python :: 3
37
+ Classifier: Programming Language :: Python :: 3.14
38
+ Classifier: Topic :: Home Automation
39
+ Classifier: Typing :: Typed
40
+ Requires-Python: >=3.14
41
+ Requires-Dist: boto3>=1.35
42
+ Requires-Dist: grpcio>=1.70
43
+ Requires-Dist: platformdirs>=4.0
44
+ Requires-Dist: protobuf>=5.0
45
+ Provides-Extra: cli
46
+ Requires-Dist: rich>=13.0; extra == 'cli'
47
+ Requires-Dist: textual>=0.80; extra == 'cli'
48
+ Requires-Dist: typer>=0.12; extra == 'cli'
49
+ Provides-Extra: dev
50
+ Requires-Dist: boto3-stubs[cognito-idp]; extra == 'dev'
51
+ Requires-Dist: build>=1.2; extra == 'dev'
52
+ Requires-Dist: grpcio-tools>=1.70; extra == 'dev'
53
+ Requires-Dist: mypy-protobuf>=3.6; extra == 'dev'
54
+ Requires-Dist: mypy>=1.15; extra == 'dev'
55
+ Requires-Dist: pytest-asyncio>=1.0; extra == 'dev'
56
+ Requires-Dist: pytest-cov>=6.0; extra == 'dev'
57
+ Requires-Dist: pytest>=8.0; extra == 'dev'
58
+ Requires-Dist: ruff>=0.11; extra == 'dev'
59
+ Requires-Dist: twine>=6.0; extra == 'dev'
60
+ Provides-Extra: docs
61
+ Requires-Dist: mkdocs-material>=9.5; extra == 'docs'
62
+ Requires-Dist: mkdocs>=1.6; extra == 'docs'
63
+ Requires-Dist: mkdocstrings[python]>=0.29; extra == 'docs'
64
+ Description-Content-Type: text/markdown
65
+
66
+ # quilt-hp-python
67
+
68
+ Async Python client library for [Quilt](https://www.quilt.com/) mini-split HVAC systems.
69
+
70
+ Communicates with the Quilt cloud API via gRPC to control spaces (rooms), indoor units,
71
+ comfort presets, schedules, and stream real-time updates.
72
+
73
+ ## Installation
74
+
75
+ ```bash
76
+ pip install quilt-hp-python
77
+ ```
78
+
79
+ With the optional CLI:
80
+
81
+ ```bash
82
+ pip install "quilt-hp-python[cli]"
83
+ ```
84
+
85
+ ## Quick Start
86
+
87
+ ```python
88
+ import asyncio
89
+ from quilt_hp import QuiltClient
90
+
91
+ async def main():
92
+ async with QuiltClient("user@example.com") as client:
93
+ await client.login(otp_callback=lambda email: input(f"OTP for {email}: "))
94
+
95
+ # List spaces
96
+ for space in await client.list_spaces():
97
+ print(f"{space.name}: {space.state.ambient_temperature_c}°C")
98
+
99
+ # Set a room to COOL at 22°C
100
+ from quilt_hp.models.enums import HVACMode
101
+ spaces = await client.list_spaces()
102
+ await client.set_space(spaces[0].id, mode=HVACMode.COOL, cool_setpoint_c=22.0)
103
+
104
+ # Stream real-time updates
105
+ spaces = await client.list_spaces()
106
+ topics = [f"hds/space/{s.id}" for s in spaces]
107
+ async with client.stream(topics) as stream:
108
+ stream.on_space_update(lambda s: print(f"{s.name}: {s.state.ambient_temperature_c}°C"))
109
+ await asyncio.sleep(60)
110
+
111
+ asyncio.run(main())
112
+ ```
113
+
114
+ ## CLI
115
+
116
+ ```bash
117
+ # Authenticate (caches tokens for subsequent commands)
118
+ quilt login --email user@example.com
119
+
120
+ # Full system inventory + telemetry (summary)
121
+ quilt info
122
+
123
+ # Full system snapshot as JSON for automation
124
+ quilt info --output json
125
+
126
+ # All device/entity IDs (includes update entities)
127
+ quilt devices
128
+
129
+ # Current sensor values + setpoints
130
+ quilt values
131
+
132
+ # Machine-readable values for scripting
133
+ quilt values --output json
134
+
135
+ # Energy usage
136
+ quilt energy --period week
137
+
138
+ # Set a room to cooling mode
139
+ quilt set "Living Room" --mode cool --cool 22
140
+ ```
141
+
142
+ ## Development
143
+
144
+ ```bash
145
+ git clone https://github.com/eman/quilt-hp-python.git
146
+ cd quilt-hp-python
147
+ python -m venv .venv
148
+ source .venv/bin/activate
149
+ pip install -e ".[dev,cli]"
150
+
151
+ # Run checks
152
+ ruff check src/ tests/
153
+ ruff format --check src/ tests/
154
+ mypy src/quilt_hp/
155
+ pytest
156
+ python -m build
157
+ twine check dist/*
158
+
159
+ # Recompile protobuf stubs (requires grpcio-tools)
160
+ # Proto sources are vendored in ./proto/cleaned for standalone use.
161
+ # Optional but recommended: install protobuf includes (e.g. `brew install protobuf`)
162
+ ./scripts/regen_protos.sh
163
+
164
+ # Build project docs (MkDocs Material)
165
+ pip install -e ".[docs]"
166
+ python scripts/check_docs_nav.py
167
+ mkdocs build --strict
168
+ ```
169
+
170
+ ## License
171
+
172
+ MIT
@@ -0,0 +1,107 @@
1
+ # quilt-hp-python
2
+
3
+ Async Python client library for [Quilt](https://www.quilt.com/) mini-split HVAC systems.
4
+
5
+ Communicates with the Quilt cloud API via gRPC to control spaces (rooms), indoor units,
6
+ comfort presets, schedules, and stream real-time updates.
7
+
8
+ ## Installation
9
+
10
+ ```bash
11
+ pip install quilt-hp-python
12
+ ```
13
+
14
+ With the optional CLI:
15
+
16
+ ```bash
17
+ pip install "quilt-hp-python[cli]"
18
+ ```
19
+
20
+ ## Quick Start
21
+
22
+ ```python
23
+ import asyncio
24
+ from quilt_hp import QuiltClient
25
+
26
+ async def main():
27
+ async with QuiltClient("user@example.com") as client:
28
+ await client.login(otp_callback=lambda email: input(f"OTP for {email}: "))
29
+
30
+ # List spaces
31
+ for space in await client.list_spaces():
32
+ print(f"{space.name}: {space.state.ambient_temperature_c}°C")
33
+
34
+ # Set a room to COOL at 22°C
35
+ from quilt_hp.models.enums import HVACMode
36
+ spaces = await client.list_spaces()
37
+ await client.set_space(spaces[0].id, mode=HVACMode.COOL, cool_setpoint_c=22.0)
38
+
39
+ # Stream real-time updates
40
+ spaces = await client.list_spaces()
41
+ topics = [f"hds/space/{s.id}" for s in spaces]
42
+ async with client.stream(topics) as stream:
43
+ stream.on_space_update(lambda s: print(f"{s.name}: {s.state.ambient_temperature_c}°C"))
44
+ await asyncio.sleep(60)
45
+
46
+ asyncio.run(main())
47
+ ```
48
+
49
+ ## CLI
50
+
51
+ ```bash
52
+ # Authenticate (caches tokens for subsequent commands)
53
+ quilt login --email user@example.com
54
+
55
+ # Full system inventory + telemetry (summary)
56
+ quilt info
57
+
58
+ # Full system snapshot as JSON for automation
59
+ quilt info --output json
60
+
61
+ # All device/entity IDs (includes update entities)
62
+ quilt devices
63
+
64
+ # Current sensor values + setpoints
65
+ quilt values
66
+
67
+ # Machine-readable values for scripting
68
+ quilt values --output json
69
+
70
+ # Energy usage
71
+ quilt energy --period week
72
+
73
+ # Set a room to cooling mode
74
+ quilt set "Living Room" --mode cool --cool 22
75
+ ```
76
+
77
+ ## Development
78
+
79
+ ```bash
80
+ git clone https://github.com/eman/quilt-hp-python.git
81
+ cd quilt-hp-python
82
+ python -m venv .venv
83
+ source .venv/bin/activate
84
+ pip install -e ".[dev,cli]"
85
+
86
+ # Run checks
87
+ ruff check src/ tests/
88
+ ruff format --check src/ tests/
89
+ mypy src/quilt_hp/
90
+ pytest
91
+ python -m build
92
+ twine check dist/*
93
+
94
+ # Recompile protobuf stubs (requires grpcio-tools)
95
+ # Proto sources are vendored in ./proto/cleaned for standalone use.
96
+ # Optional but recommended: install protobuf includes (e.g. `brew install protobuf`)
97
+ ./scripts/regen_protos.sh
98
+
99
+ # Build project docs (MkDocs Material)
100
+ pip install -e ".[docs]"
101
+ python scripts/check_docs_nav.py
102
+ mkdocs build --strict
103
+ ```
104
+
105
+ ## License
106
+
107
+ MIT