Skip to main content

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().

MQTT client ID

AWS IoT treats two live connections sharing a client ID as one session and evicts one for the other, so every connection is identified by the account's Cognito identity plus a suffix identifying you. It defaults to -py; pass your own if anything else may talk to the same account - the vendor phone app already does:

client = ZephyrClient.from_credentials(
    username, password, session, client_id_suffix="-ha",
)

The same keyword works on CredentialsAuth, and on AbstractAuth for a custom subclass. It must be a non-empty string, and short: AWS IoT caps the whole client ID at 128 characters, and the library appends -<thingName> per hood on top of identity plus suffix.

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 and write paths both verified against a Zephyr AK7400AS. power, light, fan, setdelaytimer (seconds) and setcleanairfunction have established semantics; resetgreasefilter ships untested by design.

Filter counters are in minutes, run-time counters in hours - see PROTOCOL.md §5 before deriving anything from them.

Still unestablished: the act mode strings and the delay-timer ceiling. See PROTOCOL.md §7.

Documentation

Guides, the API reference, and the protocol notes are published at https://pyzephyrconnect.readthedocs.io/.

pip install -e ".[docs]"
sphinx-build -W --keep-going -b html docs docs/_build/html

License

GPL-3.0-or-later

Metadata

Release files for pyzephyrconnect 0.2.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pyzephyrconnect 0.2.1
File Size Uploaded Provenance
pyzephyrconnect-0.2.1.tar.gz 206.1 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for pyzephyrconnect 0.2.1
File Interpreter ABI Platform
pyzephyrconnect-0.2.1-py3-none-any.whl Python 3 none any Details

Total release size: 304.5 kB

Release files / pyzephyrconnect-0.2.1.tar.gz

Download URL pyzephyrconnect-0.2.1.tar.gz
Size 206.1 kB
Tags Source
SHA-256 checksum
How to use checksums
badc51d997d10c7f6f573478a59ecbf0aaeebe68b866eb0adda612e3a9db0fd0
BLAKE2b-256 checksum
How to use checksums
a8a35b990c16c74928980fa0b4d1c497027ac1a53eac9dd9d3e8c7f8b6d74a94
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.

Transparency log

Release files / pyzephyrconnect-0.2.1-py3-none-any.whl

Download URL pyzephyrconnect-0.2.1-py3-none-any.whl
Size 98.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
69918b2c34ec96c1b69571f22b30690739993ed8985b132b5ce224e24b31ef4d
BLAKE2b-256 checksum
How to use checksums
40911a62b008e6cc5f1465afd17f014dadc01a0afdbbfcca5fd50e923c8f1ce8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.

Transparency log

Security for pyzephyrconnect 0.2.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for pyzephyrconnect-0.2.1.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page