Skip to main content

Python client for Kospel C.MI electric heater HTTP API

Project description

kospel-cmi-lib

Python client for the Kospel C.MI electric heater HTTP API.

Features

  • Async-first: Built on asyncio and aiohttp for non-blocking I/O
  • Type-safe: Strict type hinting throughout
  • Registry-driven: Settings defined declaratively in a central registry; dynamic property access on HeaterController
  • Simulator-capable: Full simulator for offline development and testing (no hardware required)
  • Protocol-based: Decoder/encoder interfaces via Python Protocol types

Installation

# With uv (recommended)
uv add kospel-cmi-lib

# With pip
pip install kospel-cmi-lib

Usage

Create a register backend (HTTP or YAML), load a registry config, and pass both to HeaterController. When using HttpRegisterBackend, call aclose() or use the controller as an async context manager to release the HTTP session when done.

Recommended: async context manager (resources released automatically):

import asyncio
import aiohttp
from kospel_cmi.controller.api import HeaterController
from kospel_cmi.controller.registry import load_registry
from kospel_cmi.kospel.backend import HttpRegisterBackend, YamlRegisterBackend


async def main() -> None:
    api_base_url = "http://192.168.1.1/api/dev/65"  # Replace with your heater URL
    registry = load_registry("kospel_cmi_standard")
    async with aiohttp.ClientSession() as session:
        backend = HttpRegisterBackend(session, api_base_url)
        async with HeaterController(backend=backend, registry=registry) as controller:
            await controller.refresh()
            print(controller.heater_mode)  # Access registry-defined settings
            # controller.heater_mode = "manual"  # Modify (if writable)
            # await controller.save()  # Write pending changes to the device
    # Session and controller resources released here


asyncio.run(main())

Alternative: explicit aclose() (for long-lived integrations):

registry = load_registry("kospel_cmi_standard")
controller = HeaterController(backend=HttpRegisterBackend(session, api_base_url), registry=registry)
try:
    await controller.refresh()
    # ... use controller ...
finally:
    await controller.aclose()

For offline development or tests, use the YAML backend (no HTTP, no close needed):

registry = load_registry("kospel_cmi_standard")
backend = YamlRegisterBackend(state_file="/path/to/state.yaml")
controller = HeaterController(backend=backend, registry=registry)
await controller.refresh()

Setting Heater Mode

import asyncio
import aiohttp
from kospel_cmi.controller.api import HeaterController
from kospel_cmi.controller.registry import load_registry
from kospel_cmi.kospel.backend import HttpRegisterBackend
from kospel_cmi.registers.enums import HeaterMode, ManualMode

async def main():
    registry = load_registry("kospel_cmi_standard")
    async with aiohttp.ClientSession() as session:
        backend = HttpRegisterBackend(session, "http://192.168.1.1/api/dev/65")
        async with HeaterController(backend=backend, registry=registry) as controller:
            await controller.refresh()
            
            # Modify settings
            controller.heater_mode = HeaterMode.WINTER
            controller.manual_temperature = 22.0
            controller.is_manual_mode_enabled = ManualMode.ENABLED
            
            # Write all changes at once
            success = await controller.save()
            print(f"Settings saved: {success}")

asyncio.run(main())

Documentation

Module Documentation

Module-specific documentation is co-located with the code (GitHub automatically displays these when browsing directories):

  • kospel/ - HTTP API endpoints and protocol
  • registers/ - Register encoding, decoding, and mappings
  • controller/ - YAML registry config and load_registry
  • tools/ - Register scanner and live scanner for reverse-engineering

Project Documentation

  • Development Guide - Contributing and extending the library
  • Architecture - System design, layers, components, and data flow
  • Technical Specs - Implementation details, data formats, protocols, testing, and coding standards

Roadmap

v1.0.0 Engine & Explorer

  1. Local control - basic device functions can be operated using the library
  2. Robust interface - an interface for 3rd party tools (i.e., Home Assistant integration)
  3. Reverse-engineering toolset - kospel-scan-registers and kospel-scan-live for exploring registers

v2.0.0 Plug & Play for Kospel ecosystem

  1. Support multiple device types
  2. Device discovery
  3. Advanced state management (error and warning flags, fault detection, debug)

References

This library was reverse-engineered from JavaScript code used in the heater's web interface. Key findings:

  • Register encoding uses little-endian byte order
  • Flag bits are used for boolean settings within registers
  • Temperature and pressure values are scaled for precision
  • Read-Modify-Write pattern is required for setting flag bits

License

Apache License 2.0

Project details


Download files

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

Source Distribution

kospel_cmi_lib-0.1.0a5.tar.gz (29.9 kB view details)

Uploaded Source

Built Distribution

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

kospel_cmi_lib-0.1.0a5-py3-none-any.whl (41.1 kB view details)

Uploaded Python 3

File details

Details for the file kospel_cmi_lib-0.1.0a5.tar.gz.

File metadata

  • Download URL: kospel_cmi_lib-0.1.0a5.tar.gz
  • Upload date:
  • Size: 29.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for kospel_cmi_lib-0.1.0a5.tar.gz
Algorithm Hash digest
SHA256 9ea497b6d0677fc25da585f3b34150218b150d58028489a89edf532723efade2
MD5 99e4ebe03bb404c134c5bb76d712eb40
BLAKE2b-256 78ce776517dae0c5e25c7453ade807e85bd3bdc2a5274586c9e12a66fb70da81

See more details on using hashes here.

Provenance

The following attestation bundles were made for kospel_cmi_lib-0.1.0a5.tar.gz:

Publisher: release-pypi.yml on JanKrl/kospel-cmi-lib

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

File details

Details for the file kospel_cmi_lib-0.1.0a5-py3-none-any.whl.

File metadata

File hashes

Hashes for kospel_cmi_lib-0.1.0a5-py3-none-any.whl
Algorithm Hash digest
SHA256 147a444cfab90192fd3a271e063de26e7a91cfbfed77b86d6ba4b8815a444e8c
MD5 9a5c6075aa6d2beeb400b14d6d254f19
BLAKE2b-256 9d94cc1d5a7545da1302c4ee1d37f6892936da3b2506f1ebb0285919540cabe0

See more details on using hashes here.

Provenance

The following attestation bundles were made for kospel_cmi_lib-0.1.0a5-py3-none-any.whl:

Publisher: release-pypi.yml on JanKrl/kospel-cmi-lib

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 Pingdom Monitoring Sentry Error logging StatusPage Status page