Skip to main content

A python library to access GivEnergy inverters via Modbus TCP, with no dependency on the GivEnergy Cloud.

Project description

GivEnergy Modbus

GivEnergy

pypi python CI codecov license Ruff

A Python library for communicating with GivEnergy inverters via Modbus TCP on a local network, with no dependency on the GivEnergy Cloud. Inspired by and originally built on pymodbus, it now provides its own asyncio-based framer, decoder and PDUs specific to the GivEnergy implementation.

⚠️ This project makes no representations as to its completeness or correctness. You use it at your own risk — if your inverter mysteriously explodes because you accidentally set the BOOMTIME register or you consume a MWh of electricity doing SOC calibration: you really are on your own. We make every effort to prevent you from shooting yourself in the foot, so as long as you use the client and its exposed methods, you should be perfectly safe.

Features

  • Reading all registers and decoding them into their representative datatypes
  • Writing data to holding registers that are deemed to be safe to set configuration on the inverter

How to use

The client is async. Use it inside an asyncio event loop; commands are plain functions that return request lists which you send via one_shot_command or execute:

import asyncio
from givenergy_modbus.client.client import Client
from givenergy_modbus.client import commands
from givenergy_modbus.model import TimeSlot
from givenergy_modbus.model.inverter import Model

async def main():
    client = Client(host="192.168.99.99", port=8899)
    await client.connect()

    # Detect the topology once, then read the config banks (needed for slot_map)
    await client.detect()
    await client.load_config()
    plant = client.plant

    # Write configuration to the device
    await client.one_shot_command(commands.set_charge_target_enabled(80))
    # set a charging slot from 00:30 to 04:30; slot_map selects correct registers for this model
    await client.one_shot_command(
        commands.set_charge_slot(1, TimeSlot.from_components(0, 30, 4, 30), plant.inverter.slot_map)
    )
    # set the inverter to charge from excess solar and discharge to meet demand
    await client.one_shot_command(commands.set_mode_dynamic())

    assert plant.inverter_serial_number == 'SA1234G567'
    assert plant.inverter.model == Model.HYBRID
    assert plant.inverter.enable_charge_target
    assert plant.inverter.charge_slot_1 == TimeSlot.from_components(0, 30, 4, 30)
    assert plant.inverter.model_dump() == {
        'serial_number': 'SA1234G567',
        'device_type_code': '3001',
        'charge_slot_1': TimeSlot.from_components(0, 30, 4, 30),
        ...
    }
    assert plant.inverter.model_dump_json() == '{"serial_number": "SA1234G567", "device_type_code": "3001", ...'

    assert plant.batteries[0].serial_number == 'BG1234G567'
    assert plant.batteries[0].v_cell_01 == 3.117
    assert plant.batteries[0].model_dump() == {
        'bms_firmware_version': 3005,
        'cap_design': 160.0,
        ...
    }
    assert plant.batteries[0].model_dump_json() == '{"serial_number": "BG1234G567", "v_cell_01": 3.117, ...'

    await client.close()

asyncio.run(main())

Credits

This package was created with Cookiecutter and the waynerv/cookiecutter-pypackage project template.

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

givenergy_modbus-2.6.1.tar.gz (471.1 kB view details)

Uploaded Source

Built Distribution

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

givenergy_modbus-2.6.1-py3-none-any.whl (182.5 kB view details)

Uploaded Python 3

File details

Details for the file givenergy_modbus-2.6.1.tar.gz.

File metadata

  • Download URL: givenergy_modbus-2.6.1.tar.gz
  • Upload date:
  • Size: 471.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for givenergy_modbus-2.6.1.tar.gz
Algorithm Hash digest
SHA256 9ea1f45796fd22c773350114d8381c8e46e6373b590b78f61131ed6e6fa0c879
MD5 31f131c427633bb47e8c8a842b16b5d9
BLAKE2b-256 a112f218dcdb03ea04e2d43efe7565d099131d0eb1f08b73e0c20d3bbd89e3db

See more details on using hashes here.

Provenance

The following attestation bundles were made for givenergy_modbus-2.6.1.tar.gz:

Publisher: release.yml on dewet22/givenergy-modbus

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

File details

Details for the file givenergy_modbus-2.6.1-py3-none-any.whl.

File metadata

File hashes

Hashes for givenergy_modbus-2.6.1-py3-none-any.whl
Algorithm Hash digest
SHA256 558069779a9d3e3b9c07225f81a0bb9e65aef57a05b1d3c734b7b3e4404e1a51
MD5 dab8f8db7a99d8347d558985ec1ecb06
BLAKE2b-256 83ac722ef10f6555d6ef7a52f89a2b5574209b4c60e91cb2e2443b33de7af692

See more details on using hashes here.

Provenance

The following attestation bundles were made for givenergy_modbus-2.6.1-py3-none-any.whl:

Publisher: release.yml on dewet22/givenergy-modbus

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