Skip to main content

aerosmart-modbus

A typed, async Python model of an aerosmart ventilation/heat-pump unit's Modbus registers. Backend-neutral: built on modbus-connection, so it runs over pymodbus, tmodbus, or an in-memory mock -- no Home Assistant dependency. A Home Assistant integration that consumes this library lives in a separate repository.

Features

  • 137 registers across 16 sub-systems, transcribed 1:1 from a live installation's Modbus register map (address, scale, unit).
  • Two Modbus units modelled as one device: unit 1 (ventilation controller, which also aggregates most fault/request flags) and unit 2 (heat pump / domestic hot water), read together via one AerosmartDevice object.
  • Neutral per-field metadata (value_kind, writable, description, source_key) -- no Home Assistant concepts leak into this layer.
  • Pooled block reads per unit (ComponentGroup), not one Modbus round-trip per register.
  • A regression test that re-parses the original source YAML and checks every Python field's address/scale still matches it (see "Development", below -- there is no manufacturer register manual to check against instead).

Device structure

Attribute Unit Sub-system
general ventilation weekday, time/date, software version, device type
outside_temperature ventilation outside air temperature + thresholds
room_temperature ventilation room air temperature + setpoint
fans ventilation fan speeds, run hours, faults
ventilation ventilation operating mode, airflow, shading/frost/de-icing
cooling ventilation cooling thresholds
summer_bypass ventilation summer bypass automation
carbon_dioxide ventilation CO2 sensor
fine_dust_filter / coarse_dust_filter ventilation filter run time / change flags
fire_alarm ventilation fire alarm system contact
aggregate_fault ventilation summary fault flags
boost_functions_ventilation ventilation HEIZUNG+ boost function (ventilation-side registers)
hot_water_ventilation ventilation hot water fault/request flags (as seen from the controller)
utility_lockout heat pump utility (EVU) lockout signals
heat_pump heat pump compressor, pressures, run hours, status
boost_functions_heat_pump heat pump BAD+ boost function (heat-pump-side registers)
hot_water_heat_pump heat pump boiler temperatures, hot water setpoint

Basic usage

import asyncio
from modbus_connection.pymodbus import connect_tcp
from aerosmart_modbus import AerosmartDevice


async def main():
    connection = await connect_tcp("192.0.2.10", port=8899)
    device = AerosmartDevice(
        connection.for_unit(1),  # ventilation
        connection.for_unit(2),  # heat pump
    )
    await device.async_update()
    print(device.outside_temperature.temp_aussenluft, "°C outside")
    print(device.heat_pump.wp_status)


asyncio.run(main())

Known hardware quirk: request pacing

Live-tested against a real unit: this device sits behind a slow RS232-to-Modbus-TCP gateway. Issuing requests back-to-back with no pacing at all made the gateway return responses under stale/mismatched transaction IDs, and most reads timed out. AerosmartDevice therefore asks the shared Modbus transport for 300ms of quiet before and after either unit's requests and a one-second settle delay after connecting. Consumers do not need to add sleeps or configure connection timing themselves.

The device exposes async_update_readings() and async_update_settings() so consumers can poll operating data and the controller clock frequently while reading filter counters and slow-changing settings on a longer interval. async_update() still refreshes everything. Each returns an UpdateReport, allowing one failed sub-system to become unavailable without discarding fresh data from the others.

Metadata and writes

Every field carries a DatapointMetadata (see metadata.py): value_kind ("number", "boolean", or "enum"), writable, verified_writable, description (the original German label), source_key (the original Home Assistant entity id it was transcribed from, for traceability), and the matching value metadata.

meta = device.hot_water_heat_pump.require_metadata_for("wp_brauchwasser_soll_temp")
meta.writable  # True
meta.verified_writable  # True
meta.source_key  # "aerosmartm_wp_brauchwasser_soll_temp"

actual = await device.async_write_verified(
    "hot_water_heat_pump", "wp_brauchwasser_soll_temp", 52.0
)

Use async_write_verified() for consumer-facing controls. It only accepts registers whose write semantics and limits are confirmed by the manufacturer documentation, serializes writes across both controller units, validates the value, and reads the register back immediately. writable=True without verified_writable=True remains an unverified transcription and is rejected by this safe API.

Command-line query tool

python -m pip install -e ".[cli]"
python script/query.py tcp 192.0.2.10 --port 8899

Prints every sub-system's current values, plus how many Modbus reads it took. Not used by CI -- a manual diagnostic tool for probing a real unit.

Development

uv sync
uv run pytest
uv run ruff check .
uv run ruff format .

Tests run against modbus_connection's in-memory mock (no real device needed) plus a YAML consistency check (tests/test_yaml_consistency.py) against the original source fragments under tests/fixtures/aerosmartm/. Tested against modbus-connection 4.12.x. Project metadata accepts compatible releases from 4.12 up to, but excluding, 5.

Metadata

Release files for aerosmart-modbus 0.3.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for aerosmart-modbus 0.3.4
File Size Uploaded Provenance Actions
aerosmart_modbus-0.3.4.tar.gz 37.2 kB With provenance Details for aerosmart_modbus-0.3.4.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for aerosmart-modbus 0.3.4
File Interpreter ABI Platform Actions
aerosmart_modbus-0.3.4-py3-none-any.whl Python 3 none any Details for aerosmart_modbus-0.3.4-py3-none-any.whl

Total release size: 66.3 kB

Release files / aerosmart_modbus-0.3.4.tar.gz

Download URL aerosmart_modbus-0.3.4.tar.gz
Size 37.2 kB
Tags Source
SHA-256 checksum
How to use checksums
4c98b0a9ed2d07b1b11e738505e00a03ca5f5495b5a8fc384b55c0c16541276a
BLAKE2b-256 checksum
How to use checksums
e7fae79662551c68b27f9b7ddd16d9827aa94e0f1e60aad4ab6f5dd9a86c50f8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 5, 2026.

Transparency log

Release files / aerosmart_modbus-0.3.4-py3-none-any.whl

Download URL aerosmart_modbus-0.3.4-py3-none-any.whl
Size 29.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
cfb22ecef0f9705ff24afe8a7f8d9ed4f8f7a95cd33c5125d07d1d1cce4ea2d9
BLAKE2b-256 checksum
How to use checksums
8b16f0b721a1d32c720fdce8fd65b0635c8bf3028a9bbb5681a1ef666e4508a2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 5, 2026.

Transparency log

Security for aerosmart-modbus 0.3.4

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

Both files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for aerosmart_modbus-0.3.4.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 5, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page