Python 3 Bibliothek zur Verwaltung von Vaillant -Thermostaten mithilfe der Netatmo -API. Es bietet eins-zu-Eins-Zuordnungen mit Vaillants Netatmo-API und bietet ähnliche Funktionen wie die offizielle Vaillant vsmart/ERELAX-App.
HINWEIS: Diese Bibliothek befindet sich noch in einem Vorverstandsstatus und ist bis v1.0.0. In einer der V0.xy -Versionen kann die öffentliche API von Veränderungen gebrochen werden.
Die Bibliothek kann einfach mit PIP installiert werden.
pip install vaillant-netatmo-apiDie Bibliothek benötigt Python 3 und hat Hartnäckigkeit und HTTPX -Abhängigkeiten.
HINWEIS: HTTPX ist derzeit eine Vorbereitungssoftware. Die in den
requirements.txtbeschriebene Version. Txt sollte ordnungsgemäß funktionieren. Wenn jedoch einige Bruchänderungen vorliegen, überprüfen Sie bitte den GitHub -Problem -Tracker auf bekannte Themen.
Alle Netatmo -APIs sind geschützt und erfordern ein Trägertoken, um sich zu authentifizieren. Um dieses Token zu bekommen, bietet Netatmo eine OAuth -API an.
Da Vaillant Ressourcenbesitzerkennwort -Anmeldeinformationen Grant verwendet, gibt es in der AuthClient -API nur eine Methode:
async_token : Einen Bearer -Token bekommen und im Token -Laden speichern 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 ,
) Für den ThermostatClient stehen drei APIs zur Verfügung, von denen alle der Trägertoken zur Authentifizierung erfordern:
async_get_thermostats_data : Alle Geräte, die dem Benutzerkonto zugeordnet sindasync_set_system_mode : Ändern des Systemmodus für ein Gerät und ein Modul (dh Sommer, Winter oder Frostgut)async_set_minor_mode : Ändern des geringfügigen Modus für ein Gerät und ein Modul (dh manueller Modus, Auswärtsmodus oder Hot Water Boost -Modus)async_sync_schedule : Aktualisieren von Zeitplandaten für ein Gerät und ein Modulasync_switch_schedule : Ändern des aktiven Zeitplans für ein Gerät und ein Modul 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 ) Obwohl die Bibliothek einen Kontextmanager für die Verwendung AuthClient und ThermostatClient bietet, sollte dies nur während der Entwicklung oder in sehr seltenen Nutzungsszenarien erfolgen.
Beide Clients verwenden httpx.AsyncClient als die zugrunde liegende HTTP -Kommunikationsbibliothek, die die Wiederverwendung von Verbindungspooling und Verbindungen implementiert. Dies bedeutet, dass mehrere übereinstimmende Anfragen durchgeführt werden sollten, indem die gleiche Instanz des AuthClient oder ThermostatClient verwendet wird, was nicht durch die Verwendung der CONTEXT Manager -API möglich ist, da diese API jedes Mal, wenn auth_client oder thermostat_client -Methode aufgerufen wird, eine neue Instanz des Clients zurückgibt.
Um eine optimale Verwendung zu erzielen, die die Wiederverwendung von Verbindungspooling und Verbindungen verwendet, sollten sowohl AuthClient als auch ThermostatClient verwendet werden, indem die Clients instanziiert und httpx.AsyncClient -Instanz in einem Konstruktor bereitgestellt werden. Dieser Client sollte als Singleton oder mit einem anderen Kontextverwaltungsmechanismus verwendet werden, wobei der Kontext breiter als ein Codeblock oder eine eingehende Anforderung ist.
Hier ist ein Beispiel für die Verwendung 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Ähnliche Haken, die eine Art Anwendungskontext darstellen, sollten verwendet werden, wenn diese Bibliothek in eine andere Anwendung integriert wird (Flask, Django oder ähnliches).
Diese Bibliothek würde nicht existieren, wenn sie nicht frühere Implementierungen der folgenden Projekte gäbe:
Sie legten die Stiftung durch, indem sie die APIs erkundeten und dokumentierten.
Diese Bibliothek ist in keiner Weise mit Vaillant oder Netatmo verbunden. Wenn entweder Vaillant oder Netatmo beschließen, etwas mit der API zu ändern oder die Verwendung außerhalb ihrer ersten Parteien -Apps zu blockieren, wird diese Bibliothek nicht mehr arbeiten.