Skip to main content

Comwatt Python Client

Overview

The Comwatt Python Client is a Python library that provides a convenient way to interact with the Comwatt API. It allows you to authenticate users, retrieve authenticated user information, and access site and device data.

Please note that the Comwatt client is exclusively for gen4 devices: it use energy.comwatt.com/api. Versions below gen4 will not be compatible. If you're looking for the go.comwatt.com/api go to python-comwatt-client-legacy.

Features

The client currently supports the following methods:

  • authenticate(self, username, password): Authenticates a user with the provided username and password. The client re-authenticates automatically on session expiry (HTTP 401) and retries the request once; pass ComwattClient(auto_reauth=False) to disable this.
  • is_authenticated(self): Returns whether the current session is still valid (probes the API; True/False, re-raises unexpected errors).
  • logout(self): Logs the current session out server-side (POST /v1/logout) and clears the stored credentials so auto_reauth cannot silently restore the session. Idempotent (a 401 when already logged out is a no-op). Note this is distinct from close(), which only releases the local HTTP session without logging out.
  • get_authenticated_user(self): Retrieves information about the authenticated user.
  • get_sites(self): Retrieves a list of sites associated with the authenticated user.
  • get_site_networks_ts_time_ago(self, site_id, measure_kind = "FLOW", aggregation_level = "NONE", aggregation_type = None, time_ago_unit = "HOUR", time_ago_value = 1, start = None, end = None): Retrieves the time series data for the networks of a specific site, based on the provided parameters. Deprecated — use get_site_time_series instead (emits a DeprecationWarning; the endpoint still works but the app has moved to site-time-series).
  • get_site_consumption_breakdown_time_ago(self, site_id, aggregation_level = "HOUR", time_ago_unit = "DAY", time_ago_value = 1, start = None, end = None) Retrieves the consumption breakdown data for a specific site, based on the provided parameters. Deprecated — use get_top_consumption instead (emits a DeprecationWarning; the endpoint still works but the app has moved to top-consumption).
  • get_devices(self, site_id): Retrieves a list of devices for the specified site.
  • get_connected_objects(self, site_id=None, gateway_uid=None): Retrieves the connected objects for a site or a gateway. Exactly one of site_id / gateway_uid is required (raises ValueError otherwise).
  • get_connected_object(self, connected_object_id): Retrieves information about a specific connected object.
  • get_measure_keys(self, site_id): Retrieves the measure keys (flat measurement inventory) for a site — each a (device, measureKind) pair with a stable id and measureKey UUID.
  • get_tiles(self, site_id): Retrieves the dashboard tile configuration for a site (tile type + which device each points at; configuration only, no live values).
  • get_electricity_price(self, site_id): Retrieves the EDF Tempo calendar / tariff structure for a site (tempoSyntheses, daily, ...).
  • get_device_kinds(self, site_uid): Retrieves the device-kind catalogue for a site (the "add a device" picker). Takes the short siteUid string (from site["siteUid"]), not the numeric site id.
  • get_device_ts_time_ago(self, device_id, measure_kind = "FLOW", aggregation_level = "HOUR", aggregation_type = "MAX", time_ago_unit = "DAY", time_ago_value = "1", start = None, end = None): Retrieves the time series data for a specific device, based on the provided parameters.
  • get_site_time_series(self, site_id, measure_kind = "FLOW", aggregation_level = "HOUR", aggregation_type = None, time_ago_unit = "DAY", time_ago_value = 1, start = None, end = None): Retrieves the whole-site rollup time series data for a specific site, based on the provided parameters.
  • get_top_consumption(self, site_id, aggregation_level = "DAY", time_ago_unit = "DAY", time_ago_value = 1, start = None, end = None): Retrieves the per-device consumption breakdown (top 5 devices + "others") for a specific site.
  • get_ecowatt(self): Retrieves the RTE EcoWatt grid-stress forecast (array of daily entries with a GREEN/ORANGE/RED status and 24 hourly values). Takes no parameters.
  • switch_capacity(self, capacity_id, enable): Turns a switch/relay capacity on or off (PUT /capacities/{id}/switch). Takes the numeric capacity id.
  • set_pilot_wire(self, capacity_id, state): Sets the pilot-wire order of a heating capacity (PUT /capacities/{id}/pilot-wire). state is passed through as-is; valid values are backend-defined (check the capacity's selectValues) and were not verified against a live pilot-wire device.
  • set_thermal_mode(self, capacity_id, state): Sets the thermal mode of a thermostat capacity, e.g. eco / comfort (PUT /capacities/{id}/thermal-mode). Same state pass-through caveat as set_pilot_wire.
  • set_thermostat_set_point(self, capacity_id, value): Sets the target set-point of a thermostat capacity (PUT /capacities/{id}/thermostat-set-point). value (temperature) is passed through as-is.

start/end accept a datetime or ISO-8601 string and select an absolute window instead of the relative time_ago_* params; a naive datetime is treated as UTC:

from datetime import datetime

client.get_device_ts_time_ago(
    "device-1",
    start=datetime(2026, 7, 4, 0, 0, 0),
    end=datetime(2026, 7, 5, 0, 0, 0),
)
  • get_device(self, device_id): Retrieves information about a specific device.
  • put_device(self, device_id, payload): Updates a specific device with the provided payload.
  • stream_measurements(self, site, *, reconnect=False, reconnect_backoff=1.0, reconnect_backoff_max=60.0, reconnect_max_attempts=None): Streams live measurements (FLOW / STATE) for a single site over STOMP-over-WebSocket. Takes one site dict (as returned by get_sites); yields Measurement / CapacityChanged events. Requires the optional [stream] extra (websocket-client). Pass reconnect=True to enable opt-in exponential-backoff reconnection on socket drops; reconnect_backoff sets the initial delay (seconds), reconnect_backoff_max caps the delay, and reconnect_max_attempts limits consecutive failed connect attempts before raising (None = unlimited). Reconnect is off by default; an auth rejection is always terminal.

Installation

You can install the Comwatt Python Client using pip. Run the following command:

pip install comwatt-client

Usage

Here's a simple example of how to use the Comwatt Python Client:

from comwatt_client import ComwattClient

# Create a Comwatt client instance
client = ComwattClient()

# Authenticate the user
client.authenticate('username', 'password')

# Get information about the authenticated user
user_info = client.get_authenticated_user()
print(user_info)

# Get a list of sites associated with the authenticated user
sites = client.get_sites()
print(sites)

# Get the whole-site rollup time series (productions, consumptions, injections, ...)
site_time_series_data = client.get_site_time_series(sites[0]['id'])
print(site_time_series_data)

# Get the per-device consumption breakdown for a specific site (top 5 + "others")
top_consumption_data = client.get_top_consumption(sites[0]['id'])
print(top_consumption_data)

# Get a list of devices for a specific site
devices = client.get_devices(sites[0]['id'])
print(devices)

# Get time series data for a specific device
time_series_data = client.get_device_ts_time_ago(devices[0]['id'])
print(time_series_data)

# Set the control mode of a specific device to MANUL
device = client.get_device(devices[0]['id'])
device['configuration']['controlMode'] = 'MANUAL'
client.put_device(device['id'], device)

# Switch the POWER_SWITCH capacity
for feature in device['features']:
    for capacity in feature['capacities']:
        if capacity.get('capacity', {}).get('nature') == "POWER_SWITCH":
            capacity_id = capacity['capacity']['id']
client.switch_capacity(capacity_id, False)
client.switch_capacity(capacity_id, True)

Make sure to replace 'username', 'password' with the actual values for your Comwatt account.

Error handling

All errors raised by the client subclass ComwattError:

  • ComwattAuthError — the credentials were rejected (HTTP 401/403 on login) or the session expired (HTTP 401). Re-authenticate.
  • ComwattAPIError — any other unexpected HTTP status, including non-credential failures of authenticate() (e.g. a 5xx during an outage, or a 200 response missing the session cookie). Exposes .status_code, .url, .detail.
from comwatt_client import ComwattClient, ComwattAuthError, ComwattAPIError

client = ComwattClient()
try:
    client.authenticate("username", "password")
    sites = client.get_sites()
except ComwattAuthError:
    ...  # credentials wrong or session expired — re-authenticate
except ComwattAPIError as e:
    print(e.status_code, e.url, e.detail)

Realtime streaming (optional)

For live measurements, install the optional streaming extra (adds websocket-client):

pip install comwatt-client[stream]

Then iterate a single site's measurements as they arrive over STOMP-over-WebSocket:

from comwatt_client import ComwattClient

client = ComwattClient()
client.authenticate("username", "password")

sites = client.get_sites()
for ev in client.stream_measurements(sites[0], reconnect=True):
    print(ev)

The generator yields Measurement (live FLOW / STATE values) and CapacityChanged (switch/state changes) events. By default (reconnect=False) it stops when the WebSocket drops. Pass reconnect=True to reconnect automatically with full-jitter exponential backoff:

for ev in client.stream_measurements(
    sites[0],
    reconnect=True,
    reconnect_backoff=1.0,
    reconnect_backoff_max=60.0,
    reconnect_max_attempts=10,
):
    print(ev)

The delay between failed connection attempts starts at reconnect_backoff seconds and doubles up to reconnect_backoff_max. reconnect_max_attempts counts consecutive failed attempts (resets to zero after any successful connection). An auth rejection (HTTP 401/403) is always terminal and will not be retried. QUANTITY measures are emitted only on bucket rollover, so keep a slow REST fallback (e.g. get_site_time_series) for absolute totals.

Contributing

Contributions to the Comwatt Python Client are welcome! If you find any issues or have suggestions for improvement, please open an issue or submit a pull request on the GitHub repository.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

comwatt_client-0.4.1.tar.gz (27.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

comwatt_client-0.4.1-py3-none-any.whl (19.1 kB view details)

Uploaded Python 3

File details

Details for the file comwatt_client-0.4.1.tar.gz.

File metadata

  • Download URL: comwatt_client-0.4.1.tar.gz
  • Upload date:
  • Size: 27.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for comwatt_client-0.4.1.tar.gz
Algorithm Hash digest
SHA256 e9ab563fd06462e11da3c57d41d42b4f3391468c61f08f45d146916f1039be1c
MD5 5c6ffed9de701d423d2f1b4056ba45cc
BLAKE2b-256 fe7137174942e6d706b34ebbbbc3a5405a077129673de1fe5dc43a907569f329

See more details on using hashes here.

Provenance

The following attestation bundles were made for comwatt_client-0.4.1.tar.gz:

Publisher: publish.yml on MateoGreil/python-comwatt-client

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file comwatt_client-0.4.1-py3-none-any.whl.

File metadata

  • Download URL: comwatt_client-0.4.1-py3-none-any.whl
  • Upload date:
  • Size: 19.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for comwatt_client-0.4.1-py3-none-any.whl
Algorithm Hash digest
SHA256 aaa8b904021c214b6f3ca603168a105ad421139b67e8425c56c2a0f35256861c
MD5 511fba63d88533eb12b88802c3a60013
BLAKE2b-256 2b3b2aaaf23a83399f2f5727a147ba52130d15bf1a869130221989a31be20cf0

See more details on using hashes here.

Provenance

The following attestation bundles were made for comwatt_client-0.4.1-py3-none-any.whl:

Publisher: publish.yml on MateoGreil/python-comwatt-client

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page