Skip to main content

kaco-modbus

Read and control KACO solar inverters over SunSpec Modbus.

Built on modbus-connection. The library never opens a connection of its own: you hand it a ModbusUnit and keep ownership of the socket. It contains no Home Assistant imports.

Developed against a KACO blueplanet 8.6 TL3 INT (firmware V5.53). It is driven by SunSpec discovery rather than a fixed register map, so it should work with any KACO inverter that exposes SunSpec over Modbus TCP — KACO's whole current range is three-phase, which is what this targets. Older Powador units that speak KACO's proprietary RS485 ASCII protocol are not supported; that is a different protocol.

Install

pip install kaco-modbus

You also need a Modbus backend, chosen by you rather than by this library:

pip install "modbus-connection[tmodbus]"   # or [pymodbus]

Use

import asyncio

from modbus_connection import ModbusTcpParams
from modbus_connection.tmodbus import ModbusConnection

from kaco_modbus import KacoInverter


async def main() -> None:
    connection = ModbusConnection(ModbusTcpParams(host="192.168.0.155"))
    try:
        inverter = KacoInverter(connection.for_unit(1))
        await inverter.async_update()

        print(inverter.info.model, inverter.info.serial_number)
        print(inverter.inverter.w, "W")  # AC power, scale factor applied
        for string in inverter.strings:
            print(string.id_str, string.dcw, "W")  # per MPPT string
    finally:
        await connection.close()


asyncio.run(main())

Command line

pip install "kaco-modbus[cli]"

Two tools, for two different readers.

kaco-status — what the inverter is doing

kaco-status 192.168.0.155
kaco-status 192.168.0.155 --watch      # live, refreshing every 5 s

Plain language, real units, and a judgement on each grid reading. No SunSpec vocabulary: the operating state reads "Producing power", not MPPT.

╭────────────────────── blueplanet 8.6 TL3 INT ───────────────────────╮
│  ● Producing power                   KACO new energy · 8.60 kW rated│
│                                                                     │
│  1.18 kW  ████░░░░░░░░░░░░░░░░░░░░░░  14% of capacity                │
│                                                                     │
│  ╭─────── Solar panels ────────╮  ╭────────── Grid ──────────╮      │
│  │  String    Voltage   Power  │  │  Phase 1   230.1 V normal│      │
│  │  String 1    344 V   270 W  │  │  Frequency 50.07 Hz normal      │
│  │  String 2    537 V   460 W  │  │  Power factor 1.00       │      │
│  ╰─────────────────────────────╯  ╰──────────────────────────╯      │
│                                                                     │
│    Generated all-time    Conversion efficiency     Temperature      │
│        12.19 MWh                 98.0%                46 °C         │
╰──────────────── 8.6TL00000000 · firmware V5.53 ─────────────────────╯

It withholds numbers it cannot stand behind. Conversion efficiency is blank below 1 kW, because the inverter reports power in 10 W steps and the rounding would show a false 100 %.

kaco-query — every register, for developers

kaco-query 192.168.0.155
kaco-query 192.168.0.155 --raw     # plus an undecoded register dump

Prints the discovered SunSpec model chain and every decoded field under its real SunSpec name, with — for the ones this firmware does not implement.

At night

A KACO stays on Modbus after dark rather than going silent, but parks the readings it is no longer taking at zero — reporting 0 Hz and 0 V for a grid that is plainly still live. The device object withholds those rather than passing them on:

inverter.is_running  # False while asleep
inverter.frequency  # None unless running
inverter.phase_voltages  # (None, None, None) unless running
inverter.temperature  # None unless running
inverter.power_factor  # None unless running

Power, current and energy are not withheld — zero is genuinely correct for those. See docs/quirks.md.

Control

Writes are limited to SunSpec model 123 (immediate controls):

await inverter.async_set_power_limit(50.0)  # curtail to 50 %
await inverter.async_clear_power_limit()

Setpoints on this hardware carry a revert timeout — the inverter drops back to its default after revert_seconds unless the value is written again. See docs/quirks.md.

License

Apache-2.0

Metadata

Release files for kaco-modbus 1.0.1

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

Source distribution (sdist)

Source distribution for kaco-modbus 1.0.1
File Size Uploaded
kaco_modbus-1.0.1.tar.gz 82.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for kaco-modbus 1.0.1
File Interpreter ABI Platform
kaco_modbus-1.0.1-py3-none-any.whl Python 3 none any Details

Total release size: 117.6 kB

Release files / kaco_modbus-1.0.1.tar.gz

Download URL kaco_modbus-1.0.1.tar.gz
Size 82.4 kB
Tags Source
SHA-256 checksum
How to use checksums
c818a747e6e56c0015f8345caf3e9074b2ec44ad975687f7923ea8f6a7762066
BLAKE2b-256 checksum
How to use checksums
035c5b2a9aae094d6cb6ee91ac6a84fecbd8cb25c9143b40b08ef32c6ab25ddc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Aug 23, 2026.

Transparency log

Release files / kaco_modbus-1.0.1-py3-none-any.whl

Download URL kaco_modbus-1.0.1-py3-none-any.whl
Size 35.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
670046419afd0aa430e474f6ec128931676c75ad3310c244d36be95218a47634
BLAKE2b-256 checksum
How to use checksums
0f15a0808ec39f98feaf16d2c9d07fc298a5cf1ca941f72b5a4746b9ea49f4c7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Aug 23, 2026.

Transparency log

Release history Release notifications | RSS feed

1.1.0

2 release files

This release

1.0.1 This release

2 release files

1.0.0

2 release files

0.1.0

2 release files

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