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" or "boolean"), writable, description (the original German label), source_key (the original Home Assistant entity id it was transcribed from, for traceability), and either NumberMetadata or BooleanMetadata.

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

await device.hot_water_heat_pump.write("wp_brauchwasser_soll_temp", 52.0)

Caution: writable=True here reflects a naming heuristic against an unverified register map, not a confirmed manufacturer specification -- treat every writable field as unverified until checked against the real unit.

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

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.2
File Size Uploaded Provenance Actions
aerosmart_modbus-0.3.2.tar.gz 35.0 kB With provenance Details for aerosmart_modbus-0.3.2.tar.gz

Built distribution (wheel)

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

Total release size: 62.2 kB

Release files / aerosmart_modbus-0.3.2.tar.gz

Download URL aerosmart_modbus-0.3.2.tar.gz
Size 35.0 kB
Tags Source
SHA-256 checksum
How to use checksums
8d547ccaf9eb22c086f9461f924b7687302687d1a5a2d3b16d8815676441cb15
BLAKE2b-256 checksum
How to use checksums
5e4b7172510ff7767b8b7f83975eb19d6640597432005dd03626330a4fa47550
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 Oct 29, 2026.

Transparency log

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

Download URL aerosmart_modbus-0.3.2-py3-none-any.whl
Size 27.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
84e9453229e1a5da996d6659a879a1ff5f6b27421d7ab4937de36a864cf81d4e
BLAKE2b-256 checksum
How to use checksums
5794bbc027eae51320e8a0bb8228880c3edd31bcd5a514bd3ca2b13ade2191b4
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 Oct 29, 2026.

Transparency log

Security for aerosmart-modbus 0.3.2

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.2.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 Oct 29, 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