chemelex-nuheat
chemelex-nuheat is a community-maintained, typed asynchronous Python client
for the North American Chemelex/NuHeat API v2. It is not an official Chemelex
product and is not affiliated with or endorsed by Chemelex.
The client targets https://api.nam.mynuheat.com/api/v2. Chemelex has stated
that API v2 supports both NuHeat Signature and NuHeat Conductor thermostats.
The read model and documented Auto, Hold, and Manual writes have been validated
against live Conductor responses. Signature and production Home Assistant Cloud
Account Linking validation are still pending.
Maintenance status
This package is being published by kilo-WATT on an interim basis to help
restore the Home Assistant NuHeat integration. The current publisher does not
intend to be the long-term owner or maintainer. An established maintainer or
organization willing to take responsibility for the repository and PyPI
releases is actively sought.
Installation
python -m pip install chemelex-nuheat
Python 3.13 or newer is required.
Usage
The caller owns OAuth. Pass an existing aiohttp.ClientSession and an async
token provider. The provider receives force_refresh=True after one HTTP 401
response and must return a valid access token. The library does not bundle an
OAuth Client ID or Client Secret.
import aiohttp
from chemelex_nuheat import NuHeatClient, ScheduleMode
async def access_token(force_refresh: bool) -> str:
"""Return a token, refreshing it when force_refresh is true."""
...
async with aiohttp.ClientSession() as session:
client = NuHeatClient(session, access_token)
account = await client.get_account()
thermostats = await client.list_thermostats()
thermostat = await client.get_thermostat(thermostats[0].serial_number)
await client.set_target_temperature(
thermostat.serial_number,
22.5,
mode=ScheduleMode.MANUAL,
)
await client.set_standby(thermostat.serial_number)
Supported operations
- Retrieve account information.
- List thermostats and retrieve one thermostat by serial number.
- Read current temperature, target temperature, online state, heating state, room name, raw numeric mode, raw setpoint, hold end, and derived state.
- Set target temperatures using Hold or Manual mode.
- Send the documented Auto, Hold, or Manual commands.
- Command the official app's Standby state.
Nonzero temperatures exposed by the public API are Celsius float values. The
NuHeat API's centi-Celsius integers are encoded and decoded at the HTTP
boundary. A zero or missing read value is exposed as None; live responses use
zero as an unavailable setpoint sentinel. Account Fahrenheit preference does
not change this wire decoding. Outbound values use decimal half-up rounding;
for example, 45°F converted by a caller to approximately 7.2222°C is sent as
the integer 722.
Thermostat.state conservatively derives scheduled operation, timed hold,
Standby, ambiguous Manual-or-permanent-hold, or unknown from the numeric mode,
raw setpoint, and hold end together. Controlled live validation after the
vendor's September 2026 GET fix established mode 1 as Auto, mode 2 as Hold,
and mode 3 as the Manual-family response. Mode 3 with a 5°C target is the
official app's Standby state. Other mode-3 targets remain ambiguous between
physical Manual and an indefinite hold in v2. The client preserves all raw
fields so callers can handle future vendor clarifications without losing
information.
Live write validation established these command semantics:
- Auto resumes the schedule and exits a hold, physical Manual mode, or Standby. A GET response can remain identical before and after exiting Standby.
- Standby uses the documented Manual command at 5°C/41°F. The official app labels this state Standby while the physical thermostat reports Manual at 41°F. It is a frost-protected standby state, not a hard power disconnect.
- Hold with an explicit timezone-aware end creates a timed hold. The client serializes the end in UTC and preserves seconds; the service may normalize returned seconds to the minute.
- Hold without an end means hold until the next scheduled event. It does not
create an indefinite hold.
ScheduleMode.HOLDremains a compatibility alias forScheduleMode.HOLD_UNTIL_NEXT_SCHEDULE. - Manual selects the physical thermostat's Manual operating mode. Non-Standby mode-3 targets still overlap an Auto operating mode with indefinite hold in the v2 read model, so that state remains deliberately ambiguous.
Standby is both writable and readable: mode 3 with raw target 500 represents
5°C/41°F Standby. Auto at the same 41°F target remains distinguishable because
it reports mode 1.
The documented request for creating an indefinite hold is still unknown.
Successful mode writes return an empty HTTP 204; the client does not decode
that body and follows it with a GET.
The temperatureType enum meanings remain unverified, so the client omits the
field and rejects attempts to set it.
NuHeatAuthError indicates rejected authorization. NuHeatApiError indicates
a transport, rate-limit, or server failure that may be retryable.
NuHeatDataError indicates invalid caller input or an unexpected API response.
Exceptions never include access tokens or response bodies.
Development
python -m pip install -e ".[dev]"
python -m pytest
ruff check .
ruff format --check .
mypy
python -m build
twine check dist/*
Report Home Assistant integration problems in
home-assistant/core, not in
this library's issue tracker. Library transport, model, and API parsing issues
belong here.
License
Apache License 2.0.
Metadata
Release files for chemelex-nuheat 0.1.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 | Provenance | |
|---|---|---|---|---|
| chemelex_nuheat-0.1.1.tar.gz | 17.2 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| chemelex_nuheat-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 30.6 kB
Release files / chemelex_nuheat-0.1.1.tar.gz
| Download URL | chemelex_nuheat-0.1.1.tar.gz |
|---|---|
| Size | 17.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d9c6ee33817309430ba4343b62ddc8777ba877c50c8e57c5a127c1d6129e03ba
|
|
BLAKE2b-256 checksum How to use checksums |
89533ce609d88b1cd5be2d6df6676f334882a25588083046e82574a02519c7b7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Sep 22, 2026.
Transparency logRelease files / chemelex_nuheat-0.1.1-py3-none-any.whl
| Download URL | chemelex_nuheat-0.1.1-py3-none-any.whl |
|---|---|
| Size | 13.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6fc4b5b8b6dd7ec09f5880998075f47340400a5ed1726c4999dda5a9e2187da8
|
|
BLAKE2b-256 checksum How to use checksums |
96107170c93c1ae3656c4f292590868dea843326dc70907bf06ad477f723fc20
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Sep 22, 2026.
Transparency logSecurity for chemelex-nuheat 0.1.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.
Attestation for chemelex_nuheat-0.1.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 Sep 22, 2026.
Transparency logA 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.