Skip to main content

aiomelcloudhome

GitHub Release Python Versions Project Stage Project Maintenance License

GitHub Activity PyPI Downloads GitHub Last Commit Open in Dev Containers

Build Status Typing Status Code Coverage

Asynchronous Python client for MELCloud Home.

About

aiomelcloudhome is an async client for the MELCloud Home API, focused on:

  • Fetching account context (buildings and devices)
  • Controlling Air-to-Air units
  • Controlling Air-to-Water units
  • Reading telemetry (energy and actual measurements)

The library is under active development and endpoint coverage will keep expanding.

Installation

pip install aiomelcloudhome

Usage

Authenticate with username and password

import asyncio

from aiohttp import ClientSession

from aiomelcloudhome import MELCloudHome


async def main() -> None:
    async with ClientSession() as session:
        async with MELCloudHome(
            username="your@email.com",
            password="your_password",
            session=session,
        ) as client:
            context = await client.get_context()

            for building in context.buildings:
                print(f"Building: {building.name}")

                for unit in building.air_to_air_units:
                    print(f"ATA: {unit.name} (room: {unit.room_temperature} C)")

                for unit in building.air_to_water_units:
                    print(f"ATW: {unit.name} (tank: {unit.tank_water_temperature} C)")


if __name__ == "__main__":
    asyncio.run(main())

Authenticate with an existing access token

from aiomelcloudhome import MELCloudHome


client = MELCloudHome(access_token="YOUR_ACCESS_TOKEN")

Control an Air-to-Air unit

from aiomelcloudhome import ATAFanSpeed, ATAOperationMode, MELCloudHome


await client.control_ata_unit(
    "ata-unit-id",
    power=True,
    operation_mode=ATAOperationMode.HEAT,
    set_temperature=21.0,
    set_fan_speed=ATAFanSpeed.AUTO,
)

Control an Air-to-Water unit

from aiomelcloudhome import ATWZoneMode


await client.control_atw_unit(
    "atw-unit-id",
    power=True,
    operation_mode_zone1=ATWZoneMode.HEAT_ROOM_TEMPERATURE,
    set_temperature_zone1=21.0,
    set_tank_water_temperature=50.0,
)

Fetch telemetry

from datetime import UTC, datetime, timedelta


energy = await client.get_energy_telemetry(
    "unit-id",
    from_dt=datetime.now(UTC) - timedelta(days=1),
    to_dt=datetime.now(UTC),
)

outdoor = await client.get_outdoor_temperature("ata-unit-id")

Live updates over WebSocket

Instead of polling get_context(), you can opt in to a live update stream. stream_updates() connects to the MELCloud Home realtime WebSocket, reuses the client's existing authentication, reconnects transparently, and yields a typed UnitStateDelta whenever a unit changes. Control, telemetry and the initial state snapshot still use the REST API.

async for delta in client.stream_updates():
    print(delta.unit_id, delta.unit_type, delta.changes)
    # e.g. changes == {"SetTemperature": 21.0} or {"OperationMode": ATAOperationMode.COOL}

The stream raises MelCloudHomeWebSocketError if the realtime channel cannot be established, so you can fall back to polling.

For a long-lived listener that you need to start and stop (for example a Home Assistant coordinator), use client.websocket() to hold a handle, run stream() in a background task, and close() it on teardown:

ws = client.websocket()
task = asyncio.create_task(_listen(ws))  # _listen iterates `async for delta in ws.stream()`

# on shutdown (e.g. async_unload_entry):
await ws.close()   # stops gracefully; stream() ends on its own
await task

More examples can be found in the examples directory.

Documentation

Project documentation and API reference: https://github.com/erwindouna/aiomelcloudhome

Contributing

Contributions are welcome. Please open an issue or pull request.

For local development:

uv sync --all-groups && uv run pre-commit install

Run checks:

uv run pre-commit run --all-files

Run tests:

uv run pytest

Update snapshot tests:

uv run pytest --snapshot-update

License

MIT License

Copyright (c) 2026 Erwin Douna

Download files

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

Source Distribution

aiomelcloudhome-0.2.0.tar.gz (18.0 kB view details)

Uploaded Source

Built Distribution

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

aiomelcloudhome-0.2.0-py3-none-any.whl (22.4 kB view details)

Uploaded Python 3

File details

Details for the file aiomelcloudhome-0.2.0.tar.gz.

File metadata

  • Download URL: aiomelcloudhome-0.2.0.tar.gz
  • Upload date:
  • Size: 18.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for aiomelcloudhome-0.2.0.tar.gz
Algorithm Hash digest
SHA256 58a5fc8a0ee8ab487c0254554a809b0499774be9a6f35e066f7a244c74996719
MD5 5b3bea4625d6cbba07babe7a20ab6c41
BLAKE2b-256 4666a3a94d7135d1ef4583879ce4f4c75c38c5445981ea4494faab499e1d21fc

See more details on using hashes here.

Provenance

The following attestation bundles were made for aiomelcloudhome-0.2.0.tar.gz:

Publisher: release.yaml on erwindouna/aiomelcloudhome

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

File details

Details for the file aiomelcloudhome-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: aiomelcloudhome-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 22.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for aiomelcloudhome-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 88c71f43a2d8cd482d5ed9daa7e635d5d464edbdd4637d8c384df2cb5d62b3b6
MD5 a88ad5a5762987ed4074a9433c632824
BLAKE2b-256 13065da4a6fc2c6246265169883fe8ba00a9b17ede6d766afeaea8b2eaeb82ef

See more details on using hashes here.

Provenance

The following attestation bundles were made for aiomelcloudhome-0.2.0-py3-none-any.whl:

Publisher: release.yaml on erwindouna/aiomelcloudhome

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