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.3

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.3
File Size Uploaded Provenance Actions
aerosmart_modbus-0.3.3.tar.gz 37.0 kB With provenance Details for aerosmart_modbus-0.3.3.tar.gz

Built distribution (wheel)

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

Total release size: 65.9 kB

Release files / aerosmart_modbus-0.3.3.tar.gz

Download URL aerosmart_modbus-0.3.3.tar.gz
Size 37.0 kB
Tags Source
SHA-256 checksum
How to use checksums
fd87be5fa050e20489d369e421616f148771bba611b3b14cbee186b0731d7dcd
BLAKE2b-256 checksum
How to use checksums
f4f328487c6aeacd8b6eaa62a31567f02a6c6e098d8ab40c485248c0c7656403
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.3-py3-none-any.whl

Download URL aerosmart_modbus-0.3.3-py3-none-any.whl
Size 28.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
5aa39fb0de292e5ab6c2d431f3f71ec0feae8a366663ef1e7a35789525f09a24
BLAKE2b-256 checksum
How to use checksums
538e5a2c39f7400eb37c8d6d981280d81202939300e2342398b42267f25ca252
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.3

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.3.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