pyzephyrconnect
Python client for Zephyr / Gemtek range hoods.
These hoods expose no local API. All communication is a cloud round-trip through AWS IoT Core device shadows. See PROTOCOL.md for how the protocol was reverse-engineered.
Install
pip install pyzephyrconnect
Read state
import aiohttp
from pyzephyrconnect import ZephyrClient
async with aiohttp.ClientSession() as session:
client = ZephyrClient.from_credentials("you@example.com", "password", session)
try:
for hood in await client.async_setup():
print(hood.capabilities.model, hood.capabilities.max_fan_speed)
await hood.async_start()
print(hood.state)
finally:
await client.async_stop()
Persisting tokens
The library never persists credentials - storage is yours. Supply tokens from a previous session and a callback to save new ones, and a restart skips the SRP login entirely:
from pyzephyrconnect import ZephyrClient, ZephyrTokens, ZephyrDataError
try:
tokens = ZephyrTokens.from_dict(saved) if saved else None
except ZephyrDataError:
# from_dict validates rather than coercing, so a corrupted or partial
# record raises here instead of failing much later as a SECRET_HASH
# Cognito rejects. Discard it - a full SRP login rebuilds it.
tokens = None
client = ZephyrClient.from_credentials(
username, password, session,
tokens=tokens,
token_updater=lambda t: save(t.as_dict()),
)
To keep the password out of the library completely, subclass AbstractAuth
and implement async_get_tokens().
Probe CLI
The write path actuates a physical fan and light. The CLI writes one field
at a time, refuses anything outside an allowlist, and requires --confirm:
export ZEPHYR_USER=you@example.com
python -m pyzephyrconnect --watch
python -m pyzephyrconnect --set light=1 --confirm
Destructive writes need --force as well. resetgreasefilter zeroes a usage
counter that cannot be reconstructed.
Status
Read path verified against a Zephyr AK7400AS. Write path is under
validation; field semantics for act and the units of the use*time
counters are not yet established.
License
GPL-3.0-or-later
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pyzephyrconnect-0.1.0.tar.gz.
File metadata
- Download URL: pyzephyrconnect-0.1.0.tar.gz
- Upload date:
- Size: 188.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5380bee65a59ab8108560208f92d00f35da4b0d9808d99404c751dbf15ff5e0e
|
|
| MD5 |
e8eb2f624c7d220616ccaabcdd708e21
|
|
| BLAKE2b-256 |
66f20e265e3d3fda16b6a2f0c45a4ae88b046db0b06bbd98fddb1ce6971259b3
|
Provenance
The following attestation bundles were made for pyzephyrconnect-0.1.0.tar.gz:
Publisher:
release.yml on RyanMorash/pyzephyrconnect
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pyzephyrconnect-0.1.0.tar.gz -
Subject digest:
5380bee65a59ab8108560208f92d00f35da4b0d9808d99404c751dbf15ff5e0e - Sigstore transparency entry: 2587301909
- Sigstore integration time:
-
Permalink:
RyanMorash/pyzephyrconnect@2c4717557e732a55650b0bab2f3e47651ee338dd -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/RyanMorash
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@2c4717557e732a55650b0bab2f3e47651ee338dd -
Trigger Event:
release
-
Statement type:
File details
Details for the file pyzephyrconnect-0.1.0-py3-none-any.whl.
File metadata
- Download URL: pyzephyrconnect-0.1.0-py3-none-any.whl
- Upload date:
- Size: 75.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
805aef22f8549f4942b0180e8143fa4c744fea6c786229553ebf91180dd00f19
|
|
| MD5 |
ceb44b611200c27164bca56e5de52cac
|
|
| BLAKE2b-256 |
2ea1482a65cae1dd84f0a7bc88a0a077c84ccc2c59a6370d6797f9fb9ec66587
|
Provenance
The following attestation bundles were made for pyzephyrconnect-0.1.0-py3-none-any.whl:
Publisher:
release.yml on RyanMorash/pyzephyrconnect
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pyzephyrconnect-0.1.0-py3-none-any.whl -
Subject digest:
805aef22f8549f4942b0180e8143fa4c744fea6c786229553ebf91180dd00f19 - Sigstore transparency entry: 2587302320
- Sigstore integration time:
-
Permalink:
RyanMorash/pyzephyrconnect@2c4717557e732a55650b0bab2f3e47651ee338dd -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/RyanMorash
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@2c4717557e732a55650b0bab2f3e47651ee338dd -
Trigger Event:
release
-
Statement type: