Skip to main content

vaillant-netatmo-api

GitHub version PyPI version Tests

General

Python 3 library for managing Vaillant thermostats using the Netatmo API. It provides one-to-one mapping with Vaillant's Netatmo API and offeres similar functionality as the official Vaillant vSMART/eRELAX app.

NOTE: This library is still in a prerelease status and will be until v1.0.0. There might be breaking changes to the public API in any of the v0.x.y versions.

Installation

Library can be simply installed using pip.

pip install vaillant-netatmo-api

Library requires Python 3 and has tenacity and httpx dependencies.

NOTE: httpx is currently a prerelease software. The version outlined in the requirements.txt should be working properly, but if there are some breaking changes, please check their Github issue tracker for known issues.

Usage

Getting the token from the OAuth API

All Netatmo APIs are protected and require a bearer token to authenticate. To get this token, Netatmo offers an OAuth API.

Since Vaillant uses Resource Owner Password Credentials Grant, there is only one method in the AuthClient API:

  • async_token: getting a bearer token and storing it in the token store
from vaillant_netatmo_api import auth_client

CLIENT_ID = ""
CLIENT_SECRET = ""

def handle_token_update(token):
    token_string = token.serialize()
    write_to_storage(token_string)

async with auth_client(CLIENT_ID, CLIENT_SECRET, handle_token_update) as client:
    await client.async_token(
        username,
        password,
        user_prefix,
        app_version,
    )

Accessing the Thermostat API

There are three APIs available for the ThermostatClient, all of which require the bearer token for authentication:

  • async_get_thermostats_data: getting all the devices associated with the user account
  • async_set_system_mode: changing system mode for a device and module (ie. summer, winter or frostguard)
  • async_set_minor_mode: changing minor mode for a device and module (ie. manual mode, away mode or hot water boost mode)
  • async_sync_schedule: updating schedule data for a device and module
  • async_switch_schedule: changing active schedule for a device and module
from vaillant_netatmo_api import thermostat_client, SystemMode, Token

CLIENT_ID = ""
CLIENT_SECRET = ""

token_string = read_from_storage()
token = Token.deserialize(token_string)

def handle_token_update(token):
    token_string = token.serialize()
    write_to_storage(token_string)

async with thermostat_client(CLIENT_ID, CLIENT_SECRET, token, handle_token_update) as client:
    devices = await client.async_get_thermostats_data()

    d_id = devices[0].id
    m_id = devices[0].modules[0].id

    await client.async_set_system_mode(d_id, m_id, SystemMode.WINTER)

Using clients as singletons

Even though library offers context manager for using AuthClient and ThermostatClient, this should only be done during development or in very infrequent usage scenarios.

Both of the clients use httpx.AsyncClient as the underlying HTTP communication library, which implements connection pooling and connection reuse. This means doing multiple concurent requests should be done by using the same instance of the AuthClient or ThermostatClient, which is not possible by using the context manager API since this API will return new instance of the client every time auth_client or thermostat_client method is called.

To achieve optimal usage, which will utilize connection pooling and connection reuse, both AuthClient and ThermostatClient should be used by instantiating the clients and providing httpx.AsyncClient instance in a constructor. This provided client should be used as singleton, or with some other context management mechanism, with the context wider than one block of code or one inbound request.

Here is an example for usage in Home Assistant.

# When setting up integration with all the devices of one account, instantiate and store the client in a configuration memory store
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
    client = get_async_client(hass)
    token_store = TokenStore(
        entry.data[CONF_CLIENT_ID],
        entry.data[CONF_CLIENT_SECRET],
        token,
        handle_token_update,
    )

    hass.data[DOMAIN][entry.entry_id] = ThermostatClient(client, token_store)
    hass.config_entries.async_setup_platforms(entry, PLATFORMS)

    return True

# When unloading the integration of this same account, read the client and close it manually
async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
    unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
    if unload_ok:
        hass.data[DOMAIN].pop(entry.entry_id)

    return unload_ok

Similar hooks which represent some kind of application context should be used when integrating this library into a different application (Flask, Django or similar).

Acknowledgements

This library would not exist if it weren't for previous implementations by the following projects:

They laid out the foundation by exploring and documenting the APIs.

Disclaimers

This library is not associated with Vaillant or Netatmo in any way. If either Vaillant or Netatmo decide to change anything with the API, or block the usage outside of their first party apps, this library will stop working.

Release files for vaillant-netatmo-api 0.13.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 vaillant-netatmo-api 0.13.1
File Size Uploaded
vaillant_netatmo_api-0.13.1.tar.gz 20.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for vaillant-netatmo-api 0.13.1
File Interpreter ABI Platform
vaillant_netatmo_api-0.13.1-py3-none-any.whl Python 3 none any Details

Total release size: 44.7 kB

Release files / vaillant_netatmo_api-0.13.1.tar.gz

Download URL vaillant_netatmo_api-0.13.1.tar.gz
Size 20.7 kB
Tags Source
SHA-256 checksum
How to use checksums
780615fa43b62102dfdf153157d63bf9fc6ec7602dcd5d707028d9f343235839
BLAKE2b-256 checksum
How to use checksums
b4e92d10f5b6f4e4a2d240d28340b7f7cd6be126b5ba3dd1508a93697f9ea86d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.12.9

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 Aug 1, 2025.

Transparency log

Release files / vaillant_netatmo_api-0.13.1-py3-none-any.whl

Download URL vaillant_netatmo_api-0.13.1-py3-none-any.whl
Size 24.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
5fa891d540f9464709a5490c510e60d50ed72a355839ee217a6aa90a6e4f8d05
BLAKE2b-256 checksum
How to use checksums
aaea6e92b7a8c7984830361805576000e8d726ab17824083fca8470d30ae33be
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.12.9

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 Aug 1, 2025.

Transparency log

Release history Release notifications | RSS feed

This release

0.13.1 This release

2 release files

0.11.0

2 release files

0.9.1

2 release files

0.8.1

2 release files

0.8.0

2 release files

0.7.2

2 release files

0.7.1

2 release files

0.7.0

2 release files

0.6.0

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

0.0.2

2 release files

0.0.1

2 release files

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