Package: vaillant-netatmo-api
vaillant-netatmo-apiGeneralPython 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.InstallationLibrary can be simply installed using pip.pipinstallvaillant-netatmo-apiLibrary requires Python 3 and hastenacityandhttpxdependencies.NOTE: httpx is currently a prerelease software. The version outlined in therequirements.txtshould be working properly, but if there are some breaking changes, please check their Github issue tracker for known issues.UsageGetting the token from the OAuth APIAll 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 theAuthClientAPI:async_token: getting a bearer token and storing it in the token storefromvaillant_netatmo_apiimportauth_clientCLIENT_ID=""CLIENT_SECRET=""defhandle_token_update(token):token_string=token.serialize()write_to_storage(token_string)asyncwithauth_client(CLIENT_ID,CLIENT_SECRET,handle_token_update)asclient:awaitclient.async_token(username,password,user_prefix,app_version,)Accessing the Thermostat APIThere are three APIs available for theThermostatClient, all of which require the bearer token for authentication:async_get_thermostats_data: getting all the devices associated with the user accountasync_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 moduleasync_switch_schedule: changing active schedule for a device and modulefromvaillant_netatmo_apiimportthermostat_client,SystemMode,TokenCLIENT_ID=""CLIENT_SECRET=""token_string=read_from_storage()token=Token.deserialize(token_string)defhandle_token_update(token):token_string=token.serialize()write_to_storage(token_string)asyncwiththermostat_client(CLIENT_ID,CLIENT_SECRET,token,handle_token_update)asclient:devices=awaitclient.async_get_thermostats_data()d_id=devices[0].idm_id=devices[0].modules[0].idawaitclient.async_set_system_mode(d_id,m_id,SystemMode.WINTER)Using clients as singletonsEven though library offers context manager for usingAuthClientandThermostatClient, this should only be done during development or in very infrequent usage scenarios.Both of the clients usehttpx.AsyncClientas 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 theAuthClientorThermostatClient, which is not possible by using the context manager API since this API will return new instance of the client every timeauth_clientorthermostat_clientmethod is called.To achieve optimal usage, which will utilize connection pooling and connection reuse, bothAuthClientandThermostatClientshould be used by instantiating the clients and providinghttpx.AsyncClientinstance 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 storeasyncdefasync_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)returnTrue# When unloading the integration of this same account, read the client and close it manuallyasyncdefasync_unload_entry(hass:HomeAssistant,entry:ConfigEntry)->bool:unload_ok=awaithass.config_entries.async_unload_platforms(entry,PLATFORMS)ifunload_ok:hass.data[DOMAIN].pop(entry.entry_id)returnunload_okSimilar hooks which represent some kind of application context should be used when integrating this library into a different application (Flask, Django or similar).AcknowledgementsThis library would not exist if it weren't for previous implementations by the following projects:https://github.com/philippelt/netatmo-api-pythonhttps://github.com/jabesq/netatmo-api-pythonhttps://github.com/samueldumont/netatmo-api-pythonhttps://github.com/jabesq/pyatmohttps://github.com/pjmaenh/pyvaillantThey laid out the foundation by exploring and documenting the APIs.DisclaimersThis 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.