Skip to main content

Unified Modbus TCP driver library for solar plant hardware used in Direktvermarktung

Project description

dv-interfaces

PyPI version Python versions CI License: MIT

Unified Modbus TCP driver library for solar plant hardware used in Direktvermarktung (direct energy marketing).

Each device — SolarLog, SMA, Meteocontrol, Smartdog — exposes a different Modbus register map. dv-interfaces abstracts all of it into one consistent Python API for reading production data and sending output curtailment commands.

Full documentation →


Context

Each device — SolarLog, SMA, Meteocontrol, SmartDog — exposes a different Modbus register map with different byte orders, slave IDs, and conventions. Without a shared layer, every integration has to rediscover and reimplement the same mapping work.

dv-interfaces removes that undifferentiated effort so you can build polling jobs, control paths, and validation tooling without touching raw register math.

The library covers Modbus TCP, the most common protocol for Fernsteuerbarkeit in Direktvermarktung. IEC 60870-5-104 is used in this space too but is not currently supported.


Installation

uv add dv-interfaces
# or
pip install dv-interfaces

Try it without installing

uvx --from dv-interfaces dv-detect 192.168.1.100
uvx --from dv-interfaces dv-read solarlog 192.168.1.100

dv-read output

Quick example

from dv_interfaces import get_interface

with get_interface('solarlog', '192.168.1.100') as iface:
    ds = iface.read_dataset()
    print(f'Production: {ds.production} W')
    print(f'Grid feed:  {ds.grid_feed:+d} W')

Supported devices

Driver Device Protocol Spec
solarlog SolarLog (Modbus TCP DPM licence required) Modbus TCP Datasheet
sma SMA cluster Modbus TCP TI Direktvermarktung
meteocontrol Meteocontrol blue'Log XC Modbus TCP Remote Power Control
smartdog ecodata PowerDog / SmartDog Modbus TCP Modbus Register List

Features

  • Unified read_dataset()DVDataset across all drivers
  • Write API: turn_on(), turn_off(), limit_plant(percent)
  • Typed Modbus configuration with driver default slave IDs
  • stream(iface) generator — yields readings continuously, errors yielded not raised
  • detect_interface(host) — identify an unknown device by probing Modbus registers
  • read_dataset_result().to_dict() — flat dict for direct DB insertion or task queue backends
  • Auto-reconnect on dropped TCP connections
  • PEP 561 typed

Issues and bugs

If you find a bug, a wrong register interpretation, or a device-specific edge case, please open an issue. Include the driver name, device model/firmware if known, the relevant Modbus register values, and the expected behaviour.


Development

uv sync
uv run pytest -m "not hardware"
uv run ruff check src/ tests/
uv run ty check
uv run mkdocs serve   # local docs preview

Hardware tests

Set one or more DV_TEST_<DRIVER>_HOST variables and run the hardware marker:

DV_TEST_SOLARLOG_HOST=192.168.1.100 uv run pytest -m hardware -v

Tests for drivers whose host variable is not set are automatically skipped. Multiple drivers can be tested at once:

DV_TEST_SOLARLOG_HOST=192.168.1.100 \
DV_TEST_SMA_HOST=192.168.1.101 \
uv run pytest -m hardware -v

See the hardware testing docs for the full variable reference.

Hardware tests

License

MIT, see LICENSE.


About

Built by Gregorio Rodrigo
Making energy market data easier to work with

grrodre@gmail.com

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

dv_interfaces-2.0.0.tar.gz (286.3 kB view details)

Uploaded Source

Built Distribution

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

dv_interfaces-2.0.0-py3-none-any.whl (25.0 kB view details)

Uploaded Python 3

File details

Details for the file dv_interfaces-2.0.0.tar.gz.

File metadata

  • Download URL: dv_interfaces-2.0.0.tar.gz
  • Upload date:
  • Size: 286.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for dv_interfaces-2.0.0.tar.gz
Algorithm Hash digest
SHA256 166e77ff40f73a62c9de3b1c535fee466b01e3048448c480a625da7a9b007147
MD5 60345bbd23a1e8dce5ca72b30d5ae570
BLAKE2b-256 c33501790655c056773bab9a83cadaf04ff0c29d22d88d492dc8af55491fc0d9

See more details on using hashes here.

Provenance

The following attestation bundles were made for dv_interfaces-2.0.0.tar.gz:

Publisher: publish.yml on grrodre/dv-interfaces

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

File details

Details for the file dv_interfaces-2.0.0-py3-none-any.whl.

File metadata

  • Download URL: dv_interfaces-2.0.0-py3-none-any.whl
  • Upload date:
  • Size: 25.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for dv_interfaces-2.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6ad7543c7ffbca1fe9ead458d2af1c96725a627795d7c57b87dbd8acfb4792dc
MD5 6a96018372cb9a4ac9e396b353e62bd3
BLAKE2b-256 504baf11af540fff2347e000ce9a2f66b39b1024a69db97b2e00fce27a0a1e8e

See more details on using hashes here.

Provenance

The following attestation bundles were made for dv_interfaces-2.0.0-py3-none-any.whl:

Publisher: publish.yml on grrodre/dv-interfaces

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