pyhelty
Async Python client for Helty Flow VMC (mechanical ventilation / MVHR) units equipped with the smart Wi-Fi interface, such as the Flow Plus.
It speaks the unit's reverse-engineered TCP protocol (default port 5001) and
exposes a small, fully typed asyncio API. It is the device-communication layer
behind the Home Assistant helty integration; it has no Home Assistant
dependency and can be used standalone.
The protocol has no official specification. Behaviour is reverse-engineered from a real Helty FlowPlus; your mileage may vary on other models.
Install
pip install pyhelty
Usage
import asyncio
from pyhelty import HeltyClient, FanMode
async def main() -> None:
client = HeltyClient("192.168.1.50") # port defaults to 5001
data = await client.async_get_data()
print(data.name, data.fan_mode, data.indoor_temperature, data.indoor_humidity)
await client.async_set_fan_mode(FanMode.NIGHT)
await client.async_set_led(False)
asyncio.run(main())
API
HeltyClient(host, port=5001, *, timeout=10.0)async_get_name() -> str— the user-assigned name (also used as a stable id)async_get_data() -> HeltyData— name, fan mode, LED state, indoor/outdoor temperature, indoor humidity, plusco2,filter_hoursandlight_level(model-dependent — see below), and the rawVMGI/VMGOinteger fieldsasync_set_fan_mode(mode: FanMode)—OFF, LOW, MEDIUM, HIGH, MAX, BOOST, NIGHT, FREE_COOLINGasync_set_led(on: bool)async_reset_filter()async_set_light(level: int)— front-light brightness 0-100 (0 = off)
Model-dependent fields
co2, filter_hours and light_level are only meaningful on models that have
the corresponding hardware. A Helty FlowPlus, for example, reports co2 == 0
(no sensor) and accepts the light command without a physical light. The
consuming application should decide whether to surface them (e.g. only when
co2 > 0).
Errors derive from HeltyError: HeltyConnectionError, HeltyResponseError,
HeltyCommandError.
Protocol notes
| Command | Purpose | Reply |
|---|---|---|
VMNM? |
device name | VMNM <name> |
VMGI? |
sensors (15 fields, tenths) | VMGI,<indoor_t>,<outdoor_t>,<indoor_rh>,... |
VMGH? |
status (15 fields) | VMGO,<fan_mode>,<led>,... |
VMWH000000<n> |
set fan mode n (0-7) |
OK |
VMWH0100010 / VMWH0100000 |
LED on / off | OK |
VMWH0417744 |
reset filter counter | OK |
The unit serves one command per TCP connection and then closes it; the client serialises commands with a lock.
Development
pip install -e ".[test,dev]"
pytest
ruff check .
mypy src
Acknowledgements
The TCP protocol has no official specification; it was reverse-engineered with the help of the prior work of @MatteoManzoni and @DanRobo76. Thanks to both.
License
MIT
Metadata
Release files for pyhelty 0.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pyhelty-0.2.1.tar.gz | 9.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pyhelty-0.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 19.5 kB
Release files / pyhelty-0.2.1.tar.gz
| Download URL | pyhelty-0.2.1.tar.gz |
|---|---|
| Size | 9.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8c5f1ebbb1953ef85875d06a622e25b904c569930cafd29ee4b246897dee42f1
|
|
BLAKE2b-256 checksum How to use checksums |
819682dab36f9f5c6b4ae5f738e1ac9572b1de1ee32782f16322a6637ccc328a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jun 6, 2026.
Transparency logRelease files / pyhelty-0.2.1-py3-none-any.whl
| Download URL | pyhelty-0.2.1-py3-none-any.whl |
|---|---|
| Size | 9.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c60dd3d43348a192f43ee872be4e826c1252dbc06e83e67e040ecb1b43478a80
|
|
BLAKE2b-256 checksum How to use checksums |
07798a2c374543c397700449c8f902adc0c3c03f21bad1539fc1ba3bd3312c75
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jun 6, 2026.
Transparency log